gcc.c (n_switches_alloc, [...]): New.
[gcc.git] / gcc / gcc.c
1 /* Compiler driver program that can handle many languages.
2 Copyright (C) 1987, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
3 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009,
4 2010
5 Free Software Foundation, Inc.
6
7 This file is part of GCC.
8
9 GCC is free software; you can redistribute it and/or modify it under
10 the terms of the GNU General Public License as published by the Free
11 Software Foundation; either version 3, or (at your option) any later
12 version.
13
14 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
15 WARRANTY; without even the implied warranty of MERCHANTABILITY or
16 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
17 for more details.
18
19 You should have received a copy of the GNU General Public License
20 along with GCC; see the file COPYING3. If not see
21 <http://www.gnu.org/licenses/>. */
22
23 /* This program is the user interface to the C compiler and possibly to
24 other compilers. It is used because compilation is a complicated procedure
25 which involves running several programs and passing temporary files between
26 them, forwarding the users switches to those programs selectively,
27 and deleting the temporary files at the end.
28
29 CC recognizes how to compile each input file by suffixes in the file names.
30 Once it knows which kind of compilation to perform, the procedure for
31 compilation is specified by a string called a "spec". */
32
33 /* A Short Introduction to Adding a Command-Line Option.
34
35 Before adding a command-line option, consider if it is really
36 necessary. Each additional command-line option adds complexity and
37 is difficult to remove in subsequent versions.
38
39 In the following, consider adding the command-line argument
40 `--bar'.
41
42 1. Each command-line option is specified in the specs file. The
43 notation is described below in the comment entitled "The Specs
44 Language". Read it.
45
46 2. In this file, add an entry to "option_map" equating the long
47 `--' argument version and any shorter, single letter version. Read
48 the comments in the declaration of "struct option_map" for an
49 explanation. Do not omit the first `-'.
50
51 3. Look in the "specs" file to determine which program or option
52 list should be given the argument, e.g., "cc1_options". Add the
53 appropriate syntax for the shorter option version to the
54 corresponding "const char *" entry in this file. Omit the first
55 `-' from the option. For example, use `-bar', rather than `--bar'.
56
57 4. If the argument takes an argument, e.g., `--baz argument1',
58 modify either DEFAULT_SWITCH_TAKES_ARG or
59 DEFAULT_WORD_SWITCH_TAKES_ARG in gcc.h. Omit the first `-'
60 from `--baz'.
61
62 5. Document the option in this file's display_help(). If the
63 option is passed to a subprogram, modify its corresponding
64 function, e.g., cppinit.c:print_help() or toplev.c:display_help(),
65 instead.
66
67 6. Compile and test. Make sure that your new specs file is being
68 read. For example, use a debugger to investigate the value of
69 "specs_file" in main(). */
70
71 #include "config.h"
72 #include "system.h"
73 #include "coretypes.h"
74 #include "multilib.h" /* before tm.h */
75 #include "tm.h"
76 #include <signal.h>
77 #if ! defined( SIGCHLD ) && defined( SIGCLD )
78 # define SIGCHLD SIGCLD
79 #endif
80 #include "xregex.h"
81 #include "obstack.h"
82 #include "intl.h"
83 #include "prefix.h"
84 #include "gcc.h"
85 #include "diagnostic.h"
86 #include "flags.h"
87 #include "opts.h"
88
89 #ifdef HAVE_MMAP_FILE
90 # include <sys/mman.h>
91 # ifdef HAVE_MINCORE
92 /* This is on Solaris. */
93 # include <sys/types.h>
94 # endif
95 #endif
96
97 #ifndef MAP_FAILED
98 # define MAP_FAILED ((void *)-1)
99 #endif
100
101 /* By default there is no special suffix for target executables. */
102 /* FIXME: when autoconf is fixed, remove the host check - dj */
103 #if defined(TARGET_EXECUTABLE_SUFFIX) && defined(HOST_EXECUTABLE_SUFFIX)
104 #define HAVE_TARGET_EXECUTABLE_SUFFIX
105 #endif
106
107 /* By default there is no special suffix for host executables. */
108 #ifdef HOST_EXECUTABLE_SUFFIX
109 #define HAVE_HOST_EXECUTABLE_SUFFIX
110 #else
111 #define HOST_EXECUTABLE_SUFFIX ""
112 #endif
113
114 /* By default, the suffix for target object files is ".o". */
115 #ifdef TARGET_OBJECT_SUFFIX
116 #define HAVE_TARGET_OBJECT_SUFFIX
117 #else
118 #define TARGET_OBJECT_SUFFIX ".o"
119 #endif
120
121 static const char dir_separator_str[] = { DIR_SEPARATOR, 0 };
122
123 /* Most every one is fine with LIBRARY_PATH. For some, it conflicts. */
124 #ifndef LIBRARY_PATH_ENV
125 #define LIBRARY_PATH_ENV "LIBRARY_PATH"
126 #endif
127
128 #ifndef HAVE_KILL
129 #define kill(p,s) raise(s)
130 #endif
131
132 /* If a stage of compilation returns an exit status >= 1,
133 compilation of that file ceases. */
134
135 #define MIN_FATAL_STATUS 1
136
137 /* Flag set by cppspec.c to 1. */
138 int is_cpp_driver;
139
140 /* Flag set to nonzero if an @file argument has been supplied to gcc. */
141 static bool at_file_supplied;
142
143 /* Flag saying to pass the greatest exit code returned by a sub-process
144 to the calling program. */
145 static int pass_exit_codes;
146
147 /* Definition of string containing the arguments given to configure. */
148 #include "configargs.h"
149
150 /* Flag saying to print the directories gcc will search through looking for
151 programs, libraries, etc. */
152
153 static int print_search_dirs;
154
155 /* Flag saying to print the full filename of this file
156 as found through our usual search mechanism. */
157
158 static const char *print_file_name = NULL;
159
160 /* As print_file_name, but search for executable file. */
161
162 static const char *print_prog_name = NULL;
163
164 /* Flag saying to print the relative path we'd use to
165 find libgcc.a given the current compiler flags. */
166
167 static int print_multi_directory;
168
169 static int print_sysroot;
170
171 /* Flag saying to print the relative path we'd use to
172 find OS libraries given the current compiler flags. */
173
174 static int print_multi_os_directory;
175
176 /* Flag saying to print the list of subdirectories and
177 compiler flags used to select them in a standard form. */
178
179 static int print_multi_lib;
180
181 /* Flag saying to print the command line options understood by gcc and its
182 sub-processes. */
183
184 static int print_help_list;
185
186 /* Flag saying to print the version of gcc and its sub-processes. */
187
188 static int print_version;
189
190 /* Flag saying to print the sysroot suffix used for searching for
191 headers. */
192
193 static int print_sysroot_headers_suffix;
194
195 /* Flag indicating whether we should print the command and arguments */
196
197 static int verbose_flag;
198
199 /* Flag indicating whether we should ONLY print the command and
200 arguments (like verbose_flag) without executing the command.
201 Displayed arguments are quoted so that the generated command
202 line is suitable for execution. This is intended for use in
203 shell scripts to capture the driver-generated command line. */
204 static int verbose_only_flag;
205
206 /* Flag indicating how to print command line options of sub-processes. */
207
208 static int print_subprocess_help;
209
210 /* Flag indicating whether we should report subprocess execution times
211 (if this is supported by the system - see pexecute.c). */
212
213 static int report_times;
214
215 /* Whether we should report subprocess execution times to a file. */
216
217 FILE *report_times_to_file = NULL;
218
219 /* Nonzero means place this string before uses of /, so that include
220 and library files can be found in an alternate location. */
221
222 #ifdef TARGET_SYSTEM_ROOT
223 static const char *target_system_root = TARGET_SYSTEM_ROOT;
224 #else
225 static const char *target_system_root = 0;
226 #endif
227
228 /* Nonzero means pass the updated target_system_root to the compiler. */
229
230 static int target_system_root_changed;
231
232 /* Nonzero means append this string to target_system_root. */
233
234 static const char *target_sysroot_suffix = 0;
235
236 /* Nonzero means append this string to target_system_root for headers. */
237
238 static const char *target_sysroot_hdrs_suffix = 0;
239
240 /* Nonzero means write "temp" files in source directory
241 and use the source file's name in them, and don't delete them. */
242
243 static enum save_temps {
244 SAVE_TEMPS_NONE, /* no -save-temps */
245 SAVE_TEMPS_CWD, /* -save-temps in current directory */
246 SAVE_TEMPS_OBJ /* -save-temps in object directory */
247 } save_temps_flag;
248
249 /* Output file to use to get the object directory for -save-temps=obj */
250 static char *save_temps_prefix = 0;
251 static size_t save_temps_length = 0;
252
253 /* Nonzero means pass multiple source files to the compiler at one time. */
254
255 static int combine_flag = 0;
256
257 /* Nonzero means use pipes to communicate between subprocesses.
258 Overridden by either of the above two flags. */
259
260 static int use_pipes;
261
262 /* The compiler version. */
263
264 static const char *compiler_version;
265
266 /* The target version. */
267
268 static const char *const spec_version = DEFAULT_TARGET_VERSION;
269
270 /* The target machine. */
271
272 static const char *spec_machine = DEFAULT_TARGET_MACHINE;
273
274 /* Nonzero if cross-compiling.
275 When -b is used, the value comes from the `specs' file. */
276
277 #ifdef CROSS_DIRECTORY_STRUCTURE
278 static const char *cross_compile = "1";
279 #else
280 static const char *cross_compile = "0";
281 #endif
282
283 /* Greatest exit code of sub-processes that has been encountered up to
284 now. */
285 static int greatest_status = 1;
286
287 /* This is the obstack which we use to allocate many strings. */
288
289 static struct obstack obstack;
290
291 /* This is the obstack to build an environment variable to pass to
292 collect2 that describes all of the relevant switches of what to
293 pass the compiler in building the list of pointers to constructors
294 and destructors. */
295
296 static struct obstack collect_obstack;
297
298 /* This is a list of a wrapper program and its arguments.
299 e.g. wrapper_string of "strace,-c"
300 will cause all programs to run as
301 strace -c program arguments
302 instead of just
303 program arguments */
304 static const char *wrapper_string;
305
306 /* Forward declaration for prototypes. */
307 struct path_prefix;
308 struct prefix_list;
309
310 static void init_spec (void);
311 static void store_arg (const char *, int, int);
312 static void insert_wrapper (const char *);
313 static char *load_specs (const char *);
314 static void read_specs (const char *, int);
315 static void set_spec (const char *, const char *);
316 static struct compiler *lookup_compiler (const char *, size_t, const char *);
317 static char *build_search_list (const struct path_prefix *, const char *,
318 bool, bool);
319 static void xputenv (const char *);
320 static void putenv_from_prefixes (const struct path_prefix *, const char *,
321 bool);
322 static int access_check (const char *, int);
323 static char *find_a_file (const struct path_prefix *, const char *, int, bool);
324 static void add_prefix (struct path_prefix *, const char *, const char *,
325 int, int, int);
326 static void add_sysrooted_prefix (struct path_prefix *, const char *,
327 const char *, int, int, int);
328 static void translate_options (int *, const char *const **);
329 static char *skip_whitespace (char *);
330 static void delete_if_ordinary (const char *);
331 static void delete_temp_files (void);
332 static void delete_failure_queue (void);
333 static void clear_failure_queue (void);
334 static int check_live_switch (int, int);
335 static const char *handle_braces (const char *);
336 static inline bool input_suffix_matches (const char *, const char *);
337 static inline bool switch_matches (const char *, const char *, int);
338 static inline void mark_matching_switches (const char *, const char *, int);
339 static inline void process_marked_switches (void);
340 static const char *process_brace_body (const char *, const char *, const char *, int, int);
341 static const struct spec_function *lookup_spec_function (const char *);
342 static const char *eval_spec_function (const char *, const char *);
343 static const char *handle_spec_function (const char *);
344 static char *save_string (const char *, int);
345 static void set_collect_gcc_options (void);
346 static int do_spec_1 (const char *, int, const char *);
347 static int do_spec_2 (const char *);
348 static void do_option_spec (const char *, const char *);
349 static void do_self_spec (const char *);
350 static const char *find_file (const char *);
351 static int is_directory (const char *, bool);
352 static const char *validate_switches (const char *);
353 static void validate_all_switches (void);
354 static inline void validate_switches_from_spec (const char *);
355 static void give_switch (int, int);
356 static int used_arg (const char *, int);
357 static int default_arg (const char *, int);
358 static void set_multilib_dir (void);
359 static void print_multilib_info (void);
360 static void perror_with_name (const char *);
361 static void display_help (void);
362 static void add_preprocessor_option (const char *, int);
363 static void add_assembler_option (const char *, int);
364 static void add_linker_option (const char *, int);
365 static void process_command (int, const char **);
366 static int execute (void);
367 static void alloc_args (void);
368 static void clear_args (void);
369 static void fatal_signal (int);
370 #if defined(ENABLE_SHARED_LIBGCC) && !defined(REAL_LIBGCC_SPEC)
371 static void init_gcc_specs (struct obstack *, const char *, const char *,
372 const char *);
373 #endif
374 #if defined(HAVE_TARGET_OBJECT_SUFFIX) || defined(HAVE_TARGET_EXECUTABLE_SUFFIX)
375 static const char *convert_filename (const char *, int, int);
376 #endif
377
378 static const char *getenv_spec_function (int, const char **);
379 static const char *if_exists_spec_function (int, const char **);
380 static const char *if_exists_else_spec_function (int, const char **);
381 static const char *replace_outfile_spec_function (int, const char **);
382 static const char *version_compare_spec_function (int, const char **);
383 static const char *include_spec_function (int, const char **);
384 static const char *find_file_spec_function (int, const char **);
385 static const char *find_plugindir_spec_function (int, const char **);
386 static const char *print_asm_header_spec_function (int, const char **);
387 static const char *compare_debug_dump_opt_spec_function (int, const char **);
388 static const char *compare_debug_self_opt_spec_function (int, const char **);
389 static const char *compare_debug_auxbase_opt_spec_function (int, const char **);
390 \f
391 /* The Specs Language
392
393 Specs are strings containing lines, each of which (if not blank)
394 is made up of a program name, and arguments separated by spaces.
395 The program name must be exact and start from root, since no path
396 is searched and it is unreliable to depend on the current working directory.
397 Redirection of input or output is not supported; the subprograms must
398 accept filenames saying what files to read and write.
399
400 In addition, the specs can contain %-sequences to substitute variable text
401 or for conditional text. Here is a table of all defined %-sequences.
402 Note that spaces are not generated automatically around the results of
403 expanding these sequences; therefore, you can concatenate them together
404 or with constant text in a single argument.
405
406 %% substitute one % into the program name or argument.
407 %i substitute the name of the input file being processed.
408 %b substitute the basename of the input file being processed.
409 This is the substring up to (and not including) the last period
410 and not including the directory unless -save-temps was specified
411 to put temporaries in a different location.
412 %B same as %b, but include the file suffix (text after the last period).
413 %gSUFFIX
414 substitute a file name that has suffix SUFFIX and is chosen
415 once per compilation, and mark the argument a la %d. To reduce
416 exposure to denial-of-service attacks, the file name is now
417 chosen in a way that is hard to predict even when previously
418 chosen file names are known. For example, `%g.s ... %g.o ... %g.s'
419 might turn into `ccUVUUAU.s ccXYAXZ12.o ccUVUUAU.s'. SUFFIX matches
420 the regexp "[.0-9A-Za-z]*%O"; "%O" is treated exactly as if it
421 had been pre-processed. Previously, %g was simply substituted
422 with a file name chosen once per compilation, without regard
423 to any appended suffix (which was therefore treated just like
424 ordinary text), making such attacks more likely to succeed.
425 %|SUFFIX
426 like %g, but if -pipe is in effect, expands simply to "-".
427 %mSUFFIX
428 like %g, but if -pipe is in effect, expands to nothing. (We have both
429 %| and %m to accommodate differences between system assemblers; see
430 the AS_NEEDS_DASH_FOR_PIPED_INPUT target macro.)
431 %uSUFFIX
432 like %g, but generates a new temporary file name even if %uSUFFIX
433 was already seen.
434 %USUFFIX
435 substitutes the last file name generated with %uSUFFIX, generating a
436 new one if there is no such last file name. In the absence of any
437 %uSUFFIX, this is just like %gSUFFIX, except they don't share
438 the same suffix "space", so `%g.s ... %U.s ... %g.s ... %U.s'
439 would involve the generation of two distinct file names, one
440 for each `%g.s' and another for each `%U.s'. Previously, %U was
441 simply substituted with a file name chosen for the previous %u,
442 without regard to any appended suffix.
443 %jSUFFIX
444 substitutes the name of the HOST_BIT_BUCKET, if any, and if it is
445 writable, and if save-temps is off; otherwise, substitute the name
446 of a temporary file, just like %u. This temporary file is not
447 meant for communication between processes, but rather as a junk
448 disposal mechanism.
449 %.SUFFIX
450 substitutes .SUFFIX for the suffixes of a matched switch's args when
451 it is subsequently output with %*. SUFFIX is terminated by the next
452 space or %.
453 %d marks the argument containing or following the %d as a
454 temporary file name, so that that file will be deleted if GCC exits
455 successfully. Unlike %g, this contributes no text to the argument.
456 %w marks the argument containing or following the %w as the
457 "output file" of this compilation. This puts the argument
458 into the sequence of arguments that %o will substitute later.
459 %V indicates that this compilation produces no "output file".
460 %W{...}
461 like %{...} but mark last argument supplied within
462 as a file to be deleted on failure.
463 %o substitutes the names of all the output files, with spaces
464 automatically placed around them. You should write spaces
465 around the %o as well or the results are undefined.
466 %o is for use in the specs for running the linker.
467 Input files whose names have no recognized suffix are not compiled
468 at all, but they are included among the output files, so they will
469 be linked.
470 %O substitutes the suffix for object files. Note that this is
471 handled specially when it immediately follows %g, %u, or %U
472 (with or without a suffix argument) because of the need for
473 those to form complete file names. The handling is such that
474 %O is treated exactly as if it had already been substituted,
475 except that %g, %u, and %U do not currently support additional
476 SUFFIX characters following %O as they would following, for
477 example, `.o'.
478 %I Substitute any of -iprefix (made from GCC_EXEC_PREFIX), -isysroot
479 (made from TARGET_SYSTEM_ROOT), -isystem (made from COMPILER_PATH
480 and -B options) and -imultilib as necessary.
481 %s current argument is the name of a library or startup file of some sort.
482 Search for that file in a standard list of directories
483 and substitute the full name found.
484 %eSTR Print STR as an error message. STR is terminated by a newline.
485 Use this when inconsistent options are detected.
486 %nSTR Print STR as a notice. STR is terminated by a newline.
487 %x{OPTION} Accumulate an option for %X.
488 %X Output the accumulated linker options specified by compilations.
489 %Y Output the accumulated assembler options specified by compilations.
490 %Z Output the accumulated preprocessor options specified by compilations.
491 %a process ASM_SPEC as a spec.
492 This allows config.h to specify part of the spec for running as.
493 %A process ASM_FINAL_SPEC as a spec. A capital A is actually
494 used here. This can be used to run a post-processor after the
495 assembler has done its job.
496 %D Dump out a -L option for each directory in startfile_prefixes.
497 If multilib_dir is set, extra entries are generated with it affixed.
498 %l process LINK_SPEC as a spec.
499 %L process LIB_SPEC as a spec.
500 %G process LIBGCC_SPEC as a spec.
501 %R Output the concatenation of target_system_root and
502 target_sysroot_suffix.
503 %S process STARTFILE_SPEC as a spec. A capital S is actually used here.
504 %E process ENDFILE_SPEC as a spec. A capital E is actually used here.
505 %C process CPP_SPEC as a spec.
506 %1 process CC1_SPEC as a spec.
507 %2 process CC1PLUS_SPEC as a spec.
508 %* substitute the variable part of a matched option. (See below.)
509 Note that each comma in the substituted string is replaced by
510 a single space.
511 %<S remove all occurrences of -S from the command line.
512 Note - this command is position dependent. % commands in the
513 spec string before this one will see -S, % commands in the
514 spec string after this one will not.
515 %<S* remove all occurrences of all switches beginning with -S from the
516 command line.
517 %:function(args)
518 Call the named function FUNCTION, passing it ARGS. ARGS is
519 first processed as a nested spec string, then split into an
520 argument vector in the usual fashion. The function returns
521 a string which is processed as if it had appeared literally
522 as part of the current spec.
523 %{S} substitutes the -S switch, if that switch was given to GCC.
524 If that switch was not specified, this substitutes nothing.
525 Here S is a metasyntactic variable.
526 %{S*} substitutes all the switches specified to GCC whose names start
527 with -S. This is used for -o, -I, etc; switches that take
528 arguments. GCC considers `-o foo' as being one switch whose
529 name starts with `o'. %{o*} would substitute this text,
530 including the space; thus, two arguments would be generated.
531 %{S*&T*} likewise, but preserve order of S and T options (the order
532 of S and T in the spec is not significant). Can be any number
533 of ampersand-separated variables; for each the wild card is
534 optional. Useful for CPP as %{D*&U*&A*}.
535
536 %{S:X} substitutes X, if the -S switch was given to GCC.
537 %{!S:X} substitutes X, if the -S switch was NOT given to GCC.
538 %{S*:X} substitutes X if one or more switches whose names start
539 with -S was given to GCC. Normally X is substituted only
540 once, no matter how many such switches appeared. However,
541 if %* appears somewhere in X, then X will be substituted
542 once for each matching switch, with the %* replaced by the
543 part of that switch that matched the '*'.
544 %{.S:X} substitutes X, if processing a file with suffix S.
545 %{!.S:X} substitutes X, if NOT processing a file with suffix S.
546 %{,S:X} substitutes X, if processing a file which will use spec S.
547 %{!,S:X} substitutes X, if NOT processing a file which will use spec S.
548
549 %{S|T:X} substitutes X if either -S or -T was given to GCC. This may be
550 combined with '!', '.', ',', and '*' as above binding stronger
551 than the OR.
552 If %* appears in X, all of the alternatives must be starred, and
553 only the first matching alternative is substituted.
554 %{S:X; if S was given to GCC, substitutes X;
555 T:Y; else if T was given to GCC, substitutes Y;
556 :D} else substitutes D. There can be as many clauses as you need.
557 This may be combined with '.', '!', ',', '|', and '*' as above.
558
559 %(Spec) processes a specification defined in a specs file as *Spec:
560 %[Spec] as above, but put __ around -D arguments
561
562 The conditional text X in a %{S:X} or similar construct may contain
563 other nested % constructs or spaces, or even newlines. They are
564 processed as usual, as described above. Trailing white space in X is
565 ignored. White space may also appear anywhere on the left side of the
566 colon in these constructs, except between . or * and the corresponding
567 word.
568
569 The -O, -f, -m, and -W switches are handled specifically in these
570 constructs. If another value of -O or the negated form of a -f, -m, or
571 -W switch is found later in the command line, the earlier switch
572 value is ignored, except with {S*} where S is just one letter; this
573 passes all matching options.
574
575 The character | at the beginning of the predicate text is used to indicate
576 that a command should be piped to the following command, but only if -pipe
577 is specified.
578
579 Note that it is built into GCC which switches take arguments and which
580 do not. You might think it would be useful to generalize this to
581 allow each compiler's spec to say which switches take arguments. But
582 this cannot be done in a consistent fashion. GCC cannot even decide
583 which input files have been specified without knowing which switches
584 take arguments, and it must know which input files to compile in order
585 to tell which compilers to run.
586
587 GCC also knows implicitly that arguments starting in `-l' are to be
588 treated as compiler output files, and passed to the linker in their
589 proper position among the other output files. */
590 \f
591 /* Define the macros used for specs %a, %l, %L, %S, %C, %1. */
592
593 /* config.h can define ASM_SPEC to provide extra args to the assembler
594 or extra switch-translations. */
595 #ifndef ASM_SPEC
596 #define ASM_SPEC ""
597 #endif
598
599 /* config.h can define ASM_FINAL_SPEC to run a post processor after
600 the assembler has run. */
601 #ifndef ASM_FINAL_SPEC
602 #define ASM_FINAL_SPEC ""
603 #endif
604
605 /* config.h can define CPP_SPEC to provide extra args to the C preprocessor
606 or extra switch-translations. */
607 #ifndef CPP_SPEC
608 #define CPP_SPEC ""
609 #endif
610
611 /* config.h can define CC1_SPEC to provide extra args to cc1 and cc1plus
612 or extra switch-translations. */
613 #ifndef CC1_SPEC
614 #define CC1_SPEC ""
615 #endif
616
617 /* config.h can define CC1PLUS_SPEC to provide extra args to cc1plus
618 or extra switch-translations. */
619 #ifndef CC1PLUS_SPEC
620 #define CC1PLUS_SPEC ""
621 #endif
622
623 /* config.h can define LINK_SPEC to provide extra args to the linker
624 or extra switch-translations. */
625 #ifndef LINK_SPEC
626 #define LINK_SPEC ""
627 #endif
628
629 /* config.h can define LIB_SPEC to override the default libraries. */
630 #ifndef LIB_SPEC
631 #define LIB_SPEC "%{!shared:%{g*:-lg} %{!p:%{!pg:-lc}}%{p:-lc_p}%{pg:-lc_p}}"
632 #endif
633
634 /* mudflap specs */
635 #ifndef MFWRAP_SPEC
636 /* XXX: valid only for GNU ld */
637 /* XXX: should exactly match hooks provided by libmudflap.a */
638 #define MFWRAP_SPEC " %{static: %{fmudflap|fmudflapth: \
639 --wrap=malloc --wrap=free --wrap=calloc --wrap=realloc\
640 --wrap=mmap --wrap=munmap --wrap=alloca\
641 } %{fmudflapth: --wrap=pthread_create\
642 }} %{fmudflap|fmudflapth: --wrap=main}"
643 #endif
644 #ifndef MFLIB_SPEC
645 #define MFLIB_SPEC "%{fmudflap|fmudflapth: -export-dynamic}"
646 #endif
647
648 /* config.h can define LIBGCC_SPEC to override how and when libgcc.a is
649 included. */
650 #ifndef LIBGCC_SPEC
651 #if defined(REAL_LIBGCC_SPEC)
652 #define LIBGCC_SPEC REAL_LIBGCC_SPEC
653 #elif defined(LINK_LIBGCC_SPECIAL_1)
654 /* Have gcc do the search for libgcc.a. */
655 #define LIBGCC_SPEC "libgcc.a%s"
656 #else
657 #define LIBGCC_SPEC "-lgcc"
658 #endif
659 #endif
660
661 /* config.h can define STARTFILE_SPEC to override the default crt0 files. */
662 #ifndef STARTFILE_SPEC
663 #define STARTFILE_SPEC \
664 "%{!shared:%{pg:gcrt0%O%s}%{!pg:%{p:mcrt0%O%s}%{!p:crt0%O%s}}}"
665 #endif
666
667 /* config.h can define SWITCHES_NEED_SPACES to control which options
668 require spaces between the option and the argument.
669
670 We define SWITCHES_NEED_SPACES to include "o" by default. This
671 causes "-ofoo.o" to be split into "-o foo.o" during the initial
672 processing of the command-line, before being seen by the specs
673 machinery. This makes sure we record "foo.o" as the temporary file
674 to be deleted in the case of error, rather than "-ofoo.o". */
675 #ifndef SWITCHES_NEED_SPACES
676 #define SWITCHES_NEED_SPACES "o"
677 #endif
678
679 /* config.h can define ENDFILE_SPEC to override the default crtn files. */
680 #ifndef ENDFILE_SPEC
681 #define ENDFILE_SPEC ""
682 #endif
683
684 #ifndef LINKER_NAME
685 #define LINKER_NAME "collect2"
686 #endif
687
688 #ifdef HAVE_AS_DEBUG_PREFIX_MAP
689 #define ASM_MAP " %{fdebug-prefix-map=*:--debug-prefix-map %*}"
690 #else
691 #define ASM_MAP ""
692 #endif
693
694 /* Define ASM_DEBUG_SPEC to be a spec suitable for translating '-g'
695 to the assembler. */
696 #ifndef ASM_DEBUG_SPEC
697 # if defined(DBX_DEBUGGING_INFO) && defined(DWARF2_DEBUGGING_INFO) \
698 && defined(HAVE_AS_GDWARF2_DEBUG_FLAG) && defined(HAVE_AS_GSTABS_DEBUG_FLAG)
699 # define ASM_DEBUG_SPEC \
700 (PREFERRED_DEBUGGING_TYPE == DBX_DEBUG \
701 ? "%{!g0:%{gdwarf-2*:--gdwarf2}%{!gdwarf-2*:%{g*:--gstabs}}}" ASM_MAP \
702 : "%{!g0:%{gstabs*:--gstabs}%{!gstabs*:%{g*:--gdwarf2}}}" ASM_MAP)
703 # else
704 # if defined(DBX_DEBUGGING_INFO) && defined(HAVE_AS_GSTABS_DEBUG_FLAG)
705 # define ASM_DEBUG_SPEC "%{g*:%{!g0:--gstabs}}" ASM_MAP
706 # endif
707 # if defined(DWARF2_DEBUGGING_INFO) && defined(HAVE_AS_GDWARF2_DEBUG_FLAG)
708 # define ASM_DEBUG_SPEC "%{g*:%{!g0:--gdwarf2}}" ASM_MAP
709 # endif
710 # endif
711 #endif
712 #ifndef ASM_DEBUG_SPEC
713 # define ASM_DEBUG_SPEC ""
714 #endif
715
716 /* Here is the spec for running the linker, after compiling all files. */
717
718 /* This is overridable by the target in case they need to specify the
719 -lgcc and -lc order specially, yet not require them to override all
720 of LINK_COMMAND_SPEC. */
721 #ifndef LINK_GCC_C_SEQUENCE_SPEC
722 #define LINK_GCC_C_SEQUENCE_SPEC "%G %L %G"
723 #endif
724
725 #ifndef LINK_SSP_SPEC
726 #ifdef TARGET_LIBC_PROVIDES_SSP
727 #define LINK_SSP_SPEC "%{fstack-protector:}"
728 #else
729 #define LINK_SSP_SPEC "%{fstack-protector|fstack-protector-all:-lssp_nonshared -lssp}"
730 #endif
731 #endif
732
733 #ifndef LINK_PIE_SPEC
734 #ifdef HAVE_LD_PIE
735 #define LINK_PIE_SPEC "%{pie:-pie} "
736 #else
737 #define LINK_PIE_SPEC "%{pie:} "
738 #endif
739 #endif
740
741 #ifndef LINK_BUILDID_SPEC
742 # if defined(HAVE_LD_BUILDID) && defined(ENABLE_LD_BUILDID)
743 # define LINK_BUILDID_SPEC "%{!r:--build-id} "
744 # endif
745 #endif
746
747
748 /* -u* was put back because both BSD and SysV seem to support it. */
749 /* %{static:} simply prevents an error message if the target machine
750 doesn't handle -static. */
751 /* We want %{T*} after %{L*} and %D so that it can be used to specify linker
752 scripts which exist in user specified directories, or in standard
753 directories. */
754 /* We pass any -flto and -fwhopr flags on to the linker, which is expected
755 to understand them. In practice, this means it had better be collect2. */
756 #ifndef LINK_COMMAND_SPEC
757 #define LINK_COMMAND_SPEC "\
758 %{!fsyntax-only:%{!c:%{!M:%{!MM:%{!E:%{!S:\
759 %(linker) \
760 %{fuse-linker-plugin: \
761 -plugin %(linker_plugin_file) \
762 -plugin-opt=%(lto_wrapper) \
763 -plugin-opt=-fresolution=%u.res \
764 %{static|static-libgcc:-plugin-opt=-pass-through=%(lto_libgcc)} \
765 %{static:-plugin-opt=-pass-through=-lc} \
766 } \
767 %{flto} %{fwhopr*} %l " LINK_PIE_SPEC \
768 "%X %{o*} %{A} %{d} %{e*} %{m} %{N} %{n} %{r}\
769 %{s} %{t} %{u*} %{x} %{z} %{Z} %{!A:%{!nostdlib:%{!nostartfiles:%S}}}\
770 %{static:} %{L*} %(mfwrap) %(link_libgcc) %o\
771 %{fopenmp|ftree-parallelize-loops=*:%:include(libgomp.spec)%(link_gomp)} %(mflib)\
772 %{fprofile-arcs|fprofile-generate*|coverage:-lgcov}\
773 %{!nostdlib:%{!nodefaultlibs:%(link_ssp) %(link_gcc_c_sequence)}}\
774 %{!A:%{!nostdlib:%{!nostartfiles:%E}}} %{T*} }}}}}}"
775 #endif
776
777 #ifndef LINK_LIBGCC_SPEC
778 /* Generate -L options for startfile prefix list. */
779 # define LINK_LIBGCC_SPEC "%D"
780 #endif
781
782 #ifndef STARTFILE_PREFIX_SPEC
783 # define STARTFILE_PREFIX_SPEC ""
784 #endif
785
786 #ifndef SYSROOT_SPEC
787 # define SYSROOT_SPEC "--sysroot=%R"
788 #endif
789
790 #ifndef SYSROOT_SUFFIX_SPEC
791 # define SYSROOT_SUFFIX_SPEC ""
792 #endif
793
794 #ifndef SYSROOT_HEADERS_SUFFIX_SPEC
795 # define SYSROOT_HEADERS_SUFFIX_SPEC ""
796 #endif
797
798 static const char *asm_debug;
799 static const char *cpp_spec = CPP_SPEC;
800 static const char *cc1_spec = CC1_SPEC;
801 static const char *cc1plus_spec = CC1PLUS_SPEC;
802 static const char *link_gcc_c_sequence_spec = LINK_GCC_C_SEQUENCE_SPEC;
803 static const char *link_ssp_spec = LINK_SSP_SPEC;
804 static const char *asm_spec = ASM_SPEC;
805 static const char *asm_final_spec = ASM_FINAL_SPEC;
806 static const char *link_spec = LINK_SPEC;
807 static const char *lib_spec = LIB_SPEC;
808 static const char *mfwrap_spec = MFWRAP_SPEC;
809 static const char *mflib_spec = MFLIB_SPEC;
810 static const char *link_gomp_spec = "";
811 static const char *libgcc_spec = LIBGCC_SPEC;
812 static const char *endfile_spec = ENDFILE_SPEC;
813 static const char *startfile_spec = STARTFILE_SPEC;
814 static const char *switches_need_spaces = SWITCHES_NEED_SPACES;
815 static const char *linker_name_spec = LINKER_NAME;
816 static const char *linker_plugin_file_spec = "";
817 static const char *lto_wrapper_spec = "";
818 static const char *lto_gcc_spec = "";
819 static const char *lto_libgcc_spec = "";
820 static const char *link_command_spec = LINK_COMMAND_SPEC;
821 static const char *link_libgcc_spec = LINK_LIBGCC_SPEC;
822 static const char *startfile_prefix_spec = STARTFILE_PREFIX_SPEC;
823 static const char *sysroot_spec = SYSROOT_SPEC;
824 static const char *sysroot_suffix_spec = SYSROOT_SUFFIX_SPEC;
825 static const char *sysroot_hdrs_suffix_spec = SYSROOT_HEADERS_SUFFIX_SPEC;
826
827 /* Standard options to cpp, cc1, and as, to reduce duplication in specs.
828 There should be no need to override these in target dependent files,
829 but we need to copy them to the specs file so that newer versions
830 of the GCC driver can correctly drive older tool chains with the
831 appropriate -B options. */
832
833 /* When cpplib handles traditional preprocessing, get rid of this, and
834 call cc1 (or cc1obj in objc/lang-specs.h) from the main specs so
835 that we default the front end language better. */
836 static const char *trad_capable_cpp =
837 "cc1 -E %{traditional|ftraditional|traditional-cpp:-traditional-cpp}";
838
839 /* We don't wrap .d files in %W{} since a missing .d file, and
840 therefore no dependency entry, confuses make into thinking a .o
841 file that happens to exist is up-to-date. */
842 static const char *cpp_unique_options =
843 "%{!Q:-quiet} %{nostdinc*} %{C} %{CC} %{v} %{I*&F*} %{P} %I\
844 %{MD:-MD %{!o:%b.d}%{o*:%.d%*}}\
845 %{MMD:-MMD %{!o:%b.d}%{o*:%.d%*}}\
846 %{M} %{MM} %{MF*} %{MG} %{MP} %{MQ*} %{MT*}\
847 %{!E:%{!M:%{!MM:%{!MT:%{!MQ:%{MD|MMD:%{o*:-MQ %*}}}}}}}\
848 %{remap} %{g3|ggdb3|gstabs3|gcoff3|gxcoff3|gvms3:-dD}\
849 %{!iplugindir*:%{fplugin*:%:find-plugindir()}}\
850 %{H} %C %{D*&U*&A*} %{i*} %Z %i\
851 %{fmudflap:-D_MUDFLAP -include mf-runtime.h}\
852 %{fmudflapth:-D_MUDFLAP -D_MUDFLAPTH -include mf-runtime.h}\
853 %{E|M|MM:%W{o*}}";
854
855 /* This contains cpp options which are common with cc1_options and are passed
856 only when preprocessing only to avoid duplication. We pass the cc1 spec
857 options to the preprocessor so that it the cc1 spec may manipulate
858 options used to set target flags. Those special target flags settings may
859 in turn cause preprocessor symbols to be defined specially. */
860 static const char *cpp_options =
861 "%(cpp_unique_options) %1 %{m*} %{std*&ansi&trigraphs} %{W*&pedantic*} %{w}\
862 %{f*} %{g*:%{!g0:%{g*} %{!fno-working-directory:-fworking-directory}}} %{O*}\
863 %{undef} %{save-temps*:-fpch-preprocess}";
864
865 /* This contains cpp options which are not passed when the preprocessor
866 output will be used by another program. */
867 static const char *cpp_debug_options = "%{d*}";
868
869 /* NB: This is shared amongst all front-ends, except for Ada. */
870 static const char *cc1_options =
871 "%{pg:%{fomit-frame-pointer:%e-pg and -fomit-frame-pointer are incompatible}}\
872 %{!iplugindir*:%{fplugin*:%:find-plugindir()}}\
873 %1 %{!Q:-quiet} %{!dumpbase:-dumpbase %B} %{d*} %{m*} %{a*}\
874 %{fcompare-debug-second:%:compare-debug-auxbase-opt(%b)} \
875 %{!fcompare-debug-second:%{c|S:%{o*:-auxbase-strip %*}%{!o*:-auxbase %b}}}%{!c:%{!S:-auxbase %b}} \
876 %{g*} %{O*} %{W*&pedantic*} %{w} %{std*&ansi&trigraphs}\
877 %{v:-version} %{pg:-p} %{p} %{f*} %{undef}\
878 %{Qn:-fno-ident} %{--help:--help}\
879 %{--target-help:--target-help}\
880 %{--help=*:--help=%(VALUE)}\
881 %{!fsyntax-only:%{S:%W{o*}%{!o*:-o %b.s}}}\
882 %{fsyntax-only:-o %j} %{-param*}\
883 %{fmudflap|fmudflapth:-fno-builtin -fno-merge-constants}\
884 %{coverage:-fprofile-arcs -ftest-coverage}";
885
886 static const char *asm_options =
887 "%{--target-help:%:print-asm-header()} "
888 #if HAVE_GNU_AS
889 /* If GNU AS is used, then convert -w (no warnings), -I, and -v
890 to the assembler equivalents. */
891 "%{v} %{w:-W} %{I*} "
892 #endif
893 "%a %Y %{c:%W{o*}%{!o*:-o %w%b%O}}%{!c:-o %d%w%u%O}";
894
895 static const char *invoke_as =
896 #ifdef AS_NEEDS_DASH_FOR_PIPED_INPUT
897 "%{!fwpa:\
898 %{fcompare-debug=*|fdump-final-insns=*:%:compare-debug-dump-opt()}\
899 %{!S:-o %|.s |\n as %(asm_options) %|.s %A }\
900 }";
901 #else
902 "%{!fwpa:\
903 %{fcompare-debug=*|fdump-final-insns=*:%:compare-debug-dump-opt()}\
904 %{!S:-o %|.s |\n as %(asm_options) %m.s %A }\
905 }";
906 #endif
907
908 /* Some compilers have limits on line lengths, and the multilib_select
909 and/or multilib_matches strings can be very long, so we build them at
910 run time. */
911 static struct obstack multilib_obstack;
912 static const char *multilib_select;
913 static const char *multilib_matches;
914 static const char *multilib_defaults;
915 static const char *multilib_exclusions;
916
917 /* Check whether a particular argument is a default argument. */
918
919 #ifndef MULTILIB_DEFAULTS
920 #define MULTILIB_DEFAULTS { "" }
921 #endif
922
923 static const char *const multilib_defaults_raw[] = MULTILIB_DEFAULTS;
924
925 #ifndef DRIVER_SELF_SPECS
926 #define DRIVER_SELF_SPECS ""
927 #endif
928
929 /* Adding -fopenmp should imply pthreads. This is particularly important
930 for targets that use different start files and suchlike. */
931 #ifndef GOMP_SELF_SPECS
932 #define GOMP_SELF_SPECS "%{fopenmp|ftree-parallelize-loops=*: -pthread}"
933 #endif
934
935 static const char *const driver_self_specs[] = {
936 "%{fdump-final-insns:-fdump-final-insns=.} %<fdump-final-insns",
937 DRIVER_SELF_SPECS, CONFIGURE_SPECS, GOMP_SELF_SPECS
938 };
939
940 #ifndef OPTION_DEFAULT_SPECS
941 #define OPTION_DEFAULT_SPECS { "", "" }
942 #endif
943
944 struct default_spec
945 {
946 const char *name;
947 const char *spec;
948 };
949
950 static const struct default_spec
951 option_default_specs[] = { OPTION_DEFAULT_SPECS };
952
953 struct user_specs
954 {
955 struct user_specs *next;
956 const char *filename;
957 };
958
959 static struct user_specs *user_specs_head, *user_specs_tail;
960
961 #ifndef SWITCH_TAKES_ARG
962 #define SWITCH_TAKES_ARG(CHAR) DEFAULT_SWITCH_TAKES_ARG(CHAR)
963 #endif
964
965 #ifndef WORD_SWITCH_TAKES_ARG
966 #define WORD_SWITCH_TAKES_ARG(STR) DEFAULT_WORD_SWITCH_TAKES_ARG (STR)
967 #endif
968 \f
969 #ifdef HAVE_TARGET_EXECUTABLE_SUFFIX
970 /* This defines which switches stop a full compilation. */
971 #define DEFAULT_SWITCH_CURTAILS_COMPILATION(CHAR) \
972 ((CHAR) == 'c' || (CHAR) == 'S' || (CHAR) == 'E')
973
974 #ifndef SWITCH_CURTAILS_COMPILATION
975 #define SWITCH_CURTAILS_COMPILATION(CHAR) \
976 DEFAULT_SWITCH_CURTAILS_COMPILATION(CHAR)
977 #endif
978 #endif
979
980 /* Record the mapping from file suffixes for compilation specs. */
981
982 struct compiler
983 {
984 const char *suffix; /* Use this compiler for input files
985 whose names end in this suffix. */
986
987 const char *spec; /* To use this compiler, run this spec. */
988
989 const char *cpp_spec; /* If non-NULL, substitute this spec
990 for `%C', rather than the usual
991 cpp_spec. */
992 const int combinable; /* If nonzero, compiler can deal with
993 multiple source files at once (IMA). */
994 const int needs_preprocessing; /* If nonzero, source files need to
995 be run through a preprocessor. */
996 };
997
998 /* Pointer to a vector of `struct compiler' that gives the spec for
999 compiling a file, based on its suffix.
1000 A file that does not end in any of these suffixes will be passed
1001 unchanged to the loader and nothing else will be done to it.
1002
1003 An entry containing two 0s is used to terminate the vector.
1004
1005 If multiple entries match a file, the last matching one is used. */
1006
1007 static struct compiler *compilers;
1008
1009 /* Number of entries in `compilers', not counting the null terminator. */
1010
1011 static int n_compilers;
1012
1013 /* The default list of file name suffixes and their compilation specs. */
1014
1015 static const struct compiler default_compilers[] =
1016 {
1017 /* Add lists of suffixes of known languages here. If those languages
1018 were not present when we built the driver, we will hit these copies
1019 and be given a more meaningful error than "file not used since
1020 linking is not done". */
1021 {".m", "#Objective-C", 0, 0, 0}, {".mi", "#Objective-C", 0, 0, 0},
1022 {".mm", "#Objective-C++", 0, 0, 0}, {".M", "#Objective-C++", 0, 0, 0},
1023 {".mii", "#Objective-C++", 0, 0, 0},
1024 {".cc", "#C++", 0, 0, 0}, {".cxx", "#C++", 0, 0, 0},
1025 {".cpp", "#C++", 0, 0, 0}, {".cp", "#C++", 0, 0, 0},
1026 {".c++", "#C++", 0, 0, 0}, {".C", "#C++", 0, 0, 0},
1027 {".CPP", "#C++", 0, 0, 0}, {".ii", "#C++", 0, 0, 0},
1028 {".ads", "#Ada", 0, 0, 0}, {".adb", "#Ada", 0, 0, 0},
1029 {".f", "#Fortran", 0, 0, 0}, {".F", "#Fortran", 0, 0, 0},
1030 {".for", "#Fortran", 0, 0, 0}, {".FOR", "#Fortran", 0, 0, 0},
1031 {".ftn", "#Fortran", 0, 0, 0}, {".FTN", "#Fortran", 0, 0, 0},
1032 {".fpp", "#Fortran", 0, 0, 0}, {".FPP", "#Fortran", 0, 0, 0},
1033 {".f90", "#Fortran", 0, 0, 0}, {".F90", "#Fortran", 0, 0, 0},
1034 {".f95", "#Fortran", 0, 0, 0}, {".F95", "#Fortran", 0, 0, 0},
1035 {".f03", "#Fortran", 0, 0, 0}, {".F03", "#Fortran", 0, 0, 0},
1036 {".f08", "#Fortran", 0, 0, 0}, {".F08", "#Fortran", 0, 0, 0},
1037 {".r", "#Ratfor", 0, 0, 0},
1038 {".p", "#Pascal", 0, 0, 0}, {".pas", "#Pascal", 0, 0, 0},
1039 {".java", "#Java", 0, 0, 0}, {".class", "#Java", 0, 0, 0},
1040 {".zip", "#Java", 0, 0, 0}, {".jar", "#Java", 0, 0, 0},
1041 /* Next come the entries for C. */
1042 {".c", "@c", 0, 1, 1},
1043 {"@c",
1044 /* cc1 has an integrated ISO C preprocessor. We should invoke the
1045 external preprocessor if -save-temps is given. */
1046 "%{E|M|MM:%(trad_capable_cpp) %(cpp_options) %(cpp_debug_options)}\
1047 %{!E:%{!M:%{!MM:\
1048 %{traditional|ftraditional:\
1049 %eGNU C no longer supports -traditional without -E}\
1050 %{!combine:\
1051 %{save-temps*|traditional-cpp|no-integrated-cpp:%(trad_capable_cpp) \
1052 %(cpp_options) -o %{save-temps*:%b.i} %{!save-temps*:%g.i} \n\
1053 cc1 -fpreprocessed %{save-temps*:%b.i} %{!save-temps*:%g.i} \
1054 %(cc1_options)}\
1055 %{!save-temps*:%{!traditional-cpp:%{!no-integrated-cpp:\
1056 cc1 %(cpp_unique_options) %(cc1_options)}}}\
1057 %{!fsyntax-only:%(invoke_as)}} \
1058 %{combine:\
1059 %{save-temps*|traditional-cpp|no-integrated-cpp:%(trad_capable_cpp) \
1060 %(cpp_options) -o %{save-temps*:%b.i} %{!save-temps*:%g.i}}\
1061 %{!save-temps*:%{!traditional-cpp:%{!no-integrated-cpp:\
1062 cc1 %(cpp_unique_options) %(cc1_options)}}\
1063 %{!fsyntax-only:%(invoke_as)}}}}}}", 0, 1, 1},
1064 {"-",
1065 "%{!E:%e-E or -x required when input is from standard input}\
1066 %(trad_capable_cpp) %(cpp_options) %(cpp_debug_options)", 0, 0, 0},
1067 {".h", "@c-header", 0, 0, 0},
1068 {"@c-header",
1069 /* cc1 has an integrated ISO C preprocessor. We should invoke the
1070 external preprocessor if -save-temps is given. */
1071 "%{E|M|MM:%(trad_capable_cpp) %(cpp_options) %(cpp_debug_options)}\
1072 %{!E:%{!M:%{!MM:\
1073 %{save-temps*|traditional-cpp|no-integrated-cpp:%(trad_capable_cpp) \
1074 %(cpp_options) -o %{save-temps*:%b.i} %{!save-temps*:%g.i} \n\
1075 cc1 -fpreprocessed %{save-temps*:%b.i} %{!save-temps*:%g.i} \
1076 %(cc1_options)\
1077 %{!fdump-ada-spec*:-o %g.s %{!o*:--output-pch=%i.gch}\
1078 %W{o*:--output-pch=%*}}%V}\
1079 %{!save-temps*:%{!traditional-cpp:%{!no-integrated-cpp:\
1080 cc1 %(cpp_unique_options) %(cc1_options)\
1081 %{!fdump-ada-spec*:-o %g.s %{!o*:--output-pch=%i.gch}\
1082 %W{o*:--output-pch=%*}}%V}}}}}}", 0, 0, 0},
1083 {".i", "@cpp-output", 0, 1, 0},
1084 {"@cpp-output",
1085 "%{!M:%{!MM:%{!E:cc1 -fpreprocessed %i %(cc1_options) %{!fsyntax-only:%(invoke_as)}}}}", 0, 1, 0},
1086 {".s", "@assembler", 0, 1, 0},
1087 {"@assembler",
1088 "%{!M:%{!MM:%{!E:%{!S:as %(asm_debug) %(asm_options) %i %A }}}}", 0, 1, 0},
1089 {".sx", "@assembler-with-cpp", 0, 1, 0},
1090 {".S", "@assembler-with-cpp", 0, 1, 0},
1091 {"@assembler-with-cpp",
1092 #ifdef AS_NEEDS_DASH_FOR_PIPED_INPUT
1093 "%(trad_capable_cpp) -lang-asm %(cpp_options) -fno-directives-only\
1094 %{E|M|MM:%(cpp_debug_options)}\
1095 %{!M:%{!MM:%{!E:%{!S:-o %|.s |\n\
1096 as %(asm_debug) %(asm_options) %|.s %A }}}}"
1097 #else
1098 "%(trad_capable_cpp) -lang-asm %(cpp_options) -fno-directives-only\
1099 %{E|M|MM:%(cpp_debug_options)}\
1100 %{!M:%{!MM:%{!E:%{!S:-o %|.s |\n\
1101 as %(asm_debug) %(asm_options) %m.s %A }}}}"
1102 #endif
1103 , 0, 1, 0},
1104
1105 #include "specs.h"
1106 /* Mark end of table. */
1107 {0, 0, 0, 0, 0}
1108 };
1109
1110 /* Number of elements in default_compilers, not counting the terminator. */
1111
1112 static const int n_default_compilers = ARRAY_SIZE (default_compilers) - 1;
1113
1114 /* A vector of options to give to the linker.
1115 These options are accumulated by %x,
1116 and substituted into the linker command with %X. */
1117 static int n_linker_options;
1118 static char **linker_options;
1119
1120 /* A vector of options to give to the assembler.
1121 These options are accumulated by -Wa,
1122 and substituted into the assembler command with %Y. */
1123 static int n_assembler_options;
1124 static char **assembler_options;
1125
1126 /* A vector of options to give to the preprocessor.
1127 These options are accumulated by -Wp,
1128 and substituted into the preprocessor command with %Z. */
1129 static int n_preprocessor_options;
1130 static char **preprocessor_options;
1131 \f
1132 /* Define how to map long options into short ones. */
1133
1134 /* This structure describes one mapping. */
1135 struct option_map
1136 {
1137 /* The long option's name. */
1138 const char *const name;
1139 /* The equivalent short option. */
1140 const char *const equivalent;
1141 /* Argument info. A string of flag chars; NULL equals no options.
1142 a => argument required.
1143 o => argument optional.
1144 j => join argument to equivalent, making one word.
1145 * => require other text after NAME as an argument. */
1146 const char *const arg_info;
1147 };
1148
1149 /* This is the table of mappings. Mappings are tried sequentially
1150 for each option encountered; the first one that matches, wins. */
1151
1152 static const struct option_map option_map[] =
1153 {
1154 {"--all-warnings", "-Wall", 0},
1155 {"--ansi", "-ansi", 0},
1156 {"--assemble", "-S", 0},
1157 {"--assert", "-A", "a"},
1158 {"--classpath", "-fclasspath=", "aj"},
1159 {"--bootclasspath", "-fbootclasspath=", "aj"},
1160 {"--CLASSPATH", "-fclasspath=", "aj"},
1161 {"--combine", "-combine", 0},
1162 {"--comments", "-C", 0},
1163 {"--comments-in-macros", "-CC", 0},
1164 {"--compile", "-c", 0},
1165 {"--debug", "-g", "oj"},
1166 {"--define-macro", "-D", "aj"},
1167 {"--dependencies", "-M", 0},
1168 {"--dump", "-d", "a"},
1169 {"--dumpbase", "-dumpbase", "a"},
1170 {"--dumpdir", "-dumpdir", "a"},
1171 {"--encoding", "-fencoding=", "aj"},
1172 {"--entry", "-e", 0},
1173 {"--extra-warnings", "-W", 0},
1174 {"--extdirs", "-fextdirs=", "aj"},
1175 {"--for-assembler", "-Wa", "a"},
1176 {"--for-linker", "-Xlinker", "a"},
1177 {"--force-link", "-u", "a"},
1178 {"--coverage", "-coverage", 0},
1179 {"--imacros", "-imacros", "a"},
1180 {"--include", "-include", "a"},
1181 {"--include-barrier", "-I-", 0},
1182 {"--include-directory", "-I", "aj"},
1183 {"--include-directory-after", "-idirafter", "a"},
1184 {"--include-prefix", "-iprefix", "a"},
1185 {"--include-with-prefix", "-iwithprefix", "a"},
1186 {"--include-with-prefix-before", "-iwithprefixbefore", "a"},
1187 {"--include-with-prefix-after", "-iwithprefix", "a"},
1188 {"--language", "-x", "a"},
1189 {"--library-directory", "-L", "a"},
1190 {"--machine", "-m", "aj"},
1191 {"--machine-", "-m", "*j"},
1192 {"--no-canonical-prefixes", "-no-canonical-prefixes", 0},
1193 {"--no-integrated-cpp", "-no-integrated-cpp", 0},
1194 {"--no-line-commands", "-P", 0},
1195 {"--no-precompiled-includes", "-noprecomp", 0},
1196 {"--no-standard-includes", "-nostdinc", 0},
1197 {"--no-standard-libraries", "-nostdlib", 0},
1198 {"--no-warnings", "-w", 0},
1199 {"--optimize", "-O", "oj"},
1200 {"--output", "-o", "a"},
1201 {"--output-class-directory", "-foutput-class-dir=", "ja"},
1202 {"--param", "--param", "a"},
1203 {"--pass-exit-codes", "-pass-exit-codes", 0},
1204 {"--pedantic", "-pedantic", 0},
1205 {"--pedantic-errors", "-pedantic-errors", 0},
1206 {"--pie", "-pie", 0},
1207 {"--pipe", "-pipe", 0},
1208 {"--prefix", "-B", "a"},
1209 {"--preprocess", "-E", 0},
1210 {"--print-search-dirs", "-print-search-dirs", 0},
1211 {"--print-file-name", "-print-file-name=", "aj"},
1212 {"--print-libgcc-file-name", "-print-libgcc-file-name", 0},
1213 {"--print-missing-file-dependencies", "-MG", 0},
1214 {"--print-multi-lib", "-print-multi-lib", 0},
1215 {"--print-multi-directory", "-print-multi-directory", 0},
1216 {"--print-multi-os-directory", "-print-multi-os-directory", 0},
1217 {"--print-prog-name", "-print-prog-name=", "aj"},
1218 {"--print-sysroot", "-print-sysroot", 0},
1219 {"--print-sysroot-headers-suffix", "-print-sysroot-headers-suffix", 0},
1220 {"--profile", "-p", 0},
1221 {"--profile-blocks", "-a", 0},
1222 {"--quiet", "-q", 0},
1223 {"--resource", "-fcompile-resource=", "aj"},
1224 {"--save-temps", "-save-temps", 0},
1225 {"--shared", "-shared", 0},
1226 {"--silent", "-q", 0},
1227 {"--specs", "-specs=", "aj"},
1228 {"--static", "-static", 0},
1229 {"--std", "-std=", "aj"},
1230 {"--symbolic", "-symbolic", 0},
1231 {"--sysroot", "--sysroot=", "aj"},
1232 {"--time", "-time", 0},
1233 {"--trace-includes", "-H", 0},
1234 {"--traditional", "-traditional", 0},
1235 {"--traditional-cpp", "-traditional-cpp", 0},
1236 {"--trigraphs", "-trigraphs", 0},
1237 {"--undefine-macro", "-U", "aj"},
1238 {"--user-dependencies", "-MM", 0},
1239 {"--verbose", "-v", 0},
1240 {"--warn-", "-W", "*j"},
1241 {"--write-dependencies", "-MD", 0},
1242 {"--write-user-dependencies", "-MMD", 0},
1243 {"--", "-f", "*j"}
1244 };
1245 \f
1246
1247 #ifdef TARGET_OPTION_TRANSLATE_TABLE
1248 static const struct {
1249 const char *const option_found;
1250 const char *const replacements;
1251 } target_option_translations[] =
1252 {
1253 TARGET_OPTION_TRANSLATE_TABLE,
1254 { 0, 0 }
1255 };
1256 #endif
1257
1258 /* Translate the options described by *ARGCP and *ARGVP.
1259 Make a new vector and store it back in *ARGVP,
1260 and store its length in *ARGCP. */
1261
1262 static void
1263 translate_options (int *argcp, const char *const **argvp)
1264 {
1265 int i;
1266 int argc = *argcp;
1267 const char *const *argv = *argvp;
1268 int newvsize = (argc + 2) * 2 * sizeof (const char *);
1269 const char **newv = XNEWVAR (const char *, newvsize);
1270 int newindex = 0;
1271
1272 i = 0;
1273 newv[newindex++] = argv[i++];
1274
1275 while (i < argc)
1276 {
1277 #ifdef TARGET_OPTION_TRANSLATE_TABLE
1278 int tott_idx;
1279
1280 for (tott_idx = 0;
1281 target_option_translations[tott_idx].option_found;
1282 tott_idx++)
1283 {
1284 if (strcmp (target_option_translations[tott_idx].option_found,
1285 argv[i]) == 0)
1286 {
1287 int spaces = 1;
1288 const char *sp;
1289 char *np;
1290
1291 for (sp = target_option_translations[tott_idx].replacements;
1292 *sp; sp++)
1293 {
1294 if (*sp == ' ')
1295 spaces ++;
1296 }
1297
1298 newvsize += spaces * sizeof (const char *);
1299 newv = XRESIZEVAR (const char *, newv, newvsize);
1300
1301 sp = target_option_translations[tott_idx].replacements;
1302 np = xstrdup (sp);
1303
1304 while (1)
1305 {
1306 while (*np == ' ')
1307 np++;
1308 if (*np == 0)
1309 break;
1310 newv[newindex++] = np;
1311 while (*np != ' ' && *np)
1312 np++;
1313 if (*np == 0)
1314 break;
1315 *np++ = 0;
1316 }
1317
1318 i ++;
1319 break;
1320 }
1321 }
1322 if (target_option_translations[tott_idx].option_found)
1323 continue;
1324 #endif
1325
1326 /* Translate -- options. */
1327 if (argv[i][0] == '-' && argv[i][1] == '-')
1328 {
1329 size_t j;
1330 /* Find a mapping that applies to this option. */
1331 for (j = 0; j < ARRAY_SIZE (option_map); j++)
1332 {
1333 size_t optlen = strlen (option_map[j].name);
1334 size_t arglen = strlen (argv[i]);
1335 size_t complen = arglen > optlen ? optlen : arglen;
1336 const char *arginfo = option_map[j].arg_info;
1337
1338 if (arginfo == 0)
1339 arginfo = "";
1340
1341 if (!strncmp (argv[i], option_map[j].name, complen))
1342 {
1343 const char *arg = 0;
1344
1345 if (arglen < optlen)
1346 {
1347 size_t k;
1348 for (k = j + 1; k < ARRAY_SIZE (option_map); k++)
1349 if (strlen (option_map[k].name) >= arglen
1350 && !strncmp (argv[i], option_map[k].name, arglen))
1351 {
1352 error ("ambiguous abbreviation %s", argv[i]);
1353 break;
1354 }
1355
1356 if (k != ARRAY_SIZE (option_map))
1357 break;
1358 }
1359
1360 if (arglen > optlen)
1361 {
1362 /* If the option has an argument, accept that. */
1363 if (argv[i][optlen] == '=')
1364 arg = argv[i] + optlen + 1;
1365
1366 /* If this mapping requires extra text at end of name,
1367 accept that as "argument". */
1368 else if (strchr (arginfo, '*') != 0)
1369 arg = argv[i] + optlen;
1370
1371 /* Otherwise, extra text at end means mismatch.
1372 Try other mappings. */
1373 else
1374 continue;
1375 }
1376
1377 else if (strchr (arginfo, '*') != 0)
1378 {
1379 error ("incomplete %qs option", option_map[j].name);
1380 break;
1381 }
1382
1383 /* Handle arguments. */
1384 if (strchr (arginfo, 'a') != 0)
1385 {
1386 if (arg == 0)
1387 {
1388 if (i + 1 == argc)
1389 {
1390 error ("missing argument to %qs option",
1391 option_map[j].name);
1392 break;
1393 }
1394
1395 arg = argv[++i];
1396 }
1397 }
1398 else if (strchr (arginfo, '*') != 0)
1399 ;
1400 else if (strchr (arginfo, 'o') == 0)
1401 {
1402 if (arg != 0)
1403 error ("extraneous argument to %qs option",
1404 option_map[j].name);
1405 arg = 0;
1406 }
1407
1408 /* Store the translation as one argv elt or as two. */
1409 if (arg != 0 && strchr (arginfo, 'j') != 0)
1410 newv[newindex++] = concat (option_map[j].equivalent, arg,
1411 NULL);
1412 else if (arg != 0)
1413 {
1414 newv[newindex++] = option_map[j].equivalent;
1415 newv[newindex++] = arg;
1416 }
1417 else
1418 newv[newindex++] = option_map[j].equivalent;
1419
1420 break;
1421 }
1422 }
1423 i++;
1424 }
1425
1426 /* Handle old-fashioned options--just copy them through,
1427 with their arguments. */
1428 else if (argv[i][0] == '-')
1429 {
1430 const char *p = argv[i] + 1;
1431 int c = *p;
1432 int nskip = 1;
1433
1434 if (SWITCH_TAKES_ARG (c) > (p[1] != 0))
1435 nskip += SWITCH_TAKES_ARG (c) - (p[1] != 0);
1436 else if (WORD_SWITCH_TAKES_ARG (p))
1437 nskip += WORD_SWITCH_TAKES_ARG (p);
1438 else if ((c == 'B' || c == 'b' || c == 'x')
1439 && p[1] == 0)
1440 nskip += 1;
1441 else if (! strcmp (p, "Xlinker"))
1442 nskip += 1;
1443 else if (! strcmp (p, "Xpreprocessor"))
1444 nskip += 1;
1445 else if (! strcmp (p, "Xassembler"))
1446 nskip += 1;
1447
1448 /* Watch out for an option at the end of the command line that
1449 is missing arguments, and avoid skipping past the end of the
1450 command line. */
1451 if (nskip + i > argc)
1452 nskip = argc - i;
1453
1454 while (nskip > 0)
1455 {
1456 newv[newindex++] = argv[i++];
1457 nskip--;
1458 }
1459 }
1460 else
1461 /* Ordinary operands. */
1462 newv[newindex++] = argv[i++];
1463 }
1464
1465 newv[newindex] = 0;
1466
1467 *argvp = newv;
1468 *argcp = newindex;
1469 }
1470 \f
1471 static char *
1472 skip_whitespace (char *p)
1473 {
1474 while (1)
1475 {
1476 /* A fully-blank line is a delimiter in the SPEC file and shouldn't
1477 be considered whitespace. */
1478 if (p[0] == '\n' && p[1] == '\n' && p[2] == '\n')
1479 return p + 1;
1480 else if (*p == '\n' || *p == ' ' || *p == '\t')
1481 p++;
1482 else if (*p == '#')
1483 {
1484 while (*p != '\n')
1485 p++;
1486 p++;
1487 }
1488 else
1489 break;
1490 }
1491
1492 return p;
1493 }
1494 /* Structures to keep track of prefixes to try when looking for files. */
1495
1496 struct prefix_list
1497 {
1498 const char *prefix; /* String to prepend to the path. */
1499 struct prefix_list *next; /* Next in linked list. */
1500 int require_machine_suffix; /* Don't use without machine_suffix. */
1501 /* 2 means try both machine_suffix and just_machine_suffix. */
1502 int priority; /* Sort key - priority within list. */
1503 int os_multilib; /* 1 if OS multilib scheme should be used,
1504 0 for GCC multilib scheme. */
1505 };
1506
1507 struct path_prefix
1508 {
1509 struct prefix_list *plist; /* List of prefixes to try */
1510 int max_len; /* Max length of a prefix in PLIST */
1511 const char *name; /* Name of this list (used in config stuff) */
1512 };
1513
1514 /* List of prefixes to try when looking for executables. */
1515
1516 static struct path_prefix exec_prefixes = { 0, 0, "exec" };
1517
1518 /* List of prefixes to try when looking for startup (crt0) files. */
1519
1520 static struct path_prefix startfile_prefixes = { 0, 0, "startfile" };
1521
1522 /* List of prefixes to try when looking for include files. */
1523
1524 static struct path_prefix include_prefixes = { 0, 0, "include" };
1525
1526 /* Suffix to attach to directories searched for commands.
1527 This looks like `MACHINE/VERSION/'. */
1528
1529 static const char *machine_suffix = 0;
1530
1531 /* Suffix to attach to directories searched for commands.
1532 This is just `MACHINE/'. */
1533
1534 static const char *just_machine_suffix = 0;
1535
1536 /* Adjusted value of GCC_EXEC_PREFIX envvar. */
1537
1538 static const char *gcc_exec_prefix;
1539
1540 /* Adjusted value of standard_libexec_prefix. */
1541
1542 static const char *gcc_libexec_prefix;
1543
1544 /* Default prefixes to attach to command names. */
1545
1546 #ifndef STANDARD_STARTFILE_PREFIX_1
1547 #define STANDARD_STARTFILE_PREFIX_1 "/lib/"
1548 #endif
1549 #ifndef STANDARD_STARTFILE_PREFIX_2
1550 #define STANDARD_STARTFILE_PREFIX_2 "/usr/lib/"
1551 #endif
1552
1553 #ifdef CROSS_DIRECTORY_STRUCTURE /* Don't use these prefixes for a cross compiler. */
1554 #undef MD_EXEC_PREFIX
1555 #undef MD_STARTFILE_PREFIX
1556 #undef MD_STARTFILE_PREFIX_1
1557 #endif
1558
1559 /* If no prefixes defined, use the null string, which will disable them. */
1560 #ifndef MD_EXEC_PREFIX
1561 #define MD_EXEC_PREFIX ""
1562 #endif
1563 #ifndef MD_STARTFILE_PREFIX
1564 #define MD_STARTFILE_PREFIX ""
1565 #endif
1566 #ifndef MD_STARTFILE_PREFIX_1
1567 #define MD_STARTFILE_PREFIX_1 ""
1568 #endif
1569
1570 /* These directories are locations set at configure-time based on the
1571 --prefix option provided to configure. Their initializers are
1572 defined in Makefile.in. These paths are not *directly* used when
1573 gcc_exec_prefix is set because, in that case, we know where the
1574 compiler has been installed, and use paths relative to that
1575 location instead. */
1576 static const char *const standard_exec_prefix = STANDARD_EXEC_PREFIX;
1577 static const char *const standard_libexec_prefix = STANDARD_LIBEXEC_PREFIX;
1578 static const char *const standard_bindir_prefix = STANDARD_BINDIR_PREFIX;
1579 static const char *const standard_startfile_prefix = STANDARD_STARTFILE_PREFIX;
1580
1581 /* For native compilers, these are well-known paths containing
1582 components that may be provided by the system. For cross
1583 compilers, these paths are not used. */
1584 static const char *md_exec_prefix = MD_EXEC_PREFIX;
1585 static const char *md_startfile_prefix = MD_STARTFILE_PREFIX;
1586 static const char *md_startfile_prefix_1 = MD_STARTFILE_PREFIX_1;
1587 static const char *const standard_startfile_prefix_1
1588 = STANDARD_STARTFILE_PREFIX_1;
1589 static const char *const standard_startfile_prefix_2
1590 = STANDARD_STARTFILE_PREFIX_2;
1591
1592 /* A relative path to be used in finding the location of tools
1593 relative to the driver. */
1594 static const char *const tooldir_base_prefix = TOOLDIR_BASE_PREFIX;
1595
1596 /* Subdirectory to use for locating libraries. Set by
1597 set_multilib_dir based on the compilation options. */
1598
1599 static const char *multilib_dir;
1600
1601 /* Subdirectory to use for locating libraries in OS conventions. Set by
1602 set_multilib_dir based on the compilation options. */
1603
1604 static const char *multilib_os_dir;
1605 \f
1606 /* Structure to keep track of the specs that have been defined so far.
1607 These are accessed using %(specname) or %[specname] in a compiler
1608 or link spec. */
1609
1610 struct spec_list
1611 {
1612 /* The following 2 fields must be first */
1613 /* to allow EXTRA_SPECS to be initialized */
1614 const char *name; /* name of the spec. */
1615 const char *ptr; /* available ptr if no static pointer */
1616
1617 /* The following fields are not initialized */
1618 /* by EXTRA_SPECS */
1619 const char **ptr_spec; /* pointer to the spec itself. */
1620 struct spec_list *next; /* Next spec in linked list. */
1621 int name_len; /* length of the name */
1622 int alloc_p; /* whether string was allocated */
1623 };
1624
1625 #define INIT_STATIC_SPEC(NAME,PTR) \
1626 { NAME, NULL, PTR, (struct spec_list *) 0, sizeof (NAME) - 1, 0 }
1627
1628 /* List of statically defined specs. */
1629 static struct spec_list static_specs[] =
1630 {
1631 INIT_STATIC_SPEC ("asm", &asm_spec),
1632 INIT_STATIC_SPEC ("asm_debug", &asm_debug),
1633 INIT_STATIC_SPEC ("asm_final", &asm_final_spec),
1634 INIT_STATIC_SPEC ("asm_options", &asm_options),
1635 INIT_STATIC_SPEC ("invoke_as", &invoke_as),
1636 INIT_STATIC_SPEC ("cpp", &cpp_spec),
1637 INIT_STATIC_SPEC ("cpp_options", &cpp_options),
1638 INIT_STATIC_SPEC ("cpp_debug_options", &cpp_debug_options),
1639 INIT_STATIC_SPEC ("cpp_unique_options", &cpp_unique_options),
1640 INIT_STATIC_SPEC ("trad_capable_cpp", &trad_capable_cpp),
1641 INIT_STATIC_SPEC ("cc1", &cc1_spec),
1642 INIT_STATIC_SPEC ("cc1_options", &cc1_options),
1643 INIT_STATIC_SPEC ("cc1plus", &cc1plus_spec),
1644 INIT_STATIC_SPEC ("link_gcc_c_sequence", &link_gcc_c_sequence_spec),
1645 INIT_STATIC_SPEC ("link_ssp", &link_ssp_spec),
1646 INIT_STATIC_SPEC ("endfile", &endfile_spec),
1647 INIT_STATIC_SPEC ("link", &link_spec),
1648 INIT_STATIC_SPEC ("lib", &lib_spec),
1649 INIT_STATIC_SPEC ("mfwrap", &mfwrap_spec),
1650 INIT_STATIC_SPEC ("mflib", &mflib_spec),
1651 INIT_STATIC_SPEC ("link_gomp", &link_gomp_spec),
1652 INIT_STATIC_SPEC ("libgcc", &libgcc_spec),
1653 INIT_STATIC_SPEC ("startfile", &startfile_spec),
1654 INIT_STATIC_SPEC ("switches_need_spaces", &switches_need_spaces),
1655 INIT_STATIC_SPEC ("cross_compile", &cross_compile),
1656 INIT_STATIC_SPEC ("version", &compiler_version),
1657 INIT_STATIC_SPEC ("multilib", &multilib_select),
1658 INIT_STATIC_SPEC ("multilib_defaults", &multilib_defaults),
1659 INIT_STATIC_SPEC ("multilib_extra", &multilib_extra),
1660 INIT_STATIC_SPEC ("multilib_matches", &multilib_matches),
1661 INIT_STATIC_SPEC ("multilib_exclusions", &multilib_exclusions),
1662 INIT_STATIC_SPEC ("multilib_options", &multilib_options),
1663 INIT_STATIC_SPEC ("linker", &linker_name_spec),
1664 INIT_STATIC_SPEC ("linker_plugin_file", &linker_plugin_file_spec),
1665 INIT_STATIC_SPEC ("lto_wrapper", &lto_wrapper_spec),
1666 INIT_STATIC_SPEC ("lto_gcc", &lto_gcc_spec),
1667 INIT_STATIC_SPEC ("lto_libgcc", &lto_libgcc_spec),
1668 INIT_STATIC_SPEC ("link_libgcc", &link_libgcc_spec),
1669 INIT_STATIC_SPEC ("md_exec_prefix", &md_exec_prefix),
1670 INIT_STATIC_SPEC ("md_startfile_prefix", &md_startfile_prefix),
1671 INIT_STATIC_SPEC ("md_startfile_prefix_1", &md_startfile_prefix_1),
1672 INIT_STATIC_SPEC ("startfile_prefix_spec", &startfile_prefix_spec),
1673 INIT_STATIC_SPEC ("sysroot_spec", &sysroot_spec),
1674 INIT_STATIC_SPEC ("sysroot_suffix_spec", &sysroot_suffix_spec),
1675 INIT_STATIC_SPEC ("sysroot_hdrs_suffix_spec", &sysroot_hdrs_suffix_spec),
1676 };
1677
1678 #ifdef EXTRA_SPECS /* additional specs needed */
1679 /* Structure to keep track of just the first two args of a spec_list.
1680 That is all that the EXTRA_SPECS macro gives us. */
1681 struct spec_list_1
1682 {
1683 const char *const name;
1684 const char *const ptr;
1685 };
1686
1687 static const struct spec_list_1 extra_specs_1[] = { EXTRA_SPECS };
1688 static struct spec_list *extra_specs = (struct spec_list *) 0;
1689 #endif
1690
1691 /* List of dynamically allocates specs that have been defined so far. */
1692
1693 static struct spec_list *specs = (struct spec_list *) 0;
1694 \f
1695 /* List of static spec functions. */
1696
1697 static const struct spec_function static_spec_functions[] =
1698 {
1699 { "getenv", getenv_spec_function },
1700 { "if-exists", if_exists_spec_function },
1701 { "if-exists-else", if_exists_else_spec_function },
1702 { "replace-outfile", replace_outfile_spec_function },
1703 { "version-compare", version_compare_spec_function },
1704 { "include", include_spec_function },
1705 { "find-file", find_file_spec_function },
1706 { "find-plugindir", find_plugindir_spec_function },
1707 { "print-asm-header", print_asm_header_spec_function },
1708 { "compare-debug-dump-opt", compare_debug_dump_opt_spec_function },
1709 { "compare-debug-self-opt", compare_debug_self_opt_spec_function },
1710 { "compare-debug-auxbase-opt", compare_debug_auxbase_opt_spec_function },
1711 #ifdef EXTRA_SPEC_FUNCTIONS
1712 EXTRA_SPEC_FUNCTIONS
1713 #endif
1714 { 0, 0 }
1715 };
1716
1717 static int processing_spec_function;
1718 \f
1719 /* Add appropriate libgcc specs to OBSTACK, taking into account
1720 various permutations of -shared-libgcc, -shared, and such. */
1721
1722 #if defined(ENABLE_SHARED_LIBGCC) && !defined(REAL_LIBGCC_SPEC)
1723
1724 #ifndef USE_LD_AS_NEEDED
1725 #define USE_LD_AS_NEEDED 0
1726 #endif
1727
1728 static void
1729 init_gcc_specs (struct obstack *obstack, const char *shared_name,
1730 const char *static_name, const char *eh_name)
1731 {
1732 char *buf;
1733
1734 buf = concat ("%{static|static-libgcc:", static_name, " ", eh_name, "}"
1735 "%{!static:%{!static-libgcc:"
1736 #if USE_LD_AS_NEEDED
1737 "%{!shared-libgcc:",
1738 static_name, " --as-needed ", shared_name, " --no-as-needed"
1739 "}"
1740 "%{shared-libgcc:",
1741 shared_name, "%{!shared: ", static_name, "}"
1742 "}"
1743 #else
1744 "%{!shared:"
1745 "%{!shared-libgcc:", static_name, " ", eh_name, "}"
1746 "%{shared-libgcc:", shared_name, " ", static_name, "}"
1747 "}"
1748 #ifdef LINK_EH_SPEC
1749 "%{shared:"
1750 "%{shared-libgcc:", shared_name, "}"
1751 "%{!shared-libgcc:", static_name, "}"
1752 "}"
1753 #else
1754 "%{shared:", shared_name, "}"
1755 #endif
1756 #endif
1757 "}}", NULL);
1758
1759 obstack_grow (obstack, buf, strlen (buf));
1760 free (buf);
1761 }
1762 #endif /* ENABLE_SHARED_LIBGCC */
1763
1764 /* Initialize the specs lookup routines. */
1765
1766 static void
1767 init_spec (void)
1768 {
1769 struct spec_list *next = (struct spec_list *) 0;
1770 struct spec_list *sl = (struct spec_list *) 0;
1771 int i;
1772
1773 if (specs)
1774 return; /* Already initialized. */
1775
1776 if (verbose_flag)
1777 fnotice (stderr, "Using built-in specs.\n");
1778
1779 #ifdef EXTRA_SPECS
1780 extra_specs = XCNEWVEC (struct spec_list, ARRAY_SIZE (extra_specs_1));
1781
1782 for (i = ARRAY_SIZE (extra_specs_1) - 1; i >= 0; i--)
1783 {
1784 sl = &extra_specs[i];
1785 sl->name = extra_specs_1[i].name;
1786 sl->ptr = extra_specs_1[i].ptr;
1787 sl->next = next;
1788 sl->name_len = strlen (sl->name);
1789 sl->ptr_spec = &sl->ptr;
1790 next = sl;
1791 }
1792 #endif
1793
1794 for (i = ARRAY_SIZE (static_specs) - 1; i >= 0; i--)
1795 {
1796 sl = &static_specs[i];
1797 sl->next = next;
1798 next = sl;
1799 }
1800
1801 #if defined(ENABLE_SHARED_LIBGCC) && !defined(REAL_LIBGCC_SPEC)
1802 /* ??? If neither -shared-libgcc nor --static-libgcc was
1803 seen, then we should be making an educated guess. Some proposed
1804 heuristics for ELF include:
1805
1806 (1) If "-Wl,--export-dynamic", then it's a fair bet that the
1807 program will be doing dynamic loading, which will likely
1808 need the shared libgcc.
1809
1810 (2) If "-ldl", then it's also a fair bet that we're doing
1811 dynamic loading.
1812
1813 (3) For each ET_DYN we're linking against (either through -lfoo
1814 or /some/path/foo.so), check to see whether it or one of
1815 its dependencies depends on a shared libgcc.
1816
1817 (4) If "-shared"
1818
1819 If the runtime is fixed to look for program headers instead
1820 of calling __register_frame_info at all, for each object,
1821 use the shared libgcc if any EH symbol referenced.
1822
1823 If crtstuff is fixed to not invoke __register_frame_info
1824 automatically, for each object, use the shared libgcc if
1825 any non-empty unwind section found.
1826
1827 Doing any of this probably requires invoking an external program to
1828 do the actual object file scanning. */
1829 {
1830 const char *p = libgcc_spec;
1831 int in_sep = 1;
1832
1833 /* Transform the extant libgcc_spec into one that uses the shared libgcc
1834 when given the proper command line arguments. */
1835 while (*p)
1836 {
1837 if (in_sep && *p == '-' && strncmp (p, "-lgcc", 5) == 0)
1838 {
1839 init_gcc_specs (&obstack,
1840 "-lgcc_s"
1841 #ifdef USE_LIBUNWIND_EXCEPTIONS
1842 " -lunwind"
1843 #endif
1844 ,
1845 "-lgcc",
1846 "-lgcc_eh"
1847 #ifdef USE_LIBUNWIND_EXCEPTIONS
1848 # ifdef HAVE_LD_STATIC_DYNAMIC
1849 " %{!static:-Bstatic} -lunwind %{!static:-Bdynamic}"
1850 # else
1851 " -lunwind"
1852 # endif
1853 #endif
1854 );
1855
1856 p += 5;
1857 in_sep = 0;
1858 }
1859 else if (in_sep && *p == 'l' && strncmp (p, "libgcc.a%s", 10) == 0)
1860 {
1861 /* Ug. We don't know shared library extensions. Hope that
1862 systems that use this form don't do shared libraries. */
1863 init_gcc_specs (&obstack,
1864 "-lgcc_s",
1865 "libgcc.a%s",
1866 "libgcc_eh.a%s"
1867 #ifdef USE_LIBUNWIND_EXCEPTIONS
1868 " -lunwind"
1869 #endif
1870 );
1871 p += 10;
1872 in_sep = 0;
1873 }
1874 else
1875 {
1876 obstack_1grow (&obstack, *p);
1877 in_sep = (*p == ' ');
1878 p += 1;
1879 }
1880 }
1881
1882 obstack_1grow (&obstack, '\0');
1883 libgcc_spec = XOBFINISH (&obstack, const char *);
1884 }
1885 #endif
1886 #ifdef USE_AS_TRADITIONAL_FORMAT
1887 /* Prepend "--traditional-format" to whatever asm_spec we had before. */
1888 {
1889 static const char tf[] = "--traditional-format ";
1890 obstack_grow (&obstack, tf, sizeof(tf) - 1);
1891 obstack_grow0 (&obstack, asm_spec, strlen (asm_spec));
1892 asm_spec = XOBFINISH (&obstack, const char *);
1893 }
1894 #endif
1895
1896 #if defined LINK_EH_SPEC || defined LINK_BUILDID_SPEC
1897 # ifdef LINK_BUILDID_SPEC
1898 /* Prepend LINK_BUILDID_SPEC to whatever link_spec we had before. */
1899 obstack_grow (&obstack, LINK_BUILDID_SPEC, sizeof(LINK_BUILDID_SPEC) - 1);
1900 # endif
1901 # ifdef LINK_EH_SPEC
1902 /* Prepend LINK_EH_SPEC to whatever link_spec we had before. */
1903 obstack_grow (&obstack, LINK_EH_SPEC, sizeof(LINK_EH_SPEC) - 1);
1904 # endif
1905 obstack_grow0 (&obstack, link_spec, strlen (link_spec));
1906 link_spec = XOBFINISH (&obstack, const char *);
1907 #endif
1908
1909 specs = sl;
1910 }
1911 \f
1912 /* Change the value of spec NAME to SPEC. If SPEC is empty, then the spec is
1913 removed; If the spec starts with a + then SPEC is added to the end of the
1914 current spec. */
1915
1916 static void
1917 set_spec (const char *name, const char *spec)
1918 {
1919 struct spec_list *sl;
1920 const char *old_spec;
1921 int name_len = strlen (name);
1922 int i;
1923
1924 /* If this is the first call, initialize the statically allocated specs. */
1925 if (!specs)
1926 {
1927 struct spec_list *next = (struct spec_list *) 0;
1928 for (i = ARRAY_SIZE (static_specs) - 1; i >= 0; i--)
1929 {
1930 sl = &static_specs[i];
1931 sl->next = next;
1932 next = sl;
1933 }
1934 specs = sl;
1935 }
1936
1937 /* See if the spec already exists. */
1938 for (sl = specs; sl; sl = sl->next)
1939 if (name_len == sl->name_len && !strcmp (sl->name, name))
1940 break;
1941
1942 if (!sl)
1943 {
1944 /* Not found - make it. */
1945 sl = XNEW (struct spec_list);
1946 sl->name = xstrdup (name);
1947 sl->name_len = name_len;
1948 sl->ptr_spec = &sl->ptr;
1949 sl->alloc_p = 0;
1950 *(sl->ptr_spec) = "";
1951 sl->next = specs;
1952 specs = sl;
1953 }
1954
1955 old_spec = *(sl->ptr_spec);
1956 *(sl->ptr_spec) = ((spec[0] == '+' && ISSPACE ((unsigned char)spec[1]))
1957 ? concat (old_spec, spec + 1, NULL)
1958 : xstrdup (spec));
1959
1960 #ifdef DEBUG_SPECS
1961 if (verbose_flag)
1962 fnotice (stderr, "Setting spec %s to '%s'\n\n", name, *(sl->ptr_spec));
1963 #endif
1964
1965 /* Free the old spec. */
1966 if (old_spec && sl->alloc_p)
1967 free (CONST_CAST(char *, old_spec));
1968
1969 sl->alloc_p = 1;
1970 }
1971 \f
1972 /* Accumulate a command (program name and args), and run it. */
1973
1974 /* Vector of pointers to arguments in the current line of specifications. */
1975
1976 static const char **argbuf;
1977
1978 /* Number of elements allocated in argbuf. */
1979
1980 static int argbuf_length;
1981
1982 /* Number of elements in argbuf currently in use (containing args). */
1983
1984 static int argbuf_index;
1985
1986 /* Position in the argbuf array containing the name of the output file
1987 (the value associated with the "-o" flag). */
1988
1989 static int have_o_argbuf_index = 0;
1990
1991 /* Were the options -c, -S or -E passed. */
1992 static int have_c = 0;
1993
1994 /* Was the option -o passed. */
1995 static int have_o = 0;
1996
1997 /* This is the list of suffixes and codes (%g/%u/%U/%j) and the associated
1998 temp file. If the HOST_BIT_BUCKET is used for %j, no entry is made for
1999 it here. */
2000
2001 static struct temp_name {
2002 const char *suffix; /* suffix associated with the code. */
2003 int length; /* strlen (suffix). */
2004 int unique; /* Indicates whether %g or %u/%U was used. */
2005 const char *filename; /* associated filename. */
2006 int filename_length; /* strlen (filename). */
2007 struct temp_name *next;
2008 } *temp_names;
2009
2010 /* Number of commands executed so far. */
2011
2012 static int execution_count;
2013
2014 /* Number of commands that exited with a signal. */
2015
2016 static int signal_count;
2017 \f
2018 /* Allocate the argument vector. */
2019
2020 static void
2021 alloc_args (void)
2022 {
2023 argbuf_length = 10;
2024 argbuf = XNEWVEC (const char *, argbuf_length);
2025 }
2026
2027 /* Clear out the vector of arguments (after a command is executed). */
2028
2029 static void
2030 clear_args (void)
2031 {
2032 argbuf_index = 0;
2033 }
2034
2035 /* Add one argument to the vector at the end.
2036 This is done when a space is seen or at the end of the line.
2037 If DELETE_ALWAYS is nonzero, the arg is a filename
2038 and the file should be deleted eventually.
2039 If DELETE_FAILURE is nonzero, the arg is a filename
2040 and the file should be deleted if this compilation fails. */
2041
2042 static void
2043 store_arg (const char *arg, int delete_always, int delete_failure)
2044 {
2045 if (argbuf_index + 1 == argbuf_length)
2046 argbuf = XRESIZEVEC (const char *, argbuf, (argbuf_length *= 2));
2047
2048 argbuf[argbuf_index++] = arg;
2049 argbuf[argbuf_index] = 0;
2050
2051 if (strcmp (arg, "-o") == 0)
2052 have_o_argbuf_index = argbuf_index;
2053 if (delete_always || delete_failure)
2054 {
2055 const char *p;
2056 /* If the temporary file we should delete is specified as
2057 part of a joined argument extract the filename. */
2058 if (arg[0] == '-'
2059 && (p = strrchr (arg, '=')))
2060 arg = p + 1;
2061 record_temp_file (arg, delete_always, delete_failure);
2062 }
2063 }
2064 \f
2065 /* Load specs from a file name named FILENAME, replacing occurrences of
2066 various different types of line-endings, \r\n, \n\r and just \r, with
2067 a single \n. */
2068
2069 static char *
2070 load_specs (const char *filename)
2071 {
2072 int desc;
2073 int readlen;
2074 struct stat statbuf;
2075 char *buffer;
2076 char *buffer_p;
2077 char *specs;
2078 char *specs_p;
2079
2080 if (verbose_flag)
2081 fnotice (stderr, "Reading specs from %s\n", filename);
2082
2083 /* Open and stat the file. */
2084 desc = open (filename, O_RDONLY, 0);
2085 if (desc < 0)
2086 pfatal_with_name (filename);
2087 if (stat (filename, &statbuf) < 0)
2088 pfatal_with_name (filename);
2089
2090 /* Read contents of file into BUFFER. */
2091 buffer = XNEWVEC (char, statbuf.st_size + 1);
2092 readlen = read (desc, buffer, (unsigned) statbuf.st_size);
2093 if (readlen < 0)
2094 pfatal_with_name (filename);
2095 buffer[readlen] = 0;
2096 close (desc);
2097
2098 specs = XNEWVEC (char, readlen + 1);
2099 specs_p = specs;
2100 for (buffer_p = buffer; buffer_p && *buffer_p; buffer_p++)
2101 {
2102 int skip = 0;
2103 char c = *buffer_p;
2104 if (c == '\r')
2105 {
2106 if (buffer_p > buffer && *(buffer_p - 1) == '\n') /* \n\r */
2107 skip = 1;
2108 else if (*(buffer_p + 1) == '\n') /* \r\n */
2109 skip = 1;
2110 else /* \r */
2111 c = '\n';
2112 }
2113 if (! skip)
2114 *specs_p++ = c;
2115 }
2116 *specs_p = '\0';
2117
2118 free (buffer);
2119 return (specs);
2120 }
2121
2122 /* Read compilation specs from a file named FILENAME,
2123 replacing the default ones.
2124
2125 A suffix which starts with `*' is a definition for
2126 one of the machine-specific sub-specs. The "suffix" should be
2127 *asm, *cc1, *cpp, *link, *startfile, etc.
2128 The corresponding spec is stored in asm_spec, etc.,
2129 rather than in the `compilers' vector.
2130
2131 Anything invalid in the file is a fatal error. */
2132
2133 static void
2134 read_specs (const char *filename, int main_p)
2135 {
2136 char *buffer;
2137 char *p;
2138
2139 buffer = load_specs (filename);
2140
2141 /* Scan BUFFER for specs, putting them in the vector. */
2142 p = buffer;
2143 while (1)
2144 {
2145 char *suffix;
2146 char *spec;
2147 char *in, *out, *p1, *p2, *p3;
2148
2149 /* Advance P in BUFFER to the next nonblank nocomment line. */
2150 p = skip_whitespace (p);
2151 if (*p == 0)
2152 break;
2153
2154 /* Is this a special command that starts with '%'? */
2155 /* Don't allow this for the main specs file, since it would
2156 encourage people to overwrite it. */
2157 if (*p == '%' && !main_p)
2158 {
2159 p1 = p;
2160 while (*p && *p != '\n')
2161 p++;
2162
2163 /* Skip '\n'. */
2164 p++;
2165
2166 if (!strncmp (p1, "%include", sizeof ("%include") - 1)
2167 && (p1[sizeof "%include" - 1] == ' '
2168 || p1[sizeof "%include" - 1] == '\t'))
2169 {
2170 char *new_filename;
2171
2172 p1 += sizeof ("%include");
2173 while (*p1 == ' ' || *p1 == '\t')
2174 p1++;
2175
2176 if (*p1++ != '<' || p[-2] != '>')
2177 fatal_error ("specs %%include syntax malformed after "
2178 "%ld characters",
2179 (long) (p1 - buffer + 1));
2180
2181 p[-2] = '\0';
2182 new_filename = find_a_file (&startfile_prefixes, p1, R_OK, true);
2183 read_specs (new_filename ? new_filename : p1, FALSE);
2184 continue;
2185 }
2186 else if (!strncmp (p1, "%include_noerr", sizeof "%include_noerr" - 1)
2187 && (p1[sizeof "%include_noerr" - 1] == ' '
2188 || p1[sizeof "%include_noerr" - 1] == '\t'))
2189 {
2190 char *new_filename;
2191
2192 p1 += sizeof "%include_noerr";
2193 while (*p1 == ' ' || *p1 == '\t')
2194 p1++;
2195
2196 if (*p1++ != '<' || p[-2] != '>')
2197 fatal_error ("specs %%include syntax malformed after "
2198 "%ld characters",
2199 (long) (p1 - buffer + 1));
2200
2201 p[-2] = '\0';
2202 new_filename = find_a_file (&startfile_prefixes, p1, R_OK, true);
2203 if (new_filename)
2204 read_specs (new_filename, FALSE);
2205 else if (verbose_flag)
2206 fnotice (stderr, "could not find specs file %s\n", p1);
2207 continue;
2208 }
2209 else if (!strncmp (p1, "%rename", sizeof "%rename" - 1)
2210 && (p1[sizeof "%rename" - 1] == ' '
2211 || p1[sizeof "%rename" - 1] == '\t'))
2212 {
2213 int name_len;
2214 struct spec_list *sl;
2215 struct spec_list *newsl;
2216
2217 /* Get original name. */
2218 p1 += sizeof "%rename";
2219 while (*p1 == ' ' || *p1 == '\t')
2220 p1++;
2221
2222 if (! ISALPHA ((unsigned char) *p1))
2223 fatal_error ("specs %%rename syntax malformed after "
2224 "%ld characters",
2225 (long) (p1 - buffer));
2226
2227 p2 = p1;
2228 while (*p2 && !ISSPACE ((unsigned char) *p2))
2229 p2++;
2230
2231 if (*p2 != ' ' && *p2 != '\t')
2232 fatal_error ("specs %%rename syntax malformed after "
2233 "%ld characters",
2234 (long) (p2 - buffer));
2235
2236 name_len = p2 - p1;
2237 *p2++ = '\0';
2238 while (*p2 == ' ' || *p2 == '\t')
2239 p2++;
2240
2241 if (! ISALPHA ((unsigned char) *p2))
2242 fatal_error ("specs %%rename syntax malformed after "
2243 "%ld characters",
2244 (long) (p2 - buffer));
2245
2246 /* Get new spec name. */
2247 p3 = p2;
2248 while (*p3 && !ISSPACE ((unsigned char) *p3))
2249 p3++;
2250
2251 if (p3 != p - 1)
2252 fatal_error ("specs %%rename syntax malformed after "
2253 "%ld characters",
2254 (long) (p3 - buffer));
2255 *p3 = '\0';
2256
2257 for (sl = specs; sl; sl = sl->next)
2258 if (name_len == sl->name_len && !strcmp (sl->name, p1))
2259 break;
2260
2261 if (!sl)
2262 fatal_error ("specs %s spec was not found to be renamed", p1);
2263
2264 if (strcmp (p1, p2) == 0)
2265 continue;
2266
2267 for (newsl = specs; newsl; newsl = newsl->next)
2268 if (strcmp (newsl->name, p2) == 0)
2269 fatal_error ("%s: attempt to rename spec %qs to "
2270 "already defined spec %qs",
2271 filename, p1, p2);
2272
2273 if (verbose_flag)
2274 {
2275 fnotice (stderr, "rename spec %s to %s\n", p1, p2);
2276 #ifdef DEBUG_SPECS
2277 fnotice (stderr, "spec is '%s'\n\n", *(sl->ptr_spec));
2278 #endif
2279 }
2280
2281 set_spec (p2, *(sl->ptr_spec));
2282 if (sl->alloc_p)
2283 free (CONST_CAST (char *, *(sl->ptr_spec)));
2284
2285 *(sl->ptr_spec) = "";
2286 sl->alloc_p = 0;
2287 continue;
2288 }
2289 else
2290 fatal_error ("specs unknown %% command after %ld characters",
2291 (long) (p1 - buffer));
2292 }
2293
2294 /* Find the colon that should end the suffix. */
2295 p1 = p;
2296 while (*p1 && *p1 != ':' && *p1 != '\n')
2297 p1++;
2298
2299 /* The colon shouldn't be missing. */
2300 if (*p1 != ':')
2301 fatal_error ("specs file malformed after %ld characters",
2302 (long) (p1 - buffer));
2303
2304 /* Skip back over trailing whitespace. */
2305 p2 = p1;
2306 while (p2 > buffer && (p2[-1] == ' ' || p2[-1] == '\t'))
2307 p2--;
2308
2309 /* Copy the suffix to a string. */
2310 suffix = save_string (p, p2 - p);
2311 /* Find the next line. */
2312 p = skip_whitespace (p1 + 1);
2313 if (p[1] == 0)
2314 fatal_error ("specs file malformed after %ld characters",
2315 (long) (p - buffer));
2316
2317 p1 = p;
2318 /* Find next blank line or end of string. */
2319 while (*p1 && !(*p1 == '\n' && (p1[1] == '\n' || p1[1] == '\0')))
2320 p1++;
2321
2322 /* Specs end at the blank line and do not include the newline. */
2323 spec = save_string (p, p1 - p);
2324 p = p1;
2325
2326 /* Delete backslash-newline sequences from the spec. */
2327 in = spec;
2328 out = spec;
2329 while (*in != 0)
2330 {
2331 if (in[0] == '\\' && in[1] == '\n')
2332 in += 2;
2333 else if (in[0] == '#')
2334 while (*in && *in != '\n')
2335 in++;
2336
2337 else
2338 *out++ = *in++;
2339 }
2340 *out = 0;
2341
2342 if (suffix[0] == '*')
2343 {
2344 if (! strcmp (suffix, "*link_command"))
2345 link_command_spec = spec;
2346 else
2347 set_spec (suffix + 1, spec);
2348 }
2349 else
2350 {
2351 /* Add this pair to the vector. */
2352 compilers
2353 = XRESIZEVEC (struct compiler, compilers, n_compilers + 2);
2354
2355 compilers[n_compilers].suffix = suffix;
2356 compilers[n_compilers].spec = spec;
2357 n_compilers++;
2358 memset (&compilers[n_compilers], 0, sizeof compilers[n_compilers]);
2359 }
2360
2361 if (*suffix == 0)
2362 link_command_spec = spec;
2363 }
2364
2365 if (link_command_spec == 0)
2366 fatal_error ("spec file has no spec for linking");
2367 }
2368 \f
2369 /* Record the names of temporary files we tell compilers to write,
2370 and delete them at the end of the run. */
2371
2372 /* This is the common prefix we use to make temp file names.
2373 It is chosen once for each run of this program.
2374 It is substituted into a spec by %g or %j.
2375 Thus, all temp file names contain this prefix.
2376 In practice, all temp file names start with this prefix.
2377
2378 This prefix comes from the envvar TMPDIR if it is defined;
2379 otherwise, from the P_tmpdir macro if that is defined;
2380 otherwise, in /usr/tmp or /tmp;
2381 or finally the current directory if all else fails. */
2382
2383 static const char *temp_filename;
2384
2385 /* Length of the prefix. */
2386
2387 static int temp_filename_length;
2388
2389 /* Define the list of temporary files to delete. */
2390
2391 struct temp_file
2392 {
2393 const char *name;
2394 struct temp_file *next;
2395 };
2396
2397 /* Queue of files to delete on success or failure of compilation. */
2398 static struct temp_file *always_delete_queue;
2399 /* Queue of files to delete on failure of compilation. */
2400 static struct temp_file *failure_delete_queue;
2401
2402 /* Record FILENAME as a file to be deleted automatically.
2403 ALWAYS_DELETE nonzero means delete it if all compilation succeeds;
2404 otherwise delete it in any case.
2405 FAIL_DELETE nonzero means delete it if a compilation step fails;
2406 otherwise delete it in any case. */
2407
2408 void
2409 record_temp_file (const char *filename, int always_delete, int fail_delete)
2410 {
2411 char *const name = xstrdup (filename);
2412
2413 if (always_delete)
2414 {
2415 struct temp_file *temp;
2416 for (temp = always_delete_queue; temp; temp = temp->next)
2417 if (! strcmp (name, temp->name))
2418 goto already1;
2419
2420 temp = XNEW (struct temp_file);
2421 temp->next = always_delete_queue;
2422 temp->name = name;
2423 always_delete_queue = temp;
2424
2425 already1:;
2426 }
2427
2428 if (fail_delete)
2429 {
2430 struct temp_file *temp;
2431 for (temp = failure_delete_queue; temp; temp = temp->next)
2432 if (! strcmp (name, temp->name))
2433 goto already2;
2434
2435 temp = XNEW (struct temp_file);
2436 temp->next = failure_delete_queue;
2437 temp->name = name;
2438 failure_delete_queue = temp;
2439
2440 already2:;
2441 }
2442 }
2443
2444 /* Delete all the temporary files whose names we previously recorded. */
2445
2446 #ifndef DELETE_IF_ORDINARY
2447 #define DELETE_IF_ORDINARY(NAME,ST,VERBOSE_FLAG) \
2448 do \
2449 { \
2450 if (stat (NAME, &ST) >= 0 && S_ISREG (ST.st_mode)) \
2451 if (unlink (NAME) < 0) \
2452 if (VERBOSE_FLAG) \
2453 perror_with_name (NAME); \
2454 } while (0)
2455 #endif
2456
2457 static void
2458 delete_if_ordinary (const char *name)
2459 {
2460 struct stat st;
2461 #ifdef DEBUG
2462 int i, c;
2463
2464 printf ("Delete %s? (y or n) ", name);
2465 fflush (stdout);
2466 i = getchar ();
2467 if (i != '\n')
2468 while ((c = getchar ()) != '\n' && c != EOF)
2469 ;
2470
2471 if (i == 'y' || i == 'Y')
2472 #endif /* DEBUG */
2473 DELETE_IF_ORDINARY (name, st, verbose_flag);
2474 }
2475
2476 static void
2477 delete_temp_files (void)
2478 {
2479 struct temp_file *temp;
2480
2481 for (temp = always_delete_queue; temp; temp = temp->next)
2482 delete_if_ordinary (temp->name);
2483 always_delete_queue = 0;
2484 }
2485
2486 /* Delete all the files to be deleted on error. */
2487
2488 static void
2489 delete_failure_queue (void)
2490 {
2491 struct temp_file *temp;
2492
2493 for (temp = failure_delete_queue; temp; temp = temp->next)
2494 delete_if_ordinary (temp->name);
2495 }
2496
2497 static void
2498 clear_failure_queue (void)
2499 {
2500 failure_delete_queue = 0;
2501 }
2502 \f
2503 /* Call CALLBACK for each path in PATHS, breaking out early if CALLBACK
2504 returns non-NULL.
2505 If DO_MULTI is true iterate over the paths twice, first with multilib
2506 suffix then without, otherwise iterate over the paths once without
2507 adding a multilib suffix. When DO_MULTI is true, some attempt is made
2508 to avoid visiting the same path twice, but we could do better. For
2509 instance, /usr/lib/../lib is considered different from /usr/lib.
2510 At least EXTRA_SPACE chars past the end of the path passed to
2511 CALLBACK are available for use by the callback.
2512 CALLBACK_INFO allows extra parameters to be passed to CALLBACK.
2513
2514 Returns the value returned by CALLBACK. */
2515
2516 static void *
2517 for_each_path (const struct path_prefix *paths,
2518 bool do_multi,
2519 size_t extra_space,
2520 void *(*callback) (char *, void *),
2521 void *callback_info)
2522 {
2523 struct prefix_list *pl;
2524 const char *multi_dir = NULL;
2525 const char *multi_os_dir = NULL;
2526 const char *multi_suffix;
2527 const char *just_multi_suffix;
2528 char *path = NULL;
2529 void *ret = NULL;
2530 bool skip_multi_dir = false;
2531 bool skip_multi_os_dir = false;
2532
2533 multi_suffix = machine_suffix;
2534 just_multi_suffix = just_machine_suffix;
2535 if (do_multi && multilib_dir && strcmp (multilib_dir, ".") != 0)
2536 {
2537 multi_dir = concat (multilib_dir, dir_separator_str, NULL);
2538 multi_suffix = concat (multi_suffix, multi_dir, NULL);
2539 just_multi_suffix = concat (just_multi_suffix, multi_dir, NULL);
2540 }
2541 if (do_multi && multilib_os_dir && strcmp (multilib_os_dir, ".") != 0)
2542 multi_os_dir = concat (multilib_os_dir, dir_separator_str, NULL);
2543
2544 while (1)
2545 {
2546 size_t multi_dir_len = 0;
2547 size_t multi_os_dir_len = 0;
2548 size_t suffix_len;
2549 size_t just_suffix_len;
2550 size_t len;
2551
2552 if (multi_dir)
2553 multi_dir_len = strlen (multi_dir);
2554 if (multi_os_dir)
2555 multi_os_dir_len = strlen (multi_os_dir);
2556 suffix_len = strlen (multi_suffix);
2557 just_suffix_len = strlen (just_multi_suffix);
2558
2559 if (path == NULL)
2560 {
2561 len = paths->max_len + extra_space + 1;
2562 if (suffix_len > multi_os_dir_len)
2563 len += suffix_len;
2564 else
2565 len += multi_os_dir_len;
2566 path = XNEWVEC (char, len);
2567 }
2568
2569 for (pl = paths->plist; pl != 0; pl = pl->next)
2570 {
2571 len = strlen (pl->prefix);
2572 memcpy (path, pl->prefix, len);
2573
2574 /* Look first in MACHINE/VERSION subdirectory. */
2575 if (!skip_multi_dir)
2576 {
2577 memcpy (path + len, multi_suffix, suffix_len + 1);
2578 ret = callback (path, callback_info);
2579 if (ret)
2580 break;
2581 }
2582
2583 /* Some paths are tried with just the machine (ie. target)
2584 subdir. This is used for finding as, ld, etc. */
2585 if (!skip_multi_dir
2586 && pl->require_machine_suffix == 2)
2587 {
2588 memcpy (path + len, just_multi_suffix, just_suffix_len + 1);
2589 ret = callback (path, callback_info);
2590 if (ret)
2591 break;
2592 }
2593
2594 /* Now try the base path. */
2595 if (!pl->require_machine_suffix
2596 && !(pl->os_multilib ? skip_multi_os_dir : skip_multi_dir))
2597 {
2598 const char *this_multi;
2599 size_t this_multi_len;
2600
2601 if (pl->os_multilib)
2602 {
2603 this_multi = multi_os_dir;
2604 this_multi_len = multi_os_dir_len;
2605 }
2606 else
2607 {
2608 this_multi = multi_dir;
2609 this_multi_len = multi_dir_len;
2610 }
2611
2612 if (this_multi_len)
2613 memcpy (path + len, this_multi, this_multi_len + 1);
2614 else
2615 path[len] = '\0';
2616
2617 ret = callback (path, callback_info);
2618 if (ret)
2619 break;
2620 }
2621 }
2622 if (pl)
2623 break;
2624
2625 if (multi_dir == NULL && multi_os_dir == NULL)
2626 break;
2627
2628 /* Run through the paths again, this time without multilibs.
2629 Don't repeat any we have already seen. */
2630 if (multi_dir)
2631 {
2632 free (CONST_CAST (char *, multi_dir));
2633 multi_dir = NULL;
2634 free (CONST_CAST (char *, multi_suffix));
2635 multi_suffix = machine_suffix;
2636 free (CONST_CAST (char *, just_multi_suffix));
2637 just_multi_suffix = just_machine_suffix;
2638 }
2639 else
2640 skip_multi_dir = true;
2641 if (multi_os_dir)
2642 {
2643 free (CONST_CAST (char *, multi_os_dir));
2644 multi_os_dir = NULL;
2645 }
2646 else
2647 skip_multi_os_dir = true;
2648 }
2649
2650 if (multi_dir)
2651 {
2652 free (CONST_CAST (char *, multi_dir));
2653 free (CONST_CAST (char *, multi_suffix));
2654 free (CONST_CAST (char *, just_multi_suffix));
2655 }
2656 if (multi_os_dir)
2657 free (CONST_CAST (char *, multi_os_dir));
2658 if (ret != path)
2659 free (path);
2660 return ret;
2661 }
2662
2663 /* Callback for build_search_list. Adds path to obstack being built. */
2664
2665 struct add_to_obstack_info {
2666 struct obstack *ob;
2667 bool check_dir;
2668 bool first_time;
2669 };
2670
2671 static void *
2672 add_to_obstack (char *path, void *data)
2673 {
2674 struct add_to_obstack_info *info = (struct add_to_obstack_info *) data;
2675
2676 if (info->check_dir && !is_directory (path, false))
2677 return NULL;
2678
2679 if (!info->first_time)
2680 obstack_1grow (info->ob, PATH_SEPARATOR);
2681
2682 obstack_grow (info->ob, path, strlen (path));
2683
2684 info->first_time = false;
2685 return NULL;
2686 }
2687
2688 /* Add or change the value of an environment variable, outputting the
2689 change to standard error if in verbose mode. */
2690 static void
2691 xputenv (const char *string)
2692 {
2693 if (verbose_flag)
2694 fnotice (stderr, "%s\n", string);
2695 putenv (CONST_CAST (char *, string));
2696 }
2697
2698 /* Build a list of search directories from PATHS.
2699 PREFIX is a string to prepend to the list.
2700 If CHECK_DIR_P is true we ensure the directory exists.
2701 If DO_MULTI is true, multilib paths are output first, then
2702 non-multilib paths.
2703 This is used mostly by putenv_from_prefixes so we use `collect_obstack'.
2704 It is also used by the --print-search-dirs flag. */
2705
2706 static char *
2707 build_search_list (const struct path_prefix *paths, const char *prefix,
2708 bool check_dir, bool do_multi)
2709 {
2710 struct add_to_obstack_info info;
2711
2712 info.ob = &collect_obstack;
2713 info.check_dir = check_dir;
2714 info.first_time = true;
2715
2716 obstack_grow (&collect_obstack, prefix, strlen (prefix));
2717 obstack_1grow (&collect_obstack, '=');
2718
2719 for_each_path (paths, do_multi, 0, add_to_obstack, &info);
2720
2721 obstack_1grow (&collect_obstack, '\0');
2722 return XOBFINISH (&collect_obstack, char *);
2723 }
2724
2725 /* Rebuild the COMPILER_PATH and LIBRARY_PATH environment variables
2726 for collect. */
2727
2728 static void
2729 putenv_from_prefixes (const struct path_prefix *paths, const char *env_var,
2730 bool do_multi)
2731 {
2732 xputenv (build_search_list (paths, env_var, true, do_multi));
2733 }
2734 \f
2735 /* Check whether NAME can be accessed in MODE. This is like access,
2736 except that it never considers directories to be executable. */
2737
2738 static int
2739 access_check (const char *name, int mode)
2740 {
2741 if (mode == X_OK)
2742 {
2743 struct stat st;
2744
2745 if (stat (name, &st) < 0
2746 || S_ISDIR (st.st_mode))
2747 return -1;
2748 }
2749
2750 return access (name, mode);
2751 }
2752
2753 /* Callback for find_a_file. Appends the file name to the directory
2754 path. If the resulting file exists in the right mode, return the
2755 full pathname to the file. */
2756
2757 struct file_at_path_info {
2758 const char *name;
2759 const char *suffix;
2760 int name_len;
2761 int suffix_len;
2762 int mode;
2763 };
2764
2765 static void *
2766 file_at_path (char *path, void *data)
2767 {
2768 struct file_at_path_info *info = (struct file_at_path_info *) data;
2769 size_t len = strlen (path);
2770
2771 memcpy (path + len, info->name, info->name_len);
2772 len += info->name_len;
2773
2774 /* Some systems have a suffix for executable files.
2775 So try appending that first. */
2776 if (info->suffix_len)
2777 {
2778 memcpy (path + len, info->suffix, info->suffix_len + 1);
2779 if (access_check (path, info->mode) == 0)
2780 return path;
2781 }
2782
2783 path[len] = '\0';
2784 if (access_check (path, info->mode) == 0)
2785 return path;
2786
2787 return NULL;
2788 }
2789
2790 /* Search for NAME using the prefix list PREFIXES. MODE is passed to
2791 access to check permissions. If DO_MULTI is true, search multilib
2792 paths then non-multilib paths, otherwise do not search multilib paths.
2793 Return 0 if not found, otherwise return its name, allocated with malloc. */
2794
2795 static char *
2796 find_a_file (const struct path_prefix *pprefix, const char *name, int mode,
2797 bool do_multi)
2798 {
2799 struct file_at_path_info info;
2800
2801 #ifdef DEFAULT_ASSEMBLER
2802 if (! strcmp (name, "as") && access (DEFAULT_ASSEMBLER, mode) == 0)
2803 return xstrdup (DEFAULT_ASSEMBLER);
2804 #endif
2805
2806 #ifdef DEFAULT_LINKER
2807 if (! strcmp(name, "ld") && access (DEFAULT_LINKER, mode) == 0)
2808 return xstrdup (DEFAULT_LINKER);
2809 #endif
2810
2811 /* Determine the filename to execute (special case for absolute paths). */
2812
2813 if (IS_ABSOLUTE_PATH (name))
2814 {
2815 if (access (name, mode) == 0)
2816 return xstrdup (name);
2817
2818 return NULL;
2819 }
2820
2821 info.name = name;
2822 info.suffix = (mode & X_OK) != 0 ? HOST_EXECUTABLE_SUFFIX : "";
2823 info.name_len = strlen (info.name);
2824 info.suffix_len = strlen (info.suffix);
2825 info.mode = mode;
2826
2827 return (char*) for_each_path (pprefix, do_multi,
2828 info.name_len + info.suffix_len,
2829 file_at_path, &info);
2830 }
2831
2832 /* Ranking of prefixes in the sort list. -B prefixes are put before
2833 all others. */
2834
2835 enum path_prefix_priority
2836 {
2837 PREFIX_PRIORITY_B_OPT,
2838 PREFIX_PRIORITY_LAST
2839 };
2840
2841 /* Add an entry for PREFIX in PLIST. The PLIST is kept in ascending
2842 order according to PRIORITY. Within each PRIORITY, new entries are
2843 appended.
2844
2845 If WARN is nonzero, we will warn if no file is found
2846 through this prefix. WARN should point to an int
2847 which will be set to 1 if this entry is used.
2848
2849 COMPONENT is the value to be passed to update_path.
2850
2851 REQUIRE_MACHINE_SUFFIX is 1 if this prefix can't be used without
2852 the complete value of machine_suffix.
2853 2 means try both machine_suffix and just_machine_suffix. */
2854
2855 static void
2856 add_prefix (struct path_prefix *pprefix, const char *prefix,
2857 const char *component, /* enum prefix_priority */ int priority,
2858 int require_machine_suffix, int os_multilib)
2859 {
2860 struct prefix_list *pl, **prev;
2861 int len;
2862
2863 for (prev = &pprefix->plist;
2864 (*prev) != NULL && (*prev)->priority <= priority;
2865 prev = &(*prev)->next)
2866 ;
2867
2868 /* Keep track of the longest prefix. */
2869
2870 prefix = update_path (prefix, component);
2871 len = strlen (prefix);
2872 if (len > pprefix->max_len)
2873 pprefix->max_len = len;
2874
2875 pl = XNEW (struct prefix_list);
2876 pl->prefix = prefix;
2877 pl->require_machine_suffix = require_machine_suffix;
2878 pl->priority = priority;
2879 pl->os_multilib = os_multilib;
2880
2881 /* Insert after PREV. */
2882 pl->next = (*prev);
2883 (*prev) = pl;
2884 }
2885
2886 /* Same as add_prefix, but prepending target_system_root to prefix. */
2887 /* The target_system_root prefix has been relocated by gcc_exec_prefix. */
2888 static void
2889 add_sysrooted_prefix (struct path_prefix *pprefix, const char *prefix,
2890 const char *component,
2891 /* enum prefix_priority */ int priority,
2892 int require_machine_suffix, int os_multilib)
2893 {
2894 if (!IS_ABSOLUTE_PATH (prefix))
2895 fatal_error ("system path %qs is not absolute", prefix);
2896
2897 if (target_system_root)
2898 {
2899 if (target_sysroot_suffix)
2900 prefix = concat (target_sysroot_suffix, prefix, NULL);
2901 prefix = concat (target_system_root, prefix, NULL);
2902
2903 /* We have to override this because GCC's notion of sysroot
2904 moves along with GCC. */
2905 component = "GCC";
2906 }
2907
2908 add_prefix (pprefix, prefix, component, priority,
2909 require_machine_suffix, os_multilib);
2910 }
2911 \f
2912 /* Execute the command specified by the arguments on the current line of spec.
2913 When using pipes, this includes several piped-together commands
2914 with `|' between them.
2915
2916 Return 0 if successful, -1 if failed. */
2917
2918 static int
2919 execute (void)
2920 {
2921 int i;
2922 int n_commands; /* # of command. */
2923 char *string;
2924 struct pex_obj *pex;
2925 struct command
2926 {
2927 const char *prog; /* program name. */
2928 const char **argv; /* vector of args. */
2929 };
2930
2931 struct command *commands; /* each command buffer with above info. */
2932
2933 gcc_assert (!processing_spec_function);
2934
2935 if (wrapper_string)
2936 {
2937 string = find_a_file (&exec_prefixes, argbuf[0], X_OK, false);
2938 argbuf[0] = (string) ? string : argbuf[0];
2939 insert_wrapper (wrapper_string);
2940 }
2941
2942 /* Count # of piped commands. */
2943 for (n_commands = 1, i = 0; i < argbuf_index; i++)
2944 if (strcmp (argbuf[i], "|") == 0)
2945 n_commands++;
2946
2947 /* Get storage for each command. */
2948 commands = (struct command *) alloca (n_commands * sizeof (struct command));
2949
2950 /* Split argbuf into its separate piped processes,
2951 and record info about each one.
2952 Also search for the programs that are to be run. */
2953
2954 commands[0].prog = argbuf[0]; /* first command. */
2955 commands[0].argv = &argbuf[0];
2956
2957 if (!wrapper_string)
2958 {
2959 string = find_a_file (&exec_prefixes, commands[0].prog, X_OK, false);
2960 commands[0].argv[0] = (string) ? string : commands[0].argv[0];
2961 }
2962
2963 for (n_commands = 1, i = 0; i < argbuf_index; i++)
2964 if (strcmp (argbuf[i], "|") == 0)
2965 { /* each command. */
2966 #if defined (__MSDOS__) || defined (OS2) || defined (VMS)
2967 fatal_error ("-pipe not supported");
2968 #endif
2969 argbuf[i] = 0; /* termination of command args. */
2970 commands[n_commands].prog = argbuf[i + 1];
2971 commands[n_commands].argv = &argbuf[i + 1];
2972 string = find_a_file (&exec_prefixes, commands[n_commands].prog,
2973 X_OK, false);
2974 if (string)
2975 commands[n_commands].argv[0] = string;
2976 n_commands++;
2977 }
2978
2979 argbuf[argbuf_index] = 0;
2980
2981 /* If -v, print what we are about to do, and maybe query. */
2982
2983 if (verbose_flag)
2984 {
2985 /* For help listings, put a blank line between sub-processes. */
2986 if (print_help_list)
2987 fputc ('\n', stderr);
2988
2989 /* Print each piped command as a separate line. */
2990 for (i = 0; i < n_commands; i++)
2991 {
2992 const char *const *j;
2993
2994 if (verbose_only_flag)
2995 {
2996 for (j = commands[i].argv; *j; j++)
2997 {
2998 const char *p;
2999 for (p = *j; *p; ++p)
3000 if (!ISALNUM ((unsigned char) *p)
3001 && *p != '_' && *p != '/' && *p != '-' && *p != '.')
3002 break;
3003 if (*p || !*j)
3004 {
3005 fprintf (stderr, " \"");
3006 for (p = *j; *p; ++p)
3007 {
3008 if (*p == '"' || *p == '\\' || *p == '$')
3009 fputc ('\\', stderr);
3010 fputc (*p, stderr);
3011 }
3012 fputc ('"', stderr);
3013 }
3014 else
3015 fprintf (stderr, " %s", *j);
3016 }
3017 }
3018 else
3019 for (j = commands[i].argv; *j; j++)
3020 fprintf (stderr, " %s", *j);
3021
3022 /* Print a pipe symbol after all but the last command. */
3023 if (i + 1 != n_commands)
3024 fprintf (stderr, " |");
3025 fprintf (stderr, "\n");
3026 }
3027 fflush (stderr);
3028 if (verbose_only_flag != 0)
3029 {
3030 /* verbose_only_flag should act as if the spec was
3031 executed, so increment execution_count before
3032 returning. This prevents spurious warnings about
3033 unused linker input files, etc. */
3034 execution_count++;
3035 return 0;
3036 }
3037 #ifdef DEBUG
3038 fnotice (stderr, "\nGo ahead? (y or n) ");
3039 fflush (stderr);
3040 i = getchar ();
3041 if (i != '\n')
3042 while (getchar () != '\n')
3043 ;
3044
3045 if (i != 'y' && i != 'Y')
3046 return 0;
3047 #endif /* DEBUG */
3048 }
3049
3050 #ifdef ENABLE_VALGRIND_CHECKING
3051 /* Run the each command through valgrind. To simplify prepending the
3052 path to valgrind and the option "-q" (for quiet operation unless
3053 something triggers), we allocate a separate argv array. */
3054
3055 for (i = 0; i < n_commands; i++)
3056 {
3057 const char **argv;
3058 int argc;
3059 int j;
3060
3061 for (argc = 0; commands[i].argv[argc] != NULL; argc++)
3062 ;
3063
3064 argv = XALLOCAVEC (const char *, argc + 3);
3065
3066 argv[0] = VALGRIND_PATH;
3067 argv[1] = "-q";
3068 for (j = 2; j < argc + 2; j++)
3069 argv[j] = commands[i].argv[j - 2];
3070 argv[j] = NULL;
3071
3072 commands[i].argv = argv;
3073 commands[i].prog = argv[0];
3074 }
3075 #endif
3076
3077 /* Run each piped subprocess. */
3078
3079 pex = pex_init (PEX_USE_PIPES | ((report_times || report_times_to_file)
3080 ? PEX_RECORD_TIMES : 0),
3081 progname, temp_filename);
3082 if (pex == NULL)
3083 fatal_error ("pex_init failed: %m");
3084
3085 for (i = 0; i < n_commands; i++)
3086 {
3087 const char *errmsg;
3088 int err;
3089 const char *string = commands[i].argv[0];
3090
3091 errmsg = pex_run (pex,
3092 ((i + 1 == n_commands ? PEX_LAST : 0)
3093 | (string == commands[i].prog ? PEX_SEARCH : 0)),
3094 string, CONST_CAST (char **, commands[i].argv),
3095 NULL, NULL, &err);
3096 if (errmsg != NULL)
3097 {
3098 if (err == 0)
3099 fatal_error (errmsg);
3100 else
3101 {
3102 errno = err;
3103 pfatal_with_name (errmsg);
3104 }
3105 }
3106
3107 if (string != commands[i].prog)
3108 free (CONST_CAST (char *, string));
3109 }
3110
3111 execution_count++;
3112
3113 /* Wait for all the subprocesses to finish. */
3114
3115 {
3116 int *statuses;
3117 struct pex_time *times = NULL;
3118 int ret_code = 0;
3119
3120 statuses = (int *) alloca (n_commands * sizeof (int));
3121 if (!pex_get_status (pex, n_commands, statuses))
3122 fatal_error ("failed to get exit status: %m");
3123
3124 if (report_times || report_times_to_file)
3125 {
3126 times = (struct pex_time *) alloca (n_commands * sizeof (struct pex_time));
3127 if (!pex_get_times (pex, n_commands, times))
3128 fatal_error ("failed to get process times: %m");
3129 }
3130
3131 pex_free (pex);
3132
3133 for (i = 0; i < n_commands; ++i)
3134 {
3135 int status = statuses[i];
3136
3137 if (WIFSIGNALED (status))
3138 {
3139 #ifdef SIGPIPE
3140 /* SIGPIPE is a special case. It happens in -pipe mode
3141 when the compiler dies before the preprocessor is done,
3142 or the assembler dies before the compiler is done.
3143 There's generally been an error already, and this is
3144 just fallout. So don't generate another error unless
3145 we would otherwise have succeeded. */
3146 if (WTERMSIG (status) == SIGPIPE
3147 && (signal_count || greatest_status >= MIN_FATAL_STATUS))
3148 {
3149 signal_count++;
3150 ret_code = -1;
3151 }
3152 else
3153 #endif
3154 internal_error ("%s (program %s)",
3155 strsignal (WTERMSIG (status)), commands[i].prog);
3156 }
3157 else if (WIFEXITED (status)
3158 && WEXITSTATUS (status) >= MIN_FATAL_STATUS)
3159 {
3160 if (WEXITSTATUS (status) > greatest_status)
3161 greatest_status = WEXITSTATUS (status);
3162 ret_code = -1;
3163 }
3164
3165 if (report_times || report_times_to_file)
3166 {
3167 struct pex_time *pt = &times[i];
3168 double ut, st;
3169
3170 ut = ((double) pt->user_seconds
3171 + (double) pt->user_microseconds / 1.0e6);
3172 st = ((double) pt->system_seconds
3173 + (double) pt->system_microseconds / 1.0e6);
3174
3175 if (ut + st != 0)
3176 {
3177 if (report_times)
3178 fnotice (stderr, "# %s %.2f %.2f\n",
3179 commands[i].prog, ut, st);
3180
3181 if (report_times_to_file)
3182 {
3183 int c = 0;
3184 const char *const *j;
3185
3186 fprintf (report_times_to_file, "%g %g", ut, st);
3187
3188 for (j = &commands[i].prog; *j; j = &commands[i].argv[++c])
3189 {
3190 const char *p;
3191 for (p = *j; *p; ++p)
3192 if (*p == '"' || *p == '\\' || *p == '$'
3193 || ISSPACE (*p))
3194 break;
3195
3196 if (*p)
3197 {
3198 fprintf (report_times_to_file, " \"");
3199 for (p = *j; *p; ++p)
3200 {
3201 if (*p == '"' || *p == '\\' || *p == '$')
3202 fputc ('\\', report_times_to_file);
3203 fputc (*p, report_times_to_file);
3204 }
3205 fputc ('"', report_times_to_file);
3206 }
3207 else
3208 fprintf (report_times_to_file, " %s", *j);
3209 }
3210
3211 fputc ('\n', report_times_to_file);
3212 }
3213 }
3214 }
3215 }
3216
3217 return ret_code;
3218 }
3219 }
3220 \f
3221 /* Find all the switches given to us
3222 and make a vector describing them.
3223 The elements of the vector are strings, one per switch given.
3224 If a switch uses following arguments, then the `part1' field
3225 is the switch itself and the `args' field
3226 is a null-terminated vector containing the following arguments.
3227 Bits in the `live_cond' field are:
3228 SWITCH_LIVE to indicate this switch is true in a conditional spec.
3229 SWITCH_FALSE to indicate this switch is overridden by a later switch.
3230 SWITCH_IGNORE to indicate this switch should be ignored (used in %<S).
3231 SWITCH_IGNORE_PERMANENTLY to indicate this switch should be ignored
3232 in all do_spec calls afterwards. Used for %<S from self specs.
3233 The `validated' field is nonzero if any spec has looked at this switch;
3234 if it remains zero at the end of the run, it must be meaningless. */
3235
3236 #define SWITCH_LIVE 0x1
3237 #define SWITCH_FALSE 0x2
3238 #define SWITCH_IGNORE 0x4
3239 #define SWITCH_IGNORE_PERMANENTLY 0x8
3240
3241 struct switchstr
3242 {
3243 const char *part1;
3244 const char **args;
3245 unsigned int live_cond;
3246 unsigned char validated;
3247 unsigned char ordering;
3248 };
3249
3250 static struct switchstr *switches;
3251
3252 static int n_switches;
3253
3254 static int n_switches_alloc;
3255
3256 /* Set to zero if -fcompare-debug is disabled, positive if it's
3257 enabled and we're running the first compilation, negative if it's
3258 enabled and we're running the second compilation. For most of the
3259 time, it's in the range -1..1, but it can be temporarily set to 2
3260 or 3 to indicate that the -fcompare-debug flags didn't come from
3261 the command-line, but rather from the GCC_COMPARE_DEBUG environment
3262 variable, until a synthesized -fcompare-debug flag is added to the
3263 command line. */
3264 int compare_debug;
3265
3266 /* Set to nonzero if we've seen the -fcompare-debug-second flag. */
3267 int compare_debug_second;
3268
3269 /* Set to the flags that should be passed to the second compilation in
3270 a -fcompare-debug compilation. */
3271 const char *compare_debug_opt;
3272
3273 static struct switchstr *switches_debug_check[2];
3274
3275 static int n_switches_debug_check[2];
3276
3277 static char *debug_check_temp_file[2];
3278
3279 /* Language is one of three things:
3280
3281 1) The name of a real programming language.
3282 2) NULL, indicating that no one has figured out
3283 what it is yet.
3284 3) '*', indicating that the file should be passed
3285 to the linker. */
3286 struct infile
3287 {
3288 const char *name;
3289 const char *language;
3290 struct compiler *incompiler;
3291 bool compiled;
3292 bool preprocessed;
3293 };
3294
3295 /* Also a vector of input files specified. */
3296
3297 static struct infile *infiles;
3298
3299 int n_infiles;
3300
3301 static int n_infiles_alloc;
3302
3303 /* True if multiple input files are being compiled to a single
3304 assembly file. */
3305
3306 static bool combine_inputs;
3307
3308 /* This counts the number of libraries added by lang_specific_driver, so that
3309 we can tell if there were any user supplied any files or libraries. */
3310
3311 static int added_libraries;
3312
3313 /* And a vector of corresponding output files is made up later. */
3314
3315 const char **outfiles;
3316 \f
3317 #if defined(HAVE_TARGET_OBJECT_SUFFIX) || defined(HAVE_TARGET_EXECUTABLE_SUFFIX)
3318
3319 /* Convert NAME to a new name if it is the standard suffix. DO_EXE
3320 is true if we should look for an executable suffix. DO_OBJ
3321 is true if we should look for an object suffix. */
3322
3323 static const char *
3324 convert_filename (const char *name, int do_exe ATTRIBUTE_UNUSED,
3325 int do_obj ATTRIBUTE_UNUSED)
3326 {
3327 #if defined(HAVE_TARGET_EXECUTABLE_SUFFIX)
3328 int i;
3329 #endif
3330 int len;
3331
3332 if (name == NULL)
3333 return NULL;
3334
3335 len = strlen (name);
3336
3337 #ifdef HAVE_TARGET_OBJECT_SUFFIX
3338 /* Convert x.o to x.obj if TARGET_OBJECT_SUFFIX is ".obj". */
3339 if (do_obj && len > 2
3340 && name[len - 2] == '.'
3341 && name[len - 1] == 'o')
3342 {
3343 obstack_grow (&obstack, name, len - 2);
3344 obstack_grow0 (&obstack, TARGET_OBJECT_SUFFIX, strlen (TARGET_OBJECT_SUFFIX));
3345 name = XOBFINISH (&obstack, const char *);
3346 }
3347 #endif
3348
3349 #if defined(HAVE_TARGET_EXECUTABLE_SUFFIX)
3350 /* If there is no filetype, make it the executable suffix (which includes
3351 the "."). But don't get confused if we have just "-o". */
3352 if (! do_exe || TARGET_EXECUTABLE_SUFFIX[0] == 0 || (len == 2 && name[0] == '-'))
3353 return name;
3354
3355 for (i = len - 1; i >= 0; i--)
3356 if (IS_DIR_SEPARATOR (name[i]))
3357 break;
3358
3359 for (i++; i < len; i++)
3360 if (name[i] == '.')
3361 return name;
3362
3363 obstack_grow (&obstack, name, len);
3364 obstack_grow0 (&obstack, TARGET_EXECUTABLE_SUFFIX,
3365 strlen (TARGET_EXECUTABLE_SUFFIX));
3366 name = XOBFINISH (&obstack, const char *);
3367 #endif
3368
3369 return name;
3370 }
3371 #endif
3372 \f
3373 /* Display the command line switches accepted by gcc. */
3374 static void
3375 display_help (void)
3376 {
3377 printf (_("Usage: %s [options] file...\n"), progname);
3378 fputs (_("Options:\n"), stdout);
3379
3380 fputs (_(" -pass-exit-codes Exit with highest error code from a phase\n"), stdout);
3381 fputs (_(" --help Display this information\n"), stdout);
3382 fputs (_(" --target-help Display target specific command line options\n"), stdout);
3383 fputs (_(" --help={target|optimizers|warnings|params|[^]{joined|separate|undocumented}}[,...]\n"), stdout);
3384 fputs (_(" Display specific types of command line options\n"), stdout);
3385 if (! verbose_flag)
3386 fputs (_(" (Use '-v --help' to display command line options of sub-processes)\n"), stdout);
3387 fputs (_(" --version Display compiler version information\n"), stdout);
3388 fputs (_(" -dumpspecs Display all of the built in spec strings\n"), stdout);
3389 fputs (_(" -dumpversion Display the version of the compiler\n"), stdout);
3390 fputs (_(" -dumpmachine Display the compiler's target processor\n"), stdout);
3391 fputs (_(" -print-search-dirs Display the directories in the compiler's search path\n"), stdout);
3392 fputs (_(" -print-libgcc-file-name Display the name of the compiler's companion library\n"), stdout);
3393 fputs (_(" -print-file-name=<lib> Display the full path to library <lib>\n"), stdout);
3394 fputs (_(" -print-prog-name=<prog> Display the full path to compiler component <prog>\n"), stdout);
3395 fputs (_(" -print-multi-directory Display the root directory for versions of libgcc\n"), stdout);
3396 fputs (_("\
3397 -print-multi-lib Display the mapping between command line options and\n\
3398 multiple library search directories\n"), stdout);
3399 fputs (_(" -print-multi-os-directory Display the relative path to OS libraries\n"), stdout);
3400 fputs (_(" -print-sysroot Display the target libraries directory\n"), stdout);
3401 fputs (_(" -print-sysroot-headers-suffix Display the sysroot suffix used to find headers\n"), stdout);
3402 fputs (_(" -Wa,<options> Pass comma-separated <options> on to the assembler\n"), stdout);
3403 fputs (_(" -Wp,<options> Pass comma-separated <options> on to the preprocessor\n"), stdout);
3404 fputs (_(" -Wl,<options> Pass comma-separated <options> on to the linker\n"), stdout);
3405 fputs (_(" -Xassembler <arg> Pass <arg> on to the assembler\n"), stdout);
3406 fputs (_(" -Xpreprocessor <arg> Pass <arg> on to the preprocessor\n"), stdout);
3407 fputs (_(" -Xlinker <arg> Pass <arg> on to the linker\n"), stdout);
3408 fputs (_(" -combine Pass multiple source files to compiler at once\n"), stdout);
3409 fputs (_(" -save-temps Do not delete intermediate files\n"), stdout);
3410 fputs (_(" -save-temps=<arg> Do not delete intermediate files\n"), stdout);
3411 fputs (_("\
3412 -no-canonical-prefixes Do not canonicalize paths when building relative\n\
3413 prefixes to other gcc components\n"), stdout);
3414 fputs (_(" -pipe Use pipes rather than intermediate files\n"), stdout);
3415 fputs (_(" -time Time the execution of each subprocess\n"), stdout);
3416 fputs (_(" -specs=<file> Override built-in specs with the contents of <file>\n"), stdout);
3417 fputs (_(" -std=<standard> Assume that the input sources are for <standard>\n"), stdout);
3418 fputs (_("\
3419 --sysroot=<directory> Use <directory> as the root directory for headers\n\
3420 and libraries\n"), stdout);
3421 fputs (_(" -B <directory> Add <directory> to the compiler's search paths\n"), stdout);
3422 fputs (_(" -v Display the programs invoked by the compiler\n"), stdout);
3423 fputs (_(" -### Like -v but options quoted and commands not executed\n"), stdout);
3424 fputs (_(" -E Preprocess only; do not compile, assemble or link\n"), stdout);
3425 fputs (_(" -S Compile only; do not assemble or link\n"), stdout);
3426 fputs (_(" -c Compile and assemble, but do not link\n"), stdout);
3427 fputs (_(" -o <file> Place the output into <file>\n"), stdout);
3428 fputs (_("\
3429 -x <language> Specify the language of the following input files\n\
3430 Permissible languages include: c c++ assembler none\n\
3431 'none' means revert to the default behavior of\n\
3432 guessing the language based on the file's extension\n\
3433 "), stdout);
3434
3435 printf (_("\
3436 \nOptions starting with -g, -f, -m, -O, -W, or --param are automatically\n\
3437 passed on to the various sub-processes invoked by %s. In order to pass\n\
3438 other options on to these processes the -W<letter> options must be used.\n\
3439 "), progname);
3440
3441 /* The rest of the options are displayed by invocations of the various
3442 sub-processes. */
3443 }
3444
3445 static void
3446 add_preprocessor_option (const char *option, int len)
3447 {
3448 n_preprocessor_options++;
3449
3450 if (! preprocessor_options)
3451 preprocessor_options = XNEWVEC (char *, n_preprocessor_options);
3452 else
3453 preprocessor_options = XRESIZEVEC (char *, preprocessor_options,
3454 n_preprocessor_options);
3455
3456 preprocessor_options [n_preprocessor_options - 1] =
3457 save_string (option, len);
3458 }
3459
3460 static void
3461 add_assembler_option (const char *option, int len)
3462 {
3463 n_assembler_options++;
3464
3465 if (! assembler_options)
3466 assembler_options = XNEWVEC (char *, n_assembler_options);
3467 else
3468 assembler_options = XRESIZEVEC (char *, assembler_options,
3469 n_assembler_options);
3470
3471 assembler_options [n_assembler_options - 1] = save_string (option, len);
3472 }
3473
3474 static void
3475 add_linker_option (const char *option, int len)
3476 {
3477 n_linker_options++;
3478
3479 if (! linker_options)
3480 linker_options = XNEWVEC (char *, n_linker_options);
3481 else
3482 linker_options = XRESIZEVEC (char *, linker_options, n_linker_options);
3483
3484 linker_options [n_linker_options - 1] = save_string (option, len);
3485 }
3486 \f
3487 /* Allocate space for an input file in infiles. */
3488
3489 static void
3490 alloc_infile (void)
3491 {
3492 if (n_infiles_alloc == 0)
3493 {
3494 n_infiles_alloc = 16;
3495 infiles = XNEWVEC (struct infile, n_infiles_alloc);
3496 }
3497 else if (n_infiles_alloc == n_infiles)
3498 {
3499 n_infiles_alloc *= 2;
3500 infiles = XRESIZEVEC (struct infile, infiles, n_infiles_alloc);
3501 }
3502 }
3503
3504 /* Store an input file with the given NAME and LANGUAGE in
3505 infiles. */
3506
3507 static void
3508 add_infile (const char *name, const char *language)
3509 {
3510 alloc_infile ();
3511 infiles[n_infiles].name = name;
3512 infiles[n_infiles++].language = language;
3513 }
3514
3515 /* Allocate space for a switch in switches. */
3516
3517 static void
3518 alloc_switch (void)
3519 {
3520 if (n_switches_alloc == 0)
3521 {
3522 n_switches_alloc = 16;
3523 switches = XNEWVEC (struct switchstr, n_switches_alloc);
3524 }
3525 else if (n_switches_alloc == n_switches)
3526 {
3527 n_switches_alloc *= 2;
3528 switches = XRESIZEVEC (struct switchstr, switches, n_switches_alloc);
3529 }
3530 }
3531
3532 /* Create the vector `switches' and its contents.
3533 Store its length in `n_switches'. */
3534
3535 static void
3536 process_command (int argc, const char **argv)
3537 {
3538 int i;
3539 const char *temp;
3540 char *temp1;
3541 const char *spec_lang = 0;
3542 int last_language_n_infiles;
3543 const char *tooldir_prefix;
3544 char *(*get_relative_prefix) (const char *, const char *,
3545 const char *) = NULL;
3546
3547 GET_ENVIRONMENT (gcc_exec_prefix, "GCC_EXEC_PREFIX");
3548
3549 n_switches = 0;
3550 n_infiles = 0;
3551 added_libraries = 0;
3552
3553 /* Figure compiler version from version string. */
3554
3555 compiler_version = temp1 = xstrdup (version_string);
3556
3557 for (; *temp1; ++temp1)
3558 {
3559 if (*temp1 == ' ')
3560 {
3561 *temp1 = '\0';
3562 break;
3563 }
3564 }
3565
3566 /* Convert new-style -- options to old-style. */
3567 translate_options (&argc,
3568 CONST_CAST2 (const char *const **, const char ***,
3569 &argv));
3570
3571 /* Handle any -no-canonical-prefixes flag early, to assign the function
3572 that builds relative prefixes. This function creates default search
3573 paths that are needed later in normal option handling. */
3574
3575 for (i = 1; i < argc; i++)
3576 {
3577 if (! strcmp (argv[i], "-no-canonical-prefixes"))
3578 {
3579 get_relative_prefix = make_relative_prefix_ignore_links;
3580 break;
3581 }
3582 }
3583 if (! get_relative_prefix)
3584 get_relative_prefix = make_relative_prefix;
3585
3586 /* Set up the default search paths. If there is no GCC_EXEC_PREFIX,
3587 see if we can create it from the pathname specified in argv[0]. */
3588
3589 gcc_libexec_prefix = standard_libexec_prefix;
3590 #ifndef VMS
3591 /* FIXME: make_relative_prefix doesn't yet work for VMS. */
3592 if (!gcc_exec_prefix)
3593 {
3594 gcc_exec_prefix = get_relative_prefix (argv[0],
3595 standard_bindir_prefix,
3596 standard_exec_prefix);
3597 gcc_libexec_prefix = get_relative_prefix (argv[0],
3598 standard_bindir_prefix,
3599 standard_libexec_prefix);
3600 if (gcc_exec_prefix)
3601 xputenv (concat ("GCC_EXEC_PREFIX=", gcc_exec_prefix, NULL));
3602 }
3603 else
3604 {
3605 /* make_relative_prefix requires a program name, but
3606 GCC_EXEC_PREFIX is typically a directory name with a trailing
3607 / (which is ignored by make_relative_prefix), so append a
3608 program name. */
3609 char *tmp_prefix = concat (gcc_exec_prefix, "gcc", NULL);
3610 gcc_libexec_prefix = get_relative_prefix (tmp_prefix,
3611 standard_exec_prefix,
3612 standard_libexec_prefix);
3613
3614 /* The path is unrelocated, so fallback to the original setting. */
3615 if (!gcc_libexec_prefix)
3616 gcc_libexec_prefix = standard_libexec_prefix;
3617
3618 free (tmp_prefix);
3619 }
3620 #else
3621 #endif
3622 /* From this point onward, gcc_exec_prefix is non-null if the toolchain
3623 is relocated. The toolchain was either relocated using GCC_EXEC_PREFIX
3624 or an automatically created GCC_EXEC_PREFIX from argv[0]. */
3625
3626 /* Do language-specific adjustment/addition of flags. */
3627 lang_specific_driver (&argc,
3628 CONST_CAST2 (const char *const **, const char ***,
3629 &argv),
3630 &added_libraries);
3631
3632 if (gcc_exec_prefix)
3633 {
3634 int len = strlen (gcc_exec_prefix);
3635
3636 if (len > (int) sizeof ("/lib/gcc/") - 1
3637 && (IS_DIR_SEPARATOR (gcc_exec_prefix[len-1])))
3638 {
3639 temp = gcc_exec_prefix + len - sizeof ("/lib/gcc/") + 1;
3640 if (IS_DIR_SEPARATOR (*temp)
3641 && strncmp (temp + 1, "lib", 3) == 0
3642 && IS_DIR_SEPARATOR (temp[4])
3643 && strncmp (temp + 5, "gcc", 3) == 0)
3644 len -= sizeof ("/lib/gcc/") - 1;
3645 }
3646
3647 set_std_prefix (gcc_exec_prefix, len);
3648 add_prefix (&exec_prefixes, gcc_libexec_prefix, "GCC",
3649 PREFIX_PRIORITY_LAST, 0, 0);
3650 add_prefix (&startfile_prefixes, gcc_exec_prefix, "GCC",
3651 PREFIX_PRIORITY_LAST, 0, 0);
3652 }
3653
3654 /* COMPILER_PATH and LIBRARY_PATH have values
3655 that are lists of directory names with colons. */
3656
3657 GET_ENVIRONMENT (temp, "COMPILER_PATH");
3658 if (temp)
3659 {
3660 const char *startp, *endp;
3661 char *nstore = (char *) alloca (strlen (temp) + 3);
3662
3663 startp = endp = temp;
3664 while (1)
3665 {
3666 if (*endp == PATH_SEPARATOR || *endp == 0)
3667 {
3668 strncpy (nstore, startp, endp - startp);
3669 if (endp == startp)
3670 strcpy (nstore, concat (".", dir_separator_str, NULL));
3671 else if (!IS_DIR_SEPARATOR (endp[-1]))
3672 {
3673 nstore[endp - startp] = DIR_SEPARATOR;
3674 nstore[endp - startp + 1] = 0;
3675 }
3676 else
3677 nstore[endp - startp] = 0;
3678 add_prefix (&exec_prefixes, nstore, 0,
3679 PREFIX_PRIORITY_LAST, 0, 0);
3680 add_prefix (&include_prefixes, nstore, 0,
3681 PREFIX_PRIORITY_LAST, 0, 0);
3682 if (*endp == 0)
3683 break;
3684 endp = startp = endp + 1;
3685 }
3686 else
3687 endp++;
3688 }
3689 }
3690
3691 GET_ENVIRONMENT (temp, LIBRARY_PATH_ENV);
3692 if (temp && *cross_compile == '0')
3693 {
3694 const char *startp, *endp;
3695 char *nstore = (char *) alloca (strlen (temp) + 3);
3696
3697 startp = endp = temp;
3698 while (1)
3699 {
3700 if (*endp == PATH_SEPARATOR || *endp == 0)
3701 {
3702 strncpy (nstore, startp, endp - startp);
3703 if (endp == startp)
3704 strcpy (nstore, concat (".", dir_separator_str, NULL));
3705 else if (!IS_DIR_SEPARATOR (endp[-1]))
3706 {
3707 nstore[endp - startp] = DIR_SEPARATOR;
3708 nstore[endp - startp + 1] = 0;
3709 }
3710 else
3711 nstore[endp - startp] = 0;
3712 add_prefix (&startfile_prefixes, nstore, NULL,
3713 PREFIX_PRIORITY_LAST, 0, 1);
3714 if (*endp == 0)
3715 break;
3716 endp = startp = endp + 1;
3717 }
3718 else
3719 endp++;
3720 }
3721 }
3722
3723 /* Use LPATH like LIBRARY_PATH (for the CMU build program). */
3724 GET_ENVIRONMENT (temp, "LPATH");
3725 if (temp && *cross_compile == '0')
3726 {
3727 const char *startp, *endp;
3728 char *nstore = (char *) alloca (strlen (temp) + 3);
3729
3730 startp = endp = temp;
3731 while (1)
3732 {
3733 if (*endp == PATH_SEPARATOR || *endp == 0)
3734 {
3735 strncpy (nstore, startp, endp - startp);
3736 if (endp == startp)
3737 strcpy (nstore, concat (".", dir_separator_str, NULL));
3738 else if (!IS_DIR_SEPARATOR (endp[-1]))
3739 {
3740 nstore[endp - startp] = DIR_SEPARATOR;
3741 nstore[endp - startp + 1] = 0;
3742 }
3743 else
3744 nstore[endp - startp] = 0;
3745 add_prefix (&startfile_prefixes, nstore, NULL,
3746 PREFIX_PRIORITY_LAST, 0, 1);
3747 if (*endp == 0)
3748 break;
3749 endp = startp = endp + 1;
3750 }
3751 else
3752 endp++;
3753 }
3754 }
3755
3756 /* Process the options and store input files and switches in their
3757 vectors. */
3758
3759 last_language_n_infiles = -1;
3760
3761 for (i = 1; i < argc; i++)
3762 {
3763 const char *p = NULL;
3764 int c = 0;
3765
3766 if (argv[i][0] == '-' && argv[i][1] != 0)
3767 {
3768 p = &argv[i][1];
3769 c = *p;
3770 }
3771
3772 if (! strcmp (argv[i], "-dumpspecs"))
3773 {
3774 struct spec_list *sl;
3775 init_spec ();
3776 for (sl = specs; sl; sl = sl->next)
3777 printf ("*%s:\n%s\n\n", sl->name, *(sl->ptr_spec));
3778 if (link_command_spec)
3779 printf ("*link_command:\n%s\n\n", link_command_spec);
3780 exit (0);
3781 }
3782 else if (! strcmp (argv[i], "-dumpversion"))
3783 {
3784 printf ("%s\n", spec_version);
3785 exit (0);
3786 }
3787 else if (! strcmp (argv[i], "-dumpmachine"))
3788 {
3789 printf ("%s\n", spec_machine);
3790 exit (0);
3791 }
3792 else if (strcmp (argv[i], "-fversion") == 0)
3793 {
3794 /* translate_options () has turned --version into -fversion. */
3795 print_version = 1;
3796
3797 /* CPP driver cannot obtain switch from cc1_options. */
3798 if (is_cpp_driver)
3799 add_preprocessor_option ("--version", strlen ("--version"));
3800 add_assembler_option ("--version", strlen ("--version"));
3801 add_linker_option ("--version", strlen ("--version"));
3802
3803 goto normal_switch;
3804 }
3805 else if (strcmp (argv[i], "-fhelp") == 0)
3806 {
3807 /* translate_options () has turned --help into -fhelp. */
3808 print_help_list = 1;
3809
3810 /* CPP driver cannot obtain switch from cc1_options. */
3811 if (is_cpp_driver)
3812 add_preprocessor_option ("--help", 6);
3813 add_assembler_option ("--help", 6);
3814 add_linker_option ("--help", 6);
3815
3816 goto normal_switch;
3817 }
3818 else if (strncmp (argv[i], "-fhelp=", 7) == 0)
3819 {
3820 /* translate_options () has turned --help into -fhelp. */
3821 print_subprocess_help = 2;
3822
3823 goto normal_switch;
3824 }
3825 else if (strcmp (argv[i], "-ftarget-help") == 0)
3826 {
3827 /* translate_options() has turned --target-help into -ftarget-help. */
3828 print_subprocess_help = 1;
3829
3830 /* CPP driver cannot obtain switch from cc1_options. */
3831 if (is_cpp_driver)
3832 add_preprocessor_option ("--target-help", 13);
3833 add_assembler_option ("--target-help", 13);
3834 add_linker_option ("--target-help", 13);
3835
3836 goto normal_switch;
3837 }
3838 else if (! strcmp (argv[i], "-pass-exit-codes"))
3839 {
3840 pass_exit_codes = 1;
3841 }
3842 else if (! strcmp (argv[i], "-print-search-dirs"))
3843 print_search_dirs = 1;
3844 else if (! strcmp (argv[i], "-print-libgcc-file-name"))
3845 print_file_name = "libgcc.a";
3846 else if (! strncmp (argv[i], "-print-file-name=", 17))
3847 print_file_name = argv[i] + 17;
3848 else if (! strncmp (argv[i], "-print-prog-name=", 17))
3849 print_prog_name = argv[i] + 17;
3850 else if (! strcmp (argv[i], "-print-multi-lib"))
3851 print_multi_lib = 1;
3852 else if (! strcmp (argv[i], "-print-multi-directory"))
3853 print_multi_directory = 1;
3854 else if (! strcmp (argv[i], "-print-sysroot"))
3855 print_sysroot = 1;
3856 else if (! strcmp (argv[i], "-print-multi-os-directory"))
3857 print_multi_os_directory = 1;
3858 else if (! strcmp (argv[i], "-print-sysroot-headers-suffix"))
3859 print_sysroot_headers_suffix = 1;
3860 else if (! strcmp (argv[i], "-fcompare-debug-second"))
3861 {
3862 compare_debug_second = 1;
3863 goto normal_switch;
3864 }
3865 else if (! strcmp (argv[i], "-fno-compare-debug"))
3866 {
3867 argv[i] = "-fcompare-debug=";
3868 p = &argv[i][1];
3869 goto compare_debug_with_arg;
3870 }
3871 else if (! strcmp (argv[i], "-fcompare-debug"))
3872 {
3873 argv[i] = "-fcompare-debug=-gtoggle";
3874 p = &argv[i][1];
3875 goto compare_debug_with_arg;
3876 }
3877 #define OPT "-fcompare-debug="
3878 else if (! strncmp (argv[i], OPT, sizeof (OPT) - 1))
3879 {
3880 const char *opt;
3881 compare_debug_with_arg:
3882 opt = argv[i] + sizeof (OPT) - 1;
3883 #undef OPT
3884 if (*opt)
3885 compare_debug = 1;
3886 else
3887 compare_debug = -1;
3888 if (compare_debug < 0)
3889 compare_debug_opt = NULL;
3890 else
3891 compare_debug_opt = opt;
3892 goto normal_switch;
3893 }
3894 else if (! strncmp (argv[i], "-Wa,", 4))
3895 {
3896 int prev, j;
3897 /* Pass the rest of this option to the assembler. */
3898
3899 /* Split the argument at commas. */
3900 prev = 4;
3901 for (j = 4; argv[i][j]; j++)
3902 if (argv[i][j] == ',')
3903 {
3904 add_assembler_option (argv[i] + prev, j - prev);
3905 prev = j + 1;
3906 }
3907
3908 /* Record the part after the last comma. */
3909 add_assembler_option (argv[i] + prev, j - prev);
3910 }
3911 else if (! strncmp (argv[i], "-Wp,", 4))
3912 {
3913 int prev, j;
3914 /* Pass the rest of this option to the preprocessor. */
3915
3916 /* Split the argument at commas. */
3917 prev = 4;
3918 for (j = 4; argv[i][j]; j++)
3919 if (argv[i][j] == ',')
3920 {
3921 add_preprocessor_option (argv[i] + prev, j - prev);
3922 prev = j + 1;
3923 }
3924
3925 /* Record the part after the last comma. */
3926 add_preprocessor_option (argv[i] + prev, j - prev);
3927 }
3928 else if (strncmp (argv[i], "-Wl,", 4) == 0)
3929 {
3930 int prev, j;
3931 /* Split the argument at commas. */
3932 prev = 4;
3933 for (j = 4; argv[i][j]; j++)
3934 if (argv[i][j] == ',')
3935 {
3936 add_infile (save_string (argv[i] + prev, j - prev), "*");
3937 prev = j + 1;
3938 }
3939 /* Record the part after the last comma. */
3940 add_infile (argv[i] + prev, "*");
3941 }
3942 else if (strcmp (argv[i], "-Xlinker") == 0)
3943 {
3944 if (i + 1 == argc)
3945 fatal_error ("argument to %<-Xlinker%> is missing");
3946
3947 add_infile (argv[i+1], "*");
3948 i++;
3949 }
3950 else if (strcmp (argv[i], "-Xpreprocessor") == 0)
3951 {
3952 if (i + 1 == argc)
3953 fatal_error ("argument to %<-Xpreprocessor%> is missing");
3954
3955 add_preprocessor_option (argv[i+1], strlen (argv[i+1]));
3956 i++;
3957 }
3958 else if (strcmp (argv[i], "-Xassembler") == 0)
3959 {
3960 if (i + 1 == argc)
3961 fatal_error ("argument to %<-Xassembler%> is missing");
3962
3963 add_assembler_option (argv[i+1], strlen (argv[i+1]));
3964 i++;
3965 }
3966 else if (strcmp (argv[i], "-l") == 0)
3967 {
3968 if (i + 1 == argc)
3969 fatal_error ("argument to %<-l%> is missing");
3970
3971 /* POSIX allows separation of -l and the lib arg;
3972 canonicalize by concatenating -l with its arg */
3973 add_infile (concat ("-l", argv[i + 1], NULL), "*");
3974 i++;
3975 }
3976 else if (strncmp (argv[i], "-l", 2) == 0)
3977 {
3978 add_infile (argv[i], "*");
3979 }
3980 else if (strcmp (argv[i], "-save-temps") == 0)
3981 {
3982 save_temps_flag = SAVE_TEMPS_CWD;
3983 goto normal_switch;
3984 }
3985 else if (strncmp (argv[i], "-save-temps=", 12) == 0)
3986 {
3987 if (strcmp (argv[i]+12, "cwd") == 0)
3988 save_temps_flag = SAVE_TEMPS_CWD;
3989 else if (strcmp (argv[i]+12, "obj") == 0
3990 || strcmp (argv[i]+12, "object") == 0)
3991 save_temps_flag = SAVE_TEMPS_OBJ;
3992 else
3993 fatal_error ("%qs is an unknown -save-temps option", argv[i]);
3994 goto normal_switch;
3995 }
3996 else if (strcmp (argv[i], "-no-canonical-prefixes") == 0)
3997 /* Already handled as a special case, so ignored here. */
3998 ;
3999 else if (strcmp (argv[i], "-combine") == 0)
4000 {
4001 combine_flag = 1;
4002 goto normal_switch;
4003 }
4004 else if (strcmp (argv[i], "-specs") == 0)
4005 {
4006 struct user_specs *user = XNEW (struct user_specs);
4007 if (++i >= argc)
4008 fatal_error ("argument to %<-specs%> is missing");
4009
4010 user->next = (struct user_specs *) 0;
4011 user->filename = argv[i];
4012 if (user_specs_tail)
4013 user_specs_tail->next = user;
4014 else
4015 user_specs_head = user;
4016 user_specs_tail = user;
4017 }
4018 else if (strncmp (argv[i], "-specs=", 7) == 0)
4019 {
4020 struct user_specs *user = XNEW (struct user_specs);
4021 if (strlen (argv[i]) == 7)
4022 fatal_error ("argument to %<-specs=%> is missing");
4023
4024 user->next = (struct user_specs *) 0;
4025 user->filename = argv[i] + 7;
4026 if (user_specs_tail)
4027 user_specs_tail->next = user;
4028 else
4029 user_specs_head = user;
4030 user_specs_tail = user;
4031 }
4032 else if (! strncmp (argv[i], "--sysroot=", strlen ("--sysroot=")))
4033 {
4034 target_system_root = argv[i] + strlen ("--sysroot=");
4035 target_system_root_changed = 1;
4036 }
4037 else if (strcmp (argv[i], "-time") == 0)
4038 report_times = 1;
4039 else if (strncmp (argv[i], "-time=", sizeof ("-time=") - 1) == 0)
4040 {
4041 if (report_times_to_file)
4042 fclose (report_times_to_file);
4043 report_times_to_file = fopen (argv[i] + sizeof ("-time=") - 1, "a");
4044 }
4045 else if (strcmp (argv[i], "-pipe") == 0)
4046 {
4047 /* -pipe has to go into the switches array as well as
4048 setting a flag. */
4049 use_pipes = 1;
4050 goto normal_switch;
4051 }
4052 else if (strcmp (argv[i], "-wrapper") == 0)
4053 {
4054 if (++i >= argc)
4055 fatal_error ("argument to %<-wrapper%> is missing");
4056
4057 wrapper_string = argv[i];
4058 }
4059 else if (strcmp (argv[i], "-###") == 0)
4060 {
4061 /* This is similar to -v except that there is no execution
4062 of the commands and the echoed arguments are quoted. It
4063 is intended for use in shell scripts to capture the
4064 driver-generated command line. */
4065 verbose_only_flag++;
4066 verbose_flag++;
4067 }
4068 else if (argv[i][0] == '-' && argv[i][1] != 0)
4069 {
4070 switch (c)
4071 {
4072 case 'B':
4073 {
4074 const char *value;
4075 int len;
4076
4077 if (p[1] == 0 && i + 1 == argc)
4078 fatal_error ("argument to %<-B%> is missing");
4079 if (p[1] == 0)
4080 value = argv[i + 1];
4081 else
4082 value = p + 1;
4083
4084 len = strlen (value);
4085
4086 /* Catch the case where the user has forgotten to append a
4087 directory separator to the path. Note, they may be using
4088 -B to add an executable name prefix, eg "i386-elf-", in
4089 order to distinguish between multiple installations of
4090 GCC in the same directory. Hence we must check to see
4091 if appending a directory separator actually makes a
4092 valid directory name. */
4093 if (! IS_DIR_SEPARATOR (value [len - 1])
4094 && is_directory (value, false))
4095 {
4096 char *tmp = XNEWVEC (char, len + 2);
4097 strcpy (tmp, value);
4098 tmp[len] = DIR_SEPARATOR;
4099 tmp[++ len] = 0;
4100 value = tmp;
4101 }
4102
4103 add_prefix (&exec_prefixes, value, NULL,
4104 PREFIX_PRIORITY_B_OPT, 0, 0);
4105 add_prefix (&startfile_prefixes, value, NULL,
4106 PREFIX_PRIORITY_B_OPT, 0, 0);
4107 add_prefix (&include_prefixes, value, NULL,
4108 PREFIX_PRIORITY_B_OPT, 0, 0);
4109 }
4110 goto normal_switch;
4111
4112 case 'v': /* Print our subcommands and print versions. */
4113 /* If they do anything other than exactly `-v', don't set
4114 verbose_flag; rather, continue on to give the error. */
4115 if (p[1] != 0)
4116 break;
4117 verbose_flag++;
4118 goto normal_switch;
4119
4120 case 'x':
4121 if (p[1] == 0 && i + 1 == argc)
4122 fatal_error ("argument to %<-x%> is missing");
4123 if (p[1] == 0)
4124 spec_lang = argv[++i];
4125 else
4126 spec_lang = p + 1;
4127 if (! strcmp (spec_lang, "none"))
4128 /* Suppress the warning if -xnone comes after the last input
4129 file, because alternate command interfaces like g++ might
4130 find it useful to place -xnone after each input file. */
4131 spec_lang = 0;
4132 else
4133 last_language_n_infiles = n_infiles;
4134 break;
4135
4136 case 'S':
4137 case 'c':
4138 case 'E':
4139 if (p[1] == 0)
4140 have_c = 1;
4141 goto normal_switch;
4142
4143 case 'o':
4144 have_o = 1;
4145 #if defined(HAVE_TARGET_EXECUTABLE_SUFFIX)
4146 if (! have_c)
4147 {
4148 int skip;
4149
4150 /* Forward scan, just in case -S, -E or -c is specified
4151 after -o. */
4152 int j = i + 1;
4153 if (p[1] == 0)
4154 ++j;
4155 while (j < argc)
4156 {
4157 if (argv[j][0] == '-')
4158 {
4159 if (SWITCH_CURTAILS_COMPILATION (argv[j][1])
4160 && argv[j][2] == 0)
4161 {
4162 have_c = 1;
4163 break;
4164 }
4165 else if ((skip = SWITCH_TAKES_ARG (argv[j][1])))
4166 j += skip - (argv[j][2] != 0);
4167 else if ((skip = WORD_SWITCH_TAKES_ARG (argv[j] + 1)))
4168 j += skip;
4169 }
4170 j++;
4171 }
4172 }
4173 #endif
4174 #if defined(HAVE_TARGET_EXECUTABLE_SUFFIX) || defined(HAVE_TARGET_OBJECT_SUFFIX)
4175 if (p[1] == 0)
4176 argv[i + 1] = convert_filename (argv[i + 1], ! have_c, 0);
4177 else
4178 {
4179 argv[i] = convert_filename (argv[i], ! have_c, 0);
4180 p = &argv[i][1];
4181 }
4182 #endif
4183 /* Save the output name in case -save-temps=obj was used. */
4184 if ((p[1] == 0) && argv[i + 1])
4185 save_temps_prefix = xstrdup(argv[i + 1]);
4186 else
4187 save_temps_prefix = xstrdup(argv[i] + 1);
4188 goto normal_switch;
4189
4190 default:
4191 normal_switch:
4192
4193 alloc_switch ();
4194 switches[n_switches].part1 = p;
4195 /* Deal with option arguments in separate argv elements. */
4196 if ((SWITCH_TAKES_ARG (c) > (p[1] != 0))
4197 || WORD_SWITCH_TAKES_ARG (p))
4198 {
4199 int j = 0;
4200 int n_args = WORD_SWITCH_TAKES_ARG (p);
4201
4202 if (n_args == 0)
4203 {
4204 /* Count only the option arguments in separate
4205 argv elements. */
4206 n_args = SWITCH_TAKES_ARG (c) - (p[1] != 0);
4207 }
4208 if (i + n_args >= argc)
4209 fatal_error ("argument to %<-%s%> is missing", p);
4210 switches[n_switches].args
4211 = XNEWVEC (const char *, n_args + 1);
4212 while (j < n_args)
4213 switches[n_switches].args[j++] = argv[++i];
4214 /* Null-terminate the vector. */
4215 switches[n_switches].args[j] = 0;
4216 }
4217 else if (strchr (switches_need_spaces, c))
4218 {
4219 /* On some systems, ld cannot handle some options without
4220 a space. So split the option from its argument. */
4221 char *part1 = XNEWVEC (char, 2);
4222 part1[0] = c;
4223 part1[1] = '\0';
4224
4225 switches[n_switches].part1 = part1;
4226 switches[n_switches].args = XNEWVEC (const char *, 2);
4227 switches[n_switches].args[0] = xstrdup (p+1);
4228 switches[n_switches].args[1] = 0;
4229 }
4230 else
4231 switches[n_switches].args = 0;
4232
4233 switches[n_switches].live_cond = 0;
4234 switches[n_switches].validated = 0;
4235 switches[n_switches].ordering = 0;
4236 /* These are always valid, since gcc.c itself understands the
4237 first four, gfortranspec.c understands -static-libgfortran
4238 and g++spec.c understands -static-libstdc++ */
4239 if (!strcmp (p, "save-temps")
4240 || !strcmp (p, "static-libgcc")
4241 || !strcmp (p, "shared-libgcc")
4242 || !strcmp (p, "pipe")
4243 || !strcmp (p, "static-libgfortran")
4244 || !strcmp (p, "static-libstdc++"))
4245 switches[n_switches].validated = 1;
4246 else
4247 {
4248 char ch = switches[n_switches].part1[0];
4249 if (ch == 'B')
4250 switches[n_switches].validated = 1;
4251 }
4252 n_switches++;
4253 }
4254 }
4255 else
4256 {
4257 const char *p = strrchr (argv[i], '@');
4258 char *fname;
4259 long offset;
4260 int consumed;
4261 #ifdef HAVE_TARGET_OBJECT_SUFFIX
4262 argv[i] = convert_filename (argv[i], 0, access (argv[i], F_OK));
4263 #endif
4264 /* For LTO static archive support we handle input file
4265 specifications that are composed of a filename and
4266 an offset like FNAME@OFFSET. */
4267 if (p
4268 && p != argv[i]
4269 && sscanf (p, "@%li%n", &offset, &consumed) >= 1
4270 && strlen (p) == (unsigned int)consumed)
4271 {
4272 fname = (char *)xmalloc (p - argv[i] + 1);
4273 memcpy (fname, argv[i], p - argv[i]);
4274 fname[p - argv[i]] = '\0';
4275 /* Only accept non-stdin and existing FNAME parts, otherwise
4276 try with the full name. */
4277 if (strcmp (fname, "-") == 0 || access (fname, F_OK) < 0)
4278 {
4279 free (fname);
4280 fname = xstrdup (argv[i]);
4281 }
4282 }
4283 else
4284 fname = xstrdup (argv[i]);
4285
4286 if (strcmp (fname, "-") != 0 && access (fname, F_OK) < 0)
4287 perror_with_name (fname);
4288 else
4289 add_infile (argv[i], spec_lang);
4290
4291 free (fname);
4292 }
4293 }
4294
4295 /* If -save-temps=obj and -o name, create the prefix to use for %b.
4296 Otherwise just make -save-temps=obj the same as -save-temps=cwd. */
4297 if (save_temps_flag == SAVE_TEMPS_OBJ && save_temps_prefix != NULL)
4298 {
4299 save_temps_length = strlen (save_temps_prefix);
4300 temp = strrchr (lbasename (save_temps_prefix), '.');
4301 if (temp)
4302 {
4303 save_temps_length -= strlen (temp);
4304 save_temps_prefix[save_temps_length] = '\0';
4305 }
4306
4307 }
4308 else if (save_temps_prefix != NULL)
4309 {
4310 free (save_temps_prefix);
4311 save_temps_prefix = NULL;
4312 }
4313
4314 if (save_temps_flag && use_pipes)
4315 {
4316 /* -save-temps overrides -pipe, so that temp files are produced */
4317 if (save_temps_flag)
4318 warning (0, "-pipe ignored because -save-temps specified");
4319 use_pipes = 0;
4320 }
4321
4322 if (!compare_debug)
4323 {
4324 const char *gcd = getenv ("GCC_COMPARE_DEBUG");
4325
4326 if (gcd && gcd[0] == '-')
4327 {
4328 compare_debug = 2;
4329 compare_debug_opt = gcd;
4330 }
4331 else if (gcd && *gcd && strcmp (gcd, "0"))
4332 {
4333 compare_debug = 3;
4334 compare_debug_opt = "-gtoggle";
4335 }
4336 }
4337 else if (compare_debug < 0)
4338 {
4339 compare_debug = 0;
4340 gcc_assert (!compare_debug_opt);
4341 }
4342
4343 /* Set up the search paths. We add directories that we expect to
4344 contain GNU Toolchain components before directories specified by
4345 the machine description so that we will find GNU components (like
4346 the GNU assembler) before those of the host system. */
4347
4348 /* If we don't know where the toolchain has been installed, use the
4349 configured-in locations. */
4350 if (!gcc_exec_prefix)
4351 {
4352 #ifndef OS2
4353 add_prefix (&exec_prefixes, standard_libexec_prefix, "GCC",
4354 PREFIX_PRIORITY_LAST, 1, 0);
4355 add_prefix (&exec_prefixes, standard_libexec_prefix, "BINUTILS",
4356 PREFIX_PRIORITY_LAST, 2, 0);
4357 add_prefix (&exec_prefixes, standard_exec_prefix, "BINUTILS",
4358 PREFIX_PRIORITY_LAST, 2, 0);
4359 #endif
4360 add_prefix (&startfile_prefixes, standard_exec_prefix, "BINUTILS",
4361 PREFIX_PRIORITY_LAST, 1, 0);
4362 }
4363
4364 gcc_assert (!IS_ABSOLUTE_PATH (tooldir_base_prefix));
4365 tooldir_prefix = concat (tooldir_base_prefix, spec_machine,
4366 dir_separator_str, NULL);
4367
4368 /* Look for tools relative to the location from which the driver is
4369 running, or, if that is not available, the configured prefix. */
4370 tooldir_prefix
4371 = concat (gcc_exec_prefix ? gcc_exec_prefix : standard_exec_prefix,
4372 spec_machine, dir_separator_str,
4373 spec_version, dir_separator_str, tooldir_prefix, NULL);
4374
4375 add_prefix (&exec_prefixes,
4376 concat (tooldir_prefix, "bin", dir_separator_str, NULL),
4377 "BINUTILS", PREFIX_PRIORITY_LAST, 0, 0);
4378 add_prefix (&startfile_prefixes,
4379 concat (tooldir_prefix, "lib", dir_separator_str, NULL),
4380 "BINUTILS", PREFIX_PRIORITY_LAST, 0, 1);
4381
4382 #if defined(TARGET_SYSTEM_ROOT_RELOCATABLE) && !defined(VMS)
4383 /* If the normal TARGET_SYSTEM_ROOT is inside of $exec_prefix,
4384 then consider it to relocate with the rest of the GCC installation
4385 if GCC_EXEC_PREFIX is set.
4386 ``make_relative_prefix'' is not compiled for VMS, so don't call it. */
4387 if (target_system_root && !target_system_root_changed && gcc_exec_prefix)
4388 {
4389 char *tmp_prefix = get_relative_prefix (argv[0],
4390 standard_bindir_prefix,
4391 target_system_root);
4392 if (tmp_prefix && access_check (tmp_prefix, F_OK) == 0)
4393 {
4394 target_system_root = tmp_prefix;
4395 target_system_root_changed = 1;
4396 }
4397 }
4398 #endif
4399
4400 /* More prefixes are enabled in main, after we read the specs file
4401 and determine whether this is cross-compilation or not. */
4402
4403 if (n_infiles == last_language_n_infiles && spec_lang != 0)
4404 warning (0, "%<-x %s%> after last input file has no effect", spec_lang);
4405
4406 if (compare_debug == 2 || compare_debug == 3)
4407 {
4408 alloc_switch ();
4409 switches[n_switches].part1 = concat ("fcompare-debug=",
4410 compare_debug_opt,
4411 NULL);
4412 switches[n_switches].args = 0;
4413 switches[n_switches].live_cond = 0;
4414 switches[n_switches].validated = 0;
4415 switches[n_switches].ordering = 0;
4416 n_switches++;
4417 compare_debug = 1;
4418 }
4419
4420 /* Ensure we only invoke each subprocess once. */
4421 if (print_subprocess_help || print_help_list || print_version)
4422 {
4423 n_infiles = 0;
4424
4425 /* Create a dummy input file, so that we can pass
4426 the help option on to the various sub-processes. */
4427 add_infile ("help-dummy", "c");
4428 }
4429
4430 alloc_switch ();
4431 switches[n_switches].part1 = 0;
4432 alloc_infile ();
4433 infiles[n_infiles].name = 0;
4434 }
4435
4436 /* Store switches not filtered out by %<S in spec in COLLECT_GCC_OPTIONS
4437 and place that in the environment. */
4438
4439 static void
4440 set_collect_gcc_options (void)
4441 {
4442 int i;
4443 int first_time;
4444
4445 /* Build COLLECT_GCC_OPTIONS to have all of the options specified to
4446 the compiler. */
4447 obstack_grow (&collect_obstack, "COLLECT_GCC_OPTIONS=",
4448 sizeof ("COLLECT_GCC_OPTIONS=") - 1);
4449
4450 first_time = TRUE;
4451 for (i = 0; (int) i < n_switches; i++)
4452 {
4453 const char *const *args;
4454 const char *p, *q;
4455 if (!first_time)
4456 obstack_grow (&collect_obstack, " ", 1);
4457
4458 first_time = FALSE;
4459
4460 /* Ignore elided switches. */
4461 if ((switches[i].live_cond & SWITCH_IGNORE) != 0)
4462 continue;
4463
4464 obstack_grow (&collect_obstack, "'-", 2);
4465 q = switches[i].part1;
4466 while ((p = strchr (q, '\'')))
4467 {
4468 obstack_grow (&collect_obstack, q, p - q);
4469 obstack_grow (&collect_obstack, "'\\''", 4);
4470 q = ++p;
4471 }
4472 obstack_grow (&collect_obstack, q, strlen (q));
4473 obstack_grow (&collect_obstack, "'", 1);
4474
4475 for (args = switches[i].args; args && *args; args++)
4476 {
4477 obstack_grow (&collect_obstack, " '", 2);
4478 q = *args;
4479 while ((p = strchr (q, '\'')))
4480 {
4481 obstack_grow (&collect_obstack, q, p - q);
4482 obstack_grow (&collect_obstack, "'\\''", 4);
4483 q = ++p;
4484 }
4485 obstack_grow (&collect_obstack, q, strlen (q));
4486 obstack_grow (&collect_obstack, "'", 1);
4487 }
4488 }
4489 obstack_grow (&collect_obstack, "\0", 1);
4490 xputenv (XOBFINISH (&collect_obstack, char *));
4491 }
4492 \f
4493 /* Process a spec string, accumulating and running commands. */
4494
4495 /* These variables describe the input file name.
4496 input_file_number is the index on outfiles of this file,
4497 so that the output file name can be stored for later use by %o.
4498 input_basename is the start of the part of the input file
4499 sans all directory names, and basename_length is the number
4500 of characters starting there excluding the suffix .c or whatever. */
4501
4502 static const char *gcc_input_filename;
4503 static int input_file_number;
4504 size_t input_filename_length;
4505 static int basename_length;
4506 static int suffixed_basename_length;
4507 static const char *input_basename;
4508 static const char *input_suffix;
4509 #ifndef HOST_LACKS_INODE_NUMBERS
4510 static struct stat input_stat;
4511 #endif
4512 static int input_stat_set;
4513
4514 /* The compiler used to process the current input file. */
4515 static struct compiler *input_file_compiler;
4516
4517 /* These are variables used within do_spec and do_spec_1. */
4518
4519 /* Nonzero if an arg has been started and not yet terminated
4520 (with space, tab or newline). */
4521 static int arg_going;
4522
4523 /* Nonzero means %d or %g has been seen; the next arg to be terminated
4524 is a temporary file name. */
4525 static int delete_this_arg;
4526
4527 /* Nonzero means %w has been seen; the next arg to be terminated
4528 is the output file name of this compilation. */
4529 static int this_is_output_file;
4530
4531 /* Nonzero means %s has been seen; the next arg to be terminated
4532 is the name of a library file and we should try the standard
4533 search dirs for it. */
4534 static int this_is_library_file;
4535
4536 /* Nonzero means %T has been seen; the next arg to be terminated
4537 is the name of a linker script and we should try all of the
4538 standard search dirs for it. If it is found insert a --script
4539 command line switch and then substitute the full path in place,
4540 otherwise generate an error message. */
4541 static int this_is_linker_script;
4542
4543 /* Nonzero means that the input of this command is coming from a pipe. */
4544 static int input_from_pipe;
4545
4546 /* Nonnull means substitute this for any suffix when outputting a switches
4547 arguments. */
4548 static const char *suffix_subst;
4549
4550 /* If there is an argument being accumulated, terminate it and store it. */
4551
4552 static void
4553 end_going_arg (void)
4554 {
4555 if (arg_going)
4556 {
4557 const char *string;
4558
4559 obstack_1grow (&obstack, 0);
4560 string = XOBFINISH (&obstack, const char *);
4561 if (this_is_library_file)
4562 string = find_file (string);
4563 if (this_is_linker_script)
4564 {
4565 char * full_script_path = find_a_file (&startfile_prefixes, string, R_OK, true);
4566
4567 if (full_script_path == NULL)
4568 {
4569 error ("unable to locate default linker script %qs in the library search paths", string);
4570 /* Script was not found on search path. */
4571 return;
4572 }
4573 store_arg ("--script", false, false);
4574 string = full_script_path;
4575 }
4576 store_arg (string, delete_this_arg, this_is_output_file);
4577 if (this_is_output_file)
4578 outfiles[input_file_number] = string;
4579 arg_going = 0;
4580 }
4581 }
4582
4583
4584 /* Parse the WRAPPER string which is a comma separated list of the command line
4585 and insert them into the beginning of argbuf. */
4586
4587 static void
4588 insert_wrapper (const char *wrapper)
4589 {
4590 int n = 0;
4591 int i;
4592 char *buf = xstrdup (wrapper);
4593 char *p = buf;
4594
4595 do
4596 {
4597 n++;
4598 while (*p == ',')
4599 p++;
4600 }
4601 while ((p = strchr (p, ',')) != NULL);
4602
4603 if (argbuf_index + n >= argbuf_length)
4604 {
4605 argbuf_length = argbuf_length * 2;
4606 while (argbuf_length < argbuf_index + n)
4607 argbuf_length *= 2;
4608 argbuf = XRESIZEVEC (const char *, argbuf, argbuf_length);
4609 }
4610 for (i = argbuf_index - 1; i >= 0; i--)
4611 argbuf[i + n] = argbuf[i];
4612
4613 i = 0;
4614 p = buf;
4615 do
4616 {
4617 while (*p == ',')
4618 {
4619 *p = 0;
4620 p++;
4621 }
4622 argbuf[i++] = p;
4623 }
4624 while ((p = strchr (p, ',')) != NULL);
4625 gcc_assert (i == n);
4626 argbuf_index += n;
4627 }
4628
4629 /* Process the spec SPEC and run the commands specified therein.
4630 Returns 0 if the spec is successfully processed; -1 if failed. */
4631
4632 int
4633 do_spec (const char *spec)
4634 {
4635 int value;
4636
4637 value = do_spec_2 (spec);
4638
4639 /* Force out any unfinished command.
4640 If -pipe, this forces out the last command if it ended in `|'. */
4641 if (value == 0)
4642 {
4643 if (argbuf_index > 0 && !strcmp (argbuf[argbuf_index - 1], "|"))
4644 argbuf_index--;
4645
4646 set_collect_gcc_options ();
4647
4648 if (argbuf_index > 0)
4649 value = execute ();
4650 }
4651
4652 return value;
4653 }
4654
4655 static int
4656 do_spec_2 (const char *spec)
4657 {
4658 int result;
4659
4660 clear_args ();
4661 arg_going = 0;
4662 delete_this_arg = 0;
4663 this_is_output_file = 0;
4664 this_is_library_file = 0;
4665 this_is_linker_script = 0;
4666 input_from_pipe = 0;
4667 suffix_subst = NULL;
4668
4669 result = do_spec_1 (spec, 0, NULL);
4670
4671 end_going_arg ();
4672
4673 return result;
4674 }
4675
4676
4677 /* Process the given spec string and add any new options to the end
4678 of the switches/n_switches array. */
4679
4680 static void
4681 do_option_spec (const char *name, const char *spec)
4682 {
4683 unsigned int i, value_count, value_len;
4684 const char *p, *q, *value;
4685 char *tmp_spec, *tmp_spec_p;
4686
4687 if (configure_default_options[0].name == NULL)
4688 return;
4689
4690 for (i = 0; i < ARRAY_SIZE (configure_default_options); i++)
4691 if (strcmp (configure_default_options[i].name, name) == 0)
4692 break;
4693 if (i == ARRAY_SIZE (configure_default_options))
4694 return;
4695
4696 value = configure_default_options[i].value;
4697 value_len = strlen (value);
4698
4699 /* Compute the size of the final spec. */
4700 value_count = 0;
4701 p = spec;
4702 while ((p = strstr (p, "%(VALUE)")) != NULL)
4703 {
4704 p ++;
4705 value_count ++;
4706 }
4707
4708 /* Replace each %(VALUE) by the specified value. */
4709 tmp_spec = (char *) alloca (strlen (spec) + 1
4710 + value_count * (value_len - strlen ("%(VALUE)")));
4711 tmp_spec_p = tmp_spec;
4712 q = spec;
4713 while ((p = strstr (q, "%(VALUE)")) != NULL)
4714 {
4715 memcpy (tmp_spec_p, q, p - q);
4716 tmp_spec_p = tmp_spec_p + (p - q);
4717 memcpy (tmp_spec_p, value, value_len);
4718 tmp_spec_p += value_len;
4719 q = p + strlen ("%(VALUE)");
4720 }
4721 strcpy (tmp_spec_p, q);
4722
4723 do_self_spec (tmp_spec);
4724 }
4725
4726 /* Process the given spec string and add any new options to the end
4727 of the switches/n_switches array. */
4728
4729 static void
4730 do_self_spec (const char *spec)
4731 {
4732 int i;
4733
4734 do_spec_2 (spec);
4735 do_spec_1 (" ", 0, NULL);
4736
4737 /* Mark %<S switches processed by do_self_spec to be ignored permanently.
4738 do_self_specs adds the replacements to switches array, so it shouldn't
4739 be processed afterwards. */
4740 for (i = 0; i < n_switches; i++)
4741 if ((switches[i].live_cond & SWITCH_IGNORE))
4742 switches[i].live_cond |= SWITCH_IGNORE_PERMANENTLY;
4743
4744 if (argbuf_index > 0)
4745 {
4746 switches = XRESIZEVEC (struct switchstr, switches,
4747 n_switches + argbuf_index + 1);
4748
4749 for (i = 0; i < argbuf_index; i++)
4750 {
4751 struct switchstr *sw;
4752 const char *p = argbuf[i];
4753 int c = *p;
4754
4755 /* Each switch should start with '-'. */
4756 if (c != '-')
4757 fatal_error ("switch %qs does not start with %<-%>", argbuf[i]);
4758
4759 p++;
4760 c = *p;
4761
4762 sw = &switches[n_switches++];
4763 sw->part1 = p;
4764 sw->live_cond = 0;
4765 sw->validated = 0;
4766 sw->ordering = 0;
4767
4768 /* Deal with option arguments in separate argv elements. */
4769 if ((SWITCH_TAKES_ARG (c) > (p[1] != 0))
4770 || WORD_SWITCH_TAKES_ARG (p))
4771 {
4772 int j = 0;
4773 int n_args = WORD_SWITCH_TAKES_ARG (p);
4774
4775 if (n_args == 0)
4776 {
4777 /* Count only the option arguments in separate argv elements. */
4778 n_args = SWITCH_TAKES_ARG (c) - (p[1] != 0);
4779 }
4780 if (i + n_args >= argbuf_index)
4781 fatal_error ("argument to %<-%s%> is missing", p);
4782 sw->args
4783 = XNEWVEC (const char *, n_args + 1);
4784 while (j < n_args)
4785 sw->args[j++] = argbuf[++i];
4786 /* Null-terminate the vector. */
4787 sw->args[j] = 0;
4788 }
4789 else if (strchr (switches_need_spaces, c))
4790 {
4791 /* On some systems, ld cannot handle some options without
4792 a space. So split the option from its argument. */
4793 char *part1 = XNEWVEC (char, 2);
4794 part1[0] = c;
4795 part1[1] = '\0';
4796
4797 sw->part1 = part1;
4798 sw->args = XNEWVEC (const char *, 2);
4799 sw->args[0] = xstrdup (p+1);
4800 sw->args[1] = 0;
4801 }
4802 else
4803 sw->args = 0;
4804 }
4805
4806 switches[n_switches].part1 = 0;
4807 }
4808 }
4809
4810 /* Callback for processing %D and %I specs. */
4811
4812 struct spec_path_info {
4813 const char *option;
4814 const char *append;
4815 size_t append_len;
4816 bool omit_relative;
4817 bool separate_options;
4818 };
4819
4820 static void *
4821 spec_path (char *path, void *data)
4822 {
4823 struct spec_path_info *info = (struct spec_path_info *) data;
4824 size_t len = 0;
4825 char save = 0;
4826
4827 if (info->omit_relative && !IS_ABSOLUTE_PATH (path))
4828 return NULL;
4829
4830 if (info->append_len != 0)
4831 {
4832 len = strlen (path);
4833 memcpy (path + len, info->append, info->append_len + 1);
4834 }
4835
4836 if (!is_directory (path, true))
4837 return NULL;
4838
4839 do_spec_1 (info->option, 1, NULL);
4840 if (info->separate_options)
4841 do_spec_1 (" ", 0, NULL);
4842
4843 if (info->append_len == 0)
4844 {
4845 len = strlen (path);
4846 save = path[len - 1];
4847 if (IS_DIR_SEPARATOR (path[len - 1]))
4848 path[len - 1] = '\0';
4849 }
4850
4851 do_spec_1 (path, 1, NULL);
4852 do_spec_1 (" ", 0, NULL);
4853
4854 /* Must not damage the original path. */
4855 if (info->append_len == 0)
4856 path[len - 1] = save;
4857
4858 return NULL;
4859 }
4860
4861 /* Create a temporary FILE with the contents of ARGV. Add @FILE to the
4862 argument list. */
4863
4864 static void
4865 create_at_file (char **argv)
4866 {
4867 char *temp_file = make_temp_file ("");
4868 char *at_argument = concat ("@", temp_file, NULL);
4869 FILE *f = fopen (temp_file, "w");
4870 int status;
4871
4872 if (f == NULL)
4873 fatal_error ("could not open temporary response file %s",
4874 temp_file);
4875
4876 status = writeargv (argv, f);
4877
4878 if (status)
4879 fatal_error ("could not write to temporary response file %s",
4880 temp_file);
4881
4882 status = fclose (f);
4883
4884 if (EOF == status)
4885 fatal_error ("could not close temporary response file %s",
4886 temp_file);
4887
4888 store_arg (at_argument, 0, 0);
4889
4890 record_temp_file (temp_file, !save_temps_flag, !save_temps_flag);
4891 }
4892
4893 /* True if we should compile INFILE. */
4894
4895 static bool
4896 compile_input_file_p (struct infile *infile)
4897 {
4898 if ((!infile->language) || (infile->language[0] != '*'))
4899 if (infile->incompiler == input_file_compiler)
4900 return true;
4901 return false;
4902 }
4903
4904 /* Process the sub-spec SPEC as a portion of a larger spec.
4905 This is like processing a whole spec except that we do
4906 not initialize at the beginning and we do not supply a
4907 newline by default at the end.
4908 INSWITCH nonzero means don't process %-sequences in SPEC;
4909 in this case, % is treated as an ordinary character.
4910 This is used while substituting switches.
4911 INSWITCH nonzero also causes SPC not to terminate an argument.
4912
4913 Value is zero unless a line was finished
4914 and the command on that line reported an error. */
4915
4916 static int
4917 do_spec_1 (const char *spec, int inswitch, const char *soft_matched_part)
4918 {
4919 const char *p = spec;
4920 int c;
4921 int i;
4922 int value;
4923
4924 while ((c = *p++))
4925 /* If substituting a switch, treat all chars like letters.
4926 Otherwise, NL, SPC, TAB and % are special. */
4927 switch (inswitch ? 'a' : c)
4928 {
4929 case '\n':
4930 end_going_arg ();
4931
4932 if (argbuf_index > 0 && !strcmp (argbuf[argbuf_index - 1], "|"))
4933 {
4934 /* A `|' before the newline means use a pipe here,
4935 but only if -pipe was specified.
4936 Otherwise, execute now and don't pass the `|' as an arg. */
4937 if (use_pipes)
4938 {
4939 input_from_pipe = 1;
4940 break;
4941 }
4942 else
4943 argbuf_index--;
4944 }
4945
4946 set_collect_gcc_options ();
4947
4948 if (argbuf_index > 0)
4949 {
4950 value = execute ();
4951 if (value)
4952 return value;
4953 }
4954 /* Reinitialize for a new command, and for a new argument. */
4955 clear_args ();
4956 arg_going = 0;
4957 delete_this_arg = 0;
4958 this_is_output_file = 0;
4959 this_is_library_file = 0;
4960 this_is_linker_script = 0;
4961 input_from_pipe = 0;
4962 break;
4963
4964 case '|':
4965 end_going_arg ();
4966
4967 /* Use pipe */
4968 obstack_1grow (&obstack, c);
4969 arg_going = 1;
4970 break;
4971
4972 case '\t':
4973 case ' ':
4974 end_going_arg ();
4975
4976 /* Reinitialize for a new argument. */
4977 delete_this_arg = 0;
4978 this_is_output_file = 0;
4979 this_is_library_file = 0;
4980 this_is_linker_script = 0;
4981 break;
4982
4983 case '%':
4984 switch (c = *p++)
4985 {
4986 case 0:
4987 fatal_error ("spec %qs invalid", spec);
4988
4989 case 'b':
4990 if (save_temps_length)
4991 obstack_grow (&obstack, save_temps_prefix, save_temps_length);
4992 else
4993 obstack_grow (&obstack, input_basename, basename_length);
4994 if (compare_debug < 0)
4995 obstack_grow (&obstack, ".gk", 3);
4996 arg_going = 1;
4997 break;
4998
4999 case 'B':
5000 if (save_temps_length)
5001 obstack_grow (&obstack, save_temps_prefix, save_temps_length);
5002 else
5003 obstack_grow (&obstack, input_basename, suffixed_basename_length);
5004 if (compare_debug < 0)
5005 obstack_grow (&obstack, ".gk", 3);
5006 arg_going = 1;
5007 break;
5008
5009 case 'd':
5010 delete_this_arg = 2;
5011 break;
5012
5013 /* Dump out the directories specified with LIBRARY_PATH,
5014 followed by the absolute directories
5015 that we search for startfiles. */
5016 case 'D':
5017 {
5018 struct spec_path_info info;
5019
5020 info.option = "-L";
5021 info.append_len = 0;
5022 #ifdef RELATIVE_PREFIX_NOT_LINKDIR
5023 /* Used on systems which record the specified -L dirs
5024 and use them to search for dynamic linking.
5025 Relative directories always come from -B,
5026 and it is better not to use them for searching
5027 at run time. In particular, stage1 loses. */
5028 info.omit_relative = true;
5029 #else
5030 info.omit_relative = false;
5031 #endif
5032 info.separate_options = false;
5033
5034 for_each_path (&startfile_prefixes, true, 0, spec_path, &info);
5035 }
5036 break;
5037
5038 case 'e':
5039 /* %efoo means report an error with `foo' as error message
5040 and don't execute any more commands for this file. */
5041 {
5042 const char *q = p;
5043 char *buf;
5044 while (*p != 0 && *p != '\n')
5045 p++;
5046 buf = (char *) alloca (p - q + 1);
5047 strncpy (buf, q, p - q);
5048 buf[p - q] = 0;
5049 error ("%s", _(buf));
5050 return -1;
5051 }
5052 break;
5053 case 'n':
5054 /* %nfoo means report a notice with `foo' on stderr. */
5055 {
5056 const char *q = p;
5057 char *buf;
5058 while (*p != 0 && *p != '\n')
5059 p++;
5060 buf = (char *) alloca (p - q + 1);
5061 strncpy (buf, q, p - q);
5062 buf[p - q] = 0;
5063 inform (0, "%s", _(buf));
5064 if (*p)
5065 p++;
5066 }
5067 break;
5068
5069 case 'j':
5070 {
5071 struct stat st;
5072
5073 /* If save_temps_flag is off, and the HOST_BIT_BUCKET is
5074 defined, and it is not a directory, and it is
5075 writable, use it. Otherwise, treat this like any
5076 other temporary file. */
5077
5078 if ((!save_temps_flag)
5079 && (stat (HOST_BIT_BUCKET, &st) == 0) && (!S_ISDIR (st.st_mode))
5080 && (access (HOST_BIT_BUCKET, W_OK) == 0))
5081 {
5082 obstack_grow (&obstack, HOST_BIT_BUCKET,
5083 strlen (HOST_BIT_BUCKET));
5084 delete_this_arg = 0;
5085 arg_going = 1;
5086 break;
5087 }
5088 }
5089 goto create_temp_file;
5090 case '|':
5091 if (use_pipes)
5092 {
5093 obstack_1grow (&obstack, '-');
5094 delete_this_arg = 0;
5095 arg_going = 1;
5096
5097 /* consume suffix */
5098 while (*p == '.' || ISALNUM ((unsigned char) *p))
5099 p++;
5100 if (p[0] == '%' && p[1] == 'O')
5101 p += 2;
5102
5103 break;
5104 }
5105 goto create_temp_file;
5106 case 'm':
5107 if (use_pipes)
5108 {
5109 /* consume suffix */
5110 while (*p == '.' || ISALNUM ((unsigned char) *p))
5111 p++;
5112 if (p[0] == '%' && p[1] == 'O')
5113 p += 2;
5114
5115 break;
5116 }
5117 goto create_temp_file;
5118 case 'g':
5119 case 'u':
5120 case 'U':
5121 create_temp_file:
5122 {
5123 struct temp_name *t;
5124 int suffix_length;
5125 const char *suffix = p;
5126 char *saved_suffix = NULL;
5127
5128 while (*p == '.' || ISALNUM ((unsigned char) *p))
5129 p++;
5130 suffix_length = p - suffix;
5131 if (p[0] == '%' && p[1] == 'O')
5132 {
5133 p += 2;
5134 /* We don't support extra suffix characters after %O. */
5135 if (*p == '.' || ISALNUM ((unsigned char) *p))
5136 fatal_error ("spec %qs has invalid %<%%0%c%>", spec, *p);
5137 if (suffix_length == 0)
5138 suffix = TARGET_OBJECT_SUFFIX;
5139 else
5140 {
5141 saved_suffix
5142 = XNEWVEC (char, suffix_length
5143 + strlen (TARGET_OBJECT_SUFFIX));
5144 strncpy (saved_suffix, suffix, suffix_length);
5145 strcpy (saved_suffix + suffix_length,
5146 TARGET_OBJECT_SUFFIX);
5147 }
5148 suffix_length += strlen (TARGET_OBJECT_SUFFIX);
5149 }
5150
5151 if (compare_debug < 0)
5152 {
5153 suffix = concat (".gk", suffix, NULL);
5154 suffix_length += 3;
5155 }
5156
5157 /* If -save-temps=obj and -o were specified, use that for the
5158 temp file. */
5159 if (save_temps_length)
5160 {
5161 char *tmp;
5162 temp_filename_length
5163 = save_temps_length + suffix_length + 1;
5164 tmp = (char *) alloca (temp_filename_length);
5165 memcpy (tmp, save_temps_prefix, save_temps_length);
5166 memcpy (tmp + save_temps_length, suffix, suffix_length);
5167 tmp[save_temps_length + suffix_length] = '\0';
5168 temp_filename = save_string (tmp,
5169 temp_filename_length + 1);
5170 obstack_grow (&obstack, temp_filename,
5171 temp_filename_length);
5172 arg_going = 1;
5173 delete_this_arg = 0;
5174 break;
5175 }
5176
5177 /* If the gcc_input_filename has the same suffix specified
5178 for the %g, %u, or %U, and -save-temps is specified,
5179 we could end up using that file as an intermediate
5180 thus clobbering the user's source file (.e.g.,
5181 gcc -save-temps foo.s would clobber foo.s with the
5182 output of cpp0). So check for this condition and
5183 generate a temp file as the intermediate. */
5184
5185 if (save_temps_flag)
5186 {
5187 char *tmp;
5188 temp_filename_length = basename_length + suffix_length + 1;
5189 tmp = (char *) alloca (temp_filename_length);
5190 memcpy (tmp, input_basename, basename_length);
5191 memcpy (tmp + basename_length, suffix, suffix_length);
5192 tmp[basename_length + suffix_length] = '\0';
5193 temp_filename = tmp;
5194
5195 if (strcmp (temp_filename, gcc_input_filename) != 0)
5196 {
5197 #ifndef HOST_LACKS_INODE_NUMBERS
5198 struct stat st_temp;
5199
5200 /* Note, set_input() resets input_stat_set to 0. */
5201 if (input_stat_set == 0)
5202 {
5203 input_stat_set = stat (gcc_input_filename,
5204 &input_stat);
5205 if (input_stat_set >= 0)
5206 input_stat_set = 1;
5207 }
5208
5209 /* If we have the stat for the gcc_input_filename
5210 and we can do the stat for the temp_filename
5211 then the they could still refer to the same
5212 file if st_dev/st_ino's are the same. */
5213 if (input_stat_set != 1
5214 || stat (temp_filename, &st_temp) < 0
5215 || input_stat.st_dev != st_temp.st_dev
5216 || input_stat.st_ino != st_temp.st_ino)
5217 #else
5218 /* Just compare canonical pathnames. */
5219 char* input_realname = lrealpath (gcc_input_filename);
5220 char* temp_realname = lrealpath (temp_filename);
5221 bool files_differ = strcmp (input_realname, temp_realname);
5222 free (input_realname);
5223 free (temp_realname);
5224 if (files_differ)
5225 #endif
5226 {
5227 temp_filename = save_string (temp_filename,
5228 temp_filename_length + 1);
5229 obstack_grow (&obstack, temp_filename,
5230 temp_filename_length);
5231 arg_going = 1;
5232 delete_this_arg = 0;
5233 break;
5234 }
5235 }
5236 }
5237
5238 /* See if we already have an association of %g/%u/%U and
5239 suffix. */
5240 for (t = temp_names; t; t = t->next)
5241 if (t->length == suffix_length
5242 && strncmp (t->suffix, suffix, suffix_length) == 0
5243 && t->unique == (c == 'u' || c == 'U' || c == 'j'))
5244 break;
5245
5246 /* Make a new association if needed. %u and %j
5247 require one. */
5248 if (t == 0 || c == 'u' || c == 'j')
5249 {
5250 if (t == 0)
5251 {
5252 t = XNEW (struct temp_name);
5253 t->next = temp_names;
5254 temp_names = t;
5255 }
5256 t->length = suffix_length;
5257 if (saved_suffix)
5258 {
5259 t->suffix = saved_suffix;
5260 saved_suffix = NULL;
5261 }
5262 else
5263 t->suffix = save_string (suffix, suffix_length);
5264 t->unique = (c == 'u' || c == 'U' || c == 'j');
5265 temp_filename = make_temp_file (t->suffix);
5266 temp_filename_length = strlen (temp_filename);
5267 t->filename = temp_filename;
5268 t->filename_length = temp_filename_length;
5269 }
5270
5271 if (saved_suffix)
5272 free (saved_suffix);
5273
5274 obstack_grow (&obstack, t->filename, t->filename_length);
5275 delete_this_arg = 1;
5276 }
5277 arg_going = 1;
5278 break;
5279
5280 case 'i':
5281 if (combine_inputs)
5282 {
5283 if (at_file_supplied)
5284 {
5285 /* We are going to expand `%i' to `@FILE', where FILE
5286 is a newly-created temporary filename. The filenames
5287 that would usually be expanded in place of %o will be
5288 written to the temporary file. */
5289 char **argv;
5290 int n_files = 0;
5291 int j;
5292
5293 for (i = 0; i < n_infiles; i++)
5294 if (compile_input_file_p (&infiles[i]))
5295 n_files++;
5296
5297 argv = (char **) alloca (sizeof (char *) * (n_files + 1));
5298
5299 /* Copy the strings over. */
5300 for (i = 0, j = 0; i < n_infiles; i++)
5301 if (compile_input_file_p (&infiles[i]))
5302 {
5303 argv[j] = CONST_CAST (char *, infiles[i].name);
5304 infiles[i].compiled = true;
5305 j++;
5306 }
5307 argv[j] = NULL;
5308
5309 create_at_file (argv);
5310 }
5311 else
5312 for (i = 0; (int) i < n_infiles; i++)
5313 if (compile_input_file_p (&infiles[i]))
5314 {
5315 store_arg (infiles[i].name, 0, 0);
5316 infiles[i].compiled = true;
5317 }
5318 }
5319 else
5320 {
5321 obstack_grow (&obstack, gcc_input_filename,
5322 input_filename_length);
5323 arg_going = 1;
5324 }
5325 break;
5326
5327 case 'I':
5328 {
5329 struct spec_path_info info;
5330
5331 if (multilib_dir)
5332 {
5333 do_spec_1 ("-imultilib", 1, NULL);
5334 /* Make this a separate argument. */
5335 do_spec_1 (" ", 0, NULL);
5336 do_spec_1 (multilib_dir, 1, NULL);
5337 do_spec_1 (" ", 0, NULL);
5338 }
5339
5340 if (gcc_exec_prefix)
5341 {
5342 do_spec_1 ("-iprefix", 1, NULL);
5343 /* Make this a separate argument. */
5344 do_spec_1 (" ", 0, NULL);
5345 do_spec_1 (gcc_exec_prefix, 1, NULL);
5346 do_spec_1 (" ", 0, NULL);
5347 }
5348
5349 if (target_system_root_changed ||
5350 (target_system_root && target_sysroot_hdrs_suffix))
5351 {
5352 do_spec_1 ("-isysroot", 1, NULL);
5353 /* Make this a separate argument. */
5354 do_spec_1 (" ", 0, NULL);
5355 do_spec_1 (target_system_root, 1, NULL);
5356 if (target_sysroot_hdrs_suffix)
5357 do_spec_1 (target_sysroot_hdrs_suffix, 1, NULL);
5358 do_spec_1 (" ", 0, NULL);
5359 }
5360
5361 info.option = "-isystem";
5362 info.append = "include";
5363 info.append_len = strlen (info.append);
5364 info.omit_relative = false;
5365 info.separate_options = true;
5366
5367 for_each_path (&include_prefixes, false, info.append_len,
5368 spec_path, &info);
5369
5370 info.append = "include-fixed";
5371 if (*sysroot_hdrs_suffix_spec)
5372 info.append = concat (info.append, dir_separator_str,
5373 multilib_dir, NULL);
5374 info.append_len = strlen (info.append);
5375 for_each_path (&include_prefixes, false, info.append_len,
5376 spec_path, &info);
5377 }
5378 break;
5379
5380 case 'o':
5381 {
5382 int max = n_infiles;
5383 max += lang_specific_extra_outfiles;
5384
5385 if (HAVE_GNU_LD && at_file_supplied)
5386 {
5387 /* We are going to expand `%o' to `@FILE', where FILE
5388 is a newly-created temporary filename. The filenames
5389 that would usually be expanded in place of %o will be
5390 written to the temporary file. */
5391
5392 char **argv;
5393 int n_files, j;
5394
5395 /* Convert OUTFILES into a form suitable for writeargv. */
5396
5397 /* Determine how many are non-NULL. */
5398 for (n_files = 0, i = 0; i < max; i++)
5399 n_files += outfiles[i] != NULL;
5400
5401 argv = (char **) alloca (sizeof (char *) * (n_files + 1));
5402
5403 /* Copy the strings over. */
5404 for (i = 0, j = 0; i < max; i++)
5405 if (outfiles[i])
5406 {
5407 argv[j] = CONST_CAST (char *, outfiles[i]);
5408 j++;
5409 }
5410 argv[j] = NULL;
5411
5412 create_at_file (argv);
5413 }
5414 else
5415 for (i = 0; i < max; i++)
5416 if (outfiles[i])
5417 store_arg (outfiles[i], 0, 0);
5418 break;
5419 }
5420
5421 case 'O':
5422 obstack_grow (&obstack, TARGET_OBJECT_SUFFIX, strlen (TARGET_OBJECT_SUFFIX));
5423 arg_going = 1;
5424 break;
5425
5426 case 's':
5427 this_is_library_file = 1;
5428 break;
5429
5430 case 'T':
5431 this_is_linker_script = 1;
5432 break;
5433
5434 case 'V':
5435 outfiles[input_file_number] = NULL;
5436 break;
5437
5438 case 'w':
5439 this_is_output_file = 1;
5440 break;
5441
5442 case 'W':
5443 {
5444 int cur_index = argbuf_index;
5445 /* Handle the {...} following the %W. */
5446 if (*p != '{')
5447 fatal_error ("spec %qs has invalid %<%%W%c%>", spec, *p);
5448 p = handle_braces (p + 1);
5449 if (p == 0)
5450 return -1;
5451 end_going_arg ();
5452 /* If any args were output, mark the last one for deletion
5453 on failure. */
5454 if (argbuf_index != cur_index)
5455 record_temp_file (argbuf[argbuf_index - 1], 0, 1);
5456 break;
5457 }
5458
5459 /* %x{OPTION} records OPTION for %X to output. */
5460 case 'x':
5461 {
5462 const char *p1 = p;
5463 char *string;
5464
5465 /* Skip past the option value and make a copy. */
5466 if (*p != '{')
5467 fatal_error ("spec %qs has invalid %<%%x%c%>", spec, *p);
5468 while (*p++ != '}')
5469 ;
5470 string = save_string (p1 + 1, p - p1 - 2);
5471
5472 /* See if we already recorded this option. */
5473 for (i = 0; i < n_linker_options; i++)
5474 if (! strcmp (string, linker_options[i]))
5475 {
5476 free (string);
5477 return 0;
5478 }
5479
5480 /* This option is new; add it. */
5481 add_linker_option (string, strlen (string));
5482 }
5483 break;
5484
5485 /* Dump out the options accumulated previously using %x. */
5486 case 'X':
5487 for (i = 0; i < n_linker_options; i++)
5488 {
5489 do_spec_1 (linker_options[i], 1, NULL);
5490 /* Make each accumulated option a separate argument. */
5491 do_spec_1 (" ", 0, NULL);
5492 }
5493 break;
5494
5495 /* Dump out the options accumulated previously using -Wa,. */
5496 case 'Y':
5497 for (i = 0; i < n_assembler_options; i++)
5498 {
5499 do_spec_1 (assembler_options[i], 1, NULL);
5500 /* Make each accumulated option a separate argument. */
5501 do_spec_1 (" ", 0, NULL);
5502 }
5503 break;
5504
5505 /* Dump out the options accumulated previously using -Wp,. */
5506 case 'Z':
5507 for (i = 0; i < n_preprocessor_options; i++)
5508 {
5509 do_spec_1 (preprocessor_options[i], 1, NULL);
5510 /* Make each accumulated option a separate argument. */
5511 do_spec_1 (" ", 0, NULL);
5512 }
5513 break;
5514
5515 /* Here are digits and numbers that just process
5516 a certain constant string as a spec. */
5517
5518 case '1':
5519 value = do_spec_1 (cc1_spec, 0, NULL);
5520 if (value != 0)
5521 return value;
5522 break;
5523
5524 case '2':
5525 value = do_spec_1 (cc1plus_spec, 0, NULL);
5526 if (value != 0)
5527 return value;
5528 break;
5529
5530 case 'a':
5531 value = do_spec_1 (asm_spec, 0, NULL);
5532 if (value != 0)
5533 return value;
5534 break;
5535
5536 case 'A':
5537 value = do_spec_1 (asm_final_spec, 0, NULL);
5538 if (value != 0)
5539 return value;
5540 break;
5541
5542 case 'C':
5543 {
5544 const char *const spec
5545 = (input_file_compiler->cpp_spec
5546 ? input_file_compiler->cpp_spec
5547 : cpp_spec);
5548 value = do_spec_1 (spec, 0, NULL);
5549 if (value != 0)
5550 return value;
5551 }
5552 break;
5553
5554 case 'E':
5555 value = do_spec_1 (endfile_spec, 0, NULL);
5556 if (value != 0)
5557 return value;
5558 break;
5559
5560 case 'l':
5561 value = do_spec_1 (link_spec, 0, NULL);
5562 if (value != 0)
5563 return value;
5564 break;
5565
5566 case 'L':
5567 value = do_spec_1 (lib_spec, 0, NULL);
5568 if (value != 0)
5569 return value;
5570 break;
5571
5572 case 'G':
5573 value = do_spec_1 (libgcc_spec, 0, NULL);
5574 if (value != 0)
5575 return value;
5576 break;
5577
5578 case 'R':
5579 /* We assume there is a directory
5580 separator at the end of this string. */
5581 if (target_system_root)
5582 {
5583 obstack_grow (&obstack, target_system_root,
5584 strlen (target_system_root));
5585 if (target_sysroot_suffix)
5586 obstack_grow (&obstack, target_sysroot_suffix,
5587 strlen (target_sysroot_suffix));
5588 }
5589 break;
5590
5591 case 'S':
5592 value = do_spec_1 (startfile_spec, 0, NULL);
5593 if (value != 0)
5594 return value;
5595 break;
5596
5597 /* Here we define characters other than letters and digits. */
5598
5599 case '{':
5600 p = handle_braces (p);
5601 if (p == 0)
5602 return -1;
5603 break;
5604
5605 case ':':
5606 p = handle_spec_function (p);
5607 if (p == 0)
5608 return -1;
5609 break;
5610
5611 case '%':
5612 obstack_1grow (&obstack, '%');
5613 break;
5614
5615 case '.':
5616 {
5617 unsigned len = 0;
5618
5619 while (p[len] && p[len] != ' ' && p[len] != '%')
5620 len++;
5621 suffix_subst = save_string (p - 1, len + 1);
5622 p += len;
5623 }
5624 break;
5625
5626 /* Henceforth ignore the option(s) matching the pattern
5627 after the %<. */
5628 case '<':
5629 {
5630 unsigned len = 0;
5631 int have_wildcard = 0;
5632 int i;
5633
5634 while (p[len] && p[len] != ' ' && p[len] != '\t')
5635 len++;
5636
5637 if (p[len-1] == '*')
5638 have_wildcard = 1;
5639
5640 for (i = 0; i < n_switches; i++)
5641 if (!strncmp (switches[i].part1, p, len - have_wildcard)
5642 && (have_wildcard || switches[i].part1[len] == '\0'))
5643 {
5644 switches[i].live_cond |= SWITCH_IGNORE;
5645 switches[i].validated = 1;
5646 }
5647
5648 p += len;
5649 }
5650 break;
5651
5652 case '*':
5653 if (soft_matched_part)
5654 {
5655 do_spec_1 (soft_matched_part, 1, NULL);
5656 do_spec_1 (" ", 0, NULL);
5657 }
5658 else
5659 /* Catch the case where a spec string contains something like
5660 '%{foo:%*}'. i.e. there is no * in the pattern on the left
5661 hand side of the :. */
5662 error ("spec failure: %<%%*%> has not been initialized by pattern match");
5663 break;
5664
5665 /* Process a string found as the value of a spec given by name.
5666 This feature allows individual machine descriptions
5667 to add and use their own specs.
5668 %[...] modifies -D options the way %P does;
5669 %(...) uses the spec unmodified. */
5670 case '[':
5671 warning (0, "use of obsolete %%[ operator in specs");
5672 case '(':
5673 {
5674 const char *name = p;
5675 struct spec_list *sl;
5676 int len;
5677
5678 /* The string after the S/P is the name of a spec that is to be
5679 processed. */
5680 while (*p && *p != ')' && *p != ']')
5681 p++;
5682
5683 /* See if it's in the list. */
5684 for (len = p - name, sl = specs; sl; sl = sl->next)
5685 if (sl->name_len == len && !strncmp (sl->name, name, len))
5686 {
5687 name = *(sl->ptr_spec);
5688 #ifdef DEBUG_SPECS
5689 fnotice (stderr, "Processing spec %c%s%c, which is '%s'\n",
5690 c, sl->name, (c == '(') ? ')' : ']', name);
5691 #endif
5692 break;
5693 }
5694
5695 if (sl)
5696 {
5697 if (c == '(')
5698 {
5699 value = do_spec_1 (name, 0, NULL);
5700 if (value != 0)
5701 return value;
5702 }
5703 else
5704 {
5705 char *x = (char *) alloca (strlen (name) * 2 + 1);
5706 char *buf = x;
5707 const char *y = name;
5708 int flag = 0;
5709
5710 /* Copy all of NAME into BUF, but put __ after
5711 every -D and at the end of each arg. */
5712 while (1)
5713 {
5714 if (! strncmp (y, "-D", 2))
5715 {
5716 *x++ = '-';
5717 *x++ = 'D';
5718 *x++ = '_';
5719 *x++ = '_';
5720 y += 2;
5721 flag = 1;
5722 continue;
5723 }
5724 else if (flag
5725 && (*y == ' ' || *y == '\t' || *y == '='
5726 || *y == '}' || *y == 0))
5727 {
5728 *x++ = '_';
5729 *x++ = '_';
5730 flag = 0;
5731 }
5732 if (*y == 0)
5733 break;
5734 else
5735 *x++ = *y++;
5736 }
5737 *x = 0;
5738
5739 value = do_spec_1 (buf, 0, NULL);
5740 if (value != 0)
5741 return value;
5742 }
5743 }
5744
5745 /* Discard the closing paren or bracket. */
5746 if (*p)
5747 p++;
5748 }
5749 break;
5750
5751 default:
5752 error ("spec failure: unrecognized spec option %qc", c);
5753 break;
5754 }
5755 break;
5756
5757 case '\\':
5758 /* Backslash: treat next character as ordinary. */
5759 c = *p++;
5760
5761 /* Fall through. */
5762 default:
5763 /* Ordinary character: put it into the current argument. */
5764 obstack_1grow (&obstack, c);
5765 arg_going = 1;
5766 }
5767
5768 /* End of string. If we are processing a spec function, we need to
5769 end any pending argument. */
5770 if (processing_spec_function)
5771 end_going_arg ();
5772
5773 return 0;
5774 }
5775
5776 /* Look up a spec function. */
5777
5778 static const struct spec_function *
5779 lookup_spec_function (const char *name)
5780 {
5781 const struct spec_function *sf;
5782
5783 for (sf = static_spec_functions; sf->name != NULL; sf++)
5784 if (strcmp (sf->name, name) == 0)
5785 return sf;
5786
5787 return NULL;
5788 }
5789
5790 /* Evaluate a spec function. */
5791
5792 static const char *
5793 eval_spec_function (const char *func, const char *args)
5794 {
5795 const struct spec_function *sf;
5796 const char *funcval;
5797
5798 /* Saved spec processing context. */
5799 int save_argbuf_index;
5800 int save_argbuf_length;
5801 const char **save_argbuf;
5802
5803 int save_arg_going;
5804 int save_delete_this_arg;
5805 int save_this_is_output_file;
5806 int save_this_is_library_file;
5807 int save_input_from_pipe;
5808 int save_this_is_linker_script;
5809 const char *save_suffix_subst;
5810
5811
5812 sf = lookup_spec_function (func);
5813 if (sf == NULL)
5814 fatal_error ("unknown spec function %qs", func);
5815
5816 /* Push the spec processing context. */
5817 save_argbuf_index = argbuf_index;
5818 save_argbuf_length = argbuf_length;
5819 save_argbuf = argbuf;
5820
5821 save_arg_going = arg_going;
5822 save_delete_this_arg = delete_this_arg;
5823 save_this_is_output_file = this_is_output_file;
5824 save_this_is_library_file = this_is_library_file;
5825 save_this_is_linker_script = this_is_linker_script;
5826 save_input_from_pipe = input_from_pipe;
5827 save_suffix_subst = suffix_subst;
5828
5829 /* Create a new spec processing context, and build the function
5830 arguments. */
5831
5832 alloc_args ();
5833 if (do_spec_2 (args) < 0)
5834 fatal_error ("error in args to spec function %qs", func);
5835
5836 /* argbuf_index is an index for the next argument to be inserted, and
5837 so contains the count of the args already inserted. */
5838
5839 funcval = (*sf->func) (argbuf_index, argbuf);
5840
5841 /* Pop the spec processing context. */
5842 argbuf_index = save_argbuf_index;
5843 argbuf_length = save_argbuf_length;
5844 free (argbuf);
5845 argbuf = save_argbuf;
5846
5847 arg_going = save_arg_going;
5848 delete_this_arg = save_delete_this_arg;
5849 this_is_output_file = save_this_is_output_file;
5850 this_is_library_file = save_this_is_library_file;
5851 this_is_linker_script = save_this_is_linker_script;
5852 input_from_pipe = save_input_from_pipe;
5853 suffix_subst = save_suffix_subst;
5854
5855 return funcval;
5856 }
5857
5858 /* Handle a spec function call of the form:
5859
5860 %:function(args)
5861
5862 ARGS is processed as a spec in a separate context and split into an
5863 argument vector in the normal fashion. The function returns a string
5864 containing a spec which we then process in the caller's context, or
5865 NULL if no processing is required. */
5866
5867 static const char *
5868 handle_spec_function (const char *p)
5869 {
5870 char *func, *args;
5871 const char *endp, *funcval;
5872 int count;
5873
5874 processing_spec_function++;
5875
5876 /* Get the function name. */
5877 for (endp = p; *endp != '\0'; endp++)
5878 {
5879 if (*endp == '(') /* ) */
5880 break;
5881 /* Only allow [A-Za-z0-9], -, and _ in function names. */
5882 if (!ISALNUM (*endp) && !(*endp == '-' || *endp == '_'))
5883 fatal_error ("malformed spec function name");
5884 }
5885 if (*endp != '(') /* ) */
5886 fatal_error ("no arguments for spec function");
5887 func = save_string (p, endp - p);
5888 p = ++endp;
5889
5890 /* Get the arguments. */
5891 for (count = 0; *endp != '\0'; endp++)
5892 {
5893 /* ( */
5894 if (*endp == ')')
5895 {
5896 if (count == 0)
5897 break;
5898 count--;
5899 }
5900 else if (*endp == '(') /* ) */
5901 count++;
5902 }
5903 /* ( */
5904 if (*endp != ')')
5905 fatal_error ("malformed spec function arguments");
5906 args = save_string (p, endp - p);
5907 p = ++endp;
5908
5909 /* p now points to just past the end of the spec function expression. */
5910
5911 funcval = eval_spec_function (func, args);
5912 if (funcval != NULL && do_spec_1 (funcval, 0, NULL) < 0)
5913 p = NULL;
5914
5915 free (func);
5916 free (args);
5917
5918 processing_spec_function--;
5919
5920 return p;
5921 }
5922
5923 /* Inline subroutine of handle_braces. Returns true if the current
5924 input suffix matches the atom bracketed by ATOM and END_ATOM. */
5925 static inline bool
5926 input_suffix_matches (const char *atom, const char *end_atom)
5927 {
5928 return (input_suffix
5929 && !strncmp (input_suffix, atom, end_atom - atom)
5930 && input_suffix[end_atom - atom] == '\0');
5931 }
5932
5933 /* Subroutine of handle_braces. Returns true if the current
5934 input file's spec name matches the atom bracketed by ATOM and END_ATOM. */
5935 static bool
5936 input_spec_matches (const char *atom, const char *end_atom)
5937 {
5938 return (input_file_compiler
5939 && input_file_compiler->suffix
5940 && input_file_compiler->suffix[0] != '\0'
5941 && !strncmp (input_file_compiler->suffix + 1, atom,
5942 end_atom - atom)
5943 && input_file_compiler->suffix[end_atom - atom + 1] == '\0');
5944 }
5945
5946 /* Subroutine of handle_braces. Returns true if a switch
5947 matching the atom bracketed by ATOM and END_ATOM appeared on the
5948 command line. */
5949 static bool
5950 switch_matches (const char *atom, const char *end_atom, int starred)
5951 {
5952 int i;
5953 int len = end_atom - atom;
5954 int plen = starred ? len : -1;
5955
5956 for (i = 0; i < n_switches; i++)
5957 if (!strncmp (switches[i].part1, atom, len)
5958 && (starred || switches[i].part1[len] == '\0')
5959 && check_live_switch (i, plen))
5960 return true;
5961
5962 return false;
5963 }
5964
5965 /* Inline subroutine of handle_braces. Mark all of the switches which
5966 match ATOM (extends to END_ATOM; STARRED indicates whether there
5967 was a star after the atom) for later processing. */
5968 static inline void
5969 mark_matching_switches (const char *atom, const char *end_atom, int starred)
5970 {
5971 int i;
5972 int len = end_atom - atom;
5973 int plen = starred ? len : -1;
5974
5975 for (i = 0; i < n_switches; i++)
5976 if (!strncmp (switches[i].part1, atom, len)
5977 && (starred || switches[i].part1[len] == '\0')
5978 && check_live_switch (i, plen))
5979 switches[i].ordering = 1;
5980 }
5981
5982 /* Inline subroutine of handle_braces. Process all the currently
5983 marked switches through give_switch, and clear the marks. */
5984 static inline void
5985 process_marked_switches (void)
5986 {
5987 int i;
5988
5989 for (i = 0; i < n_switches; i++)
5990 if (switches[i].ordering == 1)
5991 {
5992 switches[i].ordering = 0;
5993 give_switch (i, 0);
5994 }
5995 }
5996
5997 /* Handle a %{ ... } construct. P points just inside the leading {.
5998 Returns a pointer one past the end of the brace block, or 0
5999 if we call do_spec_1 and that returns -1. */
6000
6001 static const char *
6002 handle_braces (const char *p)
6003 {
6004 const char *atom, *end_atom;
6005 const char *d_atom = NULL, *d_end_atom = NULL;
6006 const char *orig = p;
6007
6008 bool a_is_suffix;
6009 bool a_is_spectype;
6010 bool a_is_starred;
6011 bool a_is_negated;
6012 bool a_matched;
6013
6014 bool a_must_be_last = false;
6015 bool ordered_set = false;
6016 bool disjunct_set = false;
6017 bool disj_matched = false;
6018 bool disj_starred = true;
6019 bool n_way_choice = false;
6020 bool n_way_matched = false;
6021
6022 #define SKIP_WHITE() do { while (*p == ' ' || *p == '\t') p++; } while (0)
6023
6024 do
6025 {
6026 if (a_must_be_last)
6027 goto invalid;
6028
6029 /* Scan one "atom" (S in the description above of %{}, possibly
6030 with '!', '.', '@', ',', or '*' modifiers). */
6031 a_matched = false;
6032 a_is_suffix = false;
6033 a_is_starred = false;
6034 a_is_negated = false;
6035 a_is_spectype = false;
6036
6037 SKIP_WHITE();
6038 if (*p == '!')
6039 p++, a_is_negated = true;
6040
6041 SKIP_WHITE();
6042 if (*p == '.')
6043 p++, a_is_suffix = true;
6044 else if (*p == ',')
6045 p++, a_is_spectype = true;
6046
6047 atom = p;
6048 while (ISIDNUM(*p) || *p == '-' || *p == '+' || *p == '='
6049 || *p == ',' || *p == '.' || *p == '@')
6050 p++;
6051 end_atom = p;
6052
6053 if (*p == '*')
6054 p++, a_is_starred = 1;
6055
6056 SKIP_WHITE();
6057 switch (*p)
6058 {
6059 case '&': case '}':
6060 /* Substitute the switch(es) indicated by the current atom. */
6061 ordered_set = true;
6062 if (disjunct_set || n_way_choice || a_is_negated || a_is_suffix
6063 || a_is_spectype || atom == end_atom)
6064 goto invalid;
6065
6066 mark_matching_switches (atom, end_atom, a_is_starred);
6067
6068 if (*p == '}')
6069 process_marked_switches ();
6070 break;
6071
6072 case '|': case ':':
6073 /* Substitute some text if the current atom appears as a switch
6074 or suffix. */
6075 disjunct_set = true;
6076 if (ordered_set)
6077 goto invalid;
6078
6079 if (atom == end_atom)
6080 {
6081 if (!n_way_choice || disj_matched || *p == '|'
6082 || a_is_negated || a_is_suffix || a_is_spectype
6083 || a_is_starred)
6084 goto invalid;
6085
6086 /* An empty term may appear as the last choice of an
6087 N-way choice set; it means "otherwise". */
6088 a_must_be_last = true;
6089 disj_matched = !n_way_matched;
6090 disj_starred = false;
6091 }
6092 else
6093 {
6094 if ((a_is_suffix || a_is_spectype) && a_is_starred)
6095 goto invalid;
6096
6097 if (!a_is_starred)
6098 disj_starred = false;
6099
6100 /* Don't bother testing this atom if we already have a
6101 match. */
6102 if (!disj_matched && !n_way_matched)
6103 {
6104 if (a_is_suffix)
6105 a_matched = input_suffix_matches (atom, end_atom);
6106 else if (a_is_spectype)
6107 a_matched = input_spec_matches (atom, end_atom);
6108 else
6109 a_matched = switch_matches (atom, end_atom, a_is_starred);
6110
6111 if (a_matched != a_is_negated)
6112 {
6113 disj_matched = true;
6114 d_atom = atom;
6115 d_end_atom = end_atom;
6116 }
6117 }
6118 }
6119
6120 if (*p == ':')
6121 {
6122 /* Found the body, that is, the text to substitute if the
6123 current disjunction matches. */
6124 p = process_brace_body (p + 1, d_atom, d_end_atom, disj_starred,
6125 disj_matched && !n_way_matched);
6126 if (p == 0)
6127 return 0;
6128
6129 /* If we have an N-way choice, reset state for the next
6130 disjunction. */
6131 if (*p == ';')
6132 {
6133 n_way_choice = true;
6134 n_way_matched |= disj_matched;
6135 disj_matched = false;
6136 disj_starred = true;
6137 d_atom = d_end_atom = NULL;
6138 }
6139 }
6140 break;
6141
6142 default:
6143 goto invalid;
6144 }
6145 }
6146 while (*p++ != '}');
6147
6148 return p;
6149
6150 invalid:
6151 fatal_error ("braced spec %qs is invalid at %qc", orig, *p);
6152
6153 #undef SKIP_WHITE
6154 }
6155
6156 /* Subroutine of handle_braces. Scan and process a brace substitution body
6157 (X in the description of %{} syntax). P points one past the colon;
6158 ATOM and END_ATOM bracket the first atom which was found to be true
6159 (present) in the current disjunction; STARRED indicates whether all
6160 the atoms in the current disjunction were starred (for syntax validation);
6161 MATCHED indicates whether the disjunction matched or not, and therefore
6162 whether or not the body is to be processed through do_spec_1 or just
6163 skipped. Returns a pointer to the closing } or ;, or 0 if do_spec_1
6164 returns -1. */
6165
6166 static const char *
6167 process_brace_body (const char *p, const char *atom, const char *end_atom,
6168 int starred, int matched)
6169 {
6170 const char *body, *end_body;
6171 unsigned int nesting_level;
6172 bool have_subst = false;
6173
6174 /* Locate the closing } or ;, honoring nested braces.
6175 Trim trailing whitespace. */
6176 body = p;
6177 nesting_level = 1;
6178 for (;;)
6179 {
6180 if (*p == '{')
6181 nesting_level++;
6182 else if (*p == '}')
6183 {
6184 if (!--nesting_level)
6185 break;
6186 }
6187 else if (*p == ';' && nesting_level == 1)
6188 break;
6189 else if (*p == '%' && p[1] == '*' && nesting_level == 1)
6190 have_subst = true;
6191 else if (*p == '\0')
6192 goto invalid;
6193 p++;
6194 }
6195
6196 end_body = p;
6197 while (end_body[-1] == ' ' || end_body[-1] == '\t')
6198 end_body--;
6199
6200 if (have_subst && !starred)
6201 goto invalid;
6202
6203 if (matched)
6204 {
6205 /* Copy the substitution body to permanent storage and execute it.
6206 If have_subst is false, this is a simple matter of running the
6207 body through do_spec_1... */
6208 char *string = save_string (body, end_body - body);
6209 if (!have_subst)
6210 {
6211 if (do_spec_1 (string, 0, NULL) < 0)
6212 return 0;
6213 }
6214 else
6215 {
6216 /* ... but if have_subst is true, we have to process the
6217 body once for each matching switch, with %* set to the
6218 variant part of the switch. */
6219 unsigned int hard_match_len = end_atom - atom;
6220 int i;
6221
6222 for (i = 0; i < n_switches; i++)
6223 if (!strncmp (switches[i].part1, atom, hard_match_len)
6224 && check_live_switch (i, hard_match_len))
6225 {
6226 if (do_spec_1 (string, 0,
6227 &switches[i].part1[hard_match_len]) < 0)
6228 return 0;
6229 /* Pass any arguments this switch has. */
6230 give_switch (i, 1);
6231 suffix_subst = NULL;
6232 }
6233 }
6234 }
6235
6236 return p;
6237
6238 invalid:
6239 fatal_error ("braced spec body %qs is invalid", body);
6240 }
6241 \f
6242 /* Return 0 iff switch number SWITCHNUM is obsoleted by a later switch
6243 on the command line. PREFIX_LENGTH is the length of XXX in an {XXX*}
6244 spec, or -1 if either exact match or %* is used.
6245
6246 A -O switch is obsoleted by a later -O switch. A -f, -m, or -W switch
6247 whose value does not begin with "no-" is obsoleted by the same value
6248 with the "no-", similarly for a switch with the "no-" prefix. */
6249
6250 static int
6251 check_live_switch (int switchnum, int prefix_length)
6252 {
6253 const char *name = switches[switchnum].part1;
6254 int i;
6255
6256 /* If we already processed this switch and determined if it was
6257 live or not, return our past determination. */
6258 if (switches[switchnum].live_cond != 0)
6259 return ((switches[switchnum].live_cond & SWITCH_LIVE) != 0
6260 && (switches[switchnum].live_cond & SWITCH_FALSE) == 0
6261 && (switches[switchnum].live_cond & SWITCH_IGNORE_PERMANENTLY)
6262 == 0);
6263
6264 /* In the common case of {<at-most-one-letter>*}, a negating
6265 switch would always match, so ignore that case. We will just
6266 send the conflicting switches to the compiler phase. */
6267 if (prefix_length >= 0 && prefix_length <= 1)
6268 return 1;
6269
6270 /* Now search for duplicate in a manner that depends on the name. */
6271 switch (*name)
6272 {
6273 case 'O':
6274 for (i = switchnum + 1; i < n_switches; i++)
6275 if (switches[i].part1[0] == 'O')
6276 {
6277 switches[switchnum].validated = 1;
6278 switches[switchnum].live_cond = SWITCH_FALSE;
6279 return 0;
6280 }
6281 break;
6282
6283 case 'W': case 'f': case 'm':
6284 if (! strncmp (name + 1, "no-", 3))
6285 {
6286 /* We have Xno-YYY, search for XYYY. */
6287 for (i = switchnum + 1; i < n_switches; i++)
6288 if (switches[i].part1[0] == name[0]
6289 && ! strcmp (&switches[i].part1[1], &name[4]))
6290 {
6291 switches[switchnum].validated = 1;
6292 switches[switchnum].live_cond = SWITCH_FALSE;
6293 return 0;
6294 }
6295 }
6296 else
6297 {
6298 /* We have XYYY, search for Xno-YYY. */
6299 for (i = switchnum + 1; i < n_switches; i++)
6300 if (switches[i].part1[0] == name[0]
6301 && switches[i].part1[1] == 'n'
6302 && switches[i].part1[2] == 'o'
6303 && switches[i].part1[3] == '-'
6304 && !strcmp (&switches[i].part1[4], &name[1]))
6305 {
6306 switches[switchnum].validated = 1;
6307 switches[switchnum].live_cond = SWITCH_FALSE;
6308 return 0;
6309 }
6310 }
6311 break;
6312 }
6313
6314 /* Otherwise the switch is live. */
6315 switches[switchnum].live_cond |= SWITCH_LIVE;
6316 return 1;
6317 }
6318 \f
6319 /* Pass a switch to the current accumulating command
6320 in the same form that we received it.
6321 SWITCHNUM identifies the switch; it is an index into
6322 the vector of switches gcc received, which is `switches'.
6323 This cannot fail since it never finishes a command line.
6324
6325 If OMIT_FIRST_WORD is nonzero, then we omit .part1 of the argument. */
6326
6327 static void
6328 give_switch (int switchnum, int omit_first_word)
6329 {
6330 if ((switches[switchnum].live_cond & SWITCH_IGNORE) != 0)
6331 return;
6332
6333 if (!omit_first_word)
6334 {
6335 do_spec_1 ("-", 0, NULL);
6336 do_spec_1 (switches[switchnum].part1, 1, NULL);
6337 }
6338
6339 if (switches[switchnum].args != 0)
6340 {
6341 const char **p;
6342 for (p = switches[switchnum].args; *p; p++)
6343 {
6344 const char *arg = *p;
6345
6346 do_spec_1 (" ", 0, NULL);
6347 if (suffix_subst)
6348 {
6349 unsigned length = strlen (arg);
6350 int dot = 0;
6351
6352 while (length-- && !IS_DIR_SEPARATOR (arg[length]))
6353 if (arg[length] == '.')
6354 {
6355 (CONST_CAST(char *, arg))[length] = 0;
6356 dot = 1;
6357 break;
6358 }
6359 do_spec_1 (arg, 1, NULL);
6360 if (dot)
6361 (CONST_CAST(char *, arg))[length] = '.';
6362 do_spec_1 (suffix_subst, 1, NULL);
6363 }
6364 else
6365 do_spec_1 (arg, 1, NULL);
6366 }
6367 }
6368
6369 do_spec_1 (" ", 0, NULL);
6370 switches[switchnum].validated = 1;
6371 }
6372 \f
6373 /* Search for a file named NAME trying various prefixes including the
6374 user's -B prefix and some standard ones.
6375 Return the absolute file name found. If nothing is found, return NAME. */
6376
6377 static const char *
6378 find_file (const char *name)
6379 {
6380 char *newname = find_a_file (&startfile_prefixes, name, R_OK, true);
6381 return newname ? newname : name;
6382 }
6383
6384 /* Determine whether a directory exists. If LINKER, return 0 for
6385 certain fixed names not needed by the linker. */
6386
6387 static int
6388 is_directory (const char *path1, bool linker)
6389 {
6390 int len1;
6391 char *path;
6392 char *cp;
6393 struct stat st;
6394
6395 /* Ensure the string ends with "/.". The resulting path will be a
6396 directory even if the given path is a symbolic link. */
6397 len1 = strlen (path1);
6398 path = (char *) alloca (3 + len1);
6399 memcpy (path, path1, len1);
6400 cp = path + len1;
6401 if (!IS_DIR_SEPARATOR (cp[-1]))
6402 *cp++ = DIR_SEPARATOR;
6403 *cp++ = '.';
6404 *cp = '\0';
6405
6406 /* Exclude directories that the linker is known to search. */
6407 if (linker
6408 && IS_DIR_SEPARATOR (path[0])
6409 && ((cp - path == 6
6410 && strncmp (path + 1, "lib", 3) == 0)
6411 || (cp - path == 10
6412 && strncmp (path + 1, "usr", 3) == 0
6413 && IS_DIR_SEPARATOR (path[4])
6414 && strncmp (path + 5, "lib", 3) == 0)))
6415 return 0;
6416
6417 return (stat (path, &st) >= 0 && S_ISDIR (st.st_mode));
6418 }
6419
6420 /* Set up the various global variables to indicate that we're processing
6421 the input file named FILENAME. */
6422
6423 void
6424 set_input (const char *filename)
6425 {
6426 const char *p;
6427
6428 gcc_input_filename = filename;
6429 input_filename_length = strlen (gcc_input_filename);
6430 input_basename = lbasename (gcc_input_filename);
6431
6432 /* Find a suffix starting with the last period,
6433 and set basename_length to exclude that suffix. */
6434 basename_length = strlen (input_basename);
6435 suffixed_basename_length = basename_length;
6436 p = input_basename + basename_length;
6437 while (p != input_basename && *p != '.')
6438 --p;
6439 if (*p == '.' && p != input_basename)
6440 {
6441 basename_length = p - input_basename;
6442 input_suffix = p + 1;
6443 }
6444 else
6445 input_suffix = "";
6446
6447 /* If a spec for 'g', 'u', or 'U' is seen with -save-temps then
6448 we will need to do a stat on the gcc_input_filename. The
6449 INPUT_STAT_SET signals that the stat is needed. */
6450 input_stat_set = 0;
6451 }
6452 \f
6453 /* On fatal signals, delete all the temporary files. */
6454
6455 static void
6456 fatal_signal (int signum)
6457 {
6458 signal (signum, SIG_DFL);
6459 delete_failure_queue ();
6460 delete_temp_files ();
6461 /* Get the same signal again, this time not handled,
6462 so its normal effect occurs. */
6463 kill (getpid (), signum);
6464 }
6465
6466 /* Compare the contents of the two files named CMPFILE[0] and
6467 CMPFILE[1]. Return zero if they're identical, nonzero
6468 otherwise. */
6469
6470 static int
6471 compare_files (char *cmpfile[])
6472 {
6473 int ret = 0;
6474 FILE *temp[2] = { NULL, NULL };
6475 int i;
6476
6477 #if HAVE_MMAP_FILE
6478 {
6479 size_t length[2];
6480 void *map[2] = { NULL, NULL };
6481
6482 for (i = 0; i < 2; i++)
6483 {
6484 struct stat st;
6485
6486 if (stat (cmpfile[i], &st) < 0 || !S_ISREG (st.st_mode))
6487 {
6488 error ("%s: could not determine length of compare-debug file %s",
6489 gcc_input_filename, cmpfile[i]);
6490 ret = 1;
6491 break;
6492 }
6493
6494 length[i] = st.st_size;
6495 }
6496
6497 if (!ret && length[0] != length[1])
6498 {
6499 error ("%s: -fcompare-debug failure (length)", gcc_input_filename);
6500 ret = 1;
6501 }
6502
6503 if (!ret)
6504 for (i = 0; i < 2; i++)
6505 {
6506 int fd = open (cmpfile[i], O_RDONLY);
6507 if (fd < 0)
6508 {
6509 error ("%s: could not open compare-debug file %s",
6510 gcc_input_filename, cmpfile[i]);
6511 ret = 1;
6512 break;
6513 }
6514
6515 map[i] = mmap (NULL, length[i], PROT_READ, MAP_PRIVATE, fd, 0);
6516 close (fd);
6517
6518 if (map[i] == (void *) MAP_FAILED)
6519 {
6520 ret = -1;
6521 break;
6522 }
6523 }
6524
6525 if (!ret)
6526 {
6527 if (memcmp (map[0], map[1], length[0]) != 0)
6528 {
6529 error ("%s: -fcompare-debug failure", gcc_input_filename);
6530 ret = 1;
6531 }
6532 }
6533
6534 for (i = 0; i < 2; i++)
6535 if (map[i])
6536 munmap ((caddr_t) map[i], length[i]);
6537
6538 if (ret >= 0)
6539 return ret;
6540
6541 ret = 0;
6542 }
6543 #endif
6544
6545 for (i = 0; i < 2; i++)
6546 {
6547 temp[i] = fopen (cmpfile[i], "r");
6548 if (!temp[i])
6549 {
6550 error ("%s: could not open compare-debug file %s",
6551 gcc_input_filename, cmpfile[i]);
6552 ret = 1;
6553 break;
6554 }
6555 }
6556
6557 if (!ret && temp[0] && temp[1])
6558 for (;;)
6559 {
6560 int c0, c1;
6561 c0 = fgetc (temp[0]);
6562 c1 = fgetc (temp[1]);
6563
6564 if (c0 != c1)
6565 {
6566 error ("%s: -fcompare-debug failure",
6567 gcc_input_filename);
6568 ret = 1;
6569 break;
6570 }
6571
6572 if (c0 == EOF)
6573 break;
6574 }
6575
6576 for (i = 1; i >= 0; i--)
6577 {
6578 if (temp[i])
6579 fclose (temp[i]);
6580 }
6581
6582 return ret;
6583 }
6584
6585 extern int main (int, char **);
6586
6587 int
6588 main (int argc, char **argv)
6589 {
6590 size_t i;
6591 int value;
6592 int linker_was_run = 0;
6593 int lang_n_infiles = 0;
6594 int num_linker_inputs = 0;
6595 char *explicit_link_files;
6596 char *specs_file;
6597 const char *p;
6598 struct user_specs *uptr;
6599 char **old_argv = argv;
6600
6601 /* Initialize here, not in definition. The IRIX 6 O32 cc sometimes chokes
6602 on ?: in file-scope variable initializations. */
6603 asm_debug = ASM_DEBUG_SPEC;
6604
6605 p = argv[0] + strlen (argv[0]);
6606 while (p != argv[0] && !IS_DIR_SEPARATOR (p[-1]))
6607 --p;
6608 progname = p;
6609
6610 xmalloc_set_program_name (progname);
6611
6612 expandargv (&argc, &argv);
6613
6614 /* Determine if any expansions were made. */
6615 if (argv != old_argv)
6616 at_file_supplied = true;
6617
6618 prune_options (&argc, &argv);
6619
6620 #ifdef GCC_DRIVER_HOST_INITIALIZATION
6621 /* Perform host dependent initialization when needed. */
6622 GCC_DRIVER_HOST_INITIALIZATION;
6623 #endif
6624
6625 /* Unlock the stdio streams. */
6626 unlock_std_streams ();
6627
6628 gcc_init_libintl ();
6629
6630 diagnostic_initialize (global_dc, 0);
6631 if (atexit (delete_temp_files) != 0)
6632 fatal_error ("atexit failed");
6633
6634 if (signal (SIGINT, SIG_IGN) != SIG_IGN)
6635 signal (SIGINT, fatal_signal);
6636 #ifdef SIGHUP
6637 if (signal (SIGHUP, SIG_IGN) != SIG_IGN)
6638 signal (SIGHUP, fatal_signal);
6639 #endif
6640 if (signal (SIGTERM, SIG_IGN) != SIG_IGN)
6641 signal (SIGTERM, fatal_signal);
6642 #ifdef SIGPIPE
6643 if (signal (SIGPIPE, SIG_IGN) != SIG_IGN)
6644 signal (SIGPIPE, fatal_signal);
6645 #endif
6646 #ifdef SIGCHLD
6647 /* We *MUST* set SIGCHLD to SIG_DFL so that the wait4() call will
6648 receive the signal. A different setting is inheritable */
6649 signal (SIGCHLD, SIG_DFL);
6650 #endif
6651
6652 /* Allocate the argument vector. */
6653 alloc_args ();
6654
6655 obstack_init (&obstack);
6656
6657 /* Build multilib_select, et. al from the separate lines that make up each
6658 multilib selection. */
6659 {
6660 const char *const *q = multilib_raw;
6661 int need_space;
6662
6663 obstack_init (&multilib_obstack);
6664 while ((p = *q++) != (char *) 0)
6665 obstack_grow (&multilib_obstack, p, strlen (p));
6666
6667 obstack_1grow (&multilib_obstack, 0);
6668 multilib_select = XOBFINISH (&multilib_obstack, const char *);
6669
6670 q = multilib_matches_raw;
6671 while ((p = *q++) != (char *) 0)
6672 obstack_grow (&multilib_obstack, p, strlen (p));
6673
6674 obstack_1grow (&multilib_obstack, 0);
6675 multilib_matches = XOBFINISH (&multilib_obstack, const char *);
6676
6677 q = multilib_exclusions_raw;
6678 while ((p = *q++) != (char *) 0)
6679 obstack_grow (&multilib_obstack, p, strlen (p));
6680
6681 obstack_1grow (&multilib_obstack, 0);
6682 multilib_exclusions = XOBFINISH (&multilib_obstack, const char *);
6683
6684 need_space = FALSE;
6685 for (i = 0; i < ARRAY_SIZE (multilib_defaults_raw); i++)
6686 {
6687 if (need_space)
6688 obstack_1grow (&multilib_obstack, ' ');
6689 obstack_grow (&multilib_obstack,
6690 multilib_defaults_raw[i],
6691 strlen (multilib_defaults_raw[i]));
6692 need_space = TRUE;
6693 }
6694
6695 obstack_1grow (&multilib_obstack, 0);
6696 multilib_defaults = XOBFINISH (&multilib_obstack, const char *);
6697 }
6698
6699 #ifdef INIT_ENVIRONMENT
6700 /* Set up any other necessary machine specific environment variables. */
6701 xputenv (INIT_ENVIRONMENT);
6702 #endif
6703
6704 /* Make a table of what switches there are (switches, n_switches).
6705 Make a table of specified input files (infiles, n_infiles).
6706 Decode switches that are handled locally. */
6707
6708 process_command (argc, CONST_CAST2 (const char **, char **, argv));
6709
6710 /* Initialize the vector of specs to just the default.
6711 This means one element containing 0s, as a terminator. */
6712
6713 compilers = XNEWVAR (struct compiler, sizeof default_compilers);
6714 memcpy (compilers, default_compilers, sizeof default_compilers);
6715 n_compilers = n_default_compilers;
6716
6717 /* Read specs from a file if there is one. */
6718
6719 machine_suffix = concat (spec_machine, dir_separator_str,
6720 spec_version, dir_separator_str, NULL);
6721 just_machine_suffix = concat (spec_machine, dir_separator_str, NULL);
6722
6723 specs_file = find_a_file (&startfile_prefixes, "specs", R_OK, true);
6724 /* Read the specs file unless it is a default one. */
6725 if (specs_file != 0 && strcmp (specs_file, "specs"))
6726 read_specs (specs_file, TRUE);
6727 else
6728 init_spec ();
6729
6730 /* We need to check standard_exec_prefix/just_machine_suffix/specs
6731 for any override of as, ld and libraries. */
6732 specs_file = (char *) alloca (strlen (standard_exec_prefix)
6733 + strlen (just_machine_suffix) + sizeof ("specs"));
6734
6735 strcpy (specs_file, standard_exec_prefix);
6736 strcat (specs_file, just_machine_suffix);
6737 strcat (specs_file, "specs");
6738 if (access (specs_file, R_OK) == 0)
6739 read_specs (specs_file, TRUE);
6740
6741 /* Process any configure-time defaults specified for the command line
6742 options, via OPTION_DEFAULT_SPECS. */
6743 for (i = 0; i < ARRAY_SIZE (option_default_specs); i++)
6744 do_option_spec (option_default_specs[i].name,
6745 option_default_specs[i].spec);
6746
6747 /* Process DRIVER_SELF_SPECS, adding any new options to the end
6748 of the command line. */
6749
6750 for (i = 0; i < ARRAY_SIZE (driver_self_specs); i++)
6751 do_self_spec (driver_self_specs[i]);
6752
6753 if (compare_debug)
6754 {
6755 enum save_temps save;
6756
6757 if (!compare_debug_second)
6758 {
6759 n_switches_debug_check[1] = n_switches;
6760 switches_debug_check[1] = XDUPVEC (struct switchstr, switches,
6761 n_switches + 1);
6762
6763 do_self_spec ("%:compare-debug-self-opt()");
6764 n_switches_debug_check[0] = n_switches;
6765 switches_debug_check[0] = switches;
6766
6767 n_switches = n_switches_debug_check[1];
6768 switches = switches_debug_check[1];
6769 }
6770
6771 /* Avoid crash when computing %j in this early. */
6772 save = save_temps_flag;
6773 save_temps_flag = SAVE_TEMPS_NONE;
6774
6775 compare_debug = -compare_debug;
6776 do_self_spec ("%:compare-debug-self-opt()");
6777
6778 save_temps_flag = save;
6779
6780 if (!compare_debug_second)
6781 {
6782 n_switches_debug_check[1] = n_switches;
6783 switches_debug_check[1] = switches;
6784 compare_debug = -compare_debug;
6785 n_switches = n_switches_debug_check[0];
6786 switches = switches_debug_check[0];
6787 }
6788 }
6789
6790 /* If not cross-compiling, look for executables in the standard
6791 places. */
6792 if (*cross_compile == '0')
6793 {
6794 if (*md_exec_prefix)
6795 {
6796 add_prefix (&exec_prefixes, md_exec_prefix, "GCC",
6797 PREFIX_PRIORITY_LAST, 0, 0);
6798 }
6799 }
6800
6801 /* Process sysroot_suffix_spec. */
6802 if (*sysroot_suffix_spec != 0
6803 && do_spec_2 (sysroot_suffix_spec) == 0)
6804 {
6805 if (argbuf_index > 1)
6806 error ("spec failure: more than one arg to SYSROOT_SUFFIX_SPEC");
6807 else if (argbuf_index == 1)
6808 target_sysroot_suffix = xstrdup (argbuf[argbuf_index -1]);
6809 }
6810
6811 #ifdef HAVE_LD_SYSROOT
6812 /* Pass the --sysroot option to the linker, if it supports that. If
6813 there is a sysroot_suffix_spec, it has already been processed by
6814 this point, so target_system_root really is the system root we
6815 should be using. */
6816 if (target_system_root)
6817 {
6818 obstack_grow (&obstack, "%(sysroot_spec) ", strlen ("%(sysroot_spec) "));
6819 obstack_grow0 (&obstack, link_spec, strlen (link_spec));
6820 set_spec ("link", XOBFINISH (&obstack, const char *));
6821 }
6822 #endif
6823
6824 /* Process sysroot_hdrs_suffix_spec. */
6825 if (*sysroot_hdrs_suffix_spec != 0
6826 && do_spec_2 (sysroot_hdrs_suffix_spec) == 0)
6827 {
6828 if (argbuf_index > 1)
6829 error ("spec failure: more than one arg to SYSROOT_HEADERS_SUFFIX_SPEC");
6830 else if (argbuf_index == 1)
6831 target_sysroot_hdrs_suffix = xstrdup (argbuf[argbuf_index -1]);
6832 }
6833
6834 /* Look for startfiles in the standard places. */
6835 if (*startfile_prefix_spec != 0
6836 && do_spec_2 (startfile_prefix_spec) == 0
6837 && do_spec_1 (" ", 0, NULL) == 0)
6838 {
6839 int ndx;
6840 for (ndx = 0; ndx < argbuf_index; ndx++)
6841 add_sysrooted_prefix (&startfile_prefixes, argbuf[ndx], "BINUTILS",
6842 PREFIX_PRIORITY_LAST, 0, 1);
6843 }
6844 /* We should eventually get rid of all these and stick to
6845 startfile_prefix_spec exclusively. */
6846 else if (*cross_compile == '0' || target_system_root)
6847 {
6848 if (*md_startfile_prefix)
6849 add_sysrooted_prefix (&startfile_prefixes, md_startfile_prefix,
6850 "GCC", PREFIX_PRIORITY_LAST, 0, 1);
6851
6852 if (*md_startfile_prefix_1)
6853 add_sysrooted_prefix (&startfile_prefixes, md_startfile_prefix_1,
6854 "GCC", PREFIX_PRIORITY_LAST, 0, 1);
6855
6856 /* If standard_startfile_prefix is relative, base it on
6857 standard_exec_prefix. This lets us move the installed tree
6858 as a unit. If GCC_EXEC_PREFIX is defined, base
6859 standard_startfile_prefix on that as well.
6860
6861 If the prefix is relative, only search it for native compilers;
6862 otherwise we will search a directory containing host libraries. */
6863 if (IS_ABSOLUTE_PATH (standard_startfile_prefix))
6864 add_sysrooted_prefix (&startfile_prefixes,
6865 standard_startfile_prefix, "BINUTILS",
6866 PREFIX_PRIORITY_LAST, 0, 1);
6867 else if (*cross_compile == '0')
6868 {
6869 add_prefix (&startfile_prefixes,
6870 concat (gcc_exec_prefix
6871 ? gcc_exec_prefix : standard_exec_prefix,
6872 machine_suffix,
6873 standard_startfile_prefix, NULL),
6874 NULL, PREFIX_PRIORITY_LAST, 0, 1);
6875 }
6876
6877 /* Sysrooted prefixes are relocated because target_system_root is
6878 also relocated by gcc_exec_prefix. */
6879 if (*standard_startfile_prefix_1)
6880 add_sysrooted_prefix (&startfile_prefixes,
6881 standard_startfile_prefix_1, "BINUTILS",
6882 PREFIX_PRIORITY_LAST, 0, 1);
6883 if (*standard_startfile_prefix_2)
6884 add_sysrooted_prefix (&startfile_prefixes,
6885 standard_startfile_prefix_2, "BINUTILS",
6886 PREFIX_PRIORITY_LAST, 0, 1);
6887 }
6888
6889 /* Process any user specified specs in the order given on the command
6890 line. */
6891 for (uptr = user_specs_head; uptr; uptr = uptr->next)
6892 {
6893 char *filename = find_a_file (&startfile_prefixes, uptr->filename,
6894 R_OK, true);
6895 read_specs (filename ? filename : uptr->filename, FALSE);
6896 }
6897
6898 /* If we have a GCC_EXEC_PREFIX envvar, modify it for cpp's sake. */
6899 if (gcc_exec_prefix)
6900 gcc_exec_prefix = concat (gcc_exec_prefix, spec_machine, dir_separator_str,
6901 spec_version, dir_separator_str, NULL);
6902
6903 /* Now we have the specs.
6904 Set the `valid' bits for switches that match anything in any spec. */
6905
6906 validate_all_switches ();
6907
6908 /* Now that we have the switches and the specs, set
6909 the subdirectory based on the options. */
6910 set_multilib_dir ();
6911
6912 /* Set up to remember the pathname of gcc and any options
6913 needed for collect. We use argv[0] instead of progname because
6914 we need the complete pathname. */
6915 obstack_init (&collect_obstack);
6916 obstack_grow (&collect_obstack, "COLLECT_GCC=", sizeof ("COLLECT_GCC=") - 1);
6917 obstack_grow (&collect_obstack, argv[0], strlen (argv[0]) + 1);
6918 xputenv (XOBFINISH (&collect_obstack, char *));
6919
6920 /* Set up to remember the pathname of the lto wrapper. */
6921
6922 lto_wrapper_spec = find_a_file (&exec_prefixes, "lto-wrapper", X_OK, false);
6923 if (lto_wrapper_spec)
6924 {
6925 obstack_init (&collect_obstack);
6926 obstack_grow (&collect_obstack, "COLLECT_LTO_WRAPPER=",
6927 sizeof ("COLLECT_LTO_WRAPPER=") - 1);
6928 obstack_grow (&collect_obstack, lto_wrapper_spec,
6929 strlen (lto_wrapper_spec) + 1);
6930 xputenv (XOBFINISH (&collect_obstack, char *));
6931 }
6932
6933 /* Warn about any switches that no pass was interested in. */
6934
6935 for (i = 0; (int) i < n_switches; i++)
6936 if (! switches[i].validated)
6937 error ("unrecognized option %<-%s%>", switches[i].part1);
6938
6939 /* Obey some of the options. */
6940
6941 if (print_search_dirs)
6942 {
6943 printf (_("install: %s%s\n"),
6944 gcc_exec_prefix ? gcc_exec_prefix : standard_exec_prefix,
6945 gcc_exec_prefix ? "" : machine_suffix);
6946 printf (_("programs: %s\n"),
6947 build_search_list (&exec_prefixes, "", false, false));
6948 printf (_("libraries: %s\n"),
6949 build_search_list (&startfile_prefixes, "", false, true));
6950 return (0);
6951 }
6952
6953 if (print_file_name)
6954 {
6955 printf ("%s\n", find_file (print_file_name));
6956 return (0);
6957 }
6958
6959 if (print_prog_name)
6960 {
6961 char *newname = find_a_file (&exec_prefixes, print_prog_name, X_OK, 0);
6962 printf ("%s\n", (newname ? newname : print_prog_name));
6963 return (0);
6964 }
6965
6966 if (print_multi_lib)
6967 {
6968 print_multilib_info ();
6969 return (0);
6970 }
6971
6972 if (print_multi_directory)
6973 {
6974 if (multilib_dir == NULL)
6975 printf (".\n");
6976 else
6977 printf ("%s\n", multilib_dir);
6978 return (0);
6979 }
6980
6981 if (print_sysroot)
6982 {
6983 if (target_system_root)
6984 {
6985 if (target_sysroot_suffix)
6986 printf ("%s%s\n", target_system_root, target_sysroot_suffix);
6987 else
6988 printf ("%s\n", target_system_root);
6989 }
6990 return (0);
6991 }
6992
6993 if (print_multi_os_directory)
6994 {
6995 if (multilib_os_dir == NULL)
6996 printf (".\n");
6997 else
6998 printf ("%s\n", multilib_os_dir);
6999 return (0);
7000 }
7001
7002 if (print_sysroot_headers_suffix)
7003 {
7004 if (*sysroot_hdrs_suffix_spec)
7005 {
7006 printf("%s\n", (target_sysroot_hdrs_suffix
7007 ? target_sysroot_hdrs_suffix
7008 : ""));
7009 return (0);
7010 }
7011 else
7012 /* The error status indicates that only one set of fixed
7013 headers should be built. */
7014 fatal_error ("not configured with sysroot headers suffix");
7015 }
7016
7017 if (print_help_list)
7018 {
7019 display_help ();
7020
7021 if (! verbose_flag)
7022 {
7023 printf (_("\nFor bug reporting instructions, please see:\n"));
7024 printf ("%s.\n", bug_report_url);
7025
7026 return (0);
7027 }
7028
7029 /* We do not exit here. Instead we have created a fake input file
7030 called 'help-dummy' which needs to be compiled, and we pass this
7031 on the various sub-processes, along with the --help switch.
7032 Ensure their output appears after ours. */
7033 fputc ('\n', stdout);
7034 fflush (stdout);
7035 }
7036
7037 if (print_version)
7038 {
7039 printf (_("%s %s%s\n"), progname, pkgversion_string,
7040 version_string);
7041 printf ("Copyright %s 2010 Free Software Foundation, Inc.\n",
7042 _("(C)"));
7043 fputs (_("This is free software; see the source for copying conditions. There is NO\n\
7044 warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\n"),
7045 stdout);
7046 if (! verbose_flag)
7047 return 0;
7048
7049 /* We do not exit here. We use the same mechanism of --help to print
7050 the version of the sub-processes. */
7051 fputc ('\n', stdout);
7052 fflush (stdout);
7053 }
7054
7055 if (verbose_flag)
7056 {
7057 int n;
7058 const char *thrmod;
7059
7060 fnotice (stderr, "Target: %s\n", spec_machine);
7061 fnotice (stderr, "Configured with: %s\n", configuration_arguments);
7062
7063 #ifdef THREAD_MODEL_SPEC
7064 /* We could have defined THREAD_MODEL_SPEC to "%*" by default,
7065 but there's no point in doing all this processing just to get
7066 thread_model back. */
7067 obstack_init (&obstack);
7068 do_spec_1 (THREAD_MODEL_SPEC, 0, thread_model);
7069 obstack_1grow (&obstack, '\0');
7070 thrmod = XOBFINISH (&obstack, const char *);
7071 #else
7072 thrmod = thread_model;
7073 #endif
7074
7075 fnotice (stderr, "Thread model: %s\n", thrmod);
7076
7077 /* compiler_version is truncated at the first space when initialized
7078 from version string, so truncate version_string at the first space
7079 before comparing. */
7080 for (n = 0; version_string[n]; n++)
7081 if (version_string[n] == ' ')
7082 break;
7083
7084 if (! strncmp (version_string, compiler_version, n)
7085 && compiler_version[n] == 0)
7086 fnotice (stderr, "gcc version %s %s\n", version_string,
7087 pkgversion_string);
7088 else
7089 fnotice (stderr, "gcc driver version %s %sexecuting gcc version %s\n",
7090 version_string, pkgversion_string, compiler_version);
7091
7092 if (n_infiles == 0)
7093 return (0);
7094 }
7095
7096 if (n_infiles == added_libraries)
7097 fatal_error ("no input files");
7098
7099 /* Make a place to record the compiler output file names
7100 that correspond to the input files. */
7101
7102 i = n_infiles;
7103 i += lang_specific_extra_outfiles;
7104 outfiles = XCNEWVEC (const char *, i);
7105
7106 /* Record which files were specified explicitly as link input. */
7107
7108 explicit_link_files = XCNEWVEC (char, n_infiles);
7109
7110 if (combine_flag)
7111 combine_inputs = true;
7112 else
7113 combine_inputs = false;
7114
7115 for (i = 0; (int) i < n_infiles; i++)
7116 {
7117 const char *name = infiles[i].name;
7118 struct compiler *compiler = lookup_compiler (name,
7119 strlen (name),
7120 infiles[i].language);
7121
7122 if (compiler && !(compiler->combinable))
7123 combine_inputs = false;
7124
7125 if (lang_n_infiles > 0 && compiler != input_file_compiler
7126 && infiles[i].language && infiles[i].language[0] != '*')
7127 infiles[i].incompiler = compiler;
7128 else if (compiler)
7129 {
7130 lang_n_infiles++;
7131 input_file_compiler = compiler;
7132 infiles[i].incompiler = compiler;
7133 }
7134 else
7135 {
7136 /* Since there is no compiler for this input file, assume it is a
7137 linker file. */
7138 explicit_link_files[i] = 1;
7139 infiles[i].incompiler = NULL;
7140 }
7141 infiles[i].compiled = false;
7142 infiles[i].preprocessed = false;
7143 }
7144
7145 if (!combine_inputs && have_c && have_o && lang_n_infiles > 1)
7146 fatal_error ("cannot specify -o with -c, -S or -E with multiple files");
7147
7148 if (combine_flag && save_temps_flag)
7149 {
7150 bool save_combine_inputs = combine_inputs;
7151 /* Must do a separate pre-processing pass for C & Objective-C files, to
7152 obtain individual .i files. */
7153
7154 combine_inputs = false;
7155 for (i = 0; (int) i < n_infiles; i++)
7156 {
7157 int this_file_error = 0;
7158
7159 input_file_number = i;
7160 set_input (infiles[i].name);
7161 if (infiles[i].incompiler
7162 && (infiles[i].incompiler)->needs_preprocessing)
7163 input_file_compiler = infiles[i].incompiler;
7164 else
7165 continue;
7166
7167 if (input_file_compiler)
7168 {
7169 if (input_file_compiler->spec[0] == '#')
7170 {
7171 error ("%s: %s compiler not installed on this system",
7172 gcc_input_filename, &input_file_compiler->spec[1]);
7173 this_file_error = 1;
7174 }
7175 else
7176 {
7177 value = do_spec (input_file_compiler->spec);
7178 infiles[i].preprocessed = true;
7179 if (!have_o_argbuf_index)
7180 fatal_error ("spec %qs is invalid",
7181 input_file_compiler->spec);
7182 infiles[i].name = argbuf[have_o_argbuf_index];
7183 infiles[i].incompiler
7184 = lookup_compiler (infiles[i].name,
7185 strlen (infiles[i].name),
7186 infiles[i].language);
7187
7188 if (value < 0)
7189 this_file_error = 1;
7190 }
7191 }
7192
7193 if (this_file_error)
7194 {
7195 delete_failure_queue ();
7196 errorcount++;
7197 break;
7198 }
7199 clear_failure_queue ();
7200 }
7201 combine_inputs = save_combine_inputs;
7202 }
7203
7204 for (i = 0; (int) i < n_infiles; i++)
7205 {
7206 int this_file_error = 0;
7207
7208 /* Tell do_spec what to substitute for %i. */
7209
7210 input_file_number = i;
7211 set_input (infiles[i].name);
7212
7213 if (infiles[i].compiled)
7214 continue;
7215
7216 /* Use the same thing in %o, unless cp->spec says otherwise. */
7217
7218 outfiles[i] = gcc_input_filename;
7219
7220 /* Figure out which compiler from the file's suffix. */
7221
7222 if (! combine_inputs)
7223 input_file_compiler
7224 = lookup_compiler (infiles[i].name, input_filename_length,
7225 infiles[i].language);
7226 else
7227 input_file_compiler = infiles[i].incompiler;
7228
7229 if (input_file_compiler)
7230 {
7231 /* Ok, we found an applicable compiler. Run its spec. */
7232
7233 if (input_file_compiler->spec[0] == '#')
7234 {
7235 error ("%s: %s compiler not installed on this system",
7236 gcc_input_filename, &input_file_compiler->spec[1]);
7237 this_file_error = 1;
7238 }
7239 else
7240 {
7241 if (compare_debug)
7242 {
7243 if (debug_check_temp_file[0])
7244 free (debug_check_temp_file[0]);
7245 debug_check_temp_file[0] = NULL;
7246
7247 if (debug_check_temp_file[1])
7248 free (debug_check_temp_file[1]);
7249 debug_check_temp_file[1] = NULL;
7250 }
7251
7252 value = do_spec (input_file_compiler->spec);
7253 infiles[i].compiled = true;
7254 if (value < 0)
7255 this_file_error = 1;
7256 else if (compare_debug && debug_check_temp_file[0])
7257 {
7258 if (verbose_flag)
7259 inform (0, "recompiling with -fcompare-debug");
7260
7261 compare_debug = -compare_debug;
7262 n_switches = n_switches_debug_check[1];
7263 switches = switches_debug_check[1];
7264
7265 value = do_spec (input_file_compiler->spec);
7266
7267 compare_debug = -compare_debug;
7268 n_switches = n_switches_debug_check[0];
7269 switches = switches_debug_check[0];
7270
7271 if (value < 0)
7272 {
7273 error ("during -fcompare-debug recompilation");
7274 this_file_error = 1;
7275 }
7276
7277 gcc_assert (debug_check_temp_file[1]
7278 && strcmp (debug_check_temp_file[0],
7279 debug_check_temp_file[1]));
7280
7281 if (verbose_flag)
7282 inform (0, "comparing final insns dumps");
7283
7284 if (compare_files (debug_check_temp_file))
7285 this_file_error = 1;
7286 }
7287
7288 if (compare_debug)
7289 {
7290 if (debug_check_temp_file[0])
7291 free (debug_check_temp_file[0]);
7292 debug_check_temp_file[0] = NULL;
7293
7294 if (debug_check_temp_file[1])
7295 free (debug_check_temp_file[1]);
7296 debug_check_temp_file[1] = NULL;
7297 }
7298 }
7299 }
7300
7301 /* If this file's name does not contain a recognized suffix,
7302 record it as explicit linker input. */
7303
7304 else
7305 explicit_link_files[i] = 1;
7306
7307 /* Clear the delete-on-failure queue, deleting the files in it
7308 if this compilation failed. */
7309
7310 if (this_file_error)
7311 {
7312 delete_failure_queue ();
7313 errorcount++;
7314 }
7315 /* If this compilation succeeded, don't delete those files later. */
7316 clear_failure_queue ();
7317 }
7318
7319 /* Reset the input file name to the first compile/object file name, for use
7320 with %b in LINK_SPEC. We use the first input file that we can find
7321 a compiler to compile it instead of using infiles.language since for
7322 languages other than C we use aliases that we then lookup later. */
7323 if (n_infiles > 0)
7324 {
7325 int i;
7326
7327 for (i = 0; i < n_infiles ; i++)
7328 if (infiles[i].language && infiles[i].language[0] != '*')
7329 {
7330 set_input (infiles[i].name);
7331 break;
7332 }
7333 }
7334
7335 if (!seen_error ())
7336 {
7337 /* Make sure INPUT_FILE_NUMBER points to first available open
7338 slot. */
7339 input_file_number = n_infiles;
7340 if (lang_specific_pre_link ())
7341 errorcount++;
7342 }
7343
7344 /* Determine if there are any linker input files. */
7345 num_linker_inputs = 0;
7346 for (i = 0; (int) i < n_infiles; i++)
7347 if (explicit_link_files[i] || outfiles[i] != NULL)
7348 num_linker_inputs++;
7349
7350 /* Run ld to link all the compiler output files. */
7351
7352 if (num_linker_inputs > 0 && !seen_error () && print_subprocess_help < 2)
7353 {
7354 int tmp = execution_count;
7355 const char *fuse_linker_plugin = "fuse-linker-plugin";
7356
7357 /* We'll use ld if we can't find collect2. */
7358 if (! strcmp (linker_name_spec, "collect2"))
7359 {
7360 char *s = find_a_file (&exec_prefixes, "collect2", X_OK, false);
7361 if (s == NULL)
7362 linker_name_spec = "ld";
7363 }
7364
7365 if (switch_matches (fuse_linker_plugin,
7366 fuse_linker_plugin + strlen (fuse_linker_plugin), 0))
7367 {
7368 linker_plugin_file_spec = find_a_file (&exec_prefixes,
7369 "liblto_plugin.so", R_OK,
7370 false);
7371 if (!linker_plugin_file_spec)
7372 fatal_error ("-fuse-linker-plugin, but liblto_plugin.so not found");
7373
7374 lto_libgcc_spec = find_a_file (&startfile_prefixes, "libgcc.a",
7375 R_OK, true);
7376 if (!lto_libgcc_spec)
7377 fatal_error ("could not find libgcc.a");
7378 }
7379 lto_gcc_spec = argv[0];
7380
7381 /* Rebuild the COMPILER_PATH and LIBRARY_PATH environment variables
7382 for collect. */
7383 putenv_from_prefixes (&exec_prefixes, "COMPILER_PATH", false);
7384 putenv_from_prefixes (&startfile_prefixes, LIBRARY_PATH_ENV, true);
7385
7386 if (print_subprocess_help == 1)
7387 {
7388 printf (_("\nLinker options\n==============\n\n"));
7389 printf (_("Use \"-Wl,OPTION\" to pass \"OPTION\""
7390 " to the linker.\n\n"));
7391 fflush (stdout);
7392 }
7393 value = do_spec (link_command_spec);
7394 if (value < 0)
7395 errorcount = 1;
7396 linker_was_run = (tmp != execution_count);
7397 }
7398
7399 /* If options said don't run linker,
7400 complain about input files to be given to the linker. */
7401
7402 if (! linker_was_run && !seen_error ())
7403 for (i = 0; (int) i < n_infiles; i++)
7404 if (explicit_link_files[i]
7405 && !(infiles[i].language && infiles[i].language[0] == '*'))
7406 warning (0, "%s: linker input file unused because linking not done",
7407 outfiles[i]);
7408
7409 /* Delete some or all of the temporary files we made. */
7410
7411 if (seen_error ())
7412 delete_failure_queue ();
7413 delete_temp_files ();
7414
7415 if (print_help_list)
7416 {
7417 printf (("\nFor bug reporting instructions, please see:\n"));
7418 printf ("%s\n", bug_report_url);
7419 }
7420
7421 return (signal_count != 0 ? 2
7422 : seen_error () ? (pass_exit_codes ? greatest_status : 1)
7423 : 0);
7424 }
7425
7426 /* Find the proper compilation spec for the file name NAME,
7427 whose length is LENGTH. LANGUAGE is the specified language,
7428 or 0 if this file is to be passed to the linker. */
7429
7430 static struct compiler *
7431 lookup_compiler (const char *name, size_t length, const char *language)
7432 {
7433 struct compiler *cp;
7434
7435 /* If this was specified by the user to be a linker input, indicate that. */
7436 if (language != 0 && language[0] == '*')
7437 return 0;
7438
7439 /* Otherwise, look for the language, if one is spec'd. */
7440 if (language != 0)
7441 {
7442 for (cp = compilers + n_compilers - 1; cp >= compilers; cp--)
7443 if (cp->suffix[0] == '@' && !strcmp (cp->suffix + 1, language))
7444 return cp;
7445
7446 error ("language %s not recognized", language);
7447 return 0;
7448 }
7449
7450 /* Look for a suffix. */
7451 for (cp = compilers + n_compilers - 1; cp >= compilers; cp--)
7452 {
7453 if (/* The suffix `-' matches only the file name `-'. */
7454 (!strcmp (cp->suffix, "-") && !strcmp (name, "-"))
7455 || (strlen (cp->suffix) < length
7456 /* See if the suffix matches the end of NAME. */
7457 && !strcmp (cp->suffix,
7458 name + length - strlen (cp->suffix))
7459 ))
7460 break;
7461 }
7462
7463 #if defined (OS2) ||defined (HAVE_DOS_BASED_FILE_SYSTEM)
7464 /* Look again, but case-insensitively this time. */
7465 if (cp < compilers)
7466 for (cp = compilers + n_compilers - 1; cp >= compilers; cp--)
7467 {
7468 if (/* The suffix `-' matches only the file name `-'. */
7469 (!strcmp (cp->suffix, "-") && !strcmp (name, "-"))
7470 || (strlen (cp->suffix) < length
7471 /* See if the suffix matches the end of NAME. */
7472 && ((!strcmp (cp->suffix,
7473 name + length - strlen (cp->suffix))
7474 || !strpbrk (cp->suffix, "ABCDEFGHIJKLMNOPQRSTUVWXYZ"))
7475 && !strcasecmp (cp->suffix,
7476 name + length - strlen (cp->suffix)))
7477 ))
7478 break;
7479 }
7480 #endif
7481
7482 if (cp >= compilers)
7483 {
7484 if (cp->spec[0] != '@')
7485 /* A non-alias entry: return it. */
7486 return cp;
7487
7488 /* An alias entry maps a suffix to a language.
7489 Search for the language; pass 0 for NAME and LENGTH
7490 to avoid infinite recursion if language not found. */
7491 return lookup_compiler (NULL, 0, cp->spec + 1);
7492 }
7493 return 0;
7494 }
7495 \f
7496 static char *
7497 save_string (const char *s, int len)
7498 {
7499 char *result = XNEWVEC (char, len + 1);
7500
7501 memcpy (result, s, len);
7502 result[len] = 0;
7503 return result;
7504 }
7505
7506 void
7507 pfatal_with_name (const char *name)
7508 {
7509 perror_with_name (name);
7510 delete_temp_files ();
7511 exit (1);
7512 }
7513
7514 static void
7515 perror_with_name (const char *name)
7516 {
7517 error ("%s: %m", name);
7518 }
7519 \f
7520 static inline void
7521 validate_switches_from_spec (const char *spec)
7522 {
7523 const char *p = spec;
7524 char c;
7525 while ((c = *p++))
7526 if (c == '%' && (*p == '{' || *p == '<' || (*p == 'W' && *++p == '{')))
7527 /* We have a switch spec. */
7528 p = validate_switches (p + 1);
7529 }
7530
7531 static void
7532 validate_all_switches (void)
7533 {
7534 struct compiler *comp;
7535 struct spec_list *spec;
7536
7537 for (comp = compilers; comp->spec; comp++)
7538 validate_switches_from_spec (comp->spec);
7539
7540 /* Look through the linked list of specs read from the specs file. */
7541 for (spec = specs; spec; spec = spec->next)
7542 validate_switches_from_spec (*spec->ptr_spec);
7543
7544 validate_switches_from_spec (link_command_spec);
7545 }
7546
7547 /* Look at the switch-name that comes after START
7548 and mark as valid all supplied switches that match it. */
7549
7550 static const char *
7551 validate_switches (const char *start)
7552 {
7553 const char *p = start;
7554 const char *atom;
7555 size_t len;
7556 int i;
7557 bool suffix = false;
7558 bool starred = false;
7559
7560 #define SKIP_WHITE() do { while (*p == ' ' || *p == '\t') p++; } while (0)
7561
7562 next_member:
7563 SKIP_WHITE ();
7564
7565 if (*p == '!')
7566 p++;
7567
7568 SKIP_WHITE ();
7569 if (*p == '.' || *p == ',')
7570 suffix = true, p++;
7571
7572 atom = p;
7573 while (ISIDNUM (*p) || *p == '-' || *p == '+' || *p == '='
7574 || *p == ',' || *p == '.' || *p == '@')
7575 p++;
7576 len = p - atom;
7577
7578 if (*p == '*')
7579 starred = true, p++;
7580
7581 SKIP_WHITE ();
7582
7583 if (!suffix)
7584 {
7585 /* Mark all matching switches as valid. */
7586 for (i = 0; i < n_switches; i++)
7587 if (!strncmp (switches[i].part1, atom, len)
7588 && (starred || switches[i].part1[len] == 0))
7589 switches[i].validated = 1;
7590 }
7591
7592 if (*p) p++;
7593 if (*p && (p[-1] == '|' || p[-1] == '&'))
7594 goto next_member;
7595
7596 if (*p && p[-1] == ':')
7597 {
7598 while (*p && *p != ';' && *p != '}')
7599 {
7600 if (*p == '%')
7601 {
7602 p++;
7603 if (*p == '{' || *p == '<')
7604 p = validate_switches (p+1);
7605 else if (p[0] == 'W' && p[1] == '{')
7606 p = validate_switches (p+2);
7607 }
7608 else
7609 p++;
7610 }
7611
7612 if (*p) p++;
7613 if (*p && p[-1] == ';')
7614 goto next_member;
7615 }
7616
7617 return p;
7618 #undef SKIP_WHITE
7619 }
7620 \f
7621 struct mdswitchstr
7622 {
7623 const char *str;
7624 int len;
7625 };
7626
7627 static struct mdswitchstr *mdswitches;
7628 static int n_mdswitches;
7629
7630 /* Check whether a particular argument was used. The first time we
7631 canonicalize the switches to keep only the ones we care about. */
7632
7633 static int
7634 used_arg (const char *p, int len)
7635 {
7636 struct mswitchstr
7637 {
7638 const char *str;
7639 const char *replace;
7640 int len;
7641 int rep_len;
7642 };
7643
7644 static struct mswitchstr *mswitches;
7645 static int n_mswitches;
7646 int i, j;
7647
7648 if (!mswitches)
7649 {
7650 struct mswitchstr *matches;
7651 const char *q;
7652 int cnt = 0;
7653
7654 /* Break multilib_matches into the component strings of string
7655 and replacement string. */
7656 for (q = multilib_matches; *q != '\0'; q++)
7657 if (*q == ';')
7658 cnt++;
7659
7660 matches
7661 = (struct mswitchstr *) alloca ((sizeof (struct mswitchstr)) * cnt);
7662 i = 0;
7663 q = multilib_matches;
7664 while (*q != '\0')
7665 {
7666 matches[i].str = q;
7667 while (*q != ' ')
7668 {
7669 if (*q == '\0')
7670 {
7671 invalid_matches:
7672 fatal_error ("multilib spec %qs is invalid",
7673 multilib_matches);
7674 }
7675 q++;
7676 }
7677 matches[i].len = q - matches[i].str;
7678
7679 matches[i].replace = ++q;
7680 while (*q != ';' && *q != '\0')
7681 {
7682 if (*q == ' ')
7683 goto invalid_matches;
7684 q++;
7685 }
7686 matches[i].rep_len = q - matches[i].replace;
7687 i++;
7688 if (*q == ';')
7689 q++;
7690 }
7691
7692 /* Now build a list of the replacement string for switches that we care
7693 about. Make sure we allocate at least one entry. This prevents
7694 xmalloc from calling fatal, and prevents us from re-executing this
7695 block of code. */
7696 mswitches
7697 = XNEWVEC (struct mswitchstr, n_mdswitches + (n_switches ? n_switches : 1));
7698 for (i = 0; i < n_switches; i++)
7699 if ((switches[i].live_cond & SWITCH_IGNORE) == 0)
7700 {
7701 int xlen = strlen (switches[i].part1);
7702 for (j = 0; j < cnt; j++)
7703 if (xlen == matches[j].len
7704 && ! strncmp (switches[i].part1, matches[j].str, xlen))
7705 {
7706 mswitches[n_mswitches].str = matches[j].replace;
7707 mswitches[n_mswitches].len = matches[j].rep_len;
7708 mswitches[n_mswitches].replace = (char *) 0;
7709 mswitches[n_mswitches].rep_len = 0;
7710 n_mswitches++;
7711 break;
7712 }
7713 }
7714
7715 /* Add MULTILIB_DEFAULTS switches too, as long as they were not present
7716 on the command line nor any options mutually incompatible with
7717 them. */
7718 for (i = 0; i < n_mdswitches; i++)
7719 {
7720 const char *r;
7721
7722 for (q = multilib_options; *q != '\0'; q++)
7723 {
7724 while (*q == ' ')
7725 q++;
7726
7727 r = q;
7728 while (strncmp (q, mdswitches[i].str, mdswitches[i].len) != 0
7729 || strchr (" /", q[mdswitches[i].len]) == NULL)
7730 {
7731 while (*q != ' ' && *q != '/' && *q != '\0')
7732 q++;
7733 if (*q != '/')
7734 break;
7735 q++;
7736 }
7737
7738 if (*q != ' ' && *q != '\0')
7739 {
7740 while (*r != ' ' && *r != '\0')
7741 {
7742 q = r;
7743 while (*q != ' ' && *q != '/' && *q != '\0')
7744 q++;
7745
7746 if (used_arg (r, q - r))
7747 break;
7748
7749 if (*q != '/')
7750 {
7751 mswitches[n_mswitches].str = mdswitches[i].str;
7752 mswitches[n_mswitches].len = mdswitches[i].len;
7753 mswitches[n_mswitches].replace = (char *) 0;
7754 mswitches[n_mswitches].rep_len = 0;
7755 n_mswitches++;
7756 break;
7757 }
7758
7759 r = q + 1;
7760 }
7761 break;
7762 }
7763 }
7764 }
7765 }
7766
7767 for (i = 0; i < n_mswitches; i++)
7768 if (len == mswitches[i].len && ! strncmp (p, mswitches[i].str, len))
7769 return 1;
7770
7771 return 0;
7772 }
7773
7774 static int
7775 default_arg (const char *p, int len)
7776 {
7777 int i;
7778
7779 for (i = 0; i < n_mdswitches; i++)
7780 if (len == mdswitches[i].len && ! strncmp (p, mdswitches[i].str, len))
7781 return 1;
7782
7783 return 0;
7784 }
7785
7786 /* Work out the subdirectory to use based on the options. The format of
7787 multilib_select is a list of elements. Each element is a subdirectory
7788 name followed by a list of options followed by a semicolon. The format
7789 of multilib_exclusions is the same, but without the preceding
7790 directory. First gcc will check the exclusions, if none of the options
7791 beginning with an exclamation point are present, and all of the other
7792 options are present, then we will ignore this completely. Passing
7793 that, gcc will consider each multilib_select in turn using the same
7794 rules for matching the options. If a match is found, that subdirectory
7795 will be used. */
7796
7797 static void
7798 set_multilib_dir (void)
7799 {
7800 const char *p;
7801 unsigned int this_path_len;
7802 const char *this_path, *this_arg;
7803 const char *start, *end;
7804 int not_arg;
7805 int ok, ndfltok, first;
7806
7807 n_mdswitches = 0;
7808 start = multilib_defaults;
7809 while (*start == ' ' || *start == '\t')
7810 start++;
7811 while (*start != '\0')
7812 {
7813 n_mdswitches++;
7814 while (*start != ' ' && *start != '\t' && *start != '\0')
7815 start++;
7816 while (*start == ' ' || *start == '\t')
7817 start++;
7818 }
7819
7820 if (n_mdswitches)
7821 {
7822 int i = 0;
7823
7824 mdswitches = XNEWVEC (struct mdswitchstr, n_mdswitches);
7825 for (start = multilib_defaults; *start != '\0'; start = end + 1)
7826 {
7827 while (*start == ' ' || *start == '\t')
7828 start++;
7829
7830 if (*start == '\0')
7831 break;
7832
7833 for (end = start + 1;
7834 *end != ' ' && *end != '\t' && *end != '\0'; end++)
7835 ;
7836
7837 obstack_grow (&multilib_obstack, start, end - start);
7838 obstack_1grow (&multilib_obstack, 0);
7839 mdswitches[i].str = XOBFINISH (&multilib_obstack, const char *);
7840 mdswitches[i++].len = end - start;
7841
7842 if (*end == '\0')
7843 break;
7844 }
7845 }
7846
7847 p = multilib_exclusions;
7848 while (*p != '\0')
7849 {
7850 /* Ignore newlines. */
7851 if (*p == '\n')
7852 {
7853 ++p;
7854 continue;
7855 }
7856
7857 /* Check the arguments. */
7858 ok = 1;
7859 while (*p != ';')
7860 {
7861 if (*p == '\0')
7862 {
7863 invalid_exclusions:
7864 fatal_error ("multilib exclusions %qs is invalid",
7865 multilib_exclusions);
7866 }
7867
7868 if (! ok)
7869 {
7870 ++p;
7871 continue;
7872 }
7873
7874 this_arg = p;
7875 while (*p != ' ' && *p != ';')
7876 {
7877 if (*p == '\0')
7878 goto invalid_exclusions;
7879 ++p;
7880 }
7881
7882 if (*this_arg != '!')
7883 not_arg = 0;
7884 else
7885 {
7886 not_arg = 1;
7887 ++this_arg;
7888 }
7889
7890 ok = used_arg (this_arg, p - this_arg);
7891 if (not_arg)
7892 ok = ! ok;
7893
7894 if (*p == ' ')
7895 ++p;
7896 }
7897
7898 if (ok)
7899 return;
7900
7901 ++p;
7902 }
7903
7904 first = 1;
7905 p = multilib_select;
7906 while (*p != '\0')
7907 {
7908 /* Ignore newlines. */
7909 if (*p == '\n')
7910 {
7911 ++p;
7912 continue;
7913 }
7914
7915 /* Get the initial path. */
7916 this_path = p;
7917 while (*p != ' ')
7918 {
7919 if (*p == '\0')
7920 {
7921 invalid_select:
7922 fatal_error ("multilib select %qs is invalid",
7923 multilib_select);
7924 }
7925 ++p;
7926 }
7927 this_path_len = p - this_path;
7928
7929 /* Check the arguments. */
7930 ok = 1;
7931 ndfltok = 1;
7932 ++p;
7933 while (*p != ';')
7934 {
7935 if (*p == '\0')
7936 goto invalid_select;
7937
7938 if (! ok)
7939 {
7940 ++p;
7941 continue;
7942 }
7943
7944 this_arg = p;
7945 while (*p != ' ' && *p != ';')
7946 {
7947 if (*p == '\0')
7948 goto invalid_select;
7949 ++p;
7950 }
7951
7952 if (*this_arg != '!')
7953 not_arg = 0;
7954 else
7955 {
7956 not_arg = 1;
7957 ++this_arg;
7958 }
7959
7960 /* If this is a default argument, we can just ignore it.
7961 This is true even if this_arg begins with '!'. Beginning
7962 with '!' does not mean that this argument is necessarily
7963 inappropriate for this library: it merely means that
7964 there is a more specific library which uses this
7965 argument. If this argument is a default, we need not
7966 consider that more specific library. */
7967 ok = used_arg (this_arg, p - this_arg);
7968 if (not_arg)
7969 ok = ! ok;
7970
7971 if (! ok)
7972 ndfltok = 0;
7973
7974 if (default_arg (this_arg, p - this_arg))
7975 ok = 1;
7976
7977 if (*p == ' ')
7978 ++p;
7979 }
7980
7981 if (ok && first)
7982 {
7983 if (this_path_len != 1
7984 || this_path[0] != '.')
7985 {
7986 char *new_multilib_dir = XNEWVEC (char, this_path_len + 1);
7987 char *q;
7988
7989 strncpy (new_multilib_dir, this_path, this_path_len);
7990 new_multilib_dir[this_path_len] = '\0';
7991 q = strchr (new_multilib_dir, ':');
7992 if (q != NULL)
7993 *q = '\0';
7994 multilib_dir = new_multilib_dir;
7995 }
7996 first = 0;
7997 }
7998
7999 if (ndfltok)
8000 {
8001 const char *q = this_path, *end = this_path + this_path_len;
8002
8003 while (q < end && *q != ':')
8004 q++;
8005 if (q < end)
8006 {
8007 char *new_multilib_os_dir = XNEWVEC (char, end - q);
8008 memcpy (new_multilib_os_dir, q + 1, end - q - 1);
8009 new_multilib_os_dir[end - q - 1] = '\0';
8010 multilib_os_dir = new_multilib_os_dir;
8011 break;
8012 }
8013 }
8014
8015 ++p;
8016 }
8017
8018 if (multilib_dir == NULL && multilib_os_dir != NULL
8019 && strcmp (multilib_os_dir, ".") == 0)
8020 {
8021 free (CONST_CAST (char *, multilib_os_dir));
8022 multilib_os_dir = NULL;
8023 }
8024 else if (multilib_dir != NULL && multilib_os_dir == NULL)
8025 multilib_os_dir = multilib_dir;
8026 }
8027
8028 /* Print out the multiple library subdirectory selection
8029 information. This prints out a series of lines. Each line looks
8030 like SUBDIRECTORY;@OPTION@OPTION, with as many options as is
8031 required. Only the desired options are printed out, the negative
8032 matches. The options are print without a leading dash. There are
8033 no spaces to make it easy to use the information in the shell.
8034 Each subdirectory is printed only once. This assumes the ordering
8035 generated by the genmultilib script. Also, we leave out ones that match
8036 the exclusions. */
8037
8038 static void
8039 print_multilib_info (void)
8040 {
8041 const char *p = multilib_select;
8042 const char *last_path = 0, *this_path;
8043 int skip;
8044 unsigned int last_path_len = 0;
8045
8046 while (*p != '\0')
8047 {
8048 skip = 0;
8049 /* Ignore newlines. */
8050 if (*p == '\n')
8051 {
8052 ++p;
8053 continue;
8054 }
8055
8056 /* Get the initial path. */
8057 this_path = p;
8058 while (*p != ' ')
8059 {
8060 if (*p == '\0')
8061 {
8062 invalid_select:
8063 fatal_error ("multilib select %qs is invalid", multilib_select);
8064 }
8065
8066 ++p;
8067 }
8068
8069 /* When --disable-multilib was used but target defines
8070 MULTILIB_OSDIRNAMES, entries starting with .: are there just
8071 to find multilib_os_dir, so skip them from output. */
8072 if (this_path[0] == '.' && this_path[1] == ':')
8073 skip = 1;
8074
8075 /* Check for matches with the multilib_exclusions. We don't bother
8076 with the '!' in either list. If any of the exclusion rules match
8077 all of its options with the select rule, we skip it. */
8078 {
8079 const char *e = multilib_exclusions;
8080 const char *this_arg;
8081
8082 while (*e != '\0')
8083 {
8084 int m = 1;
8085 /* Ignore newlines. */
8086 if (*e == '\n')
8087 {
8088 ++e;
8089 continue;
8090 }
8091
8092 /* Check the arguments. */
8093 while (*e != ';')
8094 {
8095 const char *q;
8096 int mp = 0;
8097
8098 if (*e == '\0')
8099 {
8100 invalid_exclusion:
8101 fatal_error ("multilib exclusion %qs is invalid",
8102 multilib_exclusions);
8103 }
8104
8105 if (! m)
8106 {
8107 ++e;
8108 continue;
8109 }
8110
8111 this_arg = e;
8112
8113 while (*e != ' ' && *e != ';')
8114 {
8115 if (*e == '\0')
8116 goto invalid_exclusion;
8117 ++e;
8118 }
8119
8120 q = p + 1;
8121 while (*q != ';')
8122 {
8123 const char *arg;
8124 int len = e - this_arg;
8125
8126 if (*q == '\0')
8127 goto invalid_select;
8128
8129 arg = q;
8130
8131 while (*q != ' ' && *q != ';')
8132 {
8133 if (*q == '\0')
8134 goto invalid_select;
8135 ++q;
8136 }
8137
8138 if (! strncmp (arg, this_arg,
8139 (len < q - arg) ? q - arg : len)
8140 || default_arg (this_arg, e - this_arg))
8141 {
8142 mp = 1;
8143 break;
8144 }
8145
8146 if (*q == ' ')
8147 ++q;
8148 }
8149
8150 if (! mp)
8151 m = 0;
8152
8153 if (*e == ' ')
8154 ++e;
8155 }
8156
8157 if (m)
8158 {
8159 skip = 1;
8160 break;
8161 }
8162
8163 if (*e != '\0')
8164 ++e;
8165 }
8166 }
8167
8168 if (! skip)
8169 {
8170 /* If this is a duplicate, skip it. */
8171 skip = (last_path != 0
8172 && (unsigned int) (p - this_path) == last_path_len
8173 && ! strncmp (last_path, this_path, last_path_len));
8174
8175 last_path = this_path;
8176 last_path_len = p - this_path;
8177 }
8178
8179 /* If this directory requires any default arguments, we can skip
8180 it. We will already have printed a directory identical to
8181 this one which does not require that default argument. */
8182 if (! skip)
8183 {
8184 const char *q;
8185
8186 q = p + 1;
8187 while (*q != ';')
8188 {
8189 const char *arg;
8190
8191 if (*q == '\0')
8192 goto invalid_select;
8193
8194 if (*q == '!')
8195 arg = NULL;
8196 else
8197 arg = q;
8198
8199 while (*q != ' ' && *q != ';')
8200 {
8201 if (*q == '\0')
8202 goto invalid_select;
8203 ++q;
8204 }
8205
8206 if (arg != NULL
8207 && default_arg (arg, q - arg))
8208 {
8209 skip = 1;
8210 break;
8211 }
8212
8213 if (*q == ' ')
8214 ++q;
8215 }
8216 }
8217
8218 if (! skip)
8219 {
8220 const char *p1;
8221
8222 for (p1 = last_path; p1 < p && *p1 != ':'; p1++)
8223 putchar (*p1);
8224 putchar (';');
8225 }
8226
8227 ++p;
8228 while (*p != ';')
8229 {
8230 int use_arg;
8231
8232 if (*p == '\0')
8233 goto invalid_select;
8234
8235 if (skip)
8236 {
8237 ++p;
8238 continue;
8239 }
8240
8241 use_arg = *p != '!';
8242
8243 if (use_arg)
8244 putchar ('@');
8245
8246 while (*p != ' ' && *p != ';')
8247 {
8248 if (*p == '\0')
8249 goto invalid_select;
8250 if (use_arg)
8251 putchar (*p);
8252 ++p;
8253 }
8254
8255 if (*p == ' ')
8256 ++p;
8257 }
8258
8259 if (! skip)
8260 {
8261 /* If there are extra options, print them now. */
8262 if (multilib_extra && *multilib_extra)
8263 {
8264 int print_at = TRUE;
8265 const char *q;
8266
8267 for (q = multilib_extra; *q != '\0'; q++)
8268 {
8269 if (*q == ' ')
8270 print_at = TRUE;
8271 else
8272 {
8273 if (print_at)
8274 putchar ('@');
8275 putchar (*q);
8276 print_at = FALSE;
8277 }
8278 }
8279 }
8280
8281 putchar ('\n');
8282 }
8283
8284 ++p;
8285 }
8286 }
8287 \f
8288 /* getenv built-in spec function.
8289
8290 Returns the value of the environment variable given by its first
8291 argument, concatenated with the second argument. If the
8292 environment variable is not defined, a fatal error is issued. */
8293
8294 static const char *
8295 getenv_spec_function (int argc, const char **argv)
8296 {
8297 char *value;
8298 char *result;
8299 char *ptr;
8300 size_t len;
8301
8302 if (argc != 2)
8303 return NULL;
8304
8305 value = getenv (argv[0]);
8306 if (!value)
8307 fatal_error ("environment variable %qs not defined", argv[0]);
8308
8309 /* We have to escape every character of the environment variable so
8310 they are not interpreted as active spec characters. A
8311 particularly painful case is when we are reading a variable
8312 holding a windows path complete with \ separators. */
8313 len = strlen (value) * 2 + strlen (argv[1]) + 1;
8314 result = XNEWVAR (char, len);
8315 for (ptr = result; *value; ptr += 2)
8316 {
8317 ptr[0] = '\\';
8318 ptr[1] = *value++;
8319 }
8320
8321 strcpy (ptr, argv[1]);
8322
8323 return result;
8324 }
8325
8326 /* if-exists built-in spec function.
8327
8328 Checks to see if the file specified by the absolute pathname in
8329 ARGS exists. Returns that pathname if found.
8330
8331 The usual use for this function is to check for a library file
8332 (whose name has been expanded with %s). */
8333
8334 static const char *
8335 if_exists_spec_function (int argc, const char **argv)
8336 {
8337 /* Must have only one argument. */
8338 if (argc == 1 && IS_ABSOLUTE_PATH (argv[0]) && ! access (argv[0], R_OK))
8339 return argv[0];
8340
8341 return NULL;
8342 }
8343
8344 /* if-exists-else built-in spec function.
8345
8346 This is like if-exists, but takes an additional argument which
8347 is returned if the first argument does not exist. */
8348
8349 static const char *
8350 if_exists_else_spec_function (int argc, const char **argv)
8351 {
8352 /* Must have exactly two arguments. */
8353 if (argc != 2)
8354 return NULL;
8355
8356 if (IS_ABSOLUTE_PATH (argv[0]) && ! access (argv[0], R_OK))
8357 return argv[0];
8358
8359 return argv[1];
8360 }
8361
8362 /* replace-outfile built-in spec function.
8363
8364 This looks for the first argument in the outfiles array's name and
8365 replaces it with the second argument. */
8366
8367 static const char *
8368 replace_outfile_spec_function (int argc, const char **argv)
8369 {
8370 int i;
8371 /* Must have exactly two arguments. */
8372 if (argc != 2)
8373 abort ();
8374
8375 for (i = 0; i < n_infiles; i++)
8376 {
8377 if (outfiles[i] && !strcmp (outfiles[i], argv[0]))
8378 outfiles[i] = xstrdup (argv[1]);
8379 }
8380 return NULL;
8381 }
8382
8383 /* Given two version numbers, compares the two numbers.
8384 A version number must match the regular expression
8385 ([1-9][0-9]*|0)(\.([1-9][0-9]*|0))*
8386 */
8387 static int
8388 compare_version_strings (const char *v1, const char *v2)
8389 {
8390 int rresult;
8391 regex_t r;
8392
8393 if (regcomp (&r, "^([1-9][0-9]*|0)(\\.([1-9][0-9]*|0))*$",
8394 REG_EXTENDED | REG_NOSUB) != 0)
8395 abort ();
8396 rresult = regexec (&r, v1, 0, NULL, 0);
8397 if (rresult == REG_NOMATCH)
8398 fatal_error ("invalid version number %qs", v1);
8399 else if (rresult != 0)
8400 abort ();
8401 rresult = regexec (&r, v2, 0, NULL, 0);
8402 if (rresult == REG_NOMATCH)
8403 fatal_error ("invalid version number %qs", v2);
8404 else if (rresult != 0)
8405 abort ();
8406
8407 return strverscmp (v1, v2);
8408 }
8409
8410
8411 /* version_compare built-in spec function.
8412
8413 This takes an argument of the following form:
8414
8415 <comparison-op> <arg1> [<arg2>] <switch> <result>
8416
8417 and produces "result" if the comparison evaluates to true,
8418 and nothing if it doesn't.
8419
8420 The supported <comparison-op> values are:
8421
8422 >= true if switch is a later (or same) version than arg1
8423 !> opposite of >=
8424 < true if switch is an earlier version than arg1
8425 !< opposite of <
8426 >< true if switch is arg1 or later, and earlier than arg2
8427 <> true if switch is earlier than arg1 or is arg2 or later
8428
8429 If the switch is not present, the condition is false unless
8430 the first character of the <comparison-op> is '!'.
8431
8432 For example,
8433 %:version-compare(>= 10.3 mmacosx-version-min= -lmx)
8434 adds -lmx if -mmacosx-version-min=10.3.9 was passed. */
8435
8436 static const char *
8437 version_compare_spec_function (int argc, const char **argv)
8438 {
8439 int comp1, comp2;
8440 size_t switch_len;
8441 const char *switch_value = NULL;
8442 int nargs = 1, i;
8443 bool result;
8444
8445 if (argc < 3)
8446 fatal_error ("too few arguments to %%:version-compare");
8447 if (argv[0][0] == '\0')
8448 abort ();
8449 if ((argv[0][1] == '<' || argv[0][1] == '>') && argv[0][0] != '!')
8450 nargs = 2;
8451 if (argc != nargs + 3)
8452 fatal_error ("too many arguments to %%:version-compare");
8453
8454 switch_len = strlen (argv[nargs + 1]);
8455 for (i = 0; i < n_switches; i++)
8456 if (!strncmp (switches[i].part1, argv[nargs + 1], switch_len)
8457 && check_live_switch (i, switch_len))
8458 switch_value = switches[i].part1 + switch_len;
8459
8460 if (switch_value == NULL)
8461 comp1 = comp2 = -1;
8462 else
8463 {
8464 comp1 = compare_version_strings (switch_value, argv[1]);
8465 if (nargs == 2)
8466 comp2 = compare_version_strings (switch_value, argv[2]);
8467 else
8468 comp2 = -1; /* This value unused. */
8469 }
8470
8471 switch (argv[0][0] << 8 | argv[0][1])
8472 {
8473 case '>' << 8 | '=':
8474 result = comp1 >= 0;
8475 break;
8476 case '!' << 8 | '<':
8477 result = comp1 >= 0 || switch_value == NULL;
8478 break;
8479 case '<' << 8:
8480 result = comp1 < 0;
8481 break;
8482 case '!' << 8 | '>':
8483 result = comp1 < 0 || switch_value == NULL;
8484 break;
8485 case '>' << 8 | '<':
8486 result = comp1 >= 0 && comp2 < 0;
8487 break;
8488 case '<' << 8 | '>':
8489 result = comp1 < 0 || comp2 >= 0;
8490 break;
8491
8492 default:
8493 fatal_error ("unknown operator %qs in %%:version-compare", argv[0]);
8494 }
8495 if (! result)
8496 return NULL;
8497
8498 return argv[nargs + 2];
8499 }
8500
8501 /* %:include builtin spec function. This differs from %include in that it
8502 can be nested inside a spec, and thus be conditionalized. It takes
8503 one argument, the filename, and looks for it in the startfile path.
8504 The result is always NULL, i.e. an empty expansion. */
8505
8506 static const char *
8507 include_spec_function (int argc, const char **argv)
8508 {
8509 char *file;
8510
8511 if (argc != 1)
8512 abort ();
8513
8514 file = find_a_file (&startfile_prefixes, argv[0], R_OK, true);
8515 read_specs (file ? file : argv[0], FALSE);
8516
8517 return NULL;
8518 }
8519
8520 /* %:find-file spec function. This function replaces its argument by
8521 the file found thru find_file, that is the -print-file-name gcc
8522 program option. */
8523 static const char *
8524 find_file_spec_function (int argc, const char **argv)
8525 {
8526 const char *file;
8527
8528 if (argc != 1)
8529 abort ();
8530
8531 file = find_file (argv[0]);
8532 return file;
8533 }
8534
8535
8536 /* %:find-plugindir spec function. This function replaces its argument
8537 by the -iplugindir=<dir> option. `dir' is found thru find_file, that
8538 is the -print-file-name gcc program option. */
8539 static const char *
8540 find_plugindir_spec_function (int argc, const char **argv ATTRIBUTE_UNUSED)
8541 {
8542 const char *option;
8543
8544 if (argc != 0)
8545 abort ();
8546
8547 option = concat ("-iplugindir=", find_file ("plugin"), NULL);
8548 return option;
8549 }
8550
8551
8552 /* %:print-asm-header spec function. Print a banner to say that the
8553 following output is from the assembler. */
8554
8555 static const char *
8556 print_asm_header_spec_function (int arg ATTRIBUTE_UNUSED,
8557 const char **argv ATTRIBUTE_UNUSED)
8558 {
8559 printf (_("Assembler options\n=================\n\n"));
8560 printf (_("Use \"-Wa,OPTION\" to pass \"OPTION\" to the assembler.\n\n"));
8561 fflush (stdout);
8562 return NULL;
8563 }
8564
8565 /* Compute a timestamp to initialize flag_random_seed. */
8566
8567 static unsigned
8568 get_local_tick (void)
8569 {
8570 unsigned ret = 0;
8571
8572 /* Get some more or less random data. */
8573 #ifdef HAVE_GETTIMEOFDAY
8574 {
8575 struct timeval tv;
8576
8577 gettimeofday (&tv, NULL);
8578 ret = tv.tv_sec * 1000 + tv.tv_usec / 1000;
8579 }
8580 #else
8581 {
8582 time_t now = time (NULL);
8583
8584 if (now != (time_t)-1)
8585 ret = (unsigned) now;
8586 }
8587 #endif
8588
8589 return ret;
8590 }
8591
8592 /* %:compare-debug-dump-opt spec function. Save the last argument,
8593 expected to be the last -fdump-final-insns option, or generate a
8594 temporary. */
8595
8596 static const char *
8597 compare_debug_dump_opt_spec_function (int arg,
8598 const char **argv ATTRIBUTE_UNUSED)
8599 {
8600 const char *ret;
8601 char *name;
8602 int which;
8603 static char random_seed[HOST_BITS_PER_WIDE_INT / 4 + 3];
8604
8605 if (arg != 0)
8606 fatal_error ("too many arguments to %%:compare-debug-dump-opt");
8607
8608 do_spec_2 ("%{fdump-final-insns=*:%*}");
8609 do_spec_1 (" ", 0, NULL);
8610
8611 if (argbuf_index > 0 && strcmp (argv[argbuf_index - 1], "."))
8612 {
8613 if (!compare_debug)
8614 return NULL;
8615
8616 name = xstrdup (argv[argbuf_index - 1]);
8617 ret = NULL;
8618 }
8619 else
8620 {
8621 const char *ext = NULL;
8622
8623 if (argbuf_index > 0)
8624 {
8625 do_spec_2 ("%{o*:%*}%{!o:%{!S:%b%O}%{S:%b.s}}");
8626 ext = ".gkd";
8627 }
8628 else if (!compare_debug)
8629 return NULL;
8630 else
8631 do_spec_2 ("%g.gkd");
8632
8633 do_spec_1 (" ", 0, NULL);
8634
8635 gcc_assert (argbuf_index > 0);
8636
8637 name = concat (argbuf[argbuf_index - 1], ext, NULL);
8638
8639 ret = concat ("-fdump-final-insns=", name, NULL);
8640 }
8641
8642 which = compare_debug < 0;
8643 debug_check_temp_file[which] = name;
8644
8645 if (!which)
8646 {
8647 unsigned HOST_WIDE_INT value = get_local_tick () ^ getpid ();
8648
8649 sprintf (random_seed, HOST_WIDE_INT_PRINT_HEX, value);
8650 }
8651
8652 if (*random_seed)
8653 ret = concat ("%{!frandom-seed=*:-frandom-seed=", random_seed, "} ",
8654 ret, NULL);
8655
8656 if (which)
8657 *random_seed = 0;
8658
8659 return ret;
8660 }
8661
8662 static const char *debug_auxbase_opt;
8663
8664 /* %:compare-debug-self-opt spec function. Expands to the options
8665 that are to be passed in the second compilation of
8666 compare-debug. */
8667
8668 static const char *
8669 compare_debug_self_opt_spec_function (int arg,
8670 const char **argv ATTRIBUTE_UNUSED)
8671 {
8672 if (arg != 0)
8673 fatal_error ("too many arguments to %%:compare-debug-self-opt");
8674
8675 if (compare_debug >= 0)
8676 return NULL;
8677
8678 do_spec_2 ("%{c|S:%{o*:%*}}");
8679 do_spec_1 (" ", 0, NULL);
8680
8681 if (argbuf_index > 0)
8682 debug_auxbase_opt = concat ("-auxbase-strip ",
8683 argbuf[argbuf_index - 1],
8684 NULL);
8685 else
8686 debug_auxbase_opt = NULL;
8687
8688 return concat ("\
8689 %<o %<MD %<MMD %<MF* %<MG %<MP %<MQ* %<MT* \
8690 %<fdump-final-insns=* -w -S -o %j \
8691 %{!fcompare-debug-second:-fcompare-debug-second} \
8692 ", compare_debug_opt, NULL);
8693 }
8694
8695 /* %:compare-debug-auxbase-opt spec function. Expands to the auxbase
8696 options that are to be passed in the second compilation of
8697 compare-debug. It expects, as an argument, the basename of the
8698 current input file name, with the .gk suffix appended to it. */
8699
8700 static const char *
8701 compare_debug_auxbase_opt_spec_function (int arg,
8702 const char **argv)
8703 {
8704 char *name;
8705 int len;
8706
8707 if (arg == 0)
8708 fatal_error ("too few arguments to %%:compare-debug-auxbase-opt");
8709
8710 if (arg != 1)
8711 fatal_error ("too many arguments to %%:compare-debug-auxbase-opt");
8712
8713 if (compare_debug >= 0)
8714 return NULL;
8715
8716 len = strlen (argv[0]);
8717 if (len < 3 || strcmp (argv[0] + len - 3, ".gk") != 0)
8718 fatal_error ("argument to %%:compare-debug-auxbase-opt "
8719 "does not end in .gk");
8720
8721 if (debug_auxbase_opt)
8722 return debug_auxbase_opt;
8723
8724 #define OPT "-auxbase "
8725
8726 len -= 3;
8727 name = (char*) xmalloc (sizeof (OPT) + len);
8728 memcpy (name, OPT, sizeof (OPT) - 1);
8729 memcpy (name + sizeof (OPT) - 1, argv[0], len);
8730 name[sizeof (OPT) - 1 + len] = '\0';
8731
8732 #undef OPT
8733
8734 return name;
8735 }