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