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