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