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