]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/gcc.c
Daily bump.
[thirdparty/gcc.git] / gcc / gcc.c
CommitLineData
ed1f651b 1/* Compiler driver program that can handle many languages.
3b708058
JL
2 Copyright (C) 1987, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
3 1999, 2000 Free Software Foundation, Inc.
ed1f651b
RS
4
5This file is part of GNU CC.
6
7GNU CC is free software; you can redistribute it and/or modify
8it under the terms of the GNU General Public License as published by
9the Free Software Foundation; either version 2, or (at your option)
10any later version.
11
12GNU CC is distributed in the hope that it will be useful,
13but WITHOUT ANY WARRANTY; without even the implied warranty of
14MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15GNU General Public License for more details.
16
17You should have received a copy of the GNU General Public License
18along with GNU CC; see the file COPYING. If not, write to
a35311b0
RK
19the Free Software Foundation, 59 Temple Place - Suite 330,
20Boston, MA 02111-1307, USA.
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
JL
34
35
e9a25f70 36#include "config.h"
670ee920
KG
37#include "system.h"
38#include <signal.h>
17248a6b 39#include "obstack.h"
ab87f8c8 40#include "intl.h"
460ee112 41#include "prefix.h"
9257393c 42#include "gcc.h"
c10d53dd 43
5a570ade
RK
44#ifdef VMS
45#define exit __posix_exit
46#endif
47
03c41c05
ZW
48#ifdef HAVE_SYS_RESOURCE_H
49#include <sys/resource.h>
50#endif
f31e826b 51#if defined (HAVE_DECL_GETRUSAGE) && !HAVE_DECL_GETRUSAGE
711d877c 52extern int getrusage PARAMS ((int, struct rusage *));
03c41c05
ZW
53#endif
54
ed1f651b 55/* By default there is no special suffix for executables. */
853e0b2d
RK
56#ifdef EXECUTABLE_SUFFIX
57#define HAVE_EXECUTABLE_SUFFIX
58#else
ed1f651b
RS
59#define EXECUTABLE_SUFFIX ""
60#endif
f6ec7e54 61
0f41302f 62/* By default, the suffix for object files is ".o". */
f70165f6
RK
63#ifdef OBJECT_SUFFIX
64#define HAVE_OBJECT_SUFFIX
65#else
adcb8d7d 66#define OBJECT_SUFFIX ".o"
ed7dae04
RK
67#endif
68
0deb20df
TT
69#ifndef VMS
70/* FIXME: the location independence code for VMS is hairier than this,
71 and hasn't been written. */
72#ifndef DIR_UP
73#define DIR_UP ".."
74#endif /* DIR_UP */
75#endif /* VMS */
76
48ff801b
RK
77static char dir_separator_str[] = {DIR_SEPARATOR, 0};
78
ed1f651b
RS
79#define obstack_chunk_alloc xmalloc
80#define obstack_chunk_free free
81
b2a1e458
FL
82#ifndef GET_ENV_PATH_LIST
83#define GET_ENV_PATH_LIST(VAR,NAME) do { (VAR) = getenv (NAME); } while (0)
97be8f06
SC
84#endif
85
512b62fb
JM
86/* Most every one is fine with LIBRARY_PATH. For some, it conflicts. */
87#ifndef LIBRARY_PATH_ENV
88#define LIBRARY_PATH_ENV "LIBRARY_PATH"
89#endif
90
956d6950
JL
91#ifndef HAVE_KILL
92#define kill(p,s) raise(s)
93#endif
94
ed1f651b
RS
95/* If a stage of compilation returns an exit status >= 1,
96 compilation of that file ceases. */
97
98#define MIN_FATAL_STATUS 1
99
14a774a9
RK
100/* Flag saying to pass the greatest exit code returned by a sub-process
101 to the calling program. */
102static int pass_exit_codes;
103
2628b9d3
DE
104/* Flag saying to print the directories gcc will search through looking for
105 programs, libraries, etc. */
106
107static int print_search_dirs;
108
6a9e290e 109/* Flag saying to print the full filename of this file
2dcb563f
RS
110 as found through our usual search mechanism. */
111
878f32c3 112static const char *print_file_name = NULL;
6a9e290e 113
0f41302f 114/* As print_file_name, but search for executable file. */
6a9e290e 115
878f32c3 116static const char *print_prog_name = NULL;
2dcb563f 117
60103a34
DE
118/* Flag saying to print the relative path we'd use to
119 find libgcc.a given the current compiler flags. */
120
121static int print_multi_directory;
122
123/* Flag saying to print the list of subdirectories and
124 compiler flags used to select them in a standard form. */
125
126static int print_multi_lib;
127
b8468bc7
NC
128/* Flag saying to print the command line options understood by gcc and its
129 sub-processes. */
130
131static int print_help_list;
132
ed1f651b
RS
133/* Flag indicating whether we should print the command and arguments */
134
135static int verbose_flag;
136
03c41c05
ZW
137/* Flag indicating whether we should report subprocess execution times
138 (if this is supported by the system - see pexecute.c). */
139
140static int report_times;
141
ed1f651b
RS
142/* Nonzero means write "temp" files in source directory
143 and use the source file's name in them, and don't delete them. */
144
145static int save_temps_flag;
146
53117a2f 147/* The compiler version. */
ed1f651b 148
3b304f5b 149static const char *compiler_version;
53117a2f
RK
150
151/* The target version specified with -V */
152
3b304f5b 153static const char *spec_version = DEFAULT_TARGET_VERSION;
ed1f651b
RS
154
155/* The target machine specified with -b. */
156
878f32c3 157static const char *spec_machine = DEFAULT_TARGET_MACHINE;
ed1f651b 158
004fd4d5
RS
159/* Nonzero if cross-compiling.
160 When -b is used, the value comes from the `specs' file. */
161
162#ifdef CROSS_COMPILE
3b304f5b 163static const char *cross_compile = "1";
004fd4d5 164#else
3b304f5b 165static const char *cross_compile = "0";
004fd4d5
RS
166#endif
167
48fb792a
BK
168/* The number of errors that have occurred; the link phase will not be
169 run if this is non-zero. */
170static int error_count = 0;
171
14a774a9
RK
172/* Greatest exit code of sub-processes that has been encountered up to
173 now. */
174static int greatest_status = 1;
175
ed1f651b
RS
176/* This is the obstack which we use to allocate many strings. */
177
178static struct obstack obstack;
179
b3865ca9 180/* This is the obstack to build an environment variable to pass to
6dc42e49 181 collect2 that describes all of the relevant switches of what to
b3865ca9
RS
182 pass the compiler in building the list of pointers to constructors
183 and destructors. */
184
185static struct obstack collect_obstack;
186
03c41c05
ZW
187/* These structs are used to collect resource usage information for
188 subprocesses. */
189#ifdef HAVE_GETRUSAGE
190static struct rusage rus, prus;
191#endif
192
99360286
DE
193/* Forward declaration for prototypes. */
194struct path_prefix;
195
711d877c 196static void init_spec PARAMS ((void));
0deb20df 197#ifndef VMS
711d877c
KG
198static char **split_directories PARAMS ((const char *, int *));
199static void free_split_directories PARAMS ((char **));
200static char *make_relative_prefix PARAMS ((const char *, const char *, const char *));
0deb20df 201#endif /* VMS */
fbd40359
ZW
202static void store_arg PARAMS ((const char *, int, int));
203static char *load_specs PARAMS ((const char *));
711d877c
KG
204static void read_specs PARAMS ((const char *, int));
205static void set_spec PARAMS ((const char *, const char *));
206static struct compiler *lookup_compiler PARAMS ((const char *, size_t, const char *));
207static char *build_search_list PARAMS ((struct path_prefix *, const char *, int));
208static void putenv_from_prefixes PARAMS ((struct path_prefix *, const char *));
209static int access_check PARAMS ((const char *, int));
210static char *find_a_file PARAMS ((struct path_prefix *, const char *, int));
211static void add_prefix PARAMS ((struct path_prefix *, const char *,
212 const char *, int, int, int *));
fbd40359 213static void translate_options PARAMS ((int *, const char ***));
711d877c
KG
214static char *skip_whitespace PARAMS ((char *));
215static void record_temp_file PARAMS ((const char *, int, int));
216static void delete_if_ordinary PARAMS ((const char *));
217static void delete_temp_files PARAMS ((void));
218static void delete_failure_queue PARAMS ((void));
219static void clear_failure_queue PARAMS ((void));
220static int check_live_switch PARAMS ((int, int));
221static const char *handle_braces PARAMS ((const char *));
222static char *save_string PARAMS ((const char *, int));
223static int do_spec_1 PARAMS ((const char *, int, const char *));
224static const char *find_file PARAMS ((const char *));
225static int is_directory PARAMS ((const char *, const char *, int));
226static void validate_switches PARAMS ((const char *));
227static void validate_all_switches PARAMS ((void));
228static void give_switch PARAMS ((int, int, int));
229static int used_arg PARAMS ((const char *, int));
230static int default_arg PARAMS ((const char *, int));
231static void set_multilib_dir PARAMS ((void));
232static void print_multilib_info PARAMS ((void));
233static void pfatal_with_name PARAMS ((const char *)) ATTRIBUTE_NORETURN;
234static void perror_with_name PARAMS ((const char *));
235static void pfatal_pexecute PARAMS ((const char *, const char *))
878f32c3 236 ATTRIBUTE_NORETURN;
711d877c 237static void error PARAMS ((const char *, ...))
878f32c3 238 ATTRIBUTE_PRINTF_1;
711d877c 239static void notice PARAMS ((const char *, ...))
878f32c3 240 ATTRIBUTE_PRINTF_1;
711d877c
KG
241static void display_help PARAMS ((void));
242static void add_preprocessor_option PARAMS ((const char *, int));
243static void add_assembler_option PARAMS ((const char *, int));
244static void add_linker_option PARAMS ((const char *, int));
fbd40359 245static void process_command PARAMS ((int, const char **));
711d877c
KG
246static int execute PARAMS ((void));
247static void unused_prefix_warnings PARAMS ((struct path_prefix *));
248static void clear_args PARAMS ((void));
249static void fatal_error PARAMS ((int));
250static void set_input PARAMS ((const char *));
ed1f651b
RS
251\f
252/* Specs are strings containing lines, each of which (if not blank)
253is made up of a program name, and arguments separated by spaces.
254The program name must be exact and start from root, since no path
255is searched and it is unreliable to depend on the current working directory.
256Redirection of input or output is not supported; the subprograms must
257accept filenames saying what files to read and write.
258
259In addition, the specs can contain %-sequences to substitute variable text
260or for conditional text. Here is a table of all defined %-sequences.
261Note that spaces are not generated automatically around the results of
262expanding these sequences; therefore, you can concatenate them together
263or with constant text in a single argument.
264
265 %% substitute one % into the program name or argument.
266 %i substitute the name of the input file being processed.
267 %b substitute the basename of the input file being processed.
268 This is the substring up to (and not including) the last period
269 and not including the directory.
dd75c292
CB
270 %gSUFFIX
271 substitute a file name that has suffix SUFFIX and is chosen
272 once per compilation, and mark the argument a la %d. To reduce
273 exposure to denial-of-service attacks, the file name is now
274 chosen in a way that is hard to predict even when previously
275 chosen file names are known. For example, `%g.s ... %g.o ... %g.s'
276 might turn into `ccUVUUAU.s ccXYAXZ12.o ccUVUUAU.s'. SUFFIX matches
a1d9074c
TT
277 the regexp "[.A-Za-z]*%O"; "%O" is treated exactly as if it
278 had been pre-processed. Previously, %g was simply substituted
279 with a file name chosen once per compilation, without regard
280 to any appended suffix (which was therefore treated just like
281 ordinary text), making such attacks more likely to succeed.
dd75c292
CB
282 %uSUFFIX
283 like %g, but generates a new temporary file name even if %uSUFFIX
284 was already seen.
285 %USUFFIX
286 substitutes the last file name generated with %uSUFFIX, generating a
287 new one if there is no such last file name. In the absence of any
288 %uSUFFIX, this is just like %gSUFFIX, except they don't share
289 the same suffix "space", so `%g.s ... %U.s ... %g.s ... %U.s'
290 would involve the generation of two distinct file names, one
291 for each `%g.s' and another for each `%U.s'. Previously, %U was
292 simply substituted with a file name chosen for the previous %u,
293 without regard to any appended suffix.
ed1f651b
RS
294 %d marks the argument containing or following the %d as a
295 temporary file name, so that that file will be deleted if CC exits
296 successfully. Unlike %g, this contributes no text to the argument.
297 %w marks the argument containing or following the %w as the
298 "output file" of this compilation. This puts the argument
299 into the sequence of arguments that %o will substitute later.
300 %W{...}
301 like %{...} but mark last argument supplied within
302 as a file to be deleted on failure.
303 %o substitutes the names of all the output files, with spaces
304 automatically placed around them. You should write spaces
305 around the %o as well or the results are undefined.
306 %o is for use in the specs for running the linker.
307 Input files whose names have no recognized suffix are not compiled
308 at all, but they are included among the output files, so they will
309 be linked.
dd75c292 310 %O substitutes the suffix for object files. Note that this is
a1d9074c
TT
311 handled specially when it immediately follows %g, %u, or %U
312 (with or without a suffix argument) because of the need for
313 those to form complete file names. The handling is such that
314 %O is treated exactly as if it had already been substituted,
315 except that %g, %u, and %U do not currently support additional
316 SUFFIX characters following %O as they would following, for
317 example, `.o'.
ed1f651b
RS
318 %p substitutes the standard macro predefinitions for the
319 current target machine. Use this when running cpp.
320 %P like %p, but puts `__' before and after the name of each macro.
321 (Except macros that already have __.)
322 This is for ANSI C.
8eebb258 323 %I Substitute a -iprefix option made from GCC_EXEC_PREFIX.
ed1f651b
RS
324 %s current argument is the name of a library or startup file of some sort.
325 Search for that file in a standard list of directories
326 and substitute the full name found.
327 %eSTR Print STR as an error message. STR is terminated by a newline.
328 Use this when inconsistent options are detected.
329 %x{OPTION} Accumulate an option for %X.
330 %X Output the accumulated linker options specified by compilations.
c9ebacb8 331 %Y Output the accumulated assembler options specified by compilations.
57cb9b60 332 %Z Output the accumulated preprocessor options specified by compilations.
500c9e81 333 %v1 Substitute the major version number of GCC.
3ea8083f 334 (For version 2.5.3, this is 2.)
500c9e81 335 %v2 Substitute the minor version number of GCC.
3ea8083f
JL
336 (For version 2.5.3, this is 5.)
337 %v3 Substitute the patch level number of GCC.
338 (For version 2.5.3, this is 3.)
ed1f651b
RS
339 %a process ASM_SPEC as a spec.
340 This allows config.h to specify part of the spec for running as.
341 %A process ASM_FINAL_SPEC as a spec. A capital A is actually
342 used here. This can be used to run a post-processor after the
9ec36da5 343 assembler has done its job.
48ff801b 344 %D Dump out a -L option for each directory in startfile_prefixes.
60103a34 345 If multilib_dir is set, extra entries are generated with it affixed.
ed1f651b
RS
346 %l process LINK_SPEC as a spec.
347 %L process LIB_SPEC as a spec.
68d69835 348 %G process LIBGCC_SPEC as a spec.
ed1f651b
RS
349 %S process STARTFILE_SPEC as a spec. A capital S is actually used here.
350 %E process ENDFILE_SPEC as a spec. A capital E is actually used here.
351 %c process SIGNED_CHAR_SPEC as a spec.
352 %C process CPP_SPEC as a spec. A capital C is actually used here.
353 %1 process CC1_SPEC as a spec.
354 %2 process CC1PLUS_SPEC as a spec.
a99bf70c 355 %| output "-" if the input for the current command is coming from a pipe.
ed1f651b
RS
356 %* substitute the variable part of a matched option. (See below.)
357 Note that each comma in the substituted string is replaced by
358 a single space.
359 %{S} substitutes the -S switch, if that switch was given to CC.
360 If that switch was not specified, this substitutes nothing.
361 Here S is a metasyntactic variable.
362 %{S*} substitutes all the switches specified to CC whose names start
363 with -S. This is used for -o, -D, -I, etc; switches that take
364 arguments. CC considers `-o foo' as being one switch whose
365 name starts with `o'. %{o*} would substitute this text,
366 including the space; thus, two arguments would be generated.
9f3c45fd 367 %{^S*} likewise, but don't put a blank between a switch and any args.
b9490a6e 368 %{S*:X} substitutes X if one or more switches whose names start with -S are
ed1f651b
RS
369 specified to CC. Note that the tail part of the -S option
370 (i.e. the part matched by the `*') will be substituted for each
6dc42e49 371 occurrence of %* within X.
8097c429
TT
372 %{<S} remove all occurences of S from the command line.
373 Note - this option is position dependent. % commands in the
374 spec string before this option will see S, % commands in the
375 spec string after this option will not.
ed1f651b
RS
376 %{S:X} substitutes X, but only if the -S switch was given to CC.
377 %{!S:X} substitutes X, but only if the -S switch was NOT given to CC.
378 %{|S:X} like %{S:X}, but if no S switch, substitute `-'.
379 %{|!S:X} like %{!S:X}, but if there is an S switch, substitute `-'.
380 %{.S:X} substitutes X, but only if processing a file with suffix S.
381 %{!.S:X} substitutes X, but only if NOT processing a file with suffix S.
9bf09437
RH
382 %{S|P:X} substitutes X if either -S or -P was given to CC. This may be
383 combined with ! and . as above binding stronger than the OR.
b3865ca9 384 %(Spec) processes a specification defined in a specs file as *Spec:
4089dfab 385 %[Spec] as above, but put __ around -D arguments
ed1f651b
RS
386
387The conditional text X in a %{S:X} or %{!S:X} construct may contain
388other nested % constructs or spaces, or even newlines. They are
389processed as usual, as described above.
390
6c396fb5 391The -O, -f, -m, and -W switches are handled specifically in these
f5b0eb4e
RK
392constructs. If another value of -O or the negated form of a -f, -m, or
393-W switch is found later in the command line, the earlier switch
6c396fb5
RK
394value is ignored, except with {S*} where S is just one letter; this
395passes all matching options.
f5b0eb4e 396
9bf09437
RH
397The character | at the beginning of the predicate text is used to indicate
398that a command should be piped to the following command, but only if -pipe
399is specified.
ed1f651b
RS
400
401Note that it is built into CC which switches take arguments and which
402do not. You might think it would be useful to generalize this to
403allow each compiler's spec to say which switches take arguments. But
404this cannot be done in a consistent fashion. CC cannot even decide
405which input files have been specified without knowing which switches
406take arguments, and it must know which input files to compile in order
407to tell which compilers to run.
408
409CC also knows implicitly that arguments starting in `-l' are to be
410treated as compiler output files, and passed to the linker in their
411proper position among the other output files. */
412\f
413/* Define the macros used for specs %a, %l, %L, %S, %c, %C, %1. */
414
415/* config.h can define ASM_SPEC to provide extra args to the assembler
416 or extra switch-translations. */
417#ifndef ASM_SPEC
418#define ASM_SPEC ""
419#endif
420
421/* config.h can define ASM_FINAL_SPEC to run a post processor after
422 the assembler has run. */
423#ifndef ASM_FINAL_SPEC
424#define ASM_FINAL_SPEC ""
425#endif
426
427/* config.h can define CPP_SPEC to provide extra args to the C preprocessor
428 or extra switch-translations. */
429#ifndef CPP_SPEC
430#define CPP_SPEC ""
431#endif
432
433/* config.h can define CC1_SPEC to provide extra args to cc1 and cc1plus
434 or extra switch-translations. */
435#ifndef CC1_SPEC
436#define CC1_SPEC ""
437#endif
438
439/* config.h can define CC1PLUS_SPEC to provide extra args to cc1plus
440 or extra switch-translations. */
441#ifndef CC1PLUS_SPEC
442#define CC1PLUS_SPEC ""
443#endif
444
445/* config.h can define LINK_SPEC to provide extra args to the linker
446 or extra switch-translations. */
447#ifndef LINK_SPEC
448#define LINK_SPEC ""
449#endif
450
451/* config.h can define LIB_SPEC to override the default libraries. */
452#ifndef LIB_SPEC
68d69835
JM
453#define LIB_SPEC "%{!shared:%{g*:-lg} %{!p:%{!pg:-lc}}%{p:-lc_p}%{pg:-lc_p}}"
454#endif
455
456/* config.h can define LIBGCC_SPEC to override how and when libgcc.a is
457 included. */
458#ifndef LIBGCC_SPEC
459#if defined(LINK_LIBGCC_SPECIAL) || defined(LINK_LIBGCC_SPECIAL_1)
460/* Have gcc do the search for libgcc.a. */
bacebbcf 461#define LIBGCC_SPEC "libgcc.a%s"
68d69835 462#else
bacebbcf 463#define LIBGCC_SPEC "-lgcc"
68d69835 464#endif
ed1f651b
RS
465#endif
466
467/* config.h can define STARTFILE_SPEC to override the default crt0 files. */
468#ifndef STARTFILE_SPEC
469#define STARTFILE_SPEC \
adcb8d7d 470 "%{!shared:%{pg:gcrt0%O%s}%{!pg:%{p:mcrt0%O%s}%{!p:crt0%O%s}}}"
ed1f651b
RS
471#endif
472
bb9da768
RK
473/* config.h can define SWITCHES_NEED_SPACES to control which options
474 require spaces between the option and the argument. */
ed1f651b
RS
475#ifndef SWITCHES_NEED_SPACES
476#define SWITCHES_NEED_SPACES ""
477#endif
478
479/* config.h can define ENDFILE_SPEC to override the default crtn files. */
480#ifndef ENDFILE_SPEC
481#define ENDFILE_SPEC ""
482#endif
483
484/* This spec is used for telling cpp whether char is signed or not. */
485#ifndef SIGNED_CHAR_SPEC
0e14ddbc
RS
486/* Use #if rather than ?:
487 because MIPS C compiler rejects like ?: in initializers. */
f396d278
RS
488#if DEFAULT_SIGNED_CHAR
489#define SIGNED_CHAR_SPEC "%{funsigned-char:-D__CHAR_UNSIGNED__}"
490#else
491#define SIGNED_CHAR_SPEC "%{!fsigned-char:-D__CHAR_UNSIGNED__}"
492#endif
ed1f651b
RS
493#endif
494
10da1131
BM
495#ifndef LINKER_NAME
496#define LINKER_NAME "collect2"
497#endif
498
3b304f5b
ZW
499static const char *cpp_spec = CPP_SPEC;
500static const char *cpp_predefines = CPP_PREDEFINES;
501static const char *cc1_spec = CC1_SPEC;
502static const char *cc1plus_spec = CC1PLUS_SPEC;
503static const char *signed_char_spec = SIGNED_CHAR_SPEC;
504static const char *asm_spec = ASM_SPEC;
505static const char *asm_final_spec = ASM_FINAL_SPEC;
506static const char *link_spec = LINK_SPEC;
507static const char *lib_spec = LIB_SPEC;
508static const char *libgcc_spec = LIBGCC_SPEC;
509static const char *endfile_spec = ENDFILE_SPEC;
510static const char *startfile_spec = STARTFILE_SPEC;
511static const char *switches_need_spaces = SWITCHES_NEED_SPACES;
512static const char *linker_name_spec = LINKER_NAME;
ffd86336
JW
513
514/* Some compilers have limits on line lengths, and the multilib_select
961b7009
MM
515 and/or multilib_matches strings can be very long, so we build them at
516 run time. */
ffd86336 517static struct obstack multilib_obstack;
3b304f5b
ZW
518static const char *multilib_select;
519static const char *multilib_matches;
520static const char *multilib_defaults;
521static const char *multilib_exclusions;
961b7009
MM
522#include "multilib.h"
523
524/* Check whether a particular argument is a default argument. */
525
526#ifndef MULTILIB_DEFAULTS
527#define MULTILIB_DEFAULTS { "" }
528#endif
529
9257393c 530static const char *const multilib_defaults_raw[] = MULTILIB_DEFAULTS;
ed1f651b 531
3ac63d94
NC
532struct user_specs
533{
d9ac3a07 534 struct user_specs *next;
878f32c3 535 const char *filename;
d9ac3a07
MM
536};
537
538static struct user_specs *user_specs_head, *user_specs_tail;
539
ed1f651b
RS
540/* This defines which switch letters take arguments. */
541
aa32d841 542#define DEFAULT_SWITCH_TAKES_ARG(CHAR) \
ed1f651b
RS
543 ((CHAR) == 'D' || (CHAR) == 'U' || (CHAR) == 'o' \
544 || (CHAR) == 'e' || (CHAR) == 'T' || (CHAR) == 'u' \
34dd3838 545 || (CHAR) == 'I' || (CHAR) == 'm' || (CHAR) == 'x' \
aa32d841
JL
546 || (CHAR) == 'L' || (CHAR) == 'A' || (CHAR) == 'V' \
547 || (CHAR) == 'B' || (CHAR) == 'b')
815cf875
RK
548
549#ifndef SWITCH_TAKES_ARG
550#define SWITCH_TAKES_ARG(CHAR) DEFAULT_SWITCH_TAKES_ARG(CHAR)
ed1f651b
RS
551#endif
552
553/* This defines which multi-letter switches take arguments. */
554
3b39b94f 555#define DEFAULT_WORD_SWITCH_TAKES_ARG(STR) \
ebb8e0c6
JW
556 (!strcmp (STR, "Tdata") || !strcmp (STR, "Ttext") \
557 || !strcmp (STR, "Tbss") || !strcmp (STR, "include") \
3b39b94f
ILT
558 || !strcmp (STR, "imacros") || !strcmp (STR, "aux-info") \
559 || !strcmp (STR, "idirafter") || !strcmp (STR, "iprefix") \
62a66e07 560 || !strcmp (STR, "iwithprefix") || !strcmp (STR, "iwithprefixbefore") \
d9ac3a07 561 || !strcmp (STR, "isystem") || !strcmp (STR, "specs"))
3b39b94f
ILT
562
563#ifndef WORD_SWITCH_TAKES_ARG
564#define WORD_SWITCH_TAKES_ARG(STR) DEFAULT_WORD_SWITCH_TAKES_ARG (STR)
ed1f651b
RS
565#endif
566\f
88117d44
NC
567
568#ifdef HAVE_EXECUTABLE_SUFFIX
569/* This defines which switches stop a full compilation. */
570#define DEFAULT_SWITCH_CURTAILS_COMPILATION(CHAR) \
571 ((CHAR) == 'c' || (CHAR) == 'S')
572
573#ifndef SWITCH_CURTAILS_COMPILATION
574#define SWITCH_CURTAILS_COMPILATION(CHAR) \
575 DEFAULT_SWITCH_CURTAILS_COMPILATION(CHAR)
576#endif
577#endif
578
ed1f651b
RS
579/* Record the mapping from file suffixes for compilation specs. */
580
581struct compiler
582{
878f32c3 583 const char *suffix; /* Use this compiler for input files
ed1f651b 584 whose names end in this suffix. */
ec32609a 585
878f32c3 586 const char *spec[4]; /* To use this compiler, concatenate these
ec32609a 587 specs and pass to do_spec. */
ed1f651b
RS
588};
589
590/* Pointer to a vector of `struct compiler' that gives the spec for
591 compiling a file, based on its suffix.
592 A file that does not end in any of these suffixes will be passed
593 unchanged to the loader and nothing else will be done to it.
594
595 An entry containing two 0s is used to terminate the vector.
596
597 If multiple entries match a file, the last matching one is used. */
598
599static struct compiler *compilers;
600
601/* Number of entries in `compilers', not counting the null terminator. */
602
603static int n_compilers;
604
605/* The default list of file name suffixes and their compilation specs. */
606
607static struct compiler default_compilers[] =
608{
4689ad58 609 /* Add lists of suffixes of known languages here. If those languages
e9a25f70
JL
610 were not present when we built the driver, we will hit these copies
611 and be given a more meaningful error than "file not used since
4689ad58 612 linking is not done". */
b12da25e
ZW
613 {".m", {"#Objective-C"}},
614 {".cc", {"#C++"}}, {".cxx", {"#C++"}}, {".cpp", {"#C++"}},
615 {".c++", {"#C++"}}, {".C", {"#C++"}},
616 {".ads", {"#Ada"}}, {".adb", {"#Ada"}}, {".ada", {"#Ada"}},
6e11d472
MH
617 {".f", {"#Fortran"}}, {".for", {"#Fortran"}}, {".F", {"#Fortran"}},
618 {".fpp", {"#Fortran"}},
619 {".p", {"#Pascal"}}, {".pas", {"#Pascal"}},
4689ad58 620 /* Next come the entries for C. */
6e11d472 621 {".c", {"@c"}},
ed1f651b 622 {"@c",
a0d85b75
DB
623 {
624#if USE_CPPLIB
93447205 625 "%{E|M|MM:cpp -lang-c %{ansi:-std=c89} %{std*} %{nostdinc*}\
54ff00f6 626 %{C} %{v} %{A*} %{I*} %{P} %{$} %I\
a0d85b75
DB
627 %{C:%{!E:%eGNU C does not support -C without using -E}}\
628 %{M} %{MM} %{MD:-MD %b.d} %{MMD:-MMD %b.d} %{MG}\
3ea8083f 629 %{!no-gcc:-D__GNUC__=%v1 -D__GNUC_MINOR__=%v2 -D__GNUC_PATCHLEVEL__=%v3}\
6271b191 630 %{!undef:%{!ansi:%{!std=*:%p}%{std=gnu*:%p}} %P} %{trigraphs}\
a0d85b75 631 %c %{Os:-D__OPTIMIZE_SIZE__} %{O*:%{!O0:-D__OPTIMIZE__}}\
056cd572 632 %{ffast-math:-D__FAST_MATH__}\
12a39b12 633 %{fshort-wchar:-D__WCHAR_TYPE__=short\\ unsigned\\ int}\
a0d85b75
DB
634 %{traditional} %{ftraditional:-traditional}\
635 %{traditional-cpp:-traditional}\
19283265 636 %{fleading-underscore} %{fno-leading-underscore}\
6b32882f 637 %{fshow-column} %{fno-show-column}\
a0d85b75 638 %{g*} %{W*} %{w} %{pedantic*} %{H} %{d*} %C %{D*} %{U*} %{i*} %Z\
ca242225
DB
639 %i %{E:%W{o*}}%{M:%W{o*}}%{MM:%W{o*}}\n}\
640 %{!E:%{!M:%{!MM:cc1 %i %1 \
6f4d7222 641 %{std*} %{nostdinc*} %{A*} %{I*} %I\
a0d85b75
DB
642 %{!Q:-quiet} -dumpbase %b.c %{d*} %{m*} %{a*}\
643 %{MD:-MD %b.d} %{MMD:-MMD %b.d} %{MG}\
3ea8083f 644 %{!no-gcc:-D__GNUC__=%v1 -D__GNUC_MINOR__=%v2 -D__GNUC_PATCHLEVEL__=%v3}\
6271b191 645 %{!undef:%{!ansi:%{!std=*:%p}%{std=gnu*:%p}} %P} %{trigraphs}\
a0d85b75 646 %c %{Os:-D__OPTIMIZE_SIZE__} %{O*:%{!O0:-D__OPTIMIZE__}}\
056cd572 647 %{ffast-math:-D__FAST_MATH__}\
12a39b12
JM
648 %{fshort-wchar:-D__WCHAR_TYPE__=short\\ unsigned\\ int}\
649 %{fshort-wchar:-D__WCHAR_TYPE__=short\\ unsigned\\ int}\
a0d85b75
DB
650 %{H} %C %{D*} %{U*} %{i*} %Z\
651 %{ftraditional:-traditional}\
652 %{traditional-cpp:-traditional}\
653 %{traditional} %{v:-version} %{pg:-p} %{p} %{f*}\
be163a70 654 %{aux-info*} %{Qn:-fno-ident}\
6f4d7222
UD
655 %{--help:--help}\
656 %{g*} %{O*} %{W*} %{w} %{pedantic*}\
a0d85b75
DB
657 %{pg:%{fomit-frame-pointer:%e-pg and -fomit-frame-pointer are incompatible}}\
658 %{S:%W{o*}%{!o*:-o %b.s}}%{!S:-o %{|!pipe:%g.s}} |\n\
659 %{!S:as %a %Y\
660 %{c:%W{o*}%{!o*:-o %w%b%O}}%{!c:-o %d%w%u%O}\
661 %{!pipe:%g.s} %A\n }}}}"
a0d85b75 662#else /* ! USE_CPPLIB */
6f4d7222 663 "cpp -lang-c %{ansi:-std=c89} %{std*} %{nostdinc*}\
54ff00f6 664 %{C} %{v} %{A*} %{I*} %{P} %{$} %I\
ed1f651b 665 %{C:%{!E:%eGNU C does not support -C without using -E}}\
256a105a 666 %{M} %{MM} %{MD:-MD %b.d} %{MMD:-MMD %b.d} %{MG}\
3ea8083f 667 %{!no-gcc:-D__GNUC__=%v1 -D__GNUC_MINOR__=%v2 -D__GNUC_PATCHLEVEL__=%v3}\
6271b191 668 %{!undef:%{!ansi:%{!std=*:%p}%{std=gnu*:%p}} %P} %{trigraphs}\
c6aded7c 669 %c %{Os:-D__OPTIMIZE_SIZE__} %{O*:%{!O0:-D__OPTIMIZE__}}\
056cd572 670 %{ffast-math:-D__FAST_MATH__}\
12a39b12 671 %{fshort-wchar:-D__WCHAR_TYPE__=short\\ unsigned\\ int}\
c6aded7c 672 %{traditional} %{ftraditional:-traditional}\
ed1f651b 673 %{traditional-cpp:-traditional}\
6b32882f 674 %{fshow-column} %{fno-show-column}\
19283265 675 %{fleading-underscore} %{fno-leading-underscore}\
57cb9b60 676 %{g*} %{W*} %{w} %{pedantic*} %{H} %{d*} %C %{D*} %{U*} %{i*} %Z\
ec32609a 677 %i %{!M:%{!MM:%{!E:%{!pipe:%g.i}}}}%{E:%W{o*}}%{M:%W{o*}}%{MM:%W{o*}} |\n",
a0d85b75 678 "%{!M:%{!MM:%{!E:cc1 %{!pipe:%g.i} %1 \
47288231 679 %{!Q:-quiet} -dumpbase %b.c %{d*} %{m*} %{a*}\
6f4d7222 680 %{g*} %{O*} %{W*} %{w} %{pedantic*} %{std*}\
ed1f651b 681 %{traditional} %{v:-version} %{pg:-p} %{p} %{f*}\
be163a70 682 %{aux-info*} %{Qn:-fno-ident}\
b8468bc7 683 %{--help:--help} \
ed1f651b
RS
684 %{pg:%{fomit-frame-pointer:%e-pg and -fomit-frame-pointer are incompatible}}\
685 %{S:%W{o*}%{!o*:-o %b.s}}%{!S:-o %{|!pipe:%g.s}} |\n\
0600f3fa 686 %{!S:as %a %Y\
adcb8d7d 687 %{c:%W{o*}%{!o*:-o %w%b%O}}%{!c:-o %d%w%u%O}\
a0d85b75 688 %{!pipe:%g.s} %A\n }}}}"
a0d85b75 689#endif /* ! USE_CPPLIB */
9ba051d3 690 }},
ed1f651b 691 {"-",
6f4d7222 692 {"%{E:cpp -lang-c %{ansi:-std=c89} %{std*} %{nostdinc*}\
54ff00f6 693 %{C} %{v} %{A*} %{I*} %{P} %{$} %I\
ed1f651b 694 %{C:%{!E:%eGNU C does not support -C without using -E}}\
256a105a 695 %{M} %{MM} %{MD:-MD %b.d} %{MMD:-MMD %b.d} %{MG}\
3ea8083f 696 %{!no-gcc:-D__GNUC__=%v1 -D__GNUC_MINOR__=%v2 -D__GNUC_PATCHLEVEL__=%v3}\
6271b191 697 %{!undef:%{!ansi:%{!std=*:%p}%{std=gnu*:%p}} %P} %{trigraphs}\
c6aded7c 698 %c %{Os:-D__OPTIMIZE_SIZE__} %{O*:%{!O0:-D__OPTIMIZE__}}\
056cd572 699 %{ffast-math:-D__FAST_MATH__}\
12a39b12 700 %{fshort-wchar:-D__WCHAR_TYPE__=short\\ unsigned\\ int}\
c6aded7c 701 %{traditional} %{ftraditional:-traditional}\
ed1f651b 702 %{traditional-cpp:-traditional}\
6b32882f 703 %{fshow-column} %{fno-show-column}\
19283265 704 %{fleading-underscore} %{fno-leading-underscore}\
57cb9b60 705 %{g*} %{W*} %{w} %{pedantic*} %{H} %{d*} %C %{D*} %{U*} %{i*} %Z\
ed1f651b 706 %i %W{o*}}\
6e11d472 707 %{!E:%e-E required when input is from standard input}"}},
6e11d472 708 {".h", {"@c-header"}},
ed1f651b 709 {"@c-header",
6e11d472 710 {"%{!E:%eCompilation of header file requested} \
54ff00f6 711 cpp %{nostdinc*} %{C} %{v} %{A*} %{I*} %{P} %{$} %I\
ed1f651b 712 %{C:%{!E:%eGNU C does not support -C without using -E}}\
54ff00f6 713 %{M} %{MM} %{MD:-MD %b.d} %{MMD:-MMD %b.d} %{MG}\
3ea8083f 714 %{!no-gcc:-D__GNUC__=%v1 -D__GNUC_MINOR__=%v2 -D__GNUC_PATCHLEVEL__=%v3}\
6271b191 715 %{!undef:%{!std=*:%p}%{std=gnu*:%p} %P} %{trigraphs}\
c6aded7c 716 %c %{Os:-D__OPTIMIZE_SIZE__} %{O*:%{!O0:-D__OPTIMIZE__}}\
056cd572 717 %{ffast-math:-D__FAST_MATH__}\
12a39b12
JM
718 %{fshort-wchar:-D__WCHAR_TYPE__=short\\ unsigned\\ int}\
719 %{fshort-wchar:-D__WCHAR_TYPE__=short\\ unsigned\\ int}\
c6aded7c 720 %{traditional} %{ftraditional:-traditional}\
ed1f651b 721 %{traditional-cpp:-traditional}\
6b32882f 722 %{fshow-column} %{fno-show-column}\
19283265 723 %{fleading-underscore} %{fno-leading-underscore}\
57cb9b60 724 %{g*} %{W*} %{w} %{pedantic*} %{H} %{d*} %C %{D*} %{U*} %{i*} %Z\
6e11d472
MH
725 %i %W{o*}"}},
726 {".i", {"@cpp-output"}},
ed1f651b 727 {"@cpp-output",
6e11d472 728 {"%{!M:%{!MM:%{!E:cc1 %i %1 %{!Q:-quiet} %{d*} %{m*} %{a*}\
6f4d7222 729 %{g*} %{O*} %{W*} %{w} %{pedantic*} %{std*}\
ac4cf5d9 730 %{traditional} %{v:-version} %{pg:-p} %{p} %{f*}\
3773a46b 731 %{aux-info*} %{Qn:-fno-ident} -fpreprocessed\
ac4cf5d9
RK
732 %{pg:%{fomit-frame-pointer:%e-pg and -fomit-frame-pointer are incompatible}}\
733 %{S:%W{o*}%{!o*:-o %b.s}}%{!S:-o %{|!pipe:%g.s}} |\n\
0600f3fa 734 %{!S:as %a %Y\
adcb8d7d 735 %{c:%W{o*}%{!o*:-o %w%b%O}}%{!c:-o %d%w%u%O}\
6e11d472
MH
736 %{!pipe:%g.s} %A\n }}}}"}},
737 {".s", {"@assembler"}},
ed1f651b 738 {"@assembler",
6e11d472 739 {"%{!M:%{!MM:%{!E:%{!S:as %a %Y\
adcb8d7d 740 %{c:%W{o*}%{!o*:-o %w%b%O}}%{!c:-o %d%w%u%O}\
6e11d472
MH
741 %i %A\n }}}}"}},
742 {".S", {"@assembler-with-cpp"}},
ed1f651b 743 {"@assembler-with-cpp",
54ff00f6 744 {"cpp -lang-asm %{nostdinc*} %{C} %{v} %{A*} %{I*} %{P} %{$} %I\
ed1f651b 745 %{C:%{!E:%eGNU C does not support -C without using -E}}\
256a105a 746 %{M} %{MM} %{MD:-MD %b.d} %{MMD:-MMD %b.d} %{MG} %{trigraphs}\
507df939 747 -$ %{!undef:%p %P} -D__ASSEMBLER__ \
c6aded7c 748 %c %{Os:-D__OPTIMIZE_SIZE__} %{O*:%{!O0:-D__OPTIMIZE__}}\
056cd572 749 %{ffast-math:-D__FAST_MATH__}\
12a39b12 750 %{fshort-wchar:-D__WCHAR_TYPE__=short\\ unsigned\\ int}\
c6aded7c 751 %{traditional} %{ftraditional:-traditional}\
ed1f651b 752 %{traditional-cpp:-traditional}\
6b32882f 753 %{fshow-column} %{fno-show-column}\
19283265 754 %{fleading-underscore} %{fno-leading-underscore}\
57cb9b60 755 %{g*} %{W*} %{w} %{pedantic*} %{H} %{d*} %C %{D*} %{U*} %{i*} %Z\
20eec2c2 756 %i %{!M:%{!MM:%{!E:%{!pipe:%g.s}}}}%{E:%W{o*}}%{M:%W{o*}}%{MM:%W{o*}} |\n",
6e11d472 757 "%{!M:%{!MM:%{!E:%{!S:as %a %Y\
adcb8d7d 758 %{c:%W{o*}%{!o*:-o %w%b%O}}%{!c:-o %d%w%u%O}\
6e11d472 759 %{!pipe:%g.s} %A\n }}}}"}},
1346ae41 760#include "specs.h"
ed1f651b 761 /* Mark end of table */
6e11d472 762 {0, {0}}
ed1f651b
RS
763};
764
765/* Number of elements in default_compilers, not counting the terminator. */
766
767static int n_default_compilers
768 = (sizeof default_compilers / sizeof (struct compiler)) - 1;
769
770/* Here is the spec for running the linker, after compiling all files. */
771
2378088a 772/* -u* was put back because both BSD and SysV seem to support it. */
7ede72fc
RS
773/* %{static:} simply prevents an error message if the target machine
774 doesn't handle -static. */
a2dfec99
JW
775/* We want %{T*} after %{L*} and %D so that it can be used to specify linker
776 scripts which exist in user specified directories, or in standard
777 directories. */
9ec36da5
JL
778#ifdef LINK_COMMAND_SPEC
779/* Provide option to override link_command_spec from machine specific
780 configuration files. */
878f32c3 781static const char *link_command_spec =
9ec36da5
JL
782 LINK_COMMAND_SPEC;
783#else
49003ff6 784#ifdef LINK_LIBGCC_SPECIAL
68d69835 785/* Don't generate -L options. */
878f32c3 786static const char *link_command_spec = "\
1763b229 787%{!fsyntax-only: \
10da1131 788 %{!c:%{!M:%{!MM:%{!E:%{!S:%(linker) %l %X %{o*} %{A} %{d} %{e*} %{m} %{N} %{n} \
75b11629 789 %{r} %{s} %{t} %{u*} %{x} %{z} %{Z}\
7f9cce93 790 %{!A:%{!nostdlib:%{!nostartfiles:%S}}}\
1bdf86c3 791 %{static:} %{L*} %o\
7f9cce93 792 %{!nostdlib:%{!nodefaultlibs:%G %L %G}}\
1bdf86c3
JW
793 %{!A:%{!nostdlib:%{!nostartfiles:%E}}}\
794 %{T*}\
795 \n }}}}}}";
004fd4d5 796#else
68d69835 797/* Use -L. */
878f32c3 798static const char *link_command_spec = "\
1763b229 799%{!fsyntax-only: \
10da1131 800 %{!c:%{!M:%{!MM:%{!E:%{!S:%(linker) %l %X %{o*} %{A} %{d} %{e*} %{m} %{N} %{n} \
75b11629 801 %{r} %{s} %{t} %{u*} %{x} %{z} %{Z}\
7f9cce93 802 %{!A:%{!nostdlib:%{!nostartfiles:%S}}}\
1bdf86c3 803 %{static:} %{L*} %D %o\
7f9cce93 804 %{!nostdlib:%{!nodefaultlibs:%G %L %G}}\
1bdf86c3
JW
805 %{!A:%{!nostdlib:%{!nostartfiles:%E}}}\
806 %{T*}\
807 \n }}}}}}";
49003ff6 808#endif
9ec36da5 809#endif
ed1f651b
RS
810
811/* A vector of options to give to the linker.
368dfd3a 812 These options are accumulated by %x,
ed1f651b
RS
813 and substituted into the linker command with %X. */
814static int n_linker_options;
815static char **linker_options;
c9ebacb8
RS
816
817/* A vector of options to give to the assembler.
818 These options are accumulated by -Wa,
57cb9b60 819 and substituted into the assembler command with %Y. */
c9ebacb8
RS
820static int n_assembler_options;
821static char **assembler_options;
57cb9b60
JW
822
823/* A vector of options to give to the preprocessor.
824 These options are accumulated by -Wp,
825 and substituted into the preprocessor command with %Z. */
826static int n_preprocessor_options;
827static char **preprocessor_options;
ed1f651b 828\f
f2faf549
RS
829/* Define how to map long options into short ones. */
830
831/* This structure describes one mapping. */
832struct option_map
833{
834 /* The long option's name. */
878f32c3 835 const char *name;
f2faf549 836 /* The equivalent short option. */
878f32c3 837 const char *equivalent;
f2faf549
RS
838 /* Argument info. A string of flag chars; NULL equals no options.
839 a => argument required.
840 o => argument optional.
841 j => join argument to equivalent, making one word.
92bd6bdc 842 * => require other text after NAME as an argument. */
878f32c3 843 const char *arg_info;
f2faf549
RS
844};
845
846/* This is the table of mappings. Mappings are tried sequentially
847 for each option encountered; the first one that matches, wins. */
848
849struct option_map option_map[] =
850 {
92bd6bdc
RK
851 {"--all-warnings", "-Wall", 0},
852 {"--ansi", "-ansi", 0},
853 {"--assemble", "-S", 0},
854 {"--assert", "-A", "a"},
645278bc
TT
855 {"--classpath", "-fclasspath=", "aj"},
856 {"--CLASSPATH", "-fCLASSPATH=", "aj"},
92bd6bdc 857 {"--comments", "-C", 0},
f2faf549 858 {"--compile", "-c", 0},
92bd6bdc 859 {"--debug", "-g", "oj"},
5a570ade 860 {"--define-macro", "-D", "aj"},
92bd6bdc 861 {"--dependencies", "-M", 0},
f2faf549 862 {"--dump", "-d", "a"},
92bd6bdc 863 {"--dumpbase", "-dumpbase", "a"},
f2faf549 864 {"--entry", "-e", 0},
92bd6bdc
RK
865 {"--extra-warnings", "-W", 0},
866 {"--for-assembler", "-Wa", "a"},
867 {"--for-linker", "-Xlinker", "a"},
868 {"--force-link", "-u", "a"},
f2faf549 869 {"--imacros", "-imacros", "a"},
92bd6bdc
RK
870 {"--include", "-include", "a"},
871 {"--include-barrier", "-I-", 0},
5a570ade 872 {"--include-directory", "-I", "aj"},
f2faf549 873 {"--include-directory-after", "-idirafter", "a"},
92bd6bdc 874 {"--include-prefix", "-iprefix", "a"},
f2faf549 875 {"--include-with-prefix", "-iwithprefix", "a"},
8b3d0251
RS
876 {"--include-with-prefix-before", "-iwithprefixbefore", "a"},
877 {"--include-with-prefix-after", "-iwithprefix", "a"},
92bd6bdc
RK
878 {"--language", "-x", "a"},
879 {"--library-directory", "-L", "a"},
f2faf549 880 {"--machine", "-m", "aj"},
92bd6bdc
RK
881 {"--machine-", "-m", "*j"},
882 {"--no-line-commands", "-P", 0},
883 {"--no-precompiled-includes", "-noprecomp", 0},
f2faf549
RS
884 {"--no-standard-includes", "-nostdinc", 0},
885 {"--no-standard-libraries", "-nostdlib", 0},
f2faf549 886 {"--no-warnings", "-w", 0},
f2faf549 887 {"--optimize", "-O", "oj"},
92bd6bdc 888 {"--output", "-o", "a"},
36696297 889 {"--output-class-directory", "-foutput-class-dir=", "ja"},
f2faf549
RS
890 {"--pedantic", "-pedantic", 0},
891 {"--pedantic-errors", "-pedantic-errors", 0},
92bd6bdc
RK
892 {"--pipe", "-pipe", 0},
893 {"--prefix", "-B", "a"},
894 {"--preprocess", "-E", 0},
2628b9d3 895 {"--print-search-dirs", "-print-search-dirs", 0},
6a9e290e 896 {"--print-file-name", "-print-file-name=", "aj"},
92bd6bdc
RK
897 {"--print-libgcc-file-name", "-print-libgcc-file-name", 0},
898 {"--print-missing-file-dependencies", "-MG", 0},
60103a34
DE
899 {"--print-multi-lib", "-print-multi-lib", 0},
900 {"--print-multi-directory", "-print-multi-directory", 0},
92bd6bdc
RK
901 {"--print-prog-name", "-print-prog-name=", "aj"},
902 {"--profile", "-p", 0},
903 {"--profile-blocks", "-a", 0},
904 {"--quiet", "-q", 0},
905 {"--save-temps", "-save-temps", 0},
f2faf549 906 {"--shared", "-shared", 0},
92bd6bdc 907 {"--silent", "-q", 0},
d9ac3a07 908 {"--specs", "-specs=", "aj"},
92bd6bdc 909 {"--static", "-static", 0},
6f4d7222 910 {"--std", "-std=", "aj"},
f2faf549 911 {"--symbolic", "-symbolic", 0},
92bd6bdc 912 {"--target", "-b", "a"},
03c41c05 913 {"--time", "-time", 0},
92bd6bdc
RK
914 {"--trace-includes", "-H", 0},
915 {"--traditional", "-traditional", 0},
916 {"--traditional-cpp", "-traditional-cpp", 0},
917 {"--trigraphs", "-trigraphs", 0},
5a570ade 918 {"--undefine-macro", "-U", "aj"},
92bd6bdc
RK
919 {"--use-version", "-V", "a"},
920 {"--user-dependencies", "-MM", 0},
921 {"--verbose", "-v", 0},
922 {"--version", "-dumpversion", 0},
923 {"--warn-", "-W", "*j"},
924 {"--write-dependencies", "-MD", 0},
925 {"--write-user-dependencies", "-MMD", 0},
f2faf549
RS
926 {"--", "-f", "*j"}
927 };
928\f
929/* Translate the options described by *ARGCP and *ARGVP.
930 Make a new vector and store it back in *ARGVP,
931 and store its length in *ARGVC. */
932
933static void
934translate_options (argcp, argvp)
935 int *argcp;
878f32c3 936 const char ***argvp;
f2faf549 937{
e51712db 938 int i;
f2faf549 939 int argc = *argcp;
878f32c3
KG
940 const char **argv = *argvp;
941 const char **newv =
942 (const char **) xmalloc ((argc + 2) * 2 * sizeof (const char *));
f2faf549
RS
943 int newindex = 0;
944
945 i = 0;
946 newv[newindex++] = argv[i++];
947
948 while (i < argc)
949 {
950 /* Translate -- options. */
951 if (argv[i][0] == '-' && argv[i][1] == '-')
952 {
e51712db 953 size_t j;
f2faf549
RS
954 /* Find a mapping that applies to this option. */
955 for (j = 0; j < sizeof (option_map) / sizeof (option_map[0]); j++)
956 {
85066503
MH
957 size_t optlen = strlen (option_map[j].name);
958 size_t arglen = strlen (argv[i]);
959 size_t complen = arglen > optlen ? optlen : arglen;
878f32c3 960 const char *arginfo = option_map[j].arg_info;
cc198f10
RS
961
962 if (arginfo == 0)
963 arginfo = "";
92bd6bdc 964
f2faf549
RS
965 if (!strncmp (argv[i], option_map[j].name, complen))
966 {
878f32c3 967 const char *arg = 0;
f2faf549 968
92bd6bdc
RK
969 if (arglen < optlen)
970 {
e51712db 971 size_t k;
92bd6bdc
RK
972 for (k = j + 1;
973 k < sizeof (option_map) / sizeof (option_map[0]);
974 k++)
975 if (strlen (option_map[k].name) >= arglen
976 && !strncmp (argv[i], option_map[k].name, arglen))
977 {
978 error ("Ambiguous abbreviation %s", argv[i]);
979 break;
980 }
981
982 if (k != sizeof (option_map) / sizeof (option_map[0]))
983 break;
984 }
985
986 if (arglen > optlen)
f2faf549
RS
987 {
988 /* If the option has an argument, accept that. */
989 if (argv[i][optlen] == '=')
990 arg = argv[i] + optlen + 1;
92bd6bdc
RK
991
992 /* If this mapping requires extra text at end of name,
f2faf549 993 accept that as "argument". */
cc198f10 994 else if (index (arginfo, '*') != 0)
f2faf549 995 arg = argv[i] + optlen;
92bd6bdc 996
f2faf549
RS
997 /* Otherwise, extra text at end means mismatch.
998 Try other mappings. */
999 else
1000 continue;
1001 }
92bd6bdc 1002
cc198f10 1003 else if (index (arginfo, '*') != 0)
92bd6bdc
RK
1004 {
1005 error ("Incomplete `%s' option", option_map[j].name);
1006 break;
1007 }
f2faf549
RS
1008
1009 /* Handle arguments. */
92bd6bdc 1010 if (index (arginfo, 'a') != 0)
f2faf549
RS
1011 {
1012 if (arg == 0)
1013 {
1014 if (i + 1 == argc)
92bd6bdc
RK
1015 {
1016 error ("Missing argument to `%s' option",
1017 option_map[j].name);
1018 break;
1019 }
1020
f2faf549
RS
1021 arg = argv[++i];
1022 }
1023 }
fff26804
RS
1024 else if (index (arginfo, '*') != 0)
1025 ;
92bd6bdc 1026 else if (index (arginfo, 'o') == 0)
f2faf549
RS
1027 {
1028 if (arg != 0)
1029 error ("Extraneous argument to `%s' option",
1030 option_map[j].name);
1031 arg = 0;
1032 }
1033
1034 /* Store the translation as one argv elt or as two. */
cc198f10 1035 if (arg != 0 && index (arginfo, 'j') != 0)
6aa62cff
DE
1036 newv[newindex++] = concat (option_map[j].equivalent, arg,
1037 NULL_PTR);
f2faf549
RS
1038 else if (arg != 0)
1039 {
1040 newv[newindex++] = option_map[j].equivalent;
1041 newv[newindex++] = arg;
1042 }
1043 else
1044 newv[newindex++] = option_map[j].equivalent;
1045
1046 break;
1047 }
1048 }
1049 i++;
1050 }
92bd6bdc 1051
f2faf549
RS
1052 /* Handle old-fashioned options--just copy them through,
1053 with their arguments. */
1054 else if (argv[i][0] == '-')
1055 {
878f32c3 1056 const char *p = argv[i] + 1;
f2faf549
RS
1057 int c = *p;
1058 int nskip = 1;
1059
1060 if (SWITCH_TAKES_ARG (c) > (p[1] != 0))
1061 nskip += SWITCH_TAKES_ARG (c) - (p[1] != 0);
1062 else if (WORD_SWITCH_TAKES_ARG (p))
1063 nskip += WORD_SWITCH_TAKES_ARG (p);
fb99c21c
JW
1064 else if ((c == 'B' || c == 'b' || c == 'V' || c == 'x')
1065 && p[1] == 0)
1066 nskip += 1;
1067 else if (! strcmp (p, "Xlinker"))
1068 nskip += 1;
f2faf549 1069
e184d694
JW
1070 /* Watch out for an option at the end of the command line that
1071 is missing arguments, and avoid skipping past the end of the
1072 command line. */
1073 if (nskip + i > argc)
1074 nskip = argc - i;
1075
f2faf549
RS
1076 while (nskip > 0)
1077 {
1078 newv[newindex++] = argv[i++];
1079 nskip--;
1080 }
1081 }
1082 else
1083 /* Ordinary operands, or +e options. */
1084 newv[newindex++] = argv[i++];
1085 }
1086
1087 newv[newindex] = 0;
1088
1089 *argvp = newv;
1090 *argcp = newindex;
1091}
1092\f
ed1f651b
RS
1093static char *
1094skip_whitespace (p)
1095 char *p;
1096{
1097 while (1)
1098 {
1099 /* A fully-blank line is a delimiter in the SPEC file and shouldn't
1100 be considered whitespace. */
1101 if (p[0] == '\n' && p[1] == '\n' && p[2] == '\n')
1102 return p + 1;
1103 else if (*p == '\n' || *p == ' ' || *p == '\t')
1104 p++;
1105 else if (*p == '#')
1106 {
1107 while (*p != '\n') p++;
1108 p++;
1109 }
1110 else
1111 break;
1112 }
1113
1114 return p;
1115}
1116\f
0f41302f 1117/* Structure to keep track of the specs that have been defined so far.
4089dfab
JL
1118 These are accessed using %(specname) or %[specname] in a compiler
1119 or link spec. */
ed1f651b
RS
1120
1121struct spec_list
1122{
79aff5ac
MM
1123 /* The following 2 fields must be first */
1124 /* to allow EXTRA_SPECS to be initialized */
3b304f5b
ZW
1125 const char *name; /* name of the spec. */
1126 const char *ptr; /* available ptr if no static pointer */
79aff5ac
MM
1127
1128 /* The following fields are not initialized */
1129 /* by EXTRA_SPECS */
3b304f5b 1130 const char **ptr_spec; /* pointer to the spec itself. */
79aff5ac
MM
1131 struct spec_list *next; /* Next spec in linked list. */
1132 int name_len; /* length of the name */
1133 int alloc_p; /* whether string was allocated */
ed1f651b
RS
1134};
1135
79aff5ac
MM
1136#define INIT_STATIC_SPEC(NAME,PTR) \
1137{ NAME, NULL_PTR, PTR, (struct spec_list *)0, sizeof (NAME)-1, 0 }
1138
3ac63d94
NC
1139/* List of statically defined specs. */
1140static struct spec_list static_specs[] =
1141{
79aff5ac
MM
1142 INIT_STATIC_SPEC ("asm", &asm_spec),
1143 INIT_STATIC_SPEC ("asm_final", &asm_final_spec),
1144 INIT_STATIC_SPEC ("cpp", &cpp_spec),
1145 INIT_STATIC_SPEC ("cc1", &cc1_spec),
1146 INIT_STATIC_SPEC ("cc1plus", &cc1plus_spec),
1147 INIT_STATIC_SPEC ("endfile", &endfile_spec),
1148 INIT_STATIC_SPEC ("link", &link_spec),
1149 INIT_STATIC_SPEC ("lib", &lib_spec),
1150 INIT_STATIC_SPEC ("libgcc", &libgcc_spec),
1151 INIT_STATIC_SPEC ("startfile", &startfile_spec),
1152 INIT_STATIC_SPEC ("switches_need_spaces", &switches_need_spaces),
1153 INIT_STATIC_SPEC ("signed_char", &signed_char_spec),
1154 INIT_STATIC_SPEC ("predefines", &cpp_predefines),
1155 INIT_STATIC_SPEC ("cross_compile", &cross_compile),
1156 INIT_STATIC_SPEC ("version", &compiler_version),
1157 INIT_STATIC_SPEC ("multilib", &multilib_select),
1158 INIT_STATIC_SPEC ("multilib_defaults", &multilib_defaults),
1159 INIT_STATIC_SPEC ("multilib_extra", &multilib_extra),
1160 INIT_STATIC_SPEC ("multilib_matches", &multilib_matches),
0a8d6618 1161 INIT_STATIC_SPEC ("multilib_exclusions", &multilib_exclusions),
10da1131 1162 INIT_STATIC_SPEC ("linker", &linker_name_spec),
79aff5ac
MM
1163};
1164
1165#ifdef EXTRA_SPECS /* additional specs needed */
829245be 1166/* Structure to keep track of just the first two args of a spec_list.
3ac63d94 1167 That is all that the EXTRA_SPECS macro gives us. */
829245be
KG
1168struct spec_list_1
1169{
3b304f5b
ZW
1170 const char *name;
1171 const char *ptr;
829245be
KG
1172};
1173
1174static struct spec_list_1 extra_specs_1[] = { EXTRA_SPECS };
1175static struct spec_list * extra_specs = (struct spec_list *)0;
79aff5ac
MM
1176#endif
1177
1178/* List of dynamically allocates specs that have been defined so far. */
1179
1180static struct spec_list *specs = (struct spec_list *)0;
1181
1182\f
1183/* Initialize the specs lookup routines. */
1184
1185static void
03fc1620 1186init_spec ()
79aff5ac
MM
1187{
1188 struct spec_list *next = (struct spec_list *)0;
1189 struct spec_list *sl = (struct spec_list *)0;
1190 int i;
1191
1192 if (specs)
3ac63d94 1193 return; /* Already initialized. */
79aff5ac 1194
20df0482 1195 if (verbose_flag)
ab87f8c8 1196 notice ("Using builtin specs.\n");
20df0482 1197
79aff5ac 1198#ifdef EXTRA_SPECS
829245be 1199 extra_specs = (struct spec_list *)
ad85216e 1200 xcalloc (sizeof(struct spec_list),
829245be 1201 (sizeof(extra_specs_1)/sizeof(extra_specs_1[0])));
829245be
KG
1202
1203 for (i = (sizeof(extra_specs_1) / sizeof(extra_specs_1[0])) - 1; i >= 0; i--)
03fc1620
JW
1204 {
1205 sl = &extra_specs[i];
829245be
KG
1206 sl->name = extra_specs_1[i].name;
1207 sl->ptr = extra_specs_1[i].ptr;
03fc1620
JW
1208 sl->next = next;
1209 sl->name_len = strlen (sl->name);
1210 sl->ptr_spec = &sl->ptr;
1211 next = sl;
1212 }
79aff5ac
MM
1213#endif
1214
1215 for (i = (sizeof (static_specs) / sizeof (static_specs[0])) - 1; i >= 0; i--)
1216 {
1217 sl = &static_specs[i];
1218 sl->next = next;
1219 next = sl;
1220 }
1221
1222 specs = sl;
1223}
ed1f651b 1224
ed1f651b
RS
1225\f
1226/* Change the value of spec NAME to SPEC. If SPEC is empty, then the spec is
1227 removed; If the spec starts with a + then SPEC is added to the end of the
0f41302f 1228 current spec. */
ed1f651b
RS
1229
1230static void
1231set_spec (name, spec)
878f32c3
KG
1232 const char *name;
1233 const char *spec;
ed1f651b
RS
1234{
1235 struct spec_list *sl;
3b304f5b 1236 const char *old_spec;
79aff5ac
MM
1237 int name_len = strlen (name);
1238 int i;
1239
3ac63d94 1240 /* If this is the first call, initialize the statically allocated specs. */
20df0482
MM
1241 if (!specs)
1242 {
1243 struct spec_list *next = (struct spec_list *)0;
e9a25f70
JL
1244 for (i = (sizeof (static_specs) / sizeof (static_specs[0])) - 1;
1245 i >= 0; i--)
20df0482
MM
1246 {
1247 sl = &static_specs[i];
1248 sl->next = next;
1249 next = sl;
1250 }
1251 specs = sl;
1252 }
1253
3ac63d94 1254 /* See if the spec already exists. */
ed1f651b 1255 for (sl = specs; sl; sl = sl->next)
79aff5ac 1256 if (name_len == sl->name_len && !strcmp (sl->name, name))
ed1f651b
RS
1257 break;
1258
1259 if (!sl)
1260 {
3ac63d94 1261 /* Not found - make it. */
ed1f651b 1262 sl = (struct spec_list *) xmalloc (sizeof (struct spec_list));
ad85216e 1263 sl->name = xstrdup (name);
79aff5ac
MM
1264 sl->name_len = name_len;
1265 sl->ptr_spec = &sl->ptr;
1266 sl->alloc_p = 0;
1267 *(sl->ptr_spec) = "";
ed1f651b
RS
1268 sl->next = specs;
1269 specs = sl;
1270 }
1271
79aff5ac 1272 old_spec = *(sl->ptr_spec);
e51712db 1273 *(sl->ptr_spec) = ((spec[0] == '+' && ISSPACE ((unsigned char)spec[1]))
79aff5ac 1274 ? concat (old_spec, spec + 1, NULL_PTR)
ad85216e 1275 : xstrdup (spec));
841faeed 1276
20df0482
MM
1277#ifdef DEBUG_SPECS
1278 if (verbose_flag)
ab87f8c8 1279 notice ("Setting spec %s to '%s'\n\n", name, *(sl->ptr_spec));
20df0482
MM
1280#endif
1281
3ac63d94 1282 /* Free the old spec. */
79aff5ac 1283 if (old_spec && sl->alloc_p)
3b304f5b 1284 free ((PTR) old_spec);
79aff5ac
MM
1285
1286 sl->alloc_p = 1;
ed1f651b
RS
1287}
1288\f
1289/* Accumulate a command (program name and args), and run it. */
1290
1291/* Vector of pointers to arguments in the current line of specifications. */
1292
fbd40359 1293static const char **argbuf;
ed1f651b
RS
1294
1295/* Number of elements allocated in argbuf. */
1296
1297static int argbuf_length;
1298
1299/* Number of elements in argbuf currently in use (containing args). */
1300
1301static int argbuf_index;
1302
003ac91d
JL
1303/* We want this on by default all the time now. */
1304#define MKTEMP_EACH_FILE
1305
4e1e2064 1306#ifdef MKTEMP_EACH_FILE
39d45901 1307
fb266030 1308/* This is the list of suffixes and codes (%g/%u/%U) and the associated
4e1e2064 1309 temp file. */
fb266030
TW
1310
1311static struct temp_name {
878f32c3 1312 const char *suffix; /* suffix associated with the code. */
fb266030
TW
1313 int length; /* strlen (suffix). */
1314 int unique; /* Indicates whether %g or %u/%U was used. */
878f32c3 1315 const char *filename; /* associated filename. */
fb266030
TW
1316 int filename_length; /* strlen (filename). */
1317 struct temp_name *next;
1318} *temp_names;
4e1e2064 1319#endif
fb266030 1320
39d45901 1321
ed1f651b
RS
1322/* Number of commands executed so far. */
1323
1324static int execution_count;
1325
3b9b4d3f
RS
1326/* Number of commands that exited with a signal. */
1327
1328static int signal_count;
1329
ed1f651b
RS
1330/* Name with which this program was invoked. */
1331
878f32c3 1332static const char *programname;
ed1f651b 1333\f
0f41302f 1334/* Structures to keep track of prefixes to try when looking for files. */
ed1f651b
RS
1335
1336struct prefix_list
1337{
0f41302f
MS
1338 char *prefix; /* String to prepend to the path. */
1339 struct prefix_list *next; /* Next in linked list. */
ed1f651b 1340 int require_machine_suffix; /* Don't use without machine_suffix. */
ae04227b 1341 /* 2 means try both machine_suffix and just_machine_suffix. */
ed1f651b
RS
1342 int *used_flag_ptr; /* 1 if a file was found with this prefix. */
1343};
1344
1345struct path_prefix
1346{
1347 struct prefix_list *plist; /* List of prefixes to try */
1348 int max_len; /* Max length of a prefix in PLIST */
878f32c3 1349 const char *name; /* Name of this list (used in config stuff) */
ed1f651b
RS
1350};
1351
0f41302f 1352/* List of prefixes to try when looking for executables. */
ed1f651b 1353
48ff801b 1354static struct path_prefix exec_prefixes = { 0, 0, "exec" };
ed1f651b 1355
0f41302f 1356/* List of prefixes to try when looking for startup (crt0) files. */
ed1f651b 1357
48ff801b 1358static struct path_prefix startfile_prefixes = { 0, 0, "startfile" };
ed1f651b 1359
2d879387
JW
1360/* List of prefixes to try when looking for include files. */
1361
48ff801b 1362static struct path_prefix include_prefixes = { 0, 0, "include" };
2d879387 1363
ae04227b
CH
1364/* Suffix to attach to directories searched for commands.
1365 This looks like `MACHINE/VERSION/'. */
ed1f651b 1366
878f32c3 1367static const char *machine_suffix = 0;
ed1f651b 1368
ae04227b
CH
1369/* Suffix to attach to directories searched for commands.
1370 This is just `MACHINE/'. */
1371
878f32c3 1372static const char *just_machine_suffix = 0;
ae04227b 1373
8eebb258
RS
1374/* Adjusted value of GCC_EXEC_PREFIX envvar. */
1375
878f32c3 1376static const char *gcc_exec_prefix;
8eebb258 1377
ed1f651b
RS
1378/* Default prefixes to attach to command names. */
1379
1380#ifdef CROSS_COMPILE /* Don't use these prefixes for a cross compiler. */
1381#undef MD_EXEC_PREFIX
1382#undef MD_STARTFILE_PREFIX
607a4f7d 1383#undef MD_STARTFILE_PREFIX_1
ed1f651b
RS
1384#endif
1385
1386#ifndef STANDARD_EXEC_PREFIX
004fd4d5 1387#define STANDARD_EXEC_PREFIX "/usr/local/lib/gcc-lib/"
ed1f651b
RS
1388#endif /* !defined STANDARD_EXEC_PREFIX */
1389
878f32c3
KG
1390static const char *standard_exec_prefix = STANDARD_EXEC_PREFIX;
1391static const char *standard_exec_prefix_1 = "/usr/lib/gcc/";
ed1f651b 1392#ifdef MD_EXEC_PREFIX
878f32c3 1393static const char *md_exec_prefix = MD_EXEC_PREFIX;
ed1f651b
RS
1394#endif
1395
1396#ifndef STANDARD_STARTFILE_PREFIX
1397#define STANDARD_STARTFILE_PREFIX "/usr/local/lib/"
1398#endif /* !defined STANDARD_STARTFILE_PREFIX */
1399
1400#ifdef MD_STARTFILE_PREFIX
878f32c3 1401static const char *md_startfile_prefix = MD_STARTFILE_PREFIX;
ed1f651b 1402#endif
607a4f7d 1403#ifdef MD_STARTFILE_PREFIX_1
878f32c3 1404static const char *md_startfile_prefix_1 = MD_STARTFILE_PREFIX_1;
607a4f7d 1405#endif
878f32c3
KG
1406static const char *standard_startfile_prefix = STANDARD_STARTFILE_PREFIX;
1407static const char *standard_startfile_prefix_1 = "/lib/";
1408static const char *standard_startfile_prefix_2 = "/usr/lib/";
ed1f651b 1409
53cc3d63
ILT
1410#ifndef TOOLDIR_BASE_PREFIX
1411#define TOOLDIR_BASE_PREFIX "/usr/local/"
f18fd956 1412#endif
878f32c3
KG
1413static const char *tooldir_base_prefix = TOOLDIR_BASE_PREFIX;
1414static const char *tooldir_prefix;
f18fd956 1415
0deb20df
TT
1416#ifndef STANDARD_BINDIR_PREFIX
1417#define STANDARD_BINDIR_PREFIX "/usr/local/bin"
1418#endif
3b304f5b 1419static const char *standard_bindir_prefix = STANDARD_BINDIR_PREFIX;
0deb20df 1420
60103a34
DE
1421/* Subdirectory to use for locating libraries. Set by
1422 set_multilib_dir based on the compilation options. */
1423
878f32c3 1424static const char *multilib_dir;
60103a34 1425
ed1f651b
RS
1426/* Clear out the vector of arguments (after a command is executed). */
1427
1428static void
1429clear_args ()
1430{
1431 argbuf_index = 0;
1432}
1433
1434/* Add one argument to the vector at the end.
1435 This is done when a space is seen or at the end of the line.
1436 If DELETE_ALWAYS is nonzero, the arg is a filename
1437 and the file should be deleted eventually.
1438 If DELETE_FAILURE is nonzero, the arg is a filename
1439 and the file should be deleted if this compilation fails. */
1440
1441static void
1442store_arg (arg, delete_always, delete_failure)
fbd40359 1443 const char *arg;
ed1f651b
RS
1444 int delete_always, delete_failure;
1445{
1446 if (argbuf_index + 1 == argbuf_length)
e9a25f70 1447 argbuf
fbd40359
ZW
1448 = (const char **) xrealloc (argbuf,
1449 (argbuf_length *= 2) * sizeof (const char *));
ed1f651b
RS
1450
1451 argbuf[argbuf_index++] = arg;
1452 argbuf[argbuf_index] = 0;
1453
1454 if (delete_always || delete_failure)
1455 record_temp_file (arg, delete_always, delete_failure);
1456}
1457\f
b633b6c0
MK
1458/* Load specs from a file name named FILENAME, replacing occurances of
1459 various different types of line-endings, \r\n, \n\r and just \r, with
1460 a single \n. */
20df0482 1461
b633b6c0
MK
1462static char*
1463load_specs (filename)
878f32c3 1464 const char *filename;
20df0482
MM
1465{
1466 int desc;
1467 int readlen;
1468 struct stat statbuf;
1469 char *buffer;
b633b6c0
MK
1470 char *buffer_p;
1471 char *specs;
1472 char *specs_p;
20df0482
MM
1473
1474 if (verbose_flag)
ab87f8c8 1475 notice ("Reading specs from %s\n", filename);
20df0482
MM
1476
1477 /* Open and stat the file. */
1478 desc = open (filename, O_RDONLY, 0);
1479 if (desc < 0)
1480 pfatal_with_name (filename);
1481 if (stat (filename, &statbuf) < 0)
1482 pfatal_with_name (filename);
1483
1484 /* Read contents of file into BUFFER. */
1485 buffer = xmalloc ((unsigned) statbuf.st_size + 1);
1486 readlen = read (desc, buffer, (unsigned) statbuf.st_size);
1487 if (readlen < 0)
1488 pfatal_with_name (filename);
1489 buffer[readlen] = 0;
1490 close (desc);
1491
b633b6c0
MK
1492 specs = xmalloc (readlen + 1);
1493 specs_p = specs;
1494 for (buffer_p = buffer; buffer_p && *buffer_p; buffer_p++)
1495 {
1496 int skip = 0;
1497 char c = *buffer_p;
1498 if (c == '\r')
1499 {
1500 if (buffer_p > buffer && *(buffer_p-1) == '\n') /* \n\r */
1501 skip = 1;
1502 else if (*(buffer_p+1) == '\n') /* \r\n */
1503 skip = 1;
1504 else /* \r */
1505 c = '\n';
1506 }
1507 if (! skip)
1508 *specs_p++ = c;
1509 }
1510 *specs_p = '\0';
1511
1512 free (buffer);
1513 return (specs);
1514}
1515
1516/* Read compilation specs from a file named FILENAME,
1517 replacing the default ones.
1518
1519 A suffix which starts with `*' is a definition for
1520 one of the machine-specific sub-specs. The "suffix" should be
1521 *asm, *cc1, *cpp, *link, *startfile, *signed_char, etc.
1522 The corresponding spec is stored in asm_spec, etc.,
1523 rather than in the `compilers' vector.
1524
1525 Anything invalid in the file is a fatal error. */
1526
1527static void
1528read_specs (filename, main_p)
1529 const char *filename;
1530 int main_p;
1531{
1532 char *buffer;
1533 register char *p;
1534
1535 buffer = load_specs (filename);
1536
20df0482
MM
1537 /* Scan BUFFER for specs, putting them in the vector. */
1538 p = buffer;
1539 while (1)
1540 {
1541 char *suffix;
1542 char *spec;
1543 char *in, *out, *p1, *p2, *p3;
1544
1545 /* Advance P in BUFFER to the next nonblank nocomment line. */
1546 p = skip_whitespace (p);
1547 if (*p == 0)
1548 break;
1549
1550 /* Is this a special command that starts with '%'? */
1551 /* Don't allow this for the main specs file, since it would
1552 encourage people to overwrite it. */
1553 if (*p == '%' && !main_p)
1554 {
1555 p1 = p;
e9a25f70
JL
1556 while (*p && *p != '\n')
1557 p++;
1558
1559 p++; /* Skip '\n' */
20df0482
MM
1560
1561 if (!strncmp (p1, "%include", sizeof ("%include")-1)
e9a25f70
JL
1562 && (p1[sizeof "%include" - 1] == ' '
1563 || p1[sizeof "%include" - 1] == '\t'))
20df0482
MM
1564 {
1565 char *new_filename;
1566
1567 p1 += sizeof ("%include");
e9a25f70
JL
1568 while (*p1 == ' ' || *p1 == '\t')
1569 p1++;
20df0482
MM
1570
1571 if (*p1++ != '<' || p[-2] != '>')
22d9f2cf
KG
1572 fatal ("specs %%include syntax malformed after %ld characters",
1573 (long) (p1 - buffer + 1));
20df0482
MM
1574
1575 p[-2] = '\0';
1576 new_filename = find_a_file (&startfile_prefixes, p1, R_OK);
1577 read_specs (new_filename ? new_filename : p1, FALSE);
1578 continue;
1579 }
e9a25f70
JL
1580 else if (!strncmp (p1, "%include_noerr", sizeof "%include_noerr" - 1)
1581 && (p1[sizeof "%include_noerr" - 1] == ' '
1582 || p1[sizeof "%include_noerr" - 1] == '\t'))
20df0482
MM
1583 {
1584 char *new_filename;
1585
e9a25f70 1586 p1 += sizeof "%include_noerr";
20df0482
MM
1587 while (*p1 == ' ' || *p1 == '\t') p1++;
1588
1589 if (*p1++ != '<' || p[-2] != '>')
22d9f2cf
KG
1590 fatal ("specs %%include syntax malformed after %ld characters",
1591 (long) (p1 - buffer + 1));
20df0482
MM
1592
1593 p[-2] = '\0';
1594 new_filename = find_a_file (&startfile_prefixes, p1, R_OK);
1595 if (new_filename)
1596 read_specs (new_filename, FALSE);
1597 else if (verbose_flag)
ab87f8c8 1598 notice ("Could not find specs file %s\n", p1);
20df0482
MM
1599 continue;
1600 }
e9a25f70
JL
1601 else if (!strncmp (p1, "%rename", sizeof "%rename" - 1)
1602 && (p1[sizeof "%rename" - 1] == ' '
1603 || p1[sizeof "%rename" - 1] == '\t'))
20df0482
MM
1604 {
1605 int name_len;
1606 struct spec_list *sl;
1607
1608 /* Get original name */
e9a25f70
JL
1609 p1 += sizeof "%rename";
1610 while (*p1 == ' ' || *p1 == '\t')
1611 p1++;
1612
e51712db 1613 if (! ISALPHA ((unsigned char)*p1))
22d9f2cf
KG
1614 fatal ("specs %%rename syntax malformed after %ld characters",
1615 (long) (p1 - buffer));
20df0482
MM
1616
1617 p2 = p1;
e51712db 1618 while (*p2 && !ISSPACE ((unsigned char)*p2))
e9a25f70
JL
1619 p2++;
1620
20df0482 1621 if (*p2 != ' ' && *p2 != '\t')
22d9f2cf
KG
1622 fatal ("specs %%rename syntax malformed after %ld characters",
1623 (long) (p2 - buffer));
20df0482
MM
1624
1625 name_len = p2 - p1;
1626 *p2++ = '\0';
e9a25f70
JL
1627 while (*p2 == ' ' || *p2 == '\t')
1628 p2++;
1629
e51712db 1630 if (! ISALPHA ((unsigned char)*p2))
22d9f2cf
KG
1631 fatal ("specs %%rename syntax malformed after %ld characters",
1632 (long) (p2 - buffer));
20df0482
MM
1633
1634 /* Get new spec name */
1635 p3 = p2;
e51712db 1636 while (*p3 && !ISSPACE ((unsigned char)*p3))
e9a25f70
JL
1637 p3++;
1638
20df0482 1639 if (p3 != p-1)
22d9f2cf
KG
1640 fatal ("specs %%rename syntax malformed after %ld characters",
1641 (long) (p3 - buffer));
20df0482
MM
1642 *p3 = '\0';
1643
1644 for (sl = specs; sl; sl = sl->next)
1645 if (name_len == sl->name_len && !strcmp (sl->name, p1))
1646 break;
1647
1648 if (!sl)
1649 fatal ("specs %s spec was not found to be renamed", p1);
1650
e9a25f70 1651 if (strcmp (p1, p2) == 0)
20df0482
MM
1652 continue;
1653
1654 if (verbose_flag)
1655 {
ab87f8c8 1656 notice ("rename spec %s to %s\n", p1, p2);
20df0482 1657#ifdef DEBUG_SPECS
ab87f8c8 1658 notice ("spec is '%s'\n\n", *(sl->ptr_spec));
20df0482
MM
1659#endif
1660 }
1661
1662 set_spec (p2, *(sl->ptr_spec));
1663 if (sl->alloc_p)
3b304f5b 1664 free ((PTR) *(sl->ptr_spec));
20df0482
MM
1665
1666 *(sl->ptr_spec) = "";
1667 sl->alloc_p = 0;
1668 continue;
1669 }
1670 else
22d9f2cf
KG
1671 fatal ("specs unknown %% command after %ld characters",
1672 (long) (p1 - buffer));
20df0482
MM
1673 }
1674
1675 /* Find the colon that should end the suffix. */
1676 p1 = p;
e9a25f70
JL
1677 while (*p1 && *p1 != ':' && *p1 != '\n')
1678 p1++;
1679
20df0482
MM
1680 /* The colon shouldn't be missing. */
1681 if (*p1 != ':')
22d9f2cf
KG
1682 fatal ("specs file malformed after %ld characters",
1683 (long) (p1 - buffer));
e9a25f70 1684
20df0482
MM
1685 /* Skip back over trailing whitespace. */
1686 p2 = p1;
e9a25f70
JL
1687 while (p2 > buffer && (p2[-1] == ' ' || p2[-1] == '\t'))
1688 p2--;
1689
20df0482
MM
1690 /* Copy the suffix to a string. */
1691 suffix = save_string (p, p2 - p);
1692 /* Find the next line. */
1693 p = skip_whitespace (p1 + 1);
1694 if (p[1] == 0)
22d9f2cf
KG
1695 fatal ("specs file malformed after %ld characters",
1696 (long) (p - buffer));
e9a25f70 1697
20df0482 1698 p1 = p;
bbeb7b65
JW
1699 /* Find next blank line or end of string. */
1700 while (*p1 && !(*p1 == '\n' && (p1[1] == '\n' || p1[1] == '\0')))
e9a25f70
JL
1701 p1++;
1702
20df0482
MM
1703 /* Specs end at the blank line and do not include the newline. */
1704 spec = save_string (p, p1 - p);
1705 p = p1;
1706
1707 /* Delete backslash-newline sequences from the spec. */
1708 in = spec;
1709 out = spec;
1710 while (*in != 0)
1711 {
1712 if (in[0] == '\\' && in[1] == '\n')
1713 in += 2;
1714 else if (in[0] == '#')
e9a25f70
JL
1715 while (*in && *in != '\n')
1716 in++;
1717
20df0482
MM
1718 else
1719 *out++ = *in++;
1720 }
1721 *out = 0;
1722
1723 if (suffix[0] == '*')
1724 {
1725 if (! strcmp (suffix, "*link_command"))
1726 link_command_spec = spec;
1727 else
1728 set_spec (suffix + 1, spec);
1729 }
1730 else
1731 {
1732 /* Add this pair to the vector. */
1733 compilers
1734 = ((struct compiler *)
e9a25f70
JL
1735 xrealloc (compilers,
1736 (n_compilers + 2) * sizeof (struct compiler)));
1737
20df0482 1738 compilers[n_compilers].suffix = suffix;
9257393c
KG
1739 memset (compilers[n_compilers].spec, 0,
1740 sizeof compilers[n_compilers].spec);
20df0482
MM
1741 compilers[n_compilers].spec[0] = spec;
1742 n_compilers++;
9257393c 1743 memset (&compilers[n_compilers], 0, sizeof compilers[n_compilers]);
20df0482
MM
1744 }
1745
1746 if (*suffix == 0)
1747 link_command_spec = spec;
1748 }
1749
1750 if (link_command_spec == 0)
1751 fatal ("spec file has no spec for linking");
1752}
1753\f
ed1f651b
RS
1754/* Record the names of temporary files we tell compilers to write,
1755 and delete them at the end of the run. */
1756
1757/* This is the common prefix we use to make temp file names.
1758 It is chosen once for each run of this program.
1759 It is substituted into a spec by %g.
1760 Thus, all temp file names contain this prefix.
1761 In practice, all temp file names start with this prefix.
1762
1763 This prefix comes from the envvar TMPDIR if it is defined;
1764 otherwise, from the P_tmpdir macro if that is defined;
6aa62cff
DE
1765 otherwise, in /usr/tmp or /tmp;
1766 or finally the current directory if all else fails. */
ed1f651b 1767
878f32c3 1768static const char *temp_filename;
ed1f651b
RS
1769
1770/* Length of the prefix. */
1771
1772static int temp_filename_length;
1773
1774/* Define the list of temporary files to delete. */
1775
1776struct temp_file
1777{
878f32c3 1778 const char *name;
ed1f651b
RS
1779 struct temp_file *next;
1780};
1781
1782/* Queue of files to delete on success or failure of compilation. */
1783static struct temp_file *always_delete_queue;
1784/* Queue of files to delete on failure of compilation. */
1785static struct temp_file *failure_delete_queue;
1786
1787/* Record FILENAME as a file to be deleted automatically.
1788 ALWAYS_DELETE nonzero means delete it if all compilation succeeds;
1789 otherwise delete it in any case.
1790 FAIL_DELETE nonzero means delete it if a compilation step fails;
1791 otherwise delete it in any case. */
1792
1793static void
1794record_temp_file (filename, always_delete, fail_delete)
878f32c3 1795 const char *filename;
ed1f651b
RS
1796 int always_delete;
1797 int fail_delete;
1798{
ad85216e 1799 register char * const name = xstrdup (filename);
ed1f651b
RS
1800
1801 if (always_delete)
1802 {
1803 register struct temp_file *temp;
1804 for (temp = always_delete_queue; temp; temp = temp->next)
1805 if (! strcmp (name, temp->name))
1806 goto already1;
e9a25f70 1807
ed1f651b
RS
1808 temp = (struct temp_file *) xmalloc (sizeof (struct temp_file));
1809 temp->next = always_delete_queue;
1810 temp->name = name;
1811 always_delete_queue = temp;
e9a25f70 1812
ed1f651b
RS
1813 already1:;
1814 }
1815
1816 if (fail_delete)
1817 {
1818 register struct temp_file *temp;
1819 for (temp = failure_delete_queue; temp; temp = temp->next)
1820 if (! strcmp (name, temp->name))
1821 goto already2;
e9a25f70 1822
ed1f651b
RS
1823 temp = (struct temp_file *) xmalloc (sizeof (struct temp_file));
1824 temp->next = failure_delete_queue;
1825 temp->name = name;
1826 failure_delete_queue = temp;
e9a25f70 1827
ed1f651b
RS
1828 already2:;
1829 }
1830}
1831
1832/* Delete all the temporary files whose names we previously recorded. */
1833
d5ea2ac4
RK
1834static void
1835delete_if_ordinary (name)
878f32c3 1836 const char *name;
d5ea2ac4
RK
1837{
1838 struct stat st;
1839#ifdef DEBUG
1840 int i, c;
1841
1842 printf ("Delete %s? (y or n) ", name);
1843 fflush (stdout);
1844 i = getchar ();
1845 if (i != '\n')
e9a25f70
JL
1846 while ((c = getchar ()) != '\n' && c != EOF)
1847 ;
1848
d5ea2ac4
RK
1849 if (i == 'y' || i == 'Y')
1850#endif /* DEBUG */
1851 if (stat (name, &st) >= 0 && S_ISREG (st.st_mode))
1852 if (unlink (name) < 0)
1853 if (verbose_flag)
1854 perror_with_name (name);
1855}
1856
ed1f651b
RS
1857static void
1858delete_temp_files ()
1859{
1860 register struct temp_file *temp;
1861
1862 for (temp = always_delete_queue; temp; temp = temp->next)
d5ea2ac4 1863 delete_if_ordinary (temp->name);
ed1f651b
RS
1864 always_delete_queue = 0;
1865}
1866
1867/* Delete all the files to be deleted on error. */
1868
1869static void
1870delete_failure_queue ()
1871{
1872 register struct temp_file *temp;
1873
1874 for (temp = failure_delete_queue; temp; temp = temp->next)
d5ea2ac4 1875 delete_if_ordinary (temp->name);
ed1f651b
RS
1876}
1877
1878static void
1879clear_failure_queue ()
1880{
1881 failure_delete_queue = 0;
1882}
b3865ca9 1883\f
b3865ca9
RS
1884/* Routine to add variables to the environment. We do this to pass
1885 the pathname of the gcc driver, and the directories search to the
1886 collect2 program, which is being run as ld. This way, we can be
1887 sure of executing the right compiler when collect2 wants to build
1888 constructors and destructors. Since the environment variables we
1889 use come from an obstack, we don't have to worry about allocating
1890 space for them. */
1891
1892#ifndef HAVE_PUTENV
1893
2a353d3a 1894void
b3865ca9
RS
1895putenv (str)
1896 char *str;
1897{
b3865ca9
RS
1898#ifndef VMS /* nor about VMS */
1899
1900 extern char **environ;
1901 char **old_environ = environ;
1902 char **envp;
1903 int num_envs = 0;
1904 int name_len = 1;
1905 int str_len = strlen (str);
1906 char *p = str;
1907 int ch;
1908
1909 while ((ch = *p++) != '\0' && ch != '=')
1910 name_len++;
1911
1912 if (!ch)
1913 abort ();
1914
1915 /* Search for replacing an existing environment variable, and
1916 count the number of total environment variables. */
1917 for (envp = old_environ; *envp; envp++)
1918 {
1919 num_envs++;
1920 if (!strncmp (str, *envp, name_len))
1921 {
1922 *envp = str;
1923 return;
1924 }
1925 }
1926
1927 /* Add a new environment variable */
1928 environ = (char **) xmalloc (sizeof (char *) * (num_envs+2));
1929 *environ = str;
7e2231e7 1930 memcpy ((char *) (environ + 1), (char *) old_environ,
4c9a05bc 1931 sizeof (char *) * (num_envs+1));
b3865ca9
RS
1932
1933#endif /* VMS */
b3865ca9
RS
1934}
1935
1936#endif /* HAVE_PUTENV */
1937
1938\f
2628b9d3
DE
1939/* Build a list of search directories from PATHS.
1940 PREFIX is a string to prepend to the list.
1941 If CHECK_DIR_P is non-zero we ensure the directory exists.
1942 This is used mostly by putenv_from_prefixes so we use `collect_obstack'.
1943 It is also used by the --print-search-dirs flag. */
b3865ca9 1944
2628b9d3
DE
1945static char *
1946build_search_list (paths, prefix, check_dir_p)
b3865ca9 1947 struct path_prefix *paths;
878f32c3 1948 const char *prefix;
2628b9d3 1949 int check_dir_p;
b3865ca9
RS
1950{
1951 int suffix_len = (machine_suffix) ? strlen (machine_suffix) : 0;
3ae7de4e
RK
1952 int just_suffix_len
1953 = (just_machine_suffix) ? strlen (just_machine_suffix) : 0;
b3865ca9
RS
1954 int first_time = TRUE;
1955 struct prefix_list *pprefix;
1956
2628b9d3 1957 obstack_grow (&collect_obstack, prefix, strlen (prefix));
512b62fb 1958 obstack_1grow (&collect_obstack, '=');
b3865ca9
RS
1959
1960 for (pprefix = paths->plist; pprefix != 0; pprefix = pprefix->next)
1961 {
1962 int len = strlen (pprefix->prefix);
1963
0ad5835e 1964 if (machine_suffix
e9a25f70 1965 && (! check_dir_p
2628b9d3 1966 || is_directory (pprefix->prefix, machine_suffix, 0)))
b3865ca9
RS
1967 {
1968 if (!first_time)
3ae7de4e 1969 obstack_1grow (&collect_obstack, PATH_SEPARATOR);
b3865ca9
RS
1970
1971 first_time = FALSE;
1972 obstack_grow (&collect_obstack, pprefix->prefix, len);
1973 obstack_grow (&collect_obstack, machine_suffix, suffix_len);
1974 }
1975
0ad5835e
ILT
1976 if (just_machine_suffix
1977 && pprefix->require_machine_suffix == 2
e9a25f70 1978 && (! check_dir_p
2628b9d3 1979 || is_directory (pprefix->prefix, just_machine_suffix, 0)))
ae04227b 1980 {
e9a25f70 1981 if (! first_time)
3ae7de4e 1982 obstack_1grow (&collect_obstack, PATH_SEPARATOR);
ae04227b
CH
1983
1984 first_time = FALSE;
1985 obstack_grow (&collect_obstack, pprefix->prefix, len);
3ae7de4e
RK
1986 obstack_grow (&collect_obstack, just_machine_suffix,
1987 just_suffix_len);
ae04227b
CH
1988 }
1989
e9a25f70 1990 if (! pprefix->require_machine_suffix)
b3865ca9 1991 {
e9a25f70 1992 if (! first_time)
3ae7de4e 1993 obstack_1grow (&collect_obstack, PATH_SEPARATOR);
b3865ca9
RS
1994
1995 first_time = FALSE;
1996 obstack_grow (&collect_obstack, pprefix->prefix, len);
1997 }
1998 }
e9a25f70 1999
3ae7de4e 2000 obstack_1grow (&collect_obstack, '\0');
2628b9d3 2001 return obstack_finish (&collect_obstack);
b3865ca9
RS
2002}
2003
0f41302f
MS
2004/* Rebuild the COMPILER_PATH and LIBRARY_PATH environment variables
2005 for collect. */
2628b9d3
DE
2006
2007static void
2008putenv_from_prefixes (paths, env_var)
2009 struct path_prefix *paths;
878f32c3 2010 const char *env_var;
2628b9d3
DE
2011{
2012 putenv (build_search_list (paths, env_var, 1));
2013}
ed1f651b 2014\f
0deb20df
TT
2015#ifndef VMS
2016
2017/* FIXME: the location independence code for VMS is hairier than this,
2018 and hasn't been written. */
2019
2020/* Split a filename into component directories. */
2021
2022static char **
2023split_directories (name, ptr_num_dirs)
2024 const char *name;
2025 int *ptr_num_dirs;
2026{
2027 int num_dirs = 0;
2028 char **dirs;
2029 const char *p, *q;
2030 int ch;
2031
2032 /* Count the number of directories. Special case MSDOS disk names as part
2033 of the initial directory. */
2034 p = name;
2035#ifdef HAVE_DOS_BASED_FILE_SYSTEM
2036 if (name[1] == ':' && IS_DIR_SEPARATOR (name[2]))
2037 {
2038 p += 3;
2039 num_dirs++;
2040 }
2041#endif /* HAVE_DOS_BASED_FILE_SYSTEM */
2042
2043 while ((ch = *p++) != '\0')
2044 {
2045 if (IS_DIR_SEPARATOR (ch))
2046 {
2047 num_dirs++;
2048 while (IS_DIR_SEPARATOR (*p))
2049 p++;
2050 }
2051 }
2052
2053 dirs = (char **) xmalloc (sizeof (char *) * (num_dirs + 2));
2054
2055 /* Now copy the directory parts. */
2056 num_dirs = 0;
2057 p = name;
2058#ifdef HAVE_DOS_BASED_FILE_SYSTEM
2059 if (name[1] == ':' && IS_DIR_SEPARATOR (name[2]))
2060 {
2061 dirs[num_dirs++] = save_string (p, 3);
2062 p += 3;
2063 }
2064#endif /* HAVE_DOS_BASED_FILE_SYSTEM */
2065
2066 q = p;
2067 while ((ch = *p++) != '\0')
2068 {
2069 if (IS_DIR_SEPARATOR (ch))
2070 {
2071 while (IS_DIR_SEPARATOR (*p))
2072 p++;
2073
2074 dirs[num_dirs++] = save_string (q, p - q);
2075 q = p;
2076 }
2077 }
2078
2079 if (p - 1 - q > 0)
2080 dirs[num_dirs++] = save_string (q, p - 1 - q);
2081
2082 dirs[num_dirs] = NULL_PTR;
2083 if (ptr_num_dirs)
2084 *ptr_num_dirs = num_dirs;
2085
2086 return dirs;
2087}
2088
2089/* Release storage held by split directories. */
2090
2091static void
2092free_split_directories (dirs)
2093 char **dirs;
2094{
2095 int i = 0;
2096
2097 while (dirs[i] != NULL_PTR)
2098 free (dirs[i++]);
2099
2100 free ((char *)dirs);
2101}
2102
2103/* Given three strings PROGNAME, BIN_PREFIX, PREFIX, return a string that gets
2104 to PREFIX starting with the directory portion of PROGNAME and a relative
2105 pathname of the difference between BIN_PREFIX and PREFIX.
2106
2107 For example, if BIN_PREFIX is /alpha/beta/gamma/gcc/delta, PREFIX is
2108 /alpha/beta/gamma/omega/, and PROGNAME is /red/green/blue/gcc, then this
ba40970f 2109 function will return /red/green/blue/../omega.
0deb20df
TT
2110
2111 If no relative prefix can be found, return NULL. */
2112
2113static char *
2114make_relative_prefix (progname, bin_prefix, prefix)
2115 const char *progname;
2116 const char *bin_prefix;
2117 const char *prefix;
2118{
2119 char **prog_dirs, **bin_dirs, **prefix_dirs;
2120 int prog_num, bin_num, prefix_num, std_loc_p;
2121 int i, n, common;
2122
2123 prog_dirs = split_directories (progname, &prog_num);
2124 bin_dirs = split_directories (bin_prefix, &bin_num);
2125
2126 /* If there is no full pathname, try to find the program by checking in each
2127 of the directories specified in the PATH environment variable. */
2128 if (prog_num == 1)
2129 {
2130 char *temp;
2131
2132 GET_ENV_PATH_LIST (temp, "PATH");
2133 if (temp)
2134 {
2135 char *startp, *endp;
2136 char *nstore = (char *) alloca (strlen (temp) + strlen (progname) + 1);
2137
2138 startp = endp = temp;
2139 while (1)
2140 {
2141 if (*endp == PATH_SEPARATOR || *endp == 0)
2142 {
2143 if (endp == startp)
2144 {
2145 nstore[0] = '.';
2146 nstore[1] = DIR_SEPARATOR;
2147 nstore[2] = '\0';
2148 }
2149 else
2150 {
2151 strncpy (nstore, startp, endp-startp);
2152 if (! IS_DIR_SEPARATOR (endp[-1]))
2153 {
2154 nstore[endp-startp] = DIR_SEPARATOR;
2155 nstore[endp-startp+1] = 0;
2156 }
2157 else
2158 nstore[endp-startp] = 0;
2159 }
2160 strcat (nstore, progname);
2161 if (! access (nstore, X_OK)
2162#ifdef HAVE_EXECUTABLE_SUFFIX
2163 || ! access (strcat (nstore, EXECUTABLE_SUFFIX), X_OK)
2164#endif
2165 )
2166 {
2167 free_split_directories (prog_dirs);
2168 progname = nstore;
2169 prog_dirs = split_directories (progname, &prog_num);
2170 break;
2171 }
2172
2173 if (*endp == 0)
2174 break;
2175 endp = startp = endp + 1;
2176 }
2177 else
2178 endp++;
2179 }
2180 }
2181 }
2182
2183 /* Remove the program name from comparison of directory names. */
2184 prog_num--;
2185
2186 /* Determine if the compiler is installed in the standard location, and if
2187 so, we don't need to specify relative directories. Also, if argv[0]
2188 doesn't contain any directory specifiers, there is not much we can do. */
2189 std_loc_p = 0;
2190 if (prog_num == bin_num)
2191 {
2192 for (i = 0; i < bin_num; i++)
2193 {
2194 if (strcmp (prog_dirs[i], bin_dirs[i]) != 0)
2195 break;
2196 }
2197
2198 if (prog_num <= 0 || i == bin_num)
2199 {
2200 std_loc_p = 1;
2201 free_split_directories (prog_dirs);
2202 free_split_directories (bin_dirs);
2203 prog_dirs = bin_dirs = (char **)0;
2204 return NULL_PTR;
2205 }
2206 }
2207
2208 prefix_dirs = split_directories (prefix, &prefix_num);
2209
3ac63d94 2210 /* Find how many directories are in common between bin_prefix & prefix. */
0deb20df
TT
2211 n = (prefix_num < bin_num) ? prefix_num : bin_num;
2212 for (common = 0; common < n; common++)
2213 {
2214 if (strcmp (bin_dirs[common], prefix_dirs[common]) != 0)
2215 break;
2216 }
2217
2218 /* If there are no common directories, there can be no relative prefix. */
2219 if (common == 0)
2220 {
2221 free_split_directories (prog_dirs);
2222 free_split_directories (bin_dirs);
2223 free_split_directories (prefix_dirs);
2224 return NULL_PTR;
2225 }
2226
2227 /* Build up the pathnames in argv[0]. */
2228 for (i = 0; i < prog_num; i++)
2229 obstack_grow (&obstack, prog_dirs[i], strlen (prog_dirs[i]));
2230
2231 /* Now build up the ..'s. */
2232 for (i = common; i < n; i++)
2233 {
2234 obstack_grow (&obstack, DIR_UP, sizeof (DIR_UP)-1);
2235 obstack_1grow (&obstack, DIR_SEPARATOR);
2236 }
2237
2238 /* Put in directories to move over to prefix. */
2239 for (i = common; i < prefix_num; i++)
2240 obstack_grow (&obstack, prefix_dirs[i], strlen (prefix_dirs[i]));
2241
2242 free_split_directories (prog_dirs);
2243 free_split_directories (bin_dirs);
2244 free_split_directories (prefix_dirs);
2245
2246 obstack_1grow (&obstack, '\0');
2247 return obstack_finish (&obstack);
2248}
2249#endif /* VMS */
2250\f
ca606201
ILT
2251/* Check whether NAME can be accessed in MODE. This is like access,
2252 except that it never considers directories to be executable. */
2253
2254static int
2255access_check (name, mode)
2256 const char *name;
2257 int mode;
2258{
2259 if (mode == X_OK)
2260 {
2261 struct stat st;
2262
2263 if (stat (name, &st) < 0
2264 || S_ISDIR (st.st_mode))
2265 return -1;
2266 }
2267
2268 return access (name, mode);
2269}
2270
ed1f651b
RS
2271/* Search for NAME using the prefix list PREFIXES. MODE is passed to
2272 access to check permissions.
0f41302f 2273 Return 0 if not found, otherwise return its name, allocated with malloc. */
ed1f651b
RS
2274
2275static char *
2276find_a_file (pprefix, name, mode)
2277 struct path_prefix *pprefix;
878f32c3 2278 const char *name;
ed1f651b
RS
2279 int mode;
2280{
2281 char *temp;
878f32c3 2282 const char *file_suffix = ((mode & X_OK) != 0 ? EXECUTABLE_SUFFIX : "");
ed1f651b
RS
2283 struct prefix_list *pl;
2284 int len = pprefix->max_len + strlen (name) + strlen (file_suffix) + 1;
2285
ab339d62 2286#ifdef DEFAULT_ASSEMBLER
ad85216e
KG
2287 if (! strcmp(name, "as") && access (DEFAULT_ASSEMBLER, mode) == 0)
2288 return xstrdup (DEFAULT_ASSEMBLER);
ab339d62
AO
2289#endif
2290
2291#ifdef DEFAULT_LINKER
ad85216e
KG
2292 if (! strcmp(name, "ld") && access (DEFAULT_LINKER, mode) == 0)
2293 return xstrdup (DEFAULT_LINKER);
ab339d62
AO
2294#endif
2295
ed1f651b
RS
2296 if (machine_suffix)
2297 len += strlen (machine_suffix);
2298
2299 temp = xmalloc (len);
2300
2301 /* Determine the filename to execute (special case for absolute paths). */
2302
509781a4 2303 if (IS_DIR_SEPARATOR (*name)
0deb20df 2304#ifdef HAVE_DOS_BASED_FILE_SYSTEM
e9a25f70 2305 /* Check for disk name on MS-DOS-based systems. */
509781a4
ME
2306 || (name[0] && name[1] == ':' && IS_DIR_SEPARATOR (name[2]))
2307#endif
2308 )
ed1f651b 2309 {
ab339d62 2310 if (access (name, mode) == 0)
ed1f651b
RS
2311 {
2312 strcpy (temp, name);
2313 return temp;
2314 }
2315 }
2316 else
2317 for (pl = pprefix->plist; pl; pl = pl->next)
2318 {
2319 if (machine_suffix)
2320 {
ed1f651b 2321 /* Some systems have a suffix for executable files.
460dcab4 2322 So try appending that first. */
ed1f651b
RS
2323 if (file_suffix[0] != 0)
2324 {
460dcab4
RK
2325 strcpy (temp, pl->prefix);
2326 strcat (temp, machine_suffix);
2327 strcat (temp, name);
ed1f651b 2328 strcat (temp, file_suffix);
ca606201 2329 if (access_check (temp, mode) == 0)
ed1f651b
RS
2330 {
2331 if (pl->used_flag_ptr != 0)
2332 *pl->used_flag_ptr = 1;
2333 return temp;
2334 }
2335 }
460dcab4
RK
2336
2337 /* Now try just the name. */
ae04227b 2338 strcpy (temp, pl->prefix);
460dcab4 2339 strcat (temp, machine_suffix);
ae04227b 2340 strcat (temp, name);
ca606201 2341 if (access_check (temp, mode) == 0)
ae04227b
CH
2342 {
2343 if (pl->used_flag_ptr != 0)
2344 *pl->used_flag_ptr = 1;
2345 return temp;
2346 }
460dcab4
RK
2347 }
2348
2349 /* Certain prefixes are tried with just the machine type,
2350 not the version. This is used for finding as, ld, etc. */
2351 if (just_machine_suffix && pl->require_machine_suffix == 2)
2352 {
ae04227b 2353 /* Some systems have a suffix for executable files.
460dcab4 2354 So try appending that first. */
ae04227b
CH
2355 if (file_suffix[0] != 0)
2356 {
460dcab4
RK
2357 strcpy (temp, pl->prefix);
2358 strcat (temp, just_machine_suffix);
2359 strcat (temp, name);
ae04227b 2360 strcat (temp, file_suffix);
ca606201 2361 if (access_check (temp, mode) == 0)
ae04227b
CH
2362 {
2363 if (pl->used_flag_ptr != 0)
2364 *pl->used_flag_ptr = 1;
2365 return temp;
2366 }
2367 }
460dcab4 2368
ed1f651b 2369 strcpy (temp, pl->prefix);
460dcab4 2370 strcat (temp, just_machine_suffix);
ed1f651b 2371 strcat (temp, name);
ca606201 2372 if (access_check (temp, mode) == 0)
ed1f651b
RS
2373 {
2374 if (pl->used_flag_ptr != 0)
2375 *pl->used_flag_ptr = 1;
2376 return temp;
2377 }
460dcab4
RK
2378 }
2379
2380 /* Certain prefixes can't be used without the machine suffix
2381 when the machine or version is explicitly specified. */
e9a25f70 2382 if (! pl->require_machine_suffix)
460dcab4 2383 {
ed1f651b 2384 /* Some systems have a suffix for executable files.
460dcab4 2385 So try appending that first. */
ed1f651b
RS
2386 if (file_suffix[0] != 0)
2387 {
460dcab4
RK
2388 strcpy (temp, pl->prefix);
2389 strcat (temp, name);
ed1f651b 2390 strcat (temp, file_suffix);
ca606201 2391 if (access_check (temp, mode) == 0)
ed1f651b
RS
2392 {
2393 if (pl->used_flag_ptr != 0)
2394 *pl->used_flag_ptr = 1;
2395 return temp;
2396 }
2397 }
460dcab4
RK
2398
2399 strcpy (temp, pl->prefix);
2400 strcat (temp, name);
ca606201 2401 if (access_check (temp, mode) == 0)
460dcab4
RK
2402 {
2403 if (pl->used_flag_ptr != 0)
2404 *pl->used_flag_ptr = 1;
2405 return temp;
2406 }
ed1f651b
RS
2407 }
2408 }
2409
2410 free (temp);
2411 return 0;
2412}
2413
2414/* Add an entry for PREFIX in PLIST. If FIRST is set, it goes
2415 at the start of the list, otherwise it goes at the end.
2416
2417 If WARN is nonzero, we will warn if no file is found
2418 through this prefix. WARN should point to an int
ae04227b
CH
2419 which will be set to 1 if this entry is used.
2420
e9a25f70
JL
2421 COMPONENT is the value to be passed to update_path.
2422
ae04227b
CH
2423 REQUIRE_MACHINE_SUFFIX is 1 if this prefix can't be used without
2424 the complete value of machine_suffix.
2425 2 means try both machine_suffix and just_machine_suffix. */
ed1f651b
RS
2426
2427static void
e9a25f70 2428add_prefix (pprefix, prefix, component, first, require_machine_suffix, warn)
ed1f651b 2429 struct path_prefix *pprefix;
460ee112
KG
2430 const char *prefix;
2431 const char *component;
ed1f651b
RS
2432 int first;
2433 int require_machine_suffix;
2434 int *warn;
2435{
2436 struct prefix_list *pl, **prev;
2437 int len;
2438
e9a25f70 2439 if (! first && pprefix->plist)
ed1f651b
RS
2440 {
2441 for (pl = pprefix->plist; pl->next; pl = pl->next)
2442 ;
2443 prev = &pl->next;
2444 }
2445 else
2446 prev = &pprefix->plist;
2447
2448 /* Keep track of the longest prefix */
2449
e9a25f70 2450 prefix = update_path (prefix, component);
ed1f651b
RS
2451 len = strlen (prefix);
2452 if (len > pprefix->max_len)
2453 pprefix->max_len = len;
2454
2455 pl = (struct prefix_list *) xmalloc (sizeof (struct prefix_list));
2456 pl->prefix = save_string (prefix, len);
2457 pl->require_machine_suffix = require_machine_suffix;
2458 pl->used_flag_ptr = warn;
2459 if (warn)
2460 *warn = 0;
2461
2462 if (*prev)
2463 pl->next = *prev;
2464 else
2465 pl->next = (struct prefix_list *) 0;
2466 *prev = pl;
2467}
2468
2469/* Print warnings for any prefixes in the list PPREFIX that were not used. */
2470
2471static void
2472unused_prefix_warnings (pprefix)
2473 struct path_prefix *pprefix;
2474{
2475 struct prefix_list *pl = pprefix->plist;
2476
2477 while (pl)
2478 {
2479 if (pl->used_flag_ptr != 0 && !*pl->used_flag_ptr)
2480 {
5d7bb90c
RK
2481 if (pl->require_machine_suffix && machine_suffix)
2482 error ("file path prefix `%s%s' never used", pl->prefix,
2483 machine_suffix);
2484 else
2485 error ("file path prefix `%s' never used", pl->prefix);
2486
ed1f651b
RS
2487 /* Prevent duplicate warnings. */
2488 *pl->used_flag_ptr = 1;
2489 }
e9a25f70 2490
ed1f651b
RS
2491 pl = pl->next;
2492 }
2493}
2494
ed1f651b
RS
2495\f
2496/* Execute the command specified by the arguments on the current line of spec.
2497 When using pipes, this includes several piped-together commands
2498 with `|' between them.
2499
2500 Return 0 if successful, -1 if failed. */
2501
2502static int
2503execute ()
2504{
2505 int i;
2506 int n_commands; /* # of command. */
2507 char *string;
2508 struct command
2509 {
878f32c3 2510 const char *prog; /* program name. */
fbd40359 2511 const char **argv; /* vector of args. */
ed1f651b
RS
2512 int pid; /* pid of process for this command. */
2513 };
2514
2515 struct command *commands; /* each command buffer with above info. */
2516
2517 /* Count # of piped commands. */
2518 for (n_commands = 1, i = 0; i < argbuf_index; i++)
2519 if (strcmp (argbuf[i], "|") == 0)
2520 n_commands++;
2521
2522 /* Get storage for each command. */
2523 commands
2524 = (struct command *) alloca (n_commands * sizeof (struct command));
2525
2526 /* Split argbuf into its separate piped processes,
2527 and record info about each one.
2528 Also search for the programs that are to be run. */
2529
2530 commands[0].prog = argbuf[0]; /* first command. */
2531 commands[0].argv = &argbuf[0];
48ff801b 2532 string = find_a_file (&exec_prefixes, commands[0].prog, X_OK);
10da1131 2533
ed1f651b
RS
2534 if (string)
2535 commands[0].argv[0] = string;
2536
2537 for (n_commands = 1, i = 0; i < argbuf_index; i++)
2538 if (strcmp (argbuf[i], "|") == 0)
2539 { /* each command. */
6405c0ec 2540#if defined (__MSDOS__) || defined (OS2) || defined (VMS)
c10d53dd 2541 fatal ("-pipe not supported");
ed1f651b
RS
2542#endif
2543 argbuf[i] = 0; /* termination of command args. */
2544 commands[n_commands].prog = argbuf[i + 1];
2545 commands[n_commands].argv = &argbuf[i + 1];
48ff801b 2546 string = find_a_file (&exec_prefixes, commands[n_commands].prog, X_OK);
ed1f651b
RS
2547 if (string)
2548 commands[n_commands].argv[0] = string;
2549 n_commands++;
2550 }
2551
2552 argbuf[argbuf_index] = 0;
2553
2554 /* If -v, print what we are about to do, and maybe query. */
2555
b3865ca9 2556 if (verbose_flag)
ed1f651b 2557 {
b8468bc7
NC
2558 /* For help listings, put a blank line between sub-processes. */
2559 if (print_help_list)
2560 fputc ('\n', stderr);
2561
ed1f651b
RS
2562 /* Print each piped command as a separate line. */
2563 for (i = 0; i < n_commands ; i++)
2564 {
fbd40359 2565 const char **j;
ed1f651b
RS
2566
2567 for (j = commands[i].argv; *j; j++)
2568 fprintf (stderr, " %s", *j);
2569
2570 /* Print a pipe symbol after all but the last command. */
2571 if (i + 1 != n_commands)
2572 fprintf (stderr, " |");
2573 fprintf (stderr, "\n");
2574 }
2575 fflush (stderr);
2576#ifdef DEBUG
ab87f8c8 2577 notice ("\nGo ahead? (y or n) ");
ed1f651b
RS
2578 fflush (stderr);
2579 i = getchar ();
2580 if (i != '\n')
e9a25f70
JL
2581 while (getchar () != '\n')
2582 ;
2583
ed1f651b
RS
2584 if (i != 'y' && i != 'Y')
2585 return 0;
2586#endif /* DEBUG */
2587 }
2588
2589 /* Run each piped subprocess. */
2590
ed1f651b
RS
2591 for (i = 0; i < n_commands; i++)
2592 {
c10d53dd 2593 char *errmsg_fmt, *errmsg_arg;
fbd40359 2594 const char *string = commands[i].argv[0];
ed1f651b 2595
c10d53dd
DE
2596 commands[i].pid = pexecute (string, commands[i].argv,
2597 programname, temp_filename,
2598 &errmsg_fmt, &errmsg_arg,
2599 ((i == 0 ? PEXECUTE_FIRST : 0)
2600 | (i + 1 == n_commands ? PEXECUTE_LAST : 0)
2601 | (string == commands[i].prog
1c874773
DE
2602 ? PEXECUTE_SEARCH : 0)
2603 | (verbose_flag ? PEXECUTE_VERBOSE : 0)));
c10d53dd
DE
2604
2605 if (commands[i].pid == -1)
2606 pfatal_pexecute (errmsg_fmt, errmsg_arg);
ed1f651b
RS
2607
2608 if (string != commands[i].prog)
fbd40359 2609 free ((PTR) string);
ed1f651b
RS
2610 }
2611
2612 execution_count++;
2613
2614 /* Wait for all the subprocesses to finish.
2615 We don't care what order they finish in;
34cd1bd7
RK
2616 we know that N_COMMANDS waits will get them all.
2617 Ignore subprocesses that we don't know about,
2618 since they can be spawned by the process that exec'ed us. */
ed1f651b
RS
2619
2620 {
2621 int ret_code = 0;
03c41c05
ZW
2622#ifdef HAVE_GETRUSAGE
2623 struct timeval d;
a544cfd2 2624 double ut = 0.0, st = 0.0;
03c41c05 2625#endif
ed1f651b 2626
34cd1bd7 2627 for (i = 0; i < n_commands; )
ed1f651b 2628 {
34cd1bd7 2629 int j;
ed1f651b
RS
2630 int status;
2631 int pid;
ed1f651b 2632
c10d53dd 2633 pid = pwait (commands[i].pid, &status, 0);
ed1f651b
RS
2634 if (pid < 0)
2635 abort ();
2636
03c41c05
ZW
2637#ifdef HAVE_GETRUSAGE
2638 if (report_times)
2639 {
2640 /* getrusage returns the total resource usage of all children
2641 up to now. Copy the previous values into prus, get the
2642 current statistics, then take the difference. */
2643
2644 prus = rus;
2645 getrusage (RUSAGE_CHILDREN, &rus);
2646 d.tv_sec = rus.ru_utime.tv_sec - prus.ru_utime.tv_sec;
2647 d.tv_usec = rus.ru_utime.tv_usec - prus.ru_utime.tv_usec;
2648 ut = (double)d.tv_sec + (double)d.tv_usec / 1.0e6;
2649
2650 d.tv_sec = rus.ru_stime.tv_sec - prus.ru_stime.tv_sec;
2651 d.tv_usec = rus.ru_stime.tv_usec - prus.ru_stime.tv_usec;
2652 st = (double)d.tv_sec + (double)d.tv_usec / 1.0e6;
2653 }
2654#endif
2655
34cd1bd7
RK
2656 for (j = 0; j < n_commands; j++)
2657 if (commands[j].pid == pid)
2658 {
2659 i++;
2660 if (status != 0)
2661 {
2662 if (WIFSIGNALED (status))
2663 {
2664 fatal ("Internal compiler error: program %s got fatal signal %d",
2665 commands[j].prog, WTERMSIG (status));
2666 signal_count++;
2667 ret_code = -1;
2668 }
2669 else if (WIFEXITED (status)
2670 && WEXITSTATUS (status) >= MIN_FATAL_STATUS)
14a774a9
RK
2671 {
2672 if (WEXITSTATUS (status) > greatest_status)
2673 greatest_status = WEXITSTATUS (status);
2674 ret_code = -1;
2675 }
34cd1bd7 2676 }
03c41c05
ZW
2677#ifdef HAVE_GETRUSAGE
2678 if (report_times && ut + st != 0)
2679 notice ("# %s %.2f %.2f\n", commands[j].prog, ut, st);
2680#endif
34cd1bd7
RK
2681 break;
2682 }
ed1f651b
RS
2683 }
2684 return ret_code;
2685 }
2686}
2687\f
2688/* Find all the switches given to us
2689 and make a vector describing them.
2690 The elements of the vector are strings, one per switch given.
2691 If a switch uses following arguments, then the `part1' field
2692 is the switch itself and the `args' field
2693 is a null-terminated vector containing the following arguments.
8097c429
TT
2694 The `live_cond' field is:
2695 0 when initialized
2696 1 if the switch is true in a conditional spec,
2697 -1 if false (overridden by a later switch)
2698 -2 if this switch should be ignored (used in %{<S})
ab87f8c8 2699 The `validated' field is nonzero if any spec has looked at this switch;
ed1f651b
RS
2700 if it remains zero at the end of the run, it must be meaningless. */
2701
8097c429
TT
2702#define SWITCH_OK 0
2703#define SWITCH_FALSE -1
2704#define SWITCH_IGNORE -2
2705#define SWITCH_LIVE 1
2706
ed1f651b
RS
2707struct switchstr
2708{
878f32c3 2709 const char *part1;
fbd40359 2710 const char **args;
f5b0eb4e 2711 int live_cond;
ab87f8c8 2712 int validated;
ed1f651b
RS
2713};
2714
2715static struct switchstr *switches;
2716
2717static int n_switches;
2718
2719struct infile
2720{
878f32c3
KG
2721 const char *name;
2722 const char *language;
ed1f651b
RS
2723};
2724
2725/* Also a vector of input files specified. */
2726
2727static struct infile *infiles;
2728
2729static int n_infiles;
2730
08dc830e 2731/* This counts the number of libraries added by lang_specific_driver, so that
a2a05b0a
JW
2732 we can tell if there were any user supplied any files or libraries. */
2733
2734static int added_libraries;
2735
ed1f651b
RS
2736/* And a vector of corresponding output files is made up later. */
2737
878f32c3 2738static const char **outfiles;
ed1f651b 2739
5d7bb90c
RK
2740/* Used to track if none of the -B paths are used. */
2741static int warn_B;
2742
2743/* Used to track if standard path isn't used and -b or -V is specified. */
2744static int warn_std;
2745
2746/* Gives value to pass as "warn" to add_prefix for standard prefixes. */
b27804a8 2747static int *warn_std_ptr = 0;
5d7bb90c 2748
853e0b2d
RK
2749\f
2750#if defined(HAVE_OBJECT_SUFFIX) || defined(HAVE_EXECUTABLE_SUFFIX)
2751
2752/* Convert NAME to a new name if it is the standard suffix. DO_EXE
2753 is true if we should look for an executable suffix as well. */
2754
2755static char *
2756convert_filename (name, do_exe)
2757 char *name;
2758 int do_exe;
2759{
2760 int i;
87e690e2
MK
2761 int len;
2762
2763 if (name == NULL)
2764 return NULL;
2765
2766 len = strlen (name);
853e0b2d
RK
2767
2768#ifdef HAVE_OBJECT_SUFFIX
2769 /* Convert x.o to x.obj if OBJECT_SUFFIX is ".obj". */
2770 if (len > 2
2771 && name[len - 2] == '.'
2772 && name[len - 1] == 'o')
2773 {
bdc5ed93 2774 obstack_grow (&obstack, name, len - 2);
853e0b2d
RK
2775 obstack_grow0 (&obstack, OBJECT_SUFFIX, strlen (OBJECT_SUFFIX));
2776 name = obstack_finish (&obstack);
2777 }
2778#endif
2779
2780#ifdef HAVE_EXECUTABLE_SUFFIX
2781 /* If there is no filetype, make it the executable suffix (which includes
2782 the "."). But don't get confused if we have just "-o". */
2783 if (! do_exe || EXECUTABLE_SUFFIX[0] == 0 || (len == 2 && name[0] == '-'))
2784 return name;
2785
e0040a8e 2786 for (i = len - 1; i >= 0; i--)
509781a4 2787 if (IS_DIR_SEPARATOR (name[i]))
e0040a8e
RK
2788 break;
2789
2790 for (i++; i < len; i++)
853e0b2d
RK
2791 if (name[i] == '.')
2792 return name;
2793
2794 obstack_grow (&obstack, name, len);
2795 obstack_grow0 (&obstack, EXECUTABLE_SUFFIX, strlen (EXECUTABLE_SUFFIX));
2796 name = obstack_finish (&obstack);
2797#endif
2798
2799 return name;
2800}
2801#endif
b8468bc7
NC
2802\f
2803/* Display the command line switches accepted by gcc. */
2804static void
2805display_help ()
2806{
5e4adfba
PT
2807 printf (_("Usage: %s [options] file...\n"), programname);
2808 fputs (_("Options:\n"), stdout);
b8468bc7 2809
5e4adfba
PT
2810 fputs (_(" -pass-exit-codes Exit with highest error code from a phase\n"), stdout);
2811 fputs (_(" --help Display this information\n"), stdout);
b8468bc7 2812 if (! verbose_flag)
5e4adfba
PT
2813 fputs (_(" (Use '-v --help' to display command line options of sub-processes)\n"), stdout);
2814 fputs (_(" -dumpspecs Display all of the built in spec strings\n"), stdout);
2815 fputs (_(" -dumpversion Display the version of the compiler\n"), stdout);
2816 fputs (_(" -dumpmachine Display the compiler's target processor\n"), stdout);
2817 fputs (_(" -print-search-dirs Display the directories in the compiler's search path\n"), stdout);
2818 fputs (_(" -print-libgcc-file-name Display the name of the compiler's companion library\n"), stdout);
2819 fputs (_(" -print-file-name=<lib> Display the full path to library <lib>\n"), stdout);
2820 fputs (_(" -print-prog-name=<prog> Display the full path to compiler component <prog>\n"), stdout);
2821 fputs (_(" -print-multi-directory Display the root directory for versions of libgcc\n"), stdout);
2822 fputs (_("\
2823 -print-multi-lib Display the mapping between command line options and\n\
2824 multiple library search directories\n"), stdout);
2825 fputs (_(" -Wa,<options> Pass comma-separated <options> on to the assembler\n"), stdout);
2826 fputs (_(" -Wp,<options> Pass comma-separated <options> on to the preprocessor\n"), stdout);
2827 fputs (_(" -Wl,<options> Pass comma-separated <options> on to the linker\n"), stdout);
2828 fputs (_(" -Xlinker <arg> Pass <arg> on to the linker\n"), stdout);
2829 fputs (_(" -save-temps Do not delete intermediate files\n"), stdout);
2830 fputs (_(" -pipe Use pipes rather than intermediate files\n"), stdout);
2831 fputs (_(" -time Time the execution of each subprocess\n"), stdout);
2832 fputs (_(" -specs=<file> Override builtin specs with the contents of <file>\n"), stdout);
2833 fputs (_(" -std=<standard> Assume that the input sources are for <standard>\n"), stdout);
2834 fputs (_(" -B <directory> Add <directory> to the compiler's search paths\n"), stdout);
2835 fputs (_(" -b <machine> Run gcc for target <machine>, if installed\n"), stdout);
2836 fputs (_(" -V <version> Run gcc version number <version>, if installed\n"), stdout);
2837 fputs (_(" -v Display the programs invoked by the compiler\n"), stdout);
2838 fputs (_(" -E Preprocess only; do not compile, assemble or link\n"), stdout);
2839 fputs (_(" -S Compile only; do not assemble or link\n"), stdout);
2840 fputs (_(" -c Compile and assemble, but do not link\n"), stdout);
2841 fputs (_(" -o <file> Place the output into <file>\n"), stdout);
2842 fputs (_("\
2843 -x <language> Specify the language of the following input files\n\
2844 Permissable languages include: c c++ assembler none\n\
2845 'none' means revert to the default behaviour of\n\
2846 guessing the language based on the file's extension\n\
2847"), stdout);
2848
2849 printf (_("\n\
2850Options starting with -g, -f, -m, -O or -W are automatically passed on to\n\
2851the various sub-processes invoked by %s. In order to pass other options\n\
2852on to these processes the -W<letter> options must be used.\n\"), programname);
b8468bc7
NC
2853
2854 /* The rest of the options are displayed by invocations of the various
2855 sub-processes. */
2856}
2857
40f943dd
NC
2858static void
2859add_preprocessor_option (option, len)
878f32c3
KG
2860 const char * option;
2861 int len;
40f943dd 2862{
878f32c3 2863 n_preprocessor_options++;
40f943dd 2864
878f32c3
KG
2865 if (! preprocessor_options)
2866 preprocessor_options
2867 = (char **) xmalloc (n_preprocessor_options * sizeof (char *));
2868 else
2869 preprocessor_options
2870 = (char **) xrealloc (preprocessor_options,
2871 n_preprocessor_options * sizeof (char *));
40f943dd 2872
878f32c3
KG
2873 preprocessor_options [n_preprocessor_options - 1] =
2874 save_string (option, len);
40f943dd
NC
2875}
2876
2877static void
2878add_assembler_option (option, len)
878f32c3
KG
2879 const char * option;
2880 int len;
2881{
2882 n_assembler_options++;
2883
2884 if (! assembler_options)
2885 assembler_options
2886 = (char **) xmalloc (n_assembler_options * sizeof (char *));
2887 else
2888 assembler_options
2889 = (char **) xrealloc (assembler_options,
2890 n_assembler_options * sizeof (char *));
2891
2892 assembler_options [n_assembler_options - 1] = save_string (option, len);
b8468bc7 2893}
b8468bc7 2894
40f943dd
NC
2895static void
2896add_linker_option (option, len)
878f32c3
KG
2897 const char * option;
2898 int len;
2899{
2900 n_linker_options++;
2901
2902 if (! linker_options)
2903 linker_options
2904 = (char **) xmalloc (n_linker_options * sizeof (char *));
2905 else
2906 linker_options
2907 = (char **) xrealloc (linker_options,
2908 n_linker_options * sizeof (char *));
2909
2910 linker_options [n_linker_options - 1] = save_string (option, len);
40f943dd 2911}
853e0b2d 2912\f
ed1f651b
RS
2913/* Create the vector `switches' and its contents.
2914 Store its length in `n_switches'. */
2915
2916static void
2917process_command (argc, argv)
2918 int argc;
fbd40359 2919 const char **argv;
ed1f651b
RS
2920{
2921 register int i;
878f32c3
KG
2922 const char *temp;
2923 char *temp1;
fbd40359 2924 const char *spec_lang = 0;
ed1f651b 2925 int last_language_n_infiles;
f2cf3e1e
RK
2926 int have_c = 0;
2927 int have_o = 0;
3a265431 2928 int lang_n_infiles = 0;
ed1f651b 2929
2325c774 2930 GET_ENV_PATH_LIST (gcc_exec_prefix, "GCC_EXEC_PREFIX");
8eebb258 2931
ed1f651b
RS
2932 n_switches = 0;
2933 n_infiles = 0;
a2a05b0a 2934 added_libraries = 0;
2484b6d2 2935
53117a2f
RK
2936 /* Figure compiler version from version string. */
2937
ad85216e
KG
2938 compiler_version = temp1 = xstrdup (version_string);
2939
878f32c3 2940 for (; *temp1; ++temp1)
53117a2f 2941 {
878f32c3 2942 if (*temp1 == ' ')
53117a2f 2943 {
878f32c3 2944 *temp1 = '\0';
53117a2f
RK
2945 break;
2946 }
2947 }
ed1f651b 2948
0deb20df
TT
2949 /* Set up the default search paths. If there is no GCC_EXEC_PREFIX,
2950 see if we can create it from the pathname specified in argv[0]. */
2951
2952#ifndef VMS
2953 /* FIXME: make_relative_prefix doesn't yet work for VMS. */
2954 if (!gcc_exec_prefix)
2955 {
2956 gcc_exec_prefix = make_relative_prefix (argv[0], standard_bindir_prefix,
2957 standard_exec_prefix);
2958 if (gcc_exec_prefix)
2959 putenv (concat ("GCC_EXEC_PREFIX=", gcc_exec_prefix, NULL_PTR));
2960 }
2961#endif
ed1f651b 2962
8eebb258 2963 if (gcc_exec_prefix)
ed1f651b 2964 {
6ed4bb9a 2965 int len = strlen (gcc_exec_prefix);
e51712db 2966 if (len > (int) sizeof ("/lib/gcc-lib/")-1
509781a4 2967 && (IS_DIR_SEPARATOR (gcc_exec_prefix[len-1])))
6ed4bb9a
MM
2968 {
2969 temp = gcc_exec_prefix + len - sizeof ("/lib/gcc-lib/") + 1;
509781a4 2970 if (IS_DIR_SEPARATOR (*temp)
6ed4bb9a 2971 && strncmp (temp+1, "lib", 3) == 0
509781a4 2972 && IS_DIR_SEPARATOR (temp[4])
6ed4bb9a
MM
2973 && strncmp (temp+5, "gcc-lib", 7) == 0)
2974 len -= sizeof ("/lib/gcc-lib/") - 1;
2975 }
2976
2977 set_std_prefix (gcc_exec_prefix, len);
e9a25f70
JL
2978 add_prefix (&exec_prefixes, gcc_exec_prefix, "GCC", 0, 0, NULL_PTR);
2979 add_prefix (&startfile_prefixes, gcc_exec_prefix, "GCC", 0, 0, NULL_PTR);
ed1f651b
RS
2980 }
2981
2982 /* COMPILER_PATH and LIBRARY_PATH have values
2983 that are lists of directory names with colons. */
2984
b2a1e458 2985 GET_ENV_PATH_LIST (temp, "COMPILER_PATH");
ed1f651b
RS
2986 if (temp)
2987 {
878f32c3 2988 const char *startp, *endp;
ed1f651b
RS
2989 char *nstore = (char *) alloca (strlen (temp) + 3);
2990
2991 startp = endp = temp;
2992 while (1)
2993 {
f6ec7e54 2994 if (*endp == PATH_SEPARATOR || *endp == 0)
ed1f651b
RS
2995 {
2996 strncpy (nstore, startp, endp-startp);
2997 if (endp == startp)
6aa62cff 2998 strcpy (nstore, concat (".", dir_separator_str, NULL_PTR));
509781a4 2999 else if (!IS_DIR_SEPARATOR (endp[-1]))
ed1f651b 3000 {
48ff801b 3001 nstore[endp-startp] = DIR_SEPARATOR;
ed1f651b
RS
3002 nstore[endp-startp+1] = 0;
3003 }
3004 else
3005 nstore[endp-startp] = 0;
e9a25f70 3006 add_prefix (&exec_prefixes, nstore, 0, 0, 0, NULL_PTR);
aa32d841
JL
3007 add_prefix (&include_prefixes,
3008 concat (nstore, "include", NULL_PTR),
e9a25f70 3009 0, 0, 0, NULL_PTR);
ed1f651b
RS
3010 if (*endp == 0)
3011 break;
3012 endp = startp = endp + 1;
3013 }
3014 else
3015 endp++;
3016 }
3017 }
3018
512b62fb 3019 GET_ENV_PATH_LIST (temp, LIBRARY_PATH_ENV);
fcc9ad83 3020 if (temp && *cross_compile == '0')
ed1f651b 3021 {
878f32c3 3022 const char *startp, *endp;
ed1f651b
RS
3023 char *nstore = (char *) alloca (strlen (temp) + 3);
3024
3025 startp = endp = temp;
3026 while (1)
3027 {
f6ec7e54 3028 if (*endp == PATH_SEPARATOR || *endp == 0)
ed1f651b
RS
3029 {
3030 strncpy (nstore, startp, endp-startp);
3031 if (endp == startp)
6aa62cff 3032 strcpy (nstore, concat (".", dir_separator_str, NULL_PTR));
509781a4 3033 else if (!IS_DIR_SEPARATOR (endp[-1]))
ed1f651b 3034 {
48ff801b 3035 nstore[endp-startp] = DIR_SEPARATOR;
ed1f651b
RS
3036 nstore[endp-startp+1] = 0;
3037 }
3038 else
3039 nstore[endp-startp] = 0;
e9a25f70
JL
3040 add_prefix (&startfile_prefixes, nstore, NULL_PTR,
3041 0, 0, NULL_PTR);
ed1f651b
RS
3042 if (*endp == 0)
3043 break;
3044 endp = startp = endp + 1;
3045 }
3046 else
3047 endp++;
3048 }
3049 }
3050
3051 /* Use LPATH like LIBRARY_PATH (for the CMU build program). */
b2a1e458 3052 GET_ENV_PATH_LIST (temp, "LPATH");
fcc9ad83 3053 if (temp && *cross_compile == '0')
ed1f651b 3054 {
878f32c3 3055 const char *startp, *endp;
ed1f651b
RS
3056 char *nstore = (char *) alloca (strlen (temp) + 3);
3057
3058 startp = endp = temp;
3059 while (1)
3060 {
f6ec7e54 3061 if (*endp == PATH_SEPARATOR || *endp == 0)
ed1f651b
RS
3062 {
3063 strncpy (nstore, startp, endp-startp);
3064 if (endp == startp)
6aa62cff 3065 strcpy (nstore, concat (".", dir_separator_str, NULL_PTR));
509781a4 3066 else if (!IS_DIR_SEPARATOR (endp[-1]))
ed1f651b 3067 {
48ff801b 3068 nstore[endp-startp] = DIR_SEPARATOR;
ed1f651b
RS
3069 nstore[endp-startp+1] = 0;
3070 }
3071 else
3072 nstore[endp-startp] = 0;
e9a25f70
JL
3073 add_prefix (&startfile_prefixes, nstore, NULL_PTR,
3074 0, 0, NULL_PTR);
ed1f651b
RS
3075 if (*endp == 0)
3076 break;
3077 endp = startp = endp + 1;
3078 }
3079 else
3080 endp++;
3081 }
3082 }
3083
f2faf549
RS
3084 /* Convert new-style -- options to old-style. */
3085 translate_options (&argc, &argv);
3086
610c62ac 3087 /* Do language-specific adjustment/addition of flags. */
9257393c 3088 lang_specific_driver (&argc, &argv, &added_libraries);
610c62ac 3089
ed1f651b
RS
3090 /* Scan argv twice. Here, the first time, just count how many switches
3091 there will be in their vector, and how many input files in theirs.
3092 Here we also parse the switches that cc itself uses (e.g. -v). */
3093
3094 for (i = 1; i < argc; i++)
3095 {
3096 if (! strcmp (argv[i], "-dumpspecs"))
3097 {
79aff5ac 3098 struct spec_list *sl;
03fc1620 3099 init_spec ();
79aff5ac
MM
3100 for (sl = specs; sl; sl = sl->next)
3101 printf ("*%s:\n%s\n\n", sl->name, *(sl->ptr_spec));
e4175312
ME
3102 if (link_command_spec)
3103 printf ("*link_command:\n%s\n\n", link_command_spec);
ed1f651b
RS
3104 exit (0);
3105 }
3106 else if (! strcmp (argv[i], "-dumpversion"))
3107 {
e5e809f4 3108 printf ("%s\n", spec_version);
ed1f651b
RS
3109 exit (0);
3110 }
9b783fc9
RK
3111 else if (! strcmp (argv[i], "-dumpmachine"))
3112 {
3113 printf ("%s\n", spec_machine);
3114 exit (0);
3115 }
b8468bc7
NC
3116 else if (strcmp (argv[i], "-fhelp") == 0)
3117 {
3118 /* translate_options () has turned --help into -fhelp. */
3119 print_help_list = 1;
3120
3121 /* We will be passing a dummy file on to the sub-processes. */
3122 n_infiles++;
3123 n_switches++;
3124
3125 add_preprocessor_option ("--help", 6);
3126 add_assembler_option ("--help", 6);
3127 add_linker_option ("--help", 6);
3128 }
14a774a9
RK
3129 else if (! strcmp (argv[i], "-pass-exit-codes"))
3130 {
3131 pass_exit_codes = 1;
3132 n_switches++;
3133 }
2628b9d3
DE
3134 else if (! strcmp (argv[i], "-print-search-dirs"))
3135 print_search_dirs = 1;
2dcb563f 3136 else if (! strcmp (argv[i], "-print-libgcc-file-name"))
2628b9d3 3137 print_file_name = "libgcc.a";
6a9e290e 3138 else if (! strncmp (argv[i], "-print-file-name=", 17))
2628b9d3 3139 print_file_name = argv[i] + 17;
6a9e290e 3140 else if (! strncmp (argv[i], "-print-prog-name=", 17))
2628b9d3 3141 print_prog_name = argv[i] + 17;
60103a34
DE
3142 else if (! strcmp (argv[i], "-print-multi-lib"))
3143 print_multi_lib = 1;
3144 else if (! strcmp (argv[i], "-print-multi-directory"))
3145 print_multi_directory = 1;
c9ebacb8
RS
3146 else if (! strncmp (argv[i], "-Wa,", 4))
3147 {
3148 int prev, j;
3149 /* Pass the rest of this option to the assembler. */
3150
c9ebacb8
RS
3151 /* Split the argument at commas. */
3152 prev = 4;
3153 for (j = 4; argv[i][j]; j++)
3154 if (argv[i][j] == ',')
3155 {
b8468bc7 3156 add_assembler_option (argv[i] + prev, j - prev);
c9ebacb8
RS
3157 prev = j + 1;
3158 }
b8468bc7 3159
c9ebacb8 3160 /* Record the part after the last comma. */
b8468bc7 3161 add_assembler_option (argv[i] + prev, j - prev);
c9ebacb8 3162 }
57cb9b60
JW
3163 else if (! strncmp (argv[i], "-Wp,", 4))
3164 {
3165 int prev, j;
3166 /* Pass the rest of this option to the preprocessor. */
3167
57cb9b60
JW
3168 /* Split the argument at commas. */
3169 prev = 4;
3170 for (j = 4; argv[i][j]; j++)
3171 if (argv[i][j] == ',')
3172 {
b8468bc7 3173 add_preprocessor_option (argv[i] + prev, j - prev);
57cb9b60
JW
3174 prev = j + 1;
3175 }
b8468bc7 3176
57cb9b60 3177 /* Record the part after the last comma. */
b8468bc7 3178 add_preprocessor_option (argv[i] + prev, j - prev);
57cb9b60 3179 }
301a5c0b 3180 else if (argv[i][0] == '+' && argv[i][1] == 'e')
f2faf549 3181 /* The +e options to the C++ front-end. */
301a5c0b 3182 n_switches++;
368dfd3a 3183 else if (strncmp (argv[i], "-Wl,", 4) == 0)
9b226f90
TG
3184 {
3185 int j;
3186 /* Split the argument at commas. */
3187 for (j = 3; argv[i][j]; j++)
3188 n_infiles += (argv[i][j] == ',');
3189 }
368dfd3a
TG
3190 else if (strcmp (argv[i], "-Xlinker") == 0)
3191 {
3192 if (i + 1 == argc)
3193 fatal ("argument to `-Xlinker' is missing");
3194
3195 n_infiles++;
3196 i++;
3197 }
3198 else if (strncmp (argv[i], "-l", 2) == 0)
3199 n_infiles++;
3a265431
DE
3200 else if (strcmp (argv[i], "-save-temps") == 0)
3201 {
3202 save_temps_flag = 1;
3203 n_switches++;
3204 }
d9ac3a07
MM
3205 else if (strcmp (argv[i], "-specs") == 0)
3206 {
3207 struct user_specs *user = (struct user_specs *)
3208 xmalloc (sizeof (struct user_specs));
3209 if (++i >= argc)
3210 fatal ("argument to `-specs' is missing");
3211
3212 user->next = (struct user_specs *)0;
3213 user->filename = argv[i];
3214 if (user_specs_tail)
3215 user_specs_tail->next = user;
3216 else
3217 user_specs_head = user;
3218 user_specs_tail = user;
3219 }
3220 else if (strncmp (argv[i], "-specs=", 7) == 0)
3221 {
3222 struct user_specs *user = (struct user_specs *)
3223 xmalloc (sizeof (struct user_specs));
3224 if (strlen (argv[i]) == 7)
3225 fatal ("argument to `-specs=' is missing");
3226
3227 user->next = (struct user_specs *)0;
3228 user->filename = argv[i]+7;
3229 if (user_specs_tail)
3230 user_specs_tail->next = user;
3231 else
3232 user_specs_head = user;
3233 user_specs_tail = user;
3234 }
03c41c05
ZW
3235 else if (strcmp (argv[i], "-time") == 0)
3236 report_times = 1;
368dfd3a 3237 else if (argv[i][0] == '-' && argv[i][1] != 0)
ed1f651b 3238 {
fbd40359 3239 register const char *p = &argv[i][1];
ed1f651b
RS
3240 register int c = *p;
3241
3242 switch (c)
3243 {
3244 case 'b':
aa32d841 3245 n_switches++;
ed1f651b
RS
3246 if (p[1] == 0 && i + 1 == argc)
3247 fatal ("argument to `-b' is missing");
3248 if (p[1] == 0)
3249 spec_machine = argv[++i];
3250 else
3251 spec_machine = p + 1;
5d7bb90c
RK
3252
3253 warn_std_ptr = &warn_std;
ed1f651b
RS
3254 break;
3255
3256 case 'B':
3257 {
fbd40359 3258 const char *value;
ed1f651b
RS
3259 if (p[1] == 0 && i + 1 == argc)
3260 fatal ("argument to `-B' is missing");
3261 if (p[1] == 0)
3262 value = argv[++i];
3263 else
3264 value = p + 1;
e9a25f70
JL
3265 add_prefix (&exec_prefixes, value, NULL_PTR, 1, 0, &warn_B);
3266 add_prefix (&startfile_prefixes, value, NULL_PTR,
3267 1, 0, &warn_B);
3268 add_prefix (&include_prefixes, concat (value, "include",
3269 NULL_PTR),
3270 NULL_PTR, 1, 0, NULL_PTR);
6b0639bc 3271
a78a8d58 3272 /* As a kludge, if the arg is "[foo/]stageN/", just add
e21c472a 3273 "[foo/]include" to the include prefix. */
ea694f2d
DE
3274 {
3275 int len = strlen (value);
48ff801b
RK
3276 if ((len == 7
3277 || (len > 7
509781a4 3278 && (IS_DIR_SEPARATOR (value[len - 8]))))
a78a8d58 3279 && strncmp (value + len - 7, "stage", 5) == 0
17248a6b 3280 && ISDIGIT (value[len - 2])
509781a4 3281 && (IS_DIR_SEPARATOR (value[len - 1])))
e21c472a
JW
3282 {
3283 if (len == 7)
e9a25f70 3284 add_prefix (&include_prefixes, "include", NULL_PTR,
5d7bb90c 3285 1, 0, NULL_PTR);
e21c472a
JW
3286 else
3287 {
eb2be0e6 3288 char *string = xmalloc (len + 1);
e21c472a 3289 strncpy (string, value, len-7);
853f1cc3 3290 strcpy (string+len-7, "include");
e9a25f70 3291 add_prefix (&include_prefixes, string, NULL_PTR,
5d7bb90c 3292 1, 0, NULL_PTR);
e21c472a
JW
3293 }
3294 }
ea694f2d 3295 }
aa32d841 3296 n_switches++;
ed1f651b
RS
3297 }
3298 break;
3299
3300 case 'v': /* Print our subcommands and print versions. */
ed1f651b 3301 n_switches++;
8436fe35
RS
3302 /* If they do anything other than exactly `-v', don't set
3303 verbose_flag; rather, continue on to give the error. */
3304 if (p[1] != 0)
3305 break;
3306 verbose_flag++;
ed1f651b
RS
3307 break;
3308
3309 case 'V':
aa32d841 3310 n_switches++;
ed1f651b
RS
3311 if (p[1] == 0 && i + 1 == argc)
3312 fatal ("argument to `-V' is missing");
3313 if (p[1] == 0)
3314 spec_version = argv[++i];
3315 else
3316 spec_version = p + 1;
53117a2f 3317 compiler_version = spec_version;
5d7bb90c 3318 warn_std_ptr = &warn_std;
e5e809f4
JL
3319
3320 /* Validate the version number. Use the same checks
3321 done when inserting it into a spec.
3322
3323 The format of the version string is
3324 ([^0-9]*-)?[0-9]+[.][0-9]+([.][0-9]+)?([- ].*)? */
3325 {
878f32c3 3326 const char *v = compiler_version;
e5e809f4
JL
3327
3328 /* Ignore leading non-digits. i.e. "foo-" in "foo-2.7.2". */
e9a780ec 3329 while (! ISDIGIT (*v))
e5e809f4
JL
3330 v++;
3331
3332 if (v > compiler_version && v[-1] != '-')
3333 fatal ("invalid version number format");
3334
3335 /* Set V after the first period. */
e9a780ec 3336 while (ISDIGIT (*v))
e5e809f4
JL
3337 v++;
3338
3339 if (*v != '.')
3340 fatal ("invalid version number format");
3341
3342 v++;
e9a780ec 3343 while (ISDIGIT (*v))
e5e809f4
JL
3344 v++;
3345
3346 if (*v != 0 && *v != ' ' && *v != '.' && *v != '-')
3347 fatal ("invalid version number format");
3348 }
ed1f651b
RS
3349 break;
3350
88117d44 3351 case 'S':
3a265431
DE
3352 case 'c':
3353 if (p[1] == 0)
ed1f651b 3354 {
3a265431 3355 have_c = 1;
8eebb258 3356 n_switches++;
ed1f651b
RS
3357 break;
3358 }
5fc08cad 3359 goto normal_switch;
f2cf3e1e 3360
f2cf3e1e
RK
3361 case 'o':
3362 have_o = 1;
88117d44
NC
3363#if defined(HAVE_EXECUTABLE_SUFFIX)
3364 if (! have_c)
3365 {
3366 int skip;
3367
3368 /* Forward scan, just in case -S or -c is specified
3369 after -o. */
3370 int j = i + 1;
3371 if (p[1] == 0)
3372 ++j;
3373 while (j < argc)
3374 {
3375 if (argv[j][0] == '-')
3376 {
3377 if (SWITCH_CURTAILS_COMPILATION (argv[j][1])
3378 && argv[j][2] == 0)
3379 {
3380 have_c = 1;
3381 break;
3382 }
3383 else if (skip = SWITCH_TAKES_ARG (argv[j][1]))
3384 j += skip - (argv[j][2] != 0);
3385 else if (skip = WORD_SWITCH_TAKES_ARG (argv[j] + 1))
3386 j += skip;
3387 }
3388 j++;
3389 }
3390 }
3391#endif
853e0b2d 3392#if defined(HAVE_EXECUTABLE_SUFFIX) || defined(HAVE_OBJECT_SUFFIX)
853e0b2d 3393 if (p[1] == 0)
88117d44
NC
3394 argv[i+1] = convert_filename (argv[i+1], ! have_c);
3395 else
3396 argv[i] = convert_filename (argv[i], ! have_c);
853e0b2d 3397#endif
5fc08cad 3398 goto normal_switch;
f2cf3e1e 3399
ed1f651b 3400 default:
5fc08cad 3401 normal_switch:
ed1f651b
RS
3402 n_switches++;
3403
3404 if (SWITCH_TAKES_ARG (c) > (p[1] != 0))
3405 i += SWITCH_TAKES_ARG (c) - (p[1] != 0);
3406 else if (WORD_SWITCH_TAKES_ARG (p))
3407 i += WORD_SWITCH_TAKES_ARG (p);
3408 }
3409 }
3410 else
3a265431
DE
3411 {
3412 n_infiles++;
3413 lang_n_infiles++;
3414 }
ed1f651b
RS
3415 }
3416
3a265431 3417 if (have_c && have_o && lang_n_infiles > 1)
c74c0cff 3418 fatal ("cannot specify -o with -c or -S and multiple compilations");
f2cf3e1e 3419
ed1f651b
RS
3420 /* Set up the search paths before we go looking for config files. */
3421
3422 /* These come before the md prefixes so that we will find gcc's subcommands
3423 (such as cpp) rather than those of the host system. */
ae04227b
CH
3424 /* Use 2 as fourth arg meaning try just the machine as a suffix,
3425 as well as trying the machine and the version. */
48ff801b 3426#ifndef OS2
14a774a9
RK
3427 add_prefix (&exec_prefixes, standard_exec_prefix, "GCC",
3428 0, 1, warn_std_ptr);
e9a25f70
JL
3429 add_prefix (&exec_prefixes, standard_exec_prefix, "BINUTILS",
3430 0, 2, warn_std_ptr);
3431 add_prefix (&exec_prefixes, standard_exec_prefix_1, "BINUTILS",
3432 0, 2, warn_std_ptr);
48ff801b 3433#endif
ed1f651b 3434
e9a25f70
JL
3435 add_prefix (&startfile_prefixes, standard_exec_prefix, "BINUTILS",
3436 0, 1, warn_std_ptr);
3437 add_prefix (&startfile_prefixes, standard_exec_prefix_1, "BINUTILS",
3438 0, 1, warn_std_ptr);
ed1f651b 3439
6aa62cff
DE
3440 tooldir_prefix = concat (tooldir_base_prefix, spec_machine,
3441 dir_separator_str, NULL_PTR);
c648ab8a 3442
48ff801b 3443 /* If tooldir is relative, base it on exec_prefixes. A relative
c648ab8a
RS
3444 tooldir lets us move the installed tree as a unit.
3445
3446 If GCC_EXEC_PREFIX is defined, then we want to add two relative
3447 directories, so that we can search both the user specified directory
3448 and the standard place. */
3449
509781a4 3450 if (!IS_DIR_SEPARATOR (*tooldir_prefix))
c648ab8a
RS
3451 {
3452 if (gcc_exec_prefix)
3453 {
3454 char *gcc_exec_tooldir_prefix
6aa62cff
DE
3455 = concat (gcc_exec_prefix, spec_machine, dir_separator_str,
3456 spec_version, dir_separator_str, tooldir_prefix, NULL_PTR);
c648ab8a 3457
48ff801b 3458 add_prefix (&exec_prefixes,
6aa62cff
DE
3459 concat (gcc_exec_tooldir_prefix, "bin",
3460 dir_separator_str, NULL_PTR),
e9a25f70 3461 NULL_PTR, 0, 0, NULL_PTR);
48ff801b 3462 add_prefix (&startfile_prefixes,
6aa62cff
DE
3463 concat (gcc_exec_tooldir_prefix, "lib",
3464 dir_separator_str, NULL_PTR),
e9a25f70 3465 NULL_PTR, 0, 0, NULL_PTR);
c648ab8a
RS
3466 }
3467
6aa62cff
DE
3468 tooldir_prefix = concat (standard_exec_prefix, spec_machine,
3469 dir_separator_str, spec_version,
3470 dir_separator_str, tooldir_prefix, NULL_PTR);
c648ab8a
RS
3471 }
3472
48ff801b 3473 add_prefix (&exec_prefixes,
6aa62cff 3474 concat (tooldir_prefix, "bin", dir_separator_str, NULL_PTR),
e9a25f70 3475 "BINUTILS", 0, 0, NULL_PTR);
48ff801b 3476 add_prefix (&startfile_prefixes,
6aa62cff 3477 concat (tooldir_prefix, "lib", dir_separator_str, NULL_PTR),
e9a25f70 3478 "BINUTILS", 0, 0, NULL_PTR);
f18fd956 3479
004fd4d5
RS
3480 /* More prefixes are enabled in main, after we read the specs file
3481 and determine whether this is cross-compilation or not. */
ed1f651b 3482
ed1f651b
RS
3483
3484 /* Then create the space for the vectors and scan again. */
3485
3486 switches = ((struct switchstr *)
3487 xmalloc ((n_switches + 1) * sizeof (struct switchstr)));
3488 infiles = (struct infile *) xmalloc ((n_infiles + 1) * sizeof (struct infile));
3489 n_switches = 0;
3490 n_infiles = 0;
3491 last_language_n_infiles = -1;
3492
3493 /* This, time, copy the text of each switch and store a pointer
3494 to the copy in the vector of switches.
3495 Store all the infiles in their vector. */
3496
3497 for (i = 1; i < argc; i++)
3498 {
2ef32c88 3499 /* Just skip the switches that were handled by the preceding loop. */
368dfd3a 3500 if (! strncmp (argv[i], "-Wa,", 4))
2ef32c88 3501 ;
57cb9b60
JW
3502 else if (! strncmp (argv[i], "-Wp,", 4))
3503 ;
14a774a9
RK
3504 else if (! strcmp (argv[i], "-pass-exit-codes"))
3505 ;
2628b9d3
DE
3506 else if (! strcmp (argv[i], "-print-search-dirs"))
3507 ;
2dcb563f 3508 else if (! strcmp (argv[i], "-print-libgcc-file-name"))
2ef32c88 3509 ;
6a9e290e
RK
3510 else if (! strncmp (argv[i], "-print-file-name=", 17))
3511 ;
3512 else if (! strncmp (argv[i], "-print-prog-name=", 17))
3513 ;
60103a34
DE
3514 else if (! strcmp (argv[i], "-print-multi-lib"))
3515 ;
3516 else if (! strcmp (argv[i], "-print-multi-directory"))
3517 ;
b8468bc7
NC
3518 else if (strcmp (argv[i], "-fhelp") == 0)
3519 {
3520 if (verbose_flag)
3521 {
3522 /* Create a dummy input file, so that we can pass --help on to
3523 the various sub-processes. */
3524 infiles[n_infiles].language = "c";
3525 infiles[n_infiles++].name = "help-dummy";
3526
40f943dd 3527 /* Preserve the --help switch so that it can be caught by the
b8468bc7
NC
3528 cc1 spec string. */
3529 switches[n_switches].part1 = "--help";
3530 switches[n_switches].args = 0;
8097c429 3531 switches[n_switches].live_cond = SWITCH_OK;
ab87f8c8 3532 switches[n_switches].validated = 0;
b8468bc7
NC
3533
3534 n_switches++;
3535 }
3536 }
cc6fc442
RS
3537 else if (argv[i][0] == '+' && argv[i][1] == 'e')
3538 {
3539 /* Compensate for the +e options to the C++ front-end;
a1c37766 3540 they're there simply for cfront call-compatibility. We do
cc6fc442
RS
3541 some magic in default_compilers to pass them down properly.
3542 Note we deliberately start at the `+' here, to avoid passing
3543 -e0 or -e1 down into the linker. */
3544 switches[n_switches].part1 = &argv[i][0];
3545 switches[n_switches].args = 0;
8097c429 3546 switches[n_switches].live_cond = SWITCH_OK;
ab87f8c8 3547 switches[n_switches].validated = 0;
cc6fc442
RS
3548 n_switches++;
3549 }
368dfd3a
TG
3550 else if (strncmp (argv[i], "-Wl,", 4) == 0)
3551 {
9b226f90
TG
3552 int prev, j;
3553 /* Split the argument at commas. */
3554 prev = 4;
3555 for (j = 4; argv[i][j]; j++)
3556 if (argv[i][j] == ',')
3557 {
e5e809f4 3558 infiles[n_infiles].language = "*";
9b226f90
TG
3559 infiles[n_infiles++].name
3560 = save_string (argv[i] + prev, j - prev);
3561 prev = j + 1;
3562 }
3563 /* Record the part after the last comma. */
e5e809f4 3564 infiles[n_infiles].language = "*";
9b226f90 3565 infiles[n_infiles++].name = argv[i] + prev;
368dfd3a
TG
3566 }
3567 else if (strcmp (argv[i], "-Xlinker") == 0)
3568 {
e5e809f4 3569 infiles[n_infiles].language = "*";
368dfd3a
TG
3570 infiles[n_infiles++].name = argv[++i];
3571 }
3572 else if (strncmp (argv[i], "-l", 2) == 0)
3573 {
e5e809f4 3574 infiles[n_infiles].language = "*";
368dfd3a
TG
3575 infiles[n_infiles++].name = argv[i];
3576 }
d9ac3a07
MM
3577 else if (strcmp (argv[i], "-specs") == 0)
3578 i++;
3579 else if (strncmp (argv[i], "-specs=", 7) == 0)
3580 ;
03c41c05
ZW
3581 else if (strcmp (argv[i], "-time") == 0)
3582 ;
3583 else if ((save_temps_flag || report_times)
3584 && strcmp (argv[i], "-pipe") == 0)
3585 {
3586 /* -save-temps overrides -pipe, so that temp files are produced */
3587 if (save_temps_flag)
3588 error ("Warning: -pipe ignored since -save-temps specified");
3589 /* -time overrides -pipe because we can't get correct stats when
3590 multiple children are running at once. */
3591 else if (report_times)
3592 error ("Warning: -pipe ignored since -time specified");
3593 }
368dfd3a 3594 else if (argv[i][0] == '-' && argv[i][1] != 0)
ed1f651b 3595 {
fbd40359
ZW
3596 const char *p = &argv[i][1];
3597 int c = *p;
ed1f651b 3598
ed1f651b
RS
3599 if (c == 'x')
3600 {
3601 if (p[1] == 0 && i + 1 == argc)
3602 fatal ("argument to `-x' is missing");
3603 if (p[1] == 0)
3604 spec_lang = argv[++i];
3605 else
3606 spec_lang = p + 1;
3607 if (! strcmp (spec_lang, "none"))
34dd3838
RK
3608 /* Suppress the warning if -xnone comes after the last input
3609 file, because alternate command interfaces like g++ might
3610 find it useful to place -xnone after each input file. */
ed1f651b
RS
3611 spec_lang = 0;
3612 else
3613 last_language_n_infiles = n_infiles;
3614 continue;
3615 }
3616 switches[n_switches].part1 = p;
3617 /* Deal with option arguments in separate argv elements. */
3618 if ((SWITCH_TAKES_ARG (c) > (p[1] != 0))
14553b75
RS
3619 || WORD_SWITCH_TAKES_ARG (p))
3620 {
3621 int j = 0;
3622 int n_args = WORD_SWITCH_TAKES_ARG (p);
ed1f651b 3623
14553b75
RS
3624 if (n_args == 0)
3625 {
3626 /* Count only the option arguments in separate argv elements. */
3627 n_args = SWITCH_TAKES_ARG (c) - (p[1] != 0);
3628 }
3629 if (i + n_args >= argc)
3630 fatal ("argument to `-%s' is missing", p);
3631 switches[n_switches].args
fbd40359 3632 = (const char **) xmalloc ((n_args + 1) * sizeof(const char *));
14553b75
RS
3633 while (j < n_args)
3634 switches[n_switches].args[j++] = argv[++i];
3635 /* Null-terminate the vector. */
3636 switches[n_switches].args[j] = 0;
ed1f651b 3637 }
bb9da768 3638 else if (index (switches_need_spaces, c))
14553b75 3639 {
bb9da768
RK
3640 /* On some systems, ld cannot handle some options without
3641 a space. So split the option from its argument. */
3642 char *part1 = (char *) xmalloc (2);
fbd40359 3643 char *tmp;
bb9da768
RK
3644 part1[0] = c;
3645 part1[1] = '\0';
3646
3647 switches[n_switches].part1 = part1;
fbd40359
ZW
3648 switches[n_switches].args
3649 = (const char **) xmalloc (2 * sizeof (const char *));
3650 switches[n_switches].args[0] = tmp = xmalloc (strlen (p));
3651 strcpy (tmp, &p[1]);
14553b75
RS
3652 switches[n_switches].args[1] = 0;
3653 }
3654 else
ed1f651b 3655 switches[n_switches].args = 0;
f5b0eb4e 3656
8097c429 3657 switches[n_switches].live_cond = SWITCH_OK;
ab87f8c8 3658 switches[n_switches].validated = 0;
ed1f651b
RS
3659 /* This is always valid, since gcc.c itself understands it. */
3660 if (!strcmp (p, "save-temps"))
ab87f8c8 3661 switches[n_switches].validated = 1;
aa32d841
JL
3662 else
3663 {
3664 char ch = switches[n_switches].part1[0];
3665 if (ch == 'V' || ch == 'b' || ch == 'B')
ab87f8c8 3666 switches[n_switches].validated = 1;
aa32d841 3667 }
ed1f651b
RS
3668 n_switches++;
3669 }
3670 else
3671 {
f70165f6 3672#ifdef HAVE_OBJECT_SUFFIX
853e0b2d 3673 argv[i] = convert_filename (argv[i], 0);
f70165f6
RK
3674#endif
3675
368dfd3a 3676 if (strcmp (argv[i], "-") != 0 && access (argv[i], R_OK) < 0)
48fb792a
BK
3677 {
3678 perror_with_name (argv[i]);
3679 error_count++;
3680 }
3681 else
3682 {
3683 infiles[n_infiles].language = spec_lang;
3684 infiles[n_infiles++].name = argv[i];
3685 }
ed1f651b
RS
3686 }
3687 }
3688
fa0d5369 3689 if (n_infiles == last_language_n_infiles && spec_lang != 0)
ed1f651b
RS
3690 error ("Warning: `-x %s' after last input file has no effect", spec_lang);
3691
3692 switches[n_switches].part1 = 0;
3693 infiles[n_infiles].name = 0;
3694}
3695\f
3696/* Process a spec string, accumulating and running commands. */
3697
3698/* These variables describe the input file name.
3699 input_file_number is the index on outfiles of this file,
3700 so that the output file name can be stored for later use by %o.
3701 input_basename is the start of the part of the input file
3702 sans all directory names, and basename_length is the number
3703 of characters starting there excluding the suffix .c or whatever. */
3704
878f32c3 3705const char *input_filename;
ed1f651b 3706static int input_file_number;
f271358e 3707size_t input_filename_length;
ed1f651b 3708static int basename_length;
878f32c3
KG
3709static const char *input_basename;
3710static const char *input_suffix;
ed1f651b
RS
3711
3712/* These are variables used within do_spec and do_spec_1. */
3713
3714/* Nonzero if an arg has been started and not yet terminated
3715 (with space, tab or newline). */
3716static int arg_going;
3717
3718/* Nonzero means %d or %g has been seen; the next arg to be terminated
3719 is a temporary file name. */
3720static int delete_this_arg;
3721
3722/* Nonzero means %w has been seen; the next arg to be terminated
3723 is the output file name of this compilation. */
3724static int this_is_output_file;
3725
3726/* Nonzero means %s has been seen; the next arg to be terminated
3727 is the name of a library file and we should try the standard
3728 search dirs for it. */
3729static int this_is_library_file;
3730
a99bf70c
JW
3731/* Nonzero means that the input of this command is coming from a pipe. */
3732static int input_from_pipe;
3733
ed1f651b
RS
3734/* Process the spec SPEC and run the commands specified therein.
3735 Returns 0 if the spec is successfully processed; -1 if failed. */
3736
f271358e 3737int
ed1f651b 3738do_spec (spec)
878f32c3 3739 const char *spec;
ed1f651b
RS
3740{
3741 int value;
3742
3743 clear_args ();
3744 arg_going = 0;
3745 delete_this_arg = 0;
3746 this_is_output_file = 0;
3747 this_is_library_file = 0;
a99bf70c 3748 input_from_pipe = 0;
ed1f651b 3749
906c4e36 3750 value = do_spec_1 (spec, 0, NULL_PTR);
ed1f651b
RS
3751
3752 /* Force out any unfinished command.
3753 If -pipe, this forces out the last command if it ended in `|'. */
3754 if (value == 0)
3755 {
3756 if (argbuf_index > 0 && !strcmp (argbuf[argbuf_index - 1], "|"))
3757 argbuf_index--;
3758
3759 if (argbuf_index > 0)
3760 value = execute ();
3761 }
3762
3763 return value;
3764}
3765
3766/* Process the sub-spec SPEC as a portion of a larger spec.
3767 This is like processing a whole spec except that we do
3768 not initialize at the beginning and we do not supply a
3769 newline by default at the end.
3770 INSWITCH nonzero means don't process %-sequences in SPEC;
3771 in this case, % is treated as an ordinary character.
3772 This is used while substituting switches.
3773 INSWITCH nonzero also causes SPC not to terminate an argument.
3774
3775 Value is zero unless a line was finished
3776 and the command on that line reported an error. */
3777
3778static int
3779do_spec_1 (spec, inswitch, soft_matched_part)
878f32c3 3780 const char *spec;
ed1f651b 3781 int inswitch;
878f32c3 3782 const char *soft_matched_part;
ed1f651b 3783{
878f32c3 3784 register const char *p = spec;
ed1f651b
RS
3785 register int c;
3786 int i;
878f32c3 3787 const char *string;
3279bba6 3788 int value;
ed1f651b 3789
ededb2fc 3790 while ((c = *p++))
ed1f651b
RS
3791 /* If substituting a switch, treat all chars like letters.
3792 Otherwise, NL, SPC, TAB and % are special. */
3793 switch (inswitch ? 'a' : c)
3794 {
3795 case '\n':
3796 /* End of line: finish any pending argument,
3797 then run the pending command if one has been started. */
3798 if (arg_going)
3799 {
3800 obstack_1grow (&obstack, 0);
3801 string = obstack_finish (&obstack);
3802 if (this_is_library_file)
3803 string = find_file (string);
3804 store_arg (string, delete_this_arg, this_is_output_file);
3805 if (this_is_output_file)
3806 outfiles[input_file_number] = string;
3807 }
3808 arg_going = 0;
3809
3810 if (argbuf_index > 0 && !strcmp (argbuf[argbuf_index - 1], "|"))
3811 {
ed1f651b
RS
3812 for (i = 0; i < n_switches; i++)
3813 if (!strcmp (switches[i].part1, "pipe"))
3814 break;
3815
3816 /* A `|' before the newline means use a pipe here,
3817 but only if -pipe was specified.
3818 Otherwise, execute now and don't pass the `|' as an arg. */
3819 if (i < n_switches)
3820 {
a99bf70c 3821 input_from_pipe = 1;
ab87f8c8 3822 switches[i].validated = 1;
ed1f651b
RS
3823 break;
3824 }
3825 else
3826 argbuf_index--;
3827 }
3828
3829 if (argbuf_index > 0)
3830 {
3279bba6 3831 value = execute ();
ed1f651b
RS
3832 if (value)
3833 return value;
3834 }
3835 /* Reinitialize for a new command, and for a new argument. */
3836 clear_args ();
3837 arg_going = 0;
3838 delete_this_arg = 0;
3839 this_is_output_file = 0;
3840 this_is_library_file = 0;
a99bf70c 3841 input_from_pipe = 0;
ed1f651b
RS
3842 break;
3843
3844 case '|':
3845 /* End any pending argument. */
3846 if (arg_going)
3847 {
3848 obstack_1grow (&obstack, 0);
3849 string = obstack_finish (&obstack);
3850 if (this_is_library_file)
3851 string = find_file (string);
3852 store_arg (string, delete_this_arg, this_is_output_file);
3853 if (this_is_output_file)
3854 outfiles[input_file_number] = string;
3855 }
3856
3857 /* Use pipe */
3858 obstack_1grow (&obstack, c);
3859 arg_going = 1;
3860 break;
3861
3862 case '\t':
3863 case ' ':
3864 /* Space or tab ends an argument if one is pending. */
3865 if (arg_going)
3866 {
3867 obstack_1grow (&obstack, 0);
3868 string = obstack_finish (&obstack);
3869 if (this_is_library_file)
3870 string = find_file (string);
3871 store_arg (string, delete_this_arg, this_is_output_file);
3872 if (this_is_output_file)
3873 outfiles[input_file_number] = string;
3874 }
3875 /* Reinitialize for a new argument. */
3876 arg_going = 0;
3877 delete_this_arg = 0;
3878 this_is_output_file = 0;
3879 this_is_library_file = 0;
3880 break;
3881
3882 case '%':
3883 switch (c = *p++)
3884 {
3885 case 0:
3886 fatal ("Invalid specification! Bug in cc.");
3887
3888 case 'b':
3889 obstack_grow (&obstack, input_basename, basename_length);
3890 arg_going = 1;
3891 break;
3892
3893 case 'd':
3894 delete_this_arg = 2;
3895 break;
3896
3897 /* Dump out the directories specified with LIBRARY_PATH,
004fd4d5
RS
3898 followed by the absolute directories
3899 that we search for startfiles. */
ed1f651b 3900 case 'D':
8cacec76 3901 {
48ff801b 3902 struct prefix_list *pl = startfile_prefixes.plist;
85066503 3903 size_t bufsize = 100;
8cacec76
JW
3904 char *buffer = (char *) xmalloc (bufsize);
3905 int idx;
59014d0a 3906
8cacec76
JW
3907 for (; pl; pl = pl->next)
3908 {
004fd4d5 3909#ifdef RELATIVE_PREFIX_NOT_LINKDIR
8cacec76
JW
3910 /* Used on systems which record the specified -L dirs
3911 and use them to search for dynamic linking. */
3912 /* Relative directories always come from -B,
3913 and it is better not to use them for searching
3ac63d94 3914 at run time. In particular, stage1 loses. */
509781a4 3915 if (!IS_DIR_SEPARATOR (pl->prefix[0]))
8cacec76 3916 continue;
004fd4d5 3917#endif
60103a34
DE
3918 /* Try subdirectory if there is one. */
3919 if (multilib_dir != NULL)
3920 {
3921 if (machine_suffix)
3922 {
3923 if (strlen (pl->prefix) + strlen (machine_suffix)
3924 >= bufsize)
3925 bufsize = (strlen (pl->prefix)
3926 + strlen (machine_suffix)) * 2 + 1;
3927 buffer = (char *) xrealloc (buffer, bufsize);
3928 strcpy (buffer, pl->prefix);
3929 strcat (buffer, machine_suffix);
3930 if (is_directory (buffer, multilib_dir, 1))
3931 {
3932 do_spec_1 ("-L", 0, NULL_PTR);
3933#ifdef SPACE_AFTER_L_OPTION
3934 do_spec_1 (" ", 0, NULL_PTR);
3935#endif
3936 do_spec_1 (buffer, 1, NULL_PTR);
3937 do_spec_1 (multilib_dir, 1, NULL_PTR);
3938 /* Make this a separate argument. */
3939 do_spec_1 (" ", 0, NULL_PTR);
3940 }
3941 }
3942 if (!pl->require_machine_suffix)
3943 {
3944 if (is_directory (pl->prefix, multilib_dir, 1))
3945 {
3946 do_spec_1 ("-L", 0, NULL_PTR);
3947#ifdef SPACE_AFTER_L_OPTION
3948 do_spec_1 (" ", 0, NULL_PTR);
3949#endif
3950 do_spec_1 (pl->prefix, 1, NULL_PTR);
3951 do_spec_1 (multilib_dir, 1, NULL_PTR);
3952 /* Make this a separate argument. */
3953 do_spec_1 (" ", 0, NULL_PTR);
3954 }
3955 }
3956 }
8cacec76
JW
3957 if (machine_suffix)
3958 {
0ad5835e 3959 if (is_directory (pl->prefix, machine_suffix, 1))
8cacec76
JW
3960 {
3961 do_spec_1 ("-L", 0, NULL_PTR);
004fd4d5 3962#ifdef SPACE_AFTER_L_OPTION
8cacec76 3963 do_spec_1 (" ", 0, NULL_PTR);
004fd4d5 3964#endif
8cacec76
JW
3965 do_spec_1 (pl->prefix, 1, NULL_PTR);
3966 /* Remove slash from machine_suffix. */
3967 if (strlen (machine_suffix) >= bufsize)
3968 bufsize = strlen (machine_suffix) * 2 + 1;
3969 buffer = (char *) xrealloc (buffer, bufsize);
3970 strcpy (buffer, machine_suffix);
3971 idx = strlen (buffer);
509781a4 3972 if (IS_DIR_SEPARATOR (buffer[idx - 1]))
8cacec76
JW
3973 buffer[idx - 1] = 0;
3974 do_spec_1 (buffer, 1, NULL_PTR);
3975 /* Make this a separate argument. */
3976 do_spec_1 (" ", 0, NULL_PTR);
3977 }
3978 }
3979 if (!pl->require_machine_suffix)
3980 {
0ad5835e 3981 if (is_directory (pl->prefix, "", 1))
8cacec76
JW
3982 {
3983 do_spec_1 ("-L", 0, NULL_PTR);
004fd4d5 3984#ifdef SPACE_AFTER_L_OPTION
8cacec76 3985 do_spec_1 (" ", 0, NULL_PTR);
004fd4d5 3986#endif
8cacec76
JW
3987 /* Remove slash from pl->prefix. */
3988 if (strlen (pl->prefix) >= bufsize)
3989 bufsize = strlen (pl->prefix) * 2 + 1;
3990 buffer = (char *) xrealloc (buffer, bufsize);
3991 strcpy (buffer, pl->prefix);
3992 idx = strlen (buffer);
509781a4 3993 if (IS_DIR_SEPARATOR (buffer[idx - 1]))
8cacec76
JW
3994 buffer[idx - 1] = 0;
3995 do_spec_1 (buffer, 1, NULL_PTR);
3996 /* Make this a separate argument. */
3997 do_spec_1 (" ", 0, NULL_PTR);
3998 }
3999 }
4000 }
4001 free (buffer);
4002 }
ed1f651b
RS
4003 break;
4004
4005 case 'e':
ab87f8c8 4006 /* %efoo means report an error with `foo' as error message
ed1f651b
RS
4007 and don't execute any more commands for this file. */
4008 {
878f32c3 4009 const char *q = p;
ed1f651b
RS
4010 char *buf;
4011 while (*p != 0 && *p != '\n') p++;
4012 buf = (char *) alloca (p - q + 1);
4013 strncpy (buf, q, p - q);
4014 buf[p - q] = 0;
913d0833 4015 error ("%s", buf);
ed1f651b
RS
4016 return -1;
4017 }
4018 break;
4019
4020 case 'g':
d887e808 4021 case 'u':
4401b31c 4022 case 'U':
ed1f651b 4023 if (save_temps_flag)
3061ec2b
SS
4024 {
4025 obstack_grow (&obstack, input_basename, basename_length);
4026 delete_this_arg = 0;
4027 }
ed1f651b
RS
4028 else
4029 {
fb266030
TW
4030#ifdef MKTEMP_EACH_FILE
4031 /* ??? This has a problem: the total number of
4032 values mktemp can return is limited.
4033 That matters for the names of object files.
4034 In 2.4, do something about that. */
4035 struct temp_name *t;
dd75c292 4036 int suffix_length;
878f32c3 4037 const char *suffix = p;
a1d9074c 4038 char *saved_suffix = NULL;
dd75c292 4039
a1d9074c
TT
4040 while (*p == '.' || ISALPHA ((unsigned char)*p))
4041 p++;
4042 suffix_length = p - suffix;
dd75c292
CB
4043 if (p[0] == '%' && p[1] == 'O')
4044 {
cbc54665 4045 p += 2;
dd75c292 4046 /* We don't support extra suffix characters after %O. */
e51712db 4047 if (*p == '.' || ISALPHA ((unsigned char)*p))
dd75c292 4048 abort ();
a1d9074c
TT
4049 if (suffix_length == 0)
4050 suffix = OBJECT_SUFFIX;
4051 else
4052 {
4053 saved_suffix
4054 = (char *) xmalloc (suffix_length
4055 + strlen (OBJECT_SUFFIX));
4056 strncpy (saved_suffix, suffix, suffix_length);
4057 strcpy (saved_suffix + suffix_length,
4058 OBJECT_SUFFIX);
4059 }
4060 suffix_length += strlen (OBJECT_SUFFIX);
dd75c292 4061 }
fb266030
TW
4062
4063 /* See if we already have an association of %g/%u/%U and
4064 suffix. */
4065 for (t = temp_names; t; t = t->next)
dd75c292
CB
4066 if (t->length == suffix_length
4067 && strncmp (t->suffix, suffix, suffix_length) == 0
fb266030
TW
4068 && t->unique == (c != 'g'))
4069 break;
4070
4071 /* Make a new association if needed. %u requires one. */
4072 if (t == 0 || c == 'u')
4073 {
4074 if (t == 0)
4075 {
4076 t = (struct temp_name *) xmalloc (sizeof (struct temp_name));
4077 t->next = temp_names;
4078 temp_names = t;
4079 }
dd75c292
CB
4080 t->length = suffix_length;
4081 t->suffix = save_string (suffix, suffix_length);
4082 t->unique = (c != 'g');
4083 temp_filename = make_temp_file (t->suffix);
6aa62cff 4084 temp_filename_length = strlen (temp_filename);
fb266030
TW
4085 t->filename = temp_filename;
4086 t->filename_length = temp_filename_length;
4087 }
4088
a1d9074c
TT
4089 if (saved_suffix)
4090 free (saved_suffix);
4091
fb266030 4092 obstack_grow (&obstack, t->filename, t->filename_length);
b9490a6e
RS
4093 delete_this_arg = 1;
4094#else
ed1f651b 4095 obstack_grow (&obstack, temp_filename, temp_filename_length);
4401b31c 4096 if (c == 'u' || c == 'U')
d887e808
TW
4097 {
4098 static int unique;
4099 char buff[9];
4401b31c
MM
4100 if (c == 'u')
4101 unique++;
4102 sprintf (buff, "%d", unique);
d887e808
TW
4103 obstack_grow (&obstack, buff, strlen (buff));
4104 }
b9490a6e 4105#endif
ed1f651b
RS
4106 delete_this_arg = 1;
4107 }
4108 arg_going = 1;
4109 break;
4110
4111 case 'i':
4112 obstack_grow (&obstack, input_filename, input_filename_length);
4113 arg_going = 1;
4114 break;
4115
8eebb258 4116 case 'I':
2d879387 4117 {
48ff801b 4118 struct prefix_list *pl = include_prefixes.plist;
2d879387
JW
4119
4120 if (gcc_exec_prefix)
4121 {
4122 do_spec_1 ("-iprefix", 1, NULL_PTR);
4123 /* Make this a separate argument. */
4124 do_spec_1 (" ", 0, NULL_PTR);
4125 do_spec_1 (gcc_exec_prefix, 1, NULL_PTR);
4126 do_spec_1 (" ", 0, NULL_PTR);
4127 }
4128
4129 for (; pl; pl = pl->next)
4130 {
4131 do_spec_1 ("-isystem", 1, NULL_PTR);
4132 /* Make this a separate argument. */
4133 do_spec_1 (" ", 0, NULL_PTR);
4134 do_spec_1 (pl->prefix, 1, NULL_PTR);
4135 do_spec_1 (" ", 0, NULL_PTR);
4136 }
4137 }
8eebb258
RS
4138 break;
4139
ed1f651b 4140 case 'o':
15c5edb9
TT
4141 {
4142 int max = n_infiles;
15c5edb9 4143 max += lang_specific_extra_outfiles;
08dc830e 4144
15c5edb9
TT
4145 for (i = 0; i < max; i++)
4146 if (outfiles[i])
4147 store_arg (outfiles[i], 0, 0);
4148 break;
4149 }
ed1f651b 4150
ed7dae04
RK
4151 case 'O':
4152 obstack_grow (&obstack, OBJECT_SUFFIX, strlen (OBJECT_SUFFIX));
4153 arg_going = 1;
4154 break;
4155
ed1f651b
RS
4156 case 's':
4157 this_is_library_file = 1;
4158 break;
4159
4160 case 'w':
4161 this_is_output_file = 1;
4162 break;
4163
4164 case 'W':
4165 {
ed846da3 4166 int cur_index = argbuf_index;
ed1f651b
RS
4167 /* Handle the {...} following the %W. */
4168 if (*p != '{')
4169 abort ();
4170 p = handle_braces (p + 1);
4171 if (p == 0)
4172 return -1;
4173 /* If any args were output, mark the last one for deletion
4174 on failure. */
ed846da3 4175 if (argbuf_index != cur_index)
ed1f651b
RS
4176 record_temp_file (argbuf[argbuf_index - 1], 0, 1);
4177 break;
4178 }
4179
4180 /* %x{OPTION} records OPTION for %X to output. */
4181 case 'x':
4182 {
878f32c3 4183 const char *p1 = p;
ed1f651b
RS
4184 char *string;
4185
4186 /* Skip past the option value and make a copy. */
4187 if (*p != '{')
4188 abort ();
4189 while (*p++ != '}')
4190 ;
4191 string = save_string (p1 + 1, p - p1 - 2);
4192
4193 /* See if we already recorded this option. */
4194 for (i = 0; i < n_linker_options; i++)
4195 if (! strcmp (string, linker_options[i]))
4196 {
4197 free (string);
4198 return 0;
4199 }
4200
4201 /* This option is new; add it. */
b8468bc7 4202 add_linker_option (string, strlen (string));
ed1f651b
RS
4203 }
4204 break;
4205
368dfd3a 4206 /* Dump out the options accumulated previously using %x. */
ed1f651b
RS
4207 case 'X':
4208 for (i = 0; i < n_linker_options; i++)
4209 {
906c4e36 4210 do_spec_1 (linker_options[i], 1, NULL_PTR);
ed1f651b 4211 /* Make each accumulated option a separate argument. */
906c4e36 4212 do_spec_1 (" ", 0, NULL_PTR);
ed1f651b
RS
4213 }
4214 break;
4215
c9ebacb8
RS
4216 /* Dump out the options accumulated previously using -Wa,. */
4217 case 'Y':
4218 for (i = 0; i < n_assembler_options; i++)
4219 {
4220 do_spec_1 (assembler_options[i], 1, NULL_PTR);
4221 /* Make each accumulated option a separate argument. */
4222 do_spec_1 (" ", 0, NULL_PTR);
4223 }
4224 break;
4225
57cb9b60
JW
4226 /* Dump out the options accumulated previously using -Wp,. */
4227 case 'Z':
4228 for (i = 0; i < n_preprocessor_options; i++)
4229 {
4230 do_spec_1 (preprocessor_options[i], 1, NULL_PTR);
4231 /* Make each accumulated option a separate argument. */
4232 do_spec_1 (" ", 0, NULL_PTR);
4233 }
4234 break;
4235
ed1f651b
RS
4236 /* Here are digits and numbers that just process
4237 a certain constant string as a spec. */
4238
4239 case '1':
3279bba6
RS
4240 value = do_spec_1 (cc1_spec, 0, NULL_PTR);
4241 if (value != 0)
4242 return value;
ed1f651b
RS
4243 break;
4244
4245 case '2':
3279bba6
RS
4246 value = do_spec_1 (cc1plus_spec, 0, NULL_PTR);
4247 if (value != 0)
4248 return value;
ed1f651b
RS
4249 break;
4250
4251 case 'a':
3279bba6
RS
4252 value = do_spec_1 (asm_spec, 0, NULL_PTR);
4253 if (value != 0)
4254 return value;
ed1f651b
RS
4255 break;
4256
4257 case 'A':
3279bba6
RS
4258 value = do_spec_1 (asm_final_spec, 0, NULL_PTR);
4259 if (value != 0)
4260 return value;
ed1f651b
RS
4261 break;
4262
4263 case 'c':
3279bba6
RS
4264 value = do_spec_1 (signed_char_spec, 0, NULL_PTR);
4265 if (value != 0)
4266 return value;
ed1f651b
RS
4267 break;
4268
4269 case 'C':
3279bba6
RS
4270 value = do_spec_1 (cpp_spec, 0, NULL_PTR);
4271 if (value != 0)
4272 return value;
ed1f651b
RS
4273 break;
4274
4275 case 'E':
3279bba6
RS
4276 value = do_spec_1 (endfile_spec, 0, NULL_PTR);
4277 if (value != 0)
4278 return value;
ed1f651b
RS
4279 break;
4280
4281 case 'l':
3279bba6
RS
4282 value = do_spec_1 (link_spec, 0, NULL_PTR);
4283 if (value != 0)
4284 return value;
ed1f651b
RS
4285 break;
4286
4287 case 'L':
3279bba6
RS
4288 value = do_spec_1 (lib_spec, 0, NULL_PTR);
4289 if (value != 0)
4290 return value;
ed1f651b
RS
4291 break;
4292
68d69835
JM
4293 case 'G':
4294 value = do_spec_1 (libgcc_spec, 0, NULL_PTR);
4295 if (value != 0)
4296 return value;
4297 break;
4298
ed1f651b
RS
4299 case 'p':
4300 {
4301 char *x = (char *) alloca (strlen (cpp_predefines) + 1);
4302 char *buf = x;
3b304f5b 4303 const char *y;
ed1f651b
RS
4304
4305 /* Copy all of the -D options in CPP_PREDEFINES into BUF. */
4306 y = cpp_predefines;
4307 while (*y != 0)
4308 {
4309 if (! strncmp (y, "-D", 2))
4310 /* Copy the whole option. */
4311 while (*y && *y != ' ' && *y != '\t')
4312 *x++ = *y++;
4313 else if (*y == ' ' || *y == '\t')
4314 /* Copy whitespace to the result. */
4315 *x++ = *y++;
4316 /* Don't copy other options. */
4317 else
4318 y++;
4319 }
4320
4321 *x = 0;
4322
3279bba6
RS
4323 value = do_spec_1 (buf, 0, NULL_PTR);
4324 if (value != 0)
4325 return value;
ed1f651b
RS
4326 }
4327 break;
4328
4329 case 'P':
4330 {
4331 char *x = (char *) alloca (strlen (cpp_predefines) * 4 + 1);
4332 char *buf = x;
3b304f5b 4333 const char *y;
ed1f651b
RS
4334
4335 /* Copy all of CPP_PREDEFINES into BUF,
3ac63d94
NC
4336 but force them all into the reserved name space if they
4337 aren't already there. The reserved name space is all
52c207e2
ZW
4338 identifiers beginning with two underscores or with one
4339 underscore and a capital letter. We do the forcing by
4340 adding up to two underscores to the beginning and end
4341 of each symbol. e.g. mips, _mips, mips_, and _mips_ all
4342 become __mips__. */
ed1f651b
RS
4343 y = cpp_predefines;
4344 while (*y != 0)
4345 {
4346 if (! strncmp (y, "-D", 2))
4347 {
4348 int flag = 0;
4349
4350 *x++ = *y++;
4351 *x++ = *y++;
4352
35364692 4353 if (*y != '_'
e51712db
KG
4354 || (*(y+1) != '_'
4355 && ! ISUPPER ((unsigned char)*(y+1))))
ed1f651b
RS
4356 {
4357 /* Stick __ at front of macro name. */
52c207e2
ZW
4358 if (*y != '_')
4359 *x++ = '_';
ed1f651b
RS
4360 *x++ = '_';
4361 /* Arrange to stick __ at the end as well. */
4362 flag = 1;
4363 }
4364
4365 /* Copy the macro name. */
4366 while (*y && *y != '=' && *y != ' ' && *y != '\t')
4367 *x++ = *y++;
4368
4369 if (flag)
4370 {
52c207e2
ZW
4371 if (x[-1] != '_')
4372 {
4373 if (x[-2] != '_')
4374 *x++ = '_';
4375 *x++ = '_';
4376 }
ed1f651b
RS
4377 }
4378
4379 /* Copy the value given, if any. */
4380 while (*y && *y != ' ' && *y != '\t')
4381 *x++ = *y++;
4382 }
4383 else if (*y == ' ' || *y == '\t')
4384 /* Copy whitespace to the result. */
4385 *x++ = *y++;
4386 /* Don't copy -A options */
4387 else
4388 y++;
4389 }
4390 *x++ = ' ';
4391
4392 /* Copy all of CPP_PREDEFINES into BUF,
4393 but put __ after every -D. */
4394 y = cpp_predefines;
4395 while (*y != 0)
4396 {
4397 if (! strncmp (y, "-D", 2))
4398 {
54a88f92 4399 y += 2;
ed1f651b 4400
35364692 4401 if (*y != '_'
e51712db
KG
4402 || (*(y+1) != '_'
4403 && ! ISUPPER ((unsigned char)*(y+1))))
ed1f651b 4404 {
54a88f92
RK
4405 /* Stick -D__ at front of macro name. */
4406 *x++ = '-';
4407 *x++ = 'D';
52c207e2
ZW
4408 if (*y != '_')
4409 *x++ = '_';
ed1f651b 4410 *x++ = '_';
ed1f651b 4411
54a88f92
RK
4412 /* Copy the macro name. */
4413 while (*y && *y != '=' && *y != ' ' && *y != '\t')
4414 *x++ = *y++;
ed1f651b 4415
54a88f92
RK
4416 /* Copy the value given, if any. */
4417 while (*y && *y != ' ' && *y != '\t')
4418 *x++ = *y++;
4419 }
4420 else
4421 {
4422 /* Do not copy this macro - we have just done it before */
4423 while (*y && *y != ' ' && *y != '\t')
4424 y++;
4425 }
ed1f651b
RS
4426 }
4427 else if (*y == ' ' || *y == '\t')
4428 /* Copy whitespace to the result. */
4429 *x++ = *y++;
3ac63d94 4430 /* Don't copy -A options. */
ed1f651b
RS
4431 else
4432 y++;
4433 }
4434 *x++ = ' ';
4435
4436 /* Copy all of the -A options in CPP_PREDEFINES into BUF. */
4437 y = cpp_predefines;
4438 while (*y != 0)
4439 {
4440 if (! strncmp (y, "-A", 2))
4441 /* Copy the whole option. */
4442 while (*y && *y != ' ' && *y != '\t')
4443 *x++ = *y++;
4444 else if (*y == ' ' || *y == '\t')
4445 /* Copy whitespace to the result. */
4446 *x++ = *y++;
4447 /* Don't copy other options. */
4448 else
4449 y++;
4450 }
4451
4452 *x = 0;
4453
3279bba6
RS
4454 value = do_spec_1 (buf, 0, NULL_PTR);
4455 if (value != 0)
4456 return value;
ed1f651b
RS
4457 }
4458 break;
4459
4460 case 'S':
3279bba6
RS
4461 value = do_spec_1 (startfile_spec, 0, NULL_PTR);
4462 if (value != 0)
4463 return value;
ed1f651b
RS
4464 break;
4465
4466 /* Here we define characters other than letters and digits. */
4467
4468 case '{':
4469 p = handle_braces (p);
4470 if (p == 0)
4471 return -1;
4472 break;
4473
4474 case '%':
4475 obstack_1grow (&obstack, '%');
4476 break;
4477
4478 case '*':
3ac63d94
NC
4479 if (soft_matched_part)
4480 {
4481 do_spec_1 (soft_matched_part, 1, NULL_PTR);
4482 do_spec_1 (" ", 0, NULL_PTR);
4483 }
4484 else
4485 /* Catch the case where a spec string contains something like
4486 '%{foo:%*}'. ie there is no * in the pattern on the left
4487 hand side of the :. */
4488 error ("Spec failure: '%%*' has not been initialised by pattern match");
ed1f651b
RS
4489 break;
4490
4491 /* Process a string found as the value of a spec given by name.
4492 This feature allows individual machine descriptions
4089dfab
JL
4493 to add and use their own specs.
4494 %[...] modifies -D options the way %P does;
4495 %(...) uses the spec unmodified. */
4496 case '[':
50ea20cf 4497 error ("Warning: use of obsolete %%[ operator in specs");
ed1f651b 4498 case '(':
ed1f651b 4499 {
878f32c3 4500 const char *name = p;
ed1f651b
RS
4501 struct spec_list *sl;
4502 int len;
4503
4504 /* The string after the S/P is the name of a spec that is to be
0f41302f 4505 processed. */
4089dfab 4506 while (*p && *p != ')' && *p != ']')
ed1f651b
RS
4507 p++;
4508
3ac63d94 4509 /* See if it's in the list. */
ed1f651b 4510 for (len = p - name, sl = specs; sl; sl = sl->next)
79aff5ac 4511 if (sl->name_len == len && !strncmp (sl->name, name, len))
ed1f651b 4512 {
79aff5ac 4513 name = *(sl->ptr_spec);
20df0482 4514#ifdef DEBUG_SPECS
ab87f8c8
JL
4515 notice ("Processing spec %c%s%c, which is '%s'\n",
4516 c, sl->name, (c == '(') ? ')' : ']', name);
20df0482 4517#endif
ed1f651b
RS
4518 break;
4519 }
4520
4521 if (sl)
4522 {
4089dfab
JL
4523 if (c == '(')
4524 {
4525 value = do_spec_1 (name, 0, NULL_PTR);
4526 if (value != 0)
4527 return value;
4528 }
4529 else
4530 {
4531 char *x = (char *) alloca (strlen (name) * 2 + 1);
4532 char *buf = x;
878f32c3 4533 const char *y = name;
4089dfab
JL
4534 int flag = 0;
4535
4536 /* Copy all of NAME into BUF, but put __ after
3ac63d94 4537 every -D and at the end of each arg. */
4089dfab
JL
4538 while (1)
4539 {
4540 if (! strncmp (y, "-D", 2))
4541 {
4542 *x++ = '-';
4543 *x++ = 'D';
4544 *x++ = '_';
4545 *x++ = '_';
4546 y += 2;
4547 flag = 1;
4548 continue;
4549 }
4550 else if (flag && (*y == ' ' || *y == '\t' || *y == '='
4551 || *y == '}' || *y == 0))
4552 {
4553 *x++ = '_';
4554 *x++ = '_';
4555 flag = 0;
4556 }
4557 if (*y == 0)
4558 break;
4559 else
4560 *x++ = *y++;
4561 }
4562 *x = 0;
4563
4564 value = do_spec_1 (buf, 0, NULL_PTR);
4565 if (value != 0)
4566 return value;
4567 }
ed1f651b 4568 }
b3865ca9 4569
4089dfab 4570 /* Discard the closing paren or bracket. */
b3865ca9
RS
4571 if (*p)
4572 p++;
ed1f651b
RS
4573 }
4574 break;
4575
829407e1
RS
4576 case 'v':
4577 {
500c9e81 4578 int c1 = *p++; /* Select first or second version number. */
3b304f5b
ZW
4579 const char *v = compiler_version;
4580 const char *q;
3ea8083f 4581 static const char zeroc = '0';
fd5e7009
DE
4582
4583 /* The format of the version string is
4584 ([^0-9]*-)?[0-9]+[.][0-9]+([.][0-9]+)?([- ].*)? */
4585
4586 /* Ignore leading non-digits. i.e. "foo-" in "foo-2.7.2". */
17248a6b 4587 while (! ISDIGIT (*v))
fd5e7009
DE
4588 v++;
4589 if (v > compiler_version && v[-1] != '-')
4590 abort ();
4591
500c9e81 4592 /* If desired, advance to second version number. */
3ea8083f 4593 if (c1 >= '2')
500c9e81 4594 {
164c4c91 4595 /* Set V after the first period. */
17248a6b 4596 while (ISDIGIT (*v))
53117a2f 4597 v++;
fd5e7009
DE
4598 if (*v != '.')
4599 abort ();
4600 v++;
500c9e81 4601 }
fd5e7009 4602
3ea8083f
JL
4603 /* If desired, advance to third version number.
4604 But don't complain if it's not present */
4605 if (c1 == '3')
4606 {
4607 /* Set V after the second period. */
4608 while (ISDIGIT (*v))
4609 v++;
4610 if ((*v != 0) && (*v != ' ') && (*v != '.') && (*v != '-'))
4611 abort ();
4612 if (*v != 0)
4613 v++;
4614 }
4615
500c9e81 4616 /* Set Q at the next period or at the end. */
53117a2f 4617 q = v;
17248a6b 4618 while (ISDIGIT (*q))
53117a2f 4619 q++;
289b3cc5 4620 if (*q != 0 && q > v && *q != ' ' && *q != '.' && *q != '-')
fd5e7009
DE
4621 abort ();
4622
3ea8083f
JL
4623 if (q > v)
4624 /* Put that part into the command. */
4625 obstack_grow (&obstack, v, q - v);
4626 else
4627 /* Default to "0" */
4628 obstack_grow (&obstack, &zeroc, 1);
829407e1
RS
4629 arg_going = 1;
4630 }
4631 break;
4632
a99bf70c
JW
4633 case '|':
4634 if (input_from_pipe)
4635 do_spec_1 ("-", 0, NULL_PTR);
4636 break;
4637
ed1f651b 4638 default:
3ac63d94
NC
4639 error ("Spec failure: Unrecognised spec option '%c'", c);
4640 break;
ed1f651b
RS
4641 }
4642 break;
4643
4644 case '\\':
4645 /* Backslash: treat next character as ordinary. */
4646 c = *p++;
4647
4648 /* fall through */
4649 default:
4650 /* Ordinary character: put it into the current argument. */
4651 obstack_1grow (&obstack, c);
4652 arg_going = 1;
4653 }
4654
4655 return 0; /* End of string */
4656}
4657
4658/* Return 0 if we call do_spec_1 and that returns -1. */
4659
878f32c3 4660static const char *
ed1f651b 4661handle_braces (p)
878f32c3 4662 register const char *p;
ed1f651b 4663{
878f32c3 4664 const char *filter, *body = NULL, *endbody = NULL;
f2cf3e1e 4665 int pipe_p = 0;
9bf09437
RH
4666 int negate;
4667 int suffix;
9f3c45fd 4668 int include_blanks = 1;
8097c429 4669 int elide_switch = 0;
9f3c45fd
RK
4670
4671 if (*p == '^')
8097c429
TT
4672 {
4673 /* A '^' after the open-brace means to not give blanks before args. */
4674 include_blanks = 0;
4675 ++p;
4676 }
ed1f651b
RS
4677
4678 if (*p == '|')
8097c429
TT
4679 {
4680 /* A `|' after the open-brace means,
4681 if the test fails, output a single minus sign rather than nothing.
4682 This is used in %{|!pipe:...}. */
4683 pipe_p = 1;
4684 ++p;
4685 }
4686
4687 if (*p == '<')
4688 {
4689 /* A `<' after the open-brace means that the switch should be
4690 removed from the command-line. */
4691 elide_switch = 1;
4692 ++p;
4693 }
ed1f651b 4694
9bf09437
RH
4695next_member:
4696 negate = suffix = 0;
4697
ed1f651b
RS
4698 if (*p == '!')
4699 /* A `!' after the open-brace negates the condition:
4700 succeed if the specified switch is not present. */
4701 negate = 1, ++p;
4702
4703 if (*p == '.')
4704 /* A `.' after the open-brace means test against the current suffix. */
4705 {
f2cf3e1e 4706 if (pipe_p)
ed1f651b
RS
4707 abort ();
4708
4709 suffix = 1;
4710 ++p;
4711 }
4712
8097c429
TT
4713 if (elide_switch && (negate || pipe_p || suffix))
4714 {
4715 /* It doesn't make sense to mix elision with other flags. We
4716 could fatal() here, but the standard seems to be to abort. */
4717 abort ();
4718 }
4719
ed1f651b 4720 filter = p;
9bf09437
RH
4721 while (*p != ':' && *p != '}' && *p != '|') p++;
4722
4723 if (*p == '|' && pipe_p)
4724 abort ();
4725
4726 if (!body)
ed1f651b 4727 {
9bf09437
RH
4728 if (*p != '}')
4729 {
4730 register int count = 1;
878f32c3 4731 register const char *q = p;
9bf09437
RH
4732
4733 while (*q++ != ':') continue;
4734 body = q;
4735
4736 while (count > 0)
4737 {
4738 if (*q == '{')
4739 count++;
4740 else if (*q == '}')
4741 count--;
4742 else if (*q == 0)
4743 abort ();
4744 q++;
4745 }
4746 endbody = q;
ed1f651b 4747 }
9bf09437
RH
4748 else
4749 body = p, endbody = p+1;
ed1f651b 4750 }
ed1f651b
RS
4751
4752 if (suffix)
4753 {
4754 int found = (input_suffix != 0
e51712db 4755 && (long) strlen (input_suffix) == (long)(p - filter)
ed1f651b
RS
4756 && strncmp (input_suffix, filter, p - filter) == 0);
4757
9bf09437 4758 if (body[0] == '}')
ed1f651b
RS
4759 abort ();
4760
4761 if (negate != found
9bf09437 4762 && do_spec_1 (save_string (body, endbody-body-1), 0, NULL_PTR) < 0)
ed1f651b 4763 return 0;
ed1f651b
RS
4764 }
4765 else if (p[-1] == '*' && p[0] == '}')
4766 {
4767 /* Substitute all matching switches as separate args. */
4768 register int i;
4769 --p;
4770 for (i = 0; i < n_switches; i++)
f5b0eb4e
RK
4771 if (!strncmp (switches[i].part1, filter, p - filter)
4772 && check_live_switch (i, p - filter))
9f3c45fd 4773 give_switch (i, 0, include_blanks);
ed1f651b
RS
4774 }
4775 else
4776 {
4777 /* Test for presence of the specified switch. */
4778 register int i;
4779 int present = 0;
4780
4781 /* If name specified ends in *, as in {x*:...},
4782 check for %* and handle that case. */
4783 if (p[-1] == '*' && !negate)
4784 {
4785 int substitution;
878f32c3 4786 const char *r = body;
ed1f651b
RS
4787
4788 /* First see whether we have %*. */
4789 substitution = 0;
9bf09437 4790 while (r < endbody)
ed1f651b
RS
4791 {
4792 if (*r == '%' && r[1] == '*')
4793 substitution = 1;
4794 r++;
4795 }
4796 /* If we do, handle that case. */
4797 if (substitution)
4798 {
4799 /* Substitute all matching switches as separate args.
4800 But do this by substituting for %*
4801 in the text that follows the colon. */
4802
4803 unsigned hard_match_len = p - filter - 1;
9bf09437 4804 char *string = save_string (body, endbody - body - 1);
ed1f651b
RS
4805
4806 for (i = 0; i < n_switches; i++)
f5b0eb4e 4807 if (!strncmp (switches[i].part1, filter, hard_match_len)
6c396fb5 4808 && check_live_switch (i, -1))
ed1f651b
RS
4809 {
4810 do_spec_1 (string, 0, &switches[i].part1[hard_match_len]);
4811 /* Pass any arguments this switch has. */
1ba9a487 4812 give_switch (i, 1, 1);
ed1f651b
RS
4813 }
4814
9bf09437
RH
4815 /* We didn't match. Try again. */
4816 if (*p++ == '|')
4817 goto next_member;
4818 return endbody;
ed1f651b
RS
4819 }
4820 }
4821
4822 /* If name specified ends in *, as in {x*:...},
4823 check for presence of any switch name starting with x. */
4824 if (p[-1] == '*')
4825 {
4826 for (i = 0; i < n_switches; i++)
4827 {
4828 unsigned hard_match_len = p - filter - 1;
4829
f5b0eb4e
RK
4830 if (!strncmp (switches[i].part1, filter, hard_match_len)
4831 && check_live_switch (i, hard_match_len))
ed1f651b 4832 {
ed1f651b 4833 present = 1;
1f58da7f 4834 break;
ed1f651b
RS
4835 }
4836 }
4837 }
4838 /* Otherwise, check for presence of exact name specified. */
4839 else
4840 {
4841 for (i = 0; i < n_switches; i++)
4842 {
4843 if (!strncmp (switches[i].part1, filter, p - filter)
f5b0eb4e 4844 && switches[i].part1[p - filter] == 0
6c396fb5 4845 && check_live_switch (i, -1))
ed1f651b 4846 {
ed1f651b
RS
4847 present = 1;
4848 break;
4849 }
4850 }
4851 }
4852
9bf09437 4853 /* If it is as desired (present for %{s...}, absent for %{!s...})
ed1f651b
RS
4854 then substitute either the switch or the specified
4855 conditional text. */
4856 if (present != negate)
4857 {
8097c429
TT
4858 if (elide_switch)
4859 {
4860 switches[i].live_cond = SWITCH_IGNORE;
4861 switches[i].validated = 1;
4862 }
4863 else if (*p == '}')
ed1f651b 4864 {
9f3c45fd 4865 give_switch (i, 0, include_blanks);
ed1f651b
RS
4866 }
4867 else
4868 {
9bf09437
RH
4869 if (do_spec_1 (save_string (body, endbody - body - 1),
4870 0, NULL_PTR) < 0)
ed1f651b
RS
4871 return 0;
4872 }
4873 }
f2cf3e1e 4874 else if (pipe_p)
ed1f651b
RS
4875 {
4876 /* Here if a %{|...} conditional fails: output a minus sign,
4877 which means "standard output" or "standard input". */
906c4e36 4878 do_spec_1 ("-", 0, NULL_PTR);
9bf09437 4879 return endbody;
ed1f651b
RS
4880 }
4881 }
4882
9bf09437
RH
4883 /* We didn't match; try again. */
4884 if (*p++ == '|')
4885 goto next_member;
4886
4887 return endbody;
ed1f651b 4888}
f5b0eb4e 4889\f
6c396fb5
RK
4890/* Return 0 iff switch number SWITCHNUM is obsoleted by a later switch
4891 on the command line. PREFIX_LENGTH is the length of XXX in an {XXX*}
4892 spec, or -1 if either exact match or %* is used.
f5b0eb4e
RK
4893
4894 A -O switch is obsoleted by a later -O switch. A -f, -m, or -W switch
4895 whose value does not begin with "no-" is obsoleted by the same value
4896 with the "no-", similarly for a switch with the "no-" prefix. */
4897
4898static int
6c396fb5 4899check_live_switch (switchnum, prefix_length)
f5b0eb4e 4900 int switchnum;
6c396fb5 4901 int prefix_length;
f5b0eb4e 4902{
878f32c3 4903 const char *name = switches[switchnum].part1;
f5b0eb4e
RK
4904 int i;
4905
6c396fb5 4906 /* In the common case of {<at-most-one-letter>*}, a negating
f5b0eb4e
RK
4907 switch would always match, so ignore that case. We will just
4908 send the conflicting switches to the compiler phase. */
6c396fb5 4909 if (prefix_length >= 0 && prefix_length <= 1)
f5b0eb4e
RK
4910 return 1;
4911
4912 /* If we already processed this switch and determined if it was
4913 live or not, return our past determination. */
4914 if (switches[switchnum].live_cond != 0)
4915 return switches[switchnum].live_cond > 0;
4916
4917 /* Now search for duplicate in a manner that depends on the name. */
4918 switch (*name)
4919 {
4920 case 'O':
f5b0eb4e
RK
4921 for (i = switchnum + 1; i < n_switches; i++)
4922 if (switches[i].part1[0] == 'O')
4923 {
ab87f8c8 4924 switches[switchnum].validated = 1;
8097c429 4925 switches[switchnum].live_cond = SWITCH_FALSE;
f5b0eb4e
RK
4926 return 0;
4927 }
4928 break;
ed1f651b 4929
f5b0eb4e 4930 case 'W': case 'f': case 'm':
6c396fb5 4931 if (! strncmp (name + 1, "no-", 3))
f5b0eb4e 4932 {
0f41302f 4933 /* We have Xno-YYY, search for XYYY. */
f5b0eb4e
RK
4934 for (i = switchnum + 1; i < n_switches; i++)
4935 if (switches[i].part1[0] == name[0]
4936 && ! strcmp (&switches[i].part1[1], &name[4]))
4937 {
ab87f8c8 4938 switches[switchnum].validated = 1;
8097c429 4939 switches[switchnum].live_cond = SWITCH_FALSE;
f5b0eb4e
RK
4940 return 0;
4941 }
4942 }
4943 else
4944 {
4945 /* We have XYYY, search for Xno-YYY. */
4946 for (i = switchnum + 1; i < n_switches; i++)
4947 if (switches[i].part1[0] == name[0]
4948 && switches[i].part1[1] == 'n'
4949 && switches[i].part1[2] == 'o'
4950 && switches[i].part1[3] == '-'
4951 && !strcmp (&switches[i].part1[4], &name[1]))
4952 {
ab87f8c8 4953 switches[switchnum].validated = 1;
8097c429 4954 switches[switchnum].live_cond = SWITCH_FALSE;
f5b0eb4e
RK
4955 return 0;
4956 }
4957 }
4958 break;
4959 }
4960
4961 /* Otherwise the switch is live. */
8097c429 4962 switches[switchnum].live_cond = SWITCH_LIVE;
f5b0eb4e
RK
4963 return 1;
4964}
4965\f
ed1f651b
RS
4966/* Pass a switch to the current accumulating command
4967 in the same form that we received it.
4968 SWITCHNUM identifies the switch; it is an index into
4969 the vector of switches gcc received, which is `switches'.
4970 This cannot fail since it never finishes a command line.
4971
1ba9a487
RK
4972 If OMIT_FIRST_WORD is nonzero, then we omit .part1 of the argument.
4973
4974 If INCLUDE_BLANKS is nonzero, then we include blanks before each argument
4975 of the switch. */
ed1f651b
RS
4976
4977static void
1ba9a487 4978give_switch (switchnum, omit_first_word, include_blanks)
ed1f651b
RS
4979 int switchnum;
4980 int omit_first_word;
1ba9a487 4981 int include_blanks;
ed1f651b 4982{
8097c429
TT
4983 if (switches[switchnum].live_cond == SWITCH_IGNORE)
4984 return;
4985
ed1f651b
RS
4986 if (!omit_first_word)
4987 {
906c4e36
RK
4988 do_spec_1 ("-", 0, NULL_PTR);
4989 do_spec_1 (switches[switchnum].part1, 1, NULL_PTR);
ed1f651b 4990 }
1ba9a487 4991
ed1f651b
RS
4992 if (switches[switchnum].args != 0)
4993 {
fbd40359 4994 const char **p;
ed1f651b
RS
4995 for (p = switches[switchnum].args; *p; p++)
4996 {
1ba9a487
RK
4997 if (include_blanks)
4998 do_spec_1 (" ", 0, NULL_PTR);
906c4e36 4999 do_spec_1 (*p, 1, NULL_PTR);
ed1f651b
RS
5000 }
5001 }
1ba9a487
RK
5002
5003 do_spec_1 (" ", 0, NULL_PTR);
ab87f8c8 5004 switches[switchnum].validated = 1;
ed1f651b
RS
5005}
5006\f
5007/* Search for a file named NAME trying various prefixes including the
5008 user's -B prefix and some standard ones.
5009 Return the absolute file name found. If nothing is found, return NAME. */
5010
878f32c3 5011static const char *
ed1f651b 5012find_file (name)
878f32c3 5013 const char *name;
ed1f651b
RS
5014{
5015 char *newname;
5016
60103a34
DE
5017 /* Try multilib_dir if it is defined. */
5018 if (multilib_dir != NULL)
5019 {
5020 char *try;
5021
5022 try = (char *) alloca (strlen (multilib_dir) + strlen (name) + 2);
5023 strcpy (try, multilib_dir);
48ff801b 5024 strcat (try, dir_separator_str);
60103a34
DE
5025 strcat (try, name);
5026
48ff801b 5027 newname = find_a_file (&startfile_prefixes, try, R_OK);
60103a34
DE
5028
5029 /* If we don't find it in the multi library dir, then fall
5030 through and look for it in the normal places. */
5031 if (newname != NULL)
5032 return newname;
5033 }
5034
48ff801b 5035 newname = find_a_file (&startfile_prefixes, name, R_OK);
ed1f651b
RS
5036 return newname ? newname : name;
5037}
5038
0ad5835e
ILT
5039/* Determine whether a directory exists. If LINKER, return 0 for
5040 certain fixed names not needed by the linker. If not LINKER, it is
5041 only important to return 0 if the host machine has a small ARG_MAX
5042 limit. */
ed1f651b
RS
5043
5044static int
0ad5835e 5045is_directory (path1, path2, linker)
878f32c3
KG
5046 const char *path1;
5047 const char *path2;
0ad5835e 5048 int linker;
ed1f651b
RS
5049{
5050 int len1 = strlen (path1);
5051 int len2 = strlen (path2);
5052 char *path = (char *) alloca (3 + len1 + len2);
5053 char *cp;
5054 struct stat st;
5055
0ad5835e
ILT
5056#ifndef SMALL_ARG_MAX
5057 if (! linker)
5058 return 1;
5059#endif
5060
ed1f651b
RS
5061 /* Construct the path from the two parts. Ensure the string ends with "/.".
5062 The resulting path will be a directory even if the given path is a
5063 symbolic link. */
7e2231e7
PB
5064 memcpy (path, path1, len1);
5065 memcpy (path + len1, path2, len2);
ed1f651b 5066 cp = path + len1 + len2;
509781a4 5067 if (!IS_DIR_SEPARATOR (cp[-1]))
48ff801b 5068 *cp++ = DIR_SEPARATOR;
ed1f651b
RS
5069 *cp++ = '.';
5070 *cp = '\0';
5071
5072 /* Exclude directories that the linker is known to search. */
0ad5835e 5073 if (linker
48ff801b 5074 && ((cp - path == 6
6aa62cff
DE
5075 && strcmp (path, concat (dir_separator_str, "lib",
5076 dir_separator_str, ".", NULL_PTR)) == 0)
48ff801b 5077 || (cp - path == 10
6aa62cff
DE
5078 && strcmp (path, concat (dir_separator_str, "usr",
5079 dir_separator_str, "lib",
5080 dir_separator_str, ".", NULL_PTR)) == 0)))
ed1f651b
RS
5081 return 0;
5082
5083 return (stat (path, &st) >= 0 && S_ISDIR (st.st_mode));
5084}
512b62fb
JM
5085
5086/* Set up the various global variables to indicate that we're processing
5087 the input file named FILENAME. */
5088
5089static void
5090set_input (filename)
5091 const char *filename;
5092{
5093 register const char *p;
5094
5095 input_filename = filename;
5096 input_filename_length = strlen (input_filename);
5097
5098 input_basename = input_filename;
4ebe197a
ME
5099#ifdef HAVE_DOS_BASED_FILE_SYSTEM
5100 /* Skip drive name so 'x:foo' is handled properly. */
5101 if (input_basename[1] == ':')
5102 input_basename += 2;
5103#endif
5104 for (p = input_basename; *p; p++)
512b62fb
JM
5105 if (IS_DIR_SEPARATOR (*p))
5106 input_basename = p + 1;
5107
5108 /* Find a suffix starting with the last period,
5109 and set basename_length to exclude that suffix. */
5110 basename_length = strlen (input_basename);
5111 p = input_basename + basename_length;
5112 while (p != input_basename && *p != '.') --p;
5113 if (*p == '.' && p != input_basename)
5114 {
5115 basename_length = p - input_basename;
5116 input_suffix = p + 1;
5117 }
5118 else
5119 input_suffix = "";
5120}
ed1f651b
RS
5121\f
5122/* On fatal signals, delete all the temporary files. */
5123
5124static void
5125fatal_error (signum)
5126 int signum;
5127{
5128 signal (signum, SIG_DFL);
5129 delete_failure_queue ();
5130 delete_temp_files ();
5131 /* Get the same signal again, this time not handled,
5132 so its normal effect occurs. */
5133 kill (getpid (), signum);
5134}
5135
c809adda 5136extern int main PARAMS ((int, char **));
a8f227e7 5137
ed1f651b
RS
5138int
5139main (argc, argv)
5140 int argc;
e9cefc3e 5141 char **argv;
ed1f651b 5142{
85066503
MH
5143 register size_t i;
5144 size_t j;
ed1f651b 5145 int value;
ed1f651b
RS
5146 int linker_was_run = 0;
5147 char *explicit_link_files;
5148 char *specs_file;
878f32c3 5149 const char *p;
d9ac3a07 5150 struct user_specs *uptr;
ed1f651b 5151
afcd8a02 5152 p = argv[0] + strlen (argv[0]);
509781a4
ME
5153 while (p != argv[0] && !IS_DIR_SEPARATOR (p[-1]))
5154 --p;
afcd8a02 5155 programname = p;
ed1f651b 5156
d9b53430 5157#ifdef HAVE_LC_MESSAGES
ab87f8c8 5158 setlocale (LC_MESSAGES, "");
d9b53430 5159#endif
735396d9
KG
5160 (void) bindtextdomain (PACKAGE, localedir);
5161 (void) textdomain (PACKAGE);
ab87f8c8 5162
ed1f651b
RS
5163 if (signal (SIGINT, SIG_IGN) != SIG_IGN)
5164 signal (SIGINT, fatal_error);
2a353d3a 5165#ifdef SIGHUP
ed1f651b
RS
5166 if (signal (SIGHUP, SIG_IGN) != SIG_IGN)
5167 signal (SIGHUP, fatal_error);
2a353d3a 5168#endif
ed1f651b
RS
5169 if (signal (SIGTERM, SIG_IGN) != SIG_IGN)
5170 signal (SIGTERM, fatal_error);
5171#ifdef SIGPIPE
5172 if (signal (SIGPIPE, SIG_IGN) != SIG_IGN)
5173 signal (SIGPIPE, fatal_error);
5174#endif
5175
5176 argbuf_length = 10;
fbd40359 5177 argbuf = (const char **) xmalloc (argbuf_length * sizeof (const char *));
ed1f651b
RS
5178
5179 obstack_init (&obstack);
5180
961b7009
MM
5181 /* Build multilib_select, et. al from the separate lines that make up each
5182 multilib selection. */
ffd86336 5183 {
3b304f5b 5184 const char *const *q = multilib_raw;
961b7009 5185 int need_space;
ffd86336
JW
5186
5187 obstack_init (&multilib_obstack);
0f41302f 5188 while ((p = *q++) != (char *) 0)
ffd86336
JW
5189 obstack_grow (&multilib_obstack, p, strlen (p));
5190
5191 obstack_1grow (&multilib_obstack, 0);
5192 multilib_select = obstack_finish (&multilib_obstack);
961b7009
MM
5193
5194 q = multilib_matches_raw;
5195 while ((p = *q++) != (char *) 0)
5196 obstack_grow (&multilib_obstack, p, strlen (p));
5197
5198 obstack_1grow (&multilib_obstack, 0);
5199 multilib_matches = obstack_finish (&multilib_obstack);
5200
0a8d6618
BC
5201 q = multilib_exclusions_raw;
5202 while ((p = *q++) != (char *) 0)
5203 obstack_grow (&multilib_obstack, p, strlen (p));
5204
5205 obstack_1grow (&multilib_obstack, 0);
5206 multilib_exclusions = obstack_finish (&multilib_obstack);
5207
961b7009
MM
5208 need_space = FALSE;
5209 for (i = 0;
5210 i < sizeof (multilib_defaults_raw) / sizeof (multilib_defaults_raw[0]);
5211 i++)
5212 {
5213 if (need_space)
5214 obstack_1grow (&multilib_obstack, ' ');
5215 obstack_grow (&multilib_obstack,
5216 multilib_defaults_raw[i],
5217 strlen (multilib_defaults_raw[i]));
5218 need_space = TRUE;
5219 }
5220
5221 obstack_1grow (&multilib_obstack, 0);
5222 multilib_defaults = obstack_finish (&multilib_obstack);
ffd86336
JW
5223 }
5224
b3865ca9 5225 /* Set up to remember the pathname of gcc and any options
1d23c208
JW
5226 needed for collect. We use argv[0] instead of programname because
5227 we need the complete pathname. */
b3865ca9
RS
5228 obstack_init (&collect_obstack);
5229 obstack_grow (&collect_obstack, "COLLECT_GCC=", sizeof ("COLLECT_GCC=")-1);
1d23c208 5230 obstack_grow (&collect_obstack, argv[0], strlen (argv[0])+1);
b3865ca9
RS
5231 putenv (obstack_finish (&collect_obstack));
5232
8faf4a68
JW
5233#ifdef INIT_ENVIRONMENT
5234 /* Set up any other necessary machine specific environment variables. */
5235 putenv (INIT_ENVIRONMENT);
5236#endif
5237
ed1f651b
RS
5238 /* Choose directory for temp files. */
5239
003ac91d 5240#ifndef MKTEMP_EACH_FILE
6aa62cff
DE
5241 temp_filename = choose_temp_base ();
5242 temp_filename_length = strlen (temp_filename);
003ac91d 5243#endif
ed1f651b
RS
5244
5245 /* Make a table of what switches there are (switches, n_switches).
5246 Make a table of specified input files (infiles, n_infiles).
5247 Decode switches that are handled locally. */
5248
5249 process_command (argc, argv);
5250
aa32d841 5251 {
aa32d841
JL
5252 int first_time;
5253
5254 /* Build COLLECT_GCC_OPTIONS to have all of the options specified to
5255 the compiler. */
5256 obstack_grow (&collect_obstack, "COLLECT_GCC_OPTIONS=",
5257 sizeof ("COLLECT_GCC_OPTIONS=")-1);
5258
5259 first_time = TRUE;
e51712db 5260 for (i = 0; (int)i < n_switches; i++)
aa32d841 5261 {
fbd40359 5262 const char **args;
878f32c3 5263 const char *p, *q;
aa32d841
JL
5264 if (!first_time)
5265 obstack_grow (&collect_obstack, " ", 1);
5266
5267 first_time = FALSE;
5268 obstack_grow (&collect_obstack, "'-", 2);
5269 q = switches[i].part1;
670ee920 5270 while ((p = index (q,'\'')))
aa32d841
JL
5271 {
5272 obstack_grow (&collect_obstack, q, p-q);
5273 obstack_grow (&collect_obstack, "'\\''", 4);
5274 q = ++p;
5275 }
5276 obstack_grow (&collect_obstack, q, strlen (q));
5277 obstack_grow (&collect_obstack, "'", 1);
5278
5279 for (args = switches[i].args; args && *args; args++)
5280 {
5281 obstack_grow (&collect_obstack, " '", 2);
5282 q = *args;
670ee920 5283 while ((p = index (q,'\'')))
aa32d841
JL
5284 {
5285 obstack_grow (&collect_obstack, q, p-q);
5286 obstack_grow (&collect_obstack, "'\\''", 4);
5287 q = ++p;
5288 }
5289 obstack_grow (&collect_obstack, q, strlen (q));
5290 obstack_grow (&collect_obstack, "'", 1);
5291 }
5292 }
5293 obstack_grow (&collect_obstack, "\0", 1);
5294 putenv (obstack_finish (&collect_obstack));
5295 }
5296
ed1f651b
RS
5297 /* Initialize the vector of specs to just the default.
5298 This means one element containing 0s, as a terminator. */
5299
5300 compilers = (struct compiler *) xmalloc (sizeof default_compilers);
4c9a05bc
RK
5301 bcopy ((char *) default_compilers, (char *) compilers,
5302 sizeof default_compilers);
ed1f651b
RS
5303 n_compilers = n_default_compilers;
5304
5305 /* Read specs from a file if there is one. */
5306
6aa62cff
DE
5307 machine_suffix = concat (spec_machine, dir_separator_str,
5308 spec_version, dir_separator_str, NULL_PTR);
5309 just_machine_suffix = concat (spec_machine, dir_separator_str, NULL_PTR);
ed1f651b 5310
48ff801b 5311 specs_file = find_a_file (&startfile_prefixes, "specs", R_OK);
ed1f651b
RS
5312 /* Read the specs file unless it is a default one. */
5313 if (specs_file != 0 && strcmp (specs_file, "specs"))
20df0482
MM
5314 read_specs (specs_file, TRUE);
5315 else
5316 init_spec ();
841faeed 5317
5bb67e36 5318 /* We need to check standard_exec_prefix/just_machine_suffix/specs
3ac63d94 5319 for any override of as, ld and libraries. */
5bb67e36
RK
5320 specs_file = (char *) alloca (strlen (standard_exec_prefix)
5321 + strlen (just_machine_suffix)
5322 + sizeof ("specs"));
5323
5324 strcpy (specs_file, standard_exec_prefix);
5325 strcat (specs_file, just_machine_suffix);
5326 strcat (specs_file, "specs");
5327 if (access (specs_file, R_OK) == 0)
5328 read_specs (specs_file, TRUE);
5329
004fd4d5 5330 /* If not cross-compiling, look for startfiles in the standard places. */
fcc9ad83 5331 if (*cross_compile == '0')
004fd4d5
RS
5332 {
5333#ifdef MD_EXEC_PREFIX
e9a25f70
JL
5334 add_prefix (&exec_prefixes, md_exec_prefix, "GCC", 0, 0, NULL_PTR);
5335 add_prefix (&startfile_prefixes, md_exec_prefix, "GCC", 0, 0, NULL_PTR);
004fd4d5
RS
5336#endif
5337
5338#ifdef MD_STARTFILE_PREFIX
e9a25f70
JL
5339 add_prefix (&startfile_prefixes, md_startfile_prefix, "GCC",
5340 0, 0, NULL_PTR);
004fd4d5
RS
5341#endif
5342
607a4f7d 5343#ifdef MD_STARTFILE_PREFIX_1
e9a25f70
JL
5344 add_prefix (&startfile_prefixes, md_startfile_prefix_1, "GCC",
5345 0, 0, NULL_PTR);
607a4f7d
RS
5346#endif
5347
4dbc7773
ILT
5348 /* If standard_startfile_prefix is relative, base it on
5349 standard_exec_prefix. This lets us move the installed tree
5350 as a unit. If GCC_EXEC_PREFIX is defined, base
5351 standard_startfile_prefix on that as well. */
509781a4
ME
5352 if (IS_DIR_SEPARATOR (*standard_startfile_prefix)
5353 || *standard_startfile_prefix == '$'
0deb20df 5354#ifdef HAVE_DOS_BASED_FILE_SYSTEM
509781a4 5355 /* Check for disk name on MS-DOS-based systems. */
e5e809f4 5356 || (standard_startfile_prefix[1] == ':'
509781a4 5357 && (IS_DIR_SEPARATOR (standard_startfile_prefix[2])))
e5e809f4
JL
5358#endif
5359 )
e9a25f70
JL
5360 add_prefix (&startfile_prefixes, standard_startfile_prefix, "BINUTILS",
5361 0, 0, NULL_PTR);
4dbc7773
ILT
5362 else
5363 {
5364 if (gcc_exec_prefix)
48ff801b 5365 add_prefix (&startfile_prefixes,
6aa62cff
DE
5366 concat (gcc_exec_prefix, machine_suffix,
5367 standard_startfile_prefix, NULL_PTR),
e9a25f70 5368 NULL_PTR, 0, 0, NULL_PTR);
48ff801b 5369 add_prefix (&startfile_prefixes,
6aa62cff
DE
5370 concat (standard_exec_prefix,
5371 machine_suffix,
5372 standard_startfile_prefix, NULL_PTR),
e9a25f70 5373 NULL_PTR, 0, 0, NULL_PTR);
4dbc7773
ILT
5374 }
5375
e9a25f70
JL
5376 add_prefix (&startfile_prefixes, standard_startfile_prefix_1,
5377 "BINUTILS", 0, 0, NULL_PTR);
5378 add_prefix (&startfile_prefixes, standard_startfile_prefix_2,
5379 "BINUTILS", 0, 0, NULL_PTR);
004fd4d5 5380#if 0 /* Can cause surprises, and one can use -B./ instead. */
e9a25f70 5381 add_prefix (&startfile_prefixes, "./", NULL_PTR, 0, 1, NULL_PTR);
004fd4d5
RS
5382#endif
5383 }
e8601ecb
JW
5384 else
5385 {
509781a4 5386 if (!IS_DIR_SEPARATOR (*standard_startfile_prefix) && gcc_exec_prefix)
e8601ecb 5387 add_prefix (&startfile_prefixes,
6aa62cff
DE
5388 concat (gcc_exec_prefix, machine_suffix,
5389 standard_startfile_prefix, NULL_PTR),
e9a25f70 5390 "BINUTILS", 0, 0, NULL_PTR);
e8601ecb
JW
5391 }
5392
8607048d
TT
5393 /* Process any user specified specs in the order given on the command
5394 line. */
5395 for (uptr = user_specs_head; uptr; uptr = uptr->next)
5396 {
5397 char *filename = find_a_file (&startfile_prefixes, uptr->filename, R_OK);
5398 read_specs (filename ? filename : uptr->filename, FALSE);
5399 }
5400
e8601ecb
JW
5401 /* If we have a GCC_EXEC_PREFIX envvar, modify it for cpp's sake. */
5402 if (gcc_exec_prefix)
5403 {
5404 char * temp = (char *) xmalloc (strlen (gcc_exec_prefix)
5405 + strlen (spec_version)
5406 + strlen (spec_machine) + 3);
5407 strcpy (temp, gcc_exec_prefix);
5408 strcat (temp, spec_machine);
5409 strcat (temp, dir_separator_str);
5410 strcat (temp, spec_version);
5411 strcat (temp, dir_separator_str);
5412 gcc_exec_prefix = temp;
5413 }
004fd4d5 5414
ed1f651b
RS
5415 /* Now we have the specs.
5416 Set the `valid' bits for switches that match anything in any spec. */
5417
5418 validate_all_switches ();
5419
60103a34
DE
5420 /* Now that we have the switches and the specs, set
5421 the subdirectory based on the options. */
5422 set_multilib_dir ();
5423
ed1f651b
RS
5424 /* Warn about any switches that no pass was interested in. */
5425
e51712db 5426 for (i = 0; (int)i < n_switches; i++)
ab87f8c8 5427 if (! switches[i].validated)
ed1f651b
RS
5428 error ("unrecognized option `-%s'", switches[i].part1);
5429
6a9e290e
RK
5430 /* Obey some of the options. */
5431
2628b9d3
DE
5432 if (print_search_dirs)
5433 {
5e4adfba
PT
5434 printf (_("install: %s%s\n"), standard_exec_prefix, machine_suffix);
5435 printf (_("programs: %s\n"), build_search_list (&exec_prefixes, "", 0));
5436 printf (_("libraries: %s\n"), build_search_list (&startfile_prefixes, "", 0));
9257393c 5437 return (0);
2628b9d3
DE
5438 }
5439
6a9e290e 5440 if (print_file_name)
2dcb563f 5441 {
6a9e290e 5442 printf ("%s\n", find_file (print_file_name));
9257393c 5443 return (0);
2dcb563f
RS
5444 }
5445
6a9e290e
RK
5446 if (print_prog_name)
5447 {
48ff801b 5448 char *newname = find_a_file (&exec_prefixes, print_prog_name, X_OK);
6a9e290e 5449 printf ("%s\n", (newname ? newname : print_prog_name));
9257393c 5450 return (0);
6a9e290e 5451 }
ed1f651b 5452
60103a34
DE
5453 if (print_multi_lib)
5454 {
5455 print_multilib_info ();
9257393c 5456 return (0);
60103a34
DE
5457 }
5458
5459 if (print_multi_directory)
5460 {
5461 if (multilib_dir == NULL)
5462 printf (".\n");
5463 else
5464 printf ("%s\n", multilib_dir);
9257393c 5465 return (0);
60103a34
DE
5466 }
5467
b8468bc7
NC
5468 if (print_help_list)
5469 {
5470 display_help ();
5471
5472 if (! verbose_flag)
5473 {
5e4adfba 5474 printf (_("\nFor bug reporting instructions, please see:\n"));
8b97e23b 5475 printf ("%s.\n", GCCBUGURL);
b8468bc7 5476
9257393c 5477 return (0);
b8468bc7
NC
5478 }
5479
5480 /* We do not exit here. Instead we have created a fake input file
5481 called 'help-dummy' which needs to be compiled, and we pass this
5482 on the the various sub-processes, along with the --help switch. */
5483 }
5484
ed1f651b
RS
5485 if (verbose_flag)
5486 {
7ad9ff7a
DE
5487 int n;
5488
5489 /* compiler_version is truncated at the first space when initialized
5490 from version string, so truncate version_string at the first space
5491 before comparing. */
5492 for (n = 0; version_string[n]; n++)
5493 if (version_string[n] == ' ')
5494 break;
5495
5496 if (! strncmp (version_string, compiler_version, n)
5497 && compiler_version[n] == 0)
ab87f8c8 5498 notice ("gcc version %s\n", version_string);
9c4faac1 5499 else
ab87f8c8
JL
5500 notice ("gcc driver version %s executing gcc version %s\n",
5501 version_string, compiler_version);
9c4faac1 5502
ed1f651b 5503 if (n_infiles == 0)
9257393c 5504 return (0);
ed1f651b
RS
5505 }
5506
a2a05b0a 5507 if (n_infiles == added_libraries)
1df80ae4 5508 fatal ("No input files");
ed1f651b
RS
5509
5510 /* Make a place to record the compiler output file names
5511 that correspond to the input files. */
5512
f271358e 5513 i = n_infiles;
e37cda9b 5514 i += lang_specific_extra_outfiles;
ad85216e 5515 outfiles = (const char **) xcalloc (i, sizeof (char *));
ed1f651b
RS
5516
5517 /* Record which files were specified explicitly as link input. */
5518
ad85216e 5519 explicit_link_files = xcalloc (1, n_infiles);
ed1f651b 5520
e51712db 5521 for (i = 0; (int)i < n_infiles; i++)
ed1f651b
RS
5522 {
5523 register struct compiler *cp = 0;
5524 int this_file_error = 0;
5525
5526 /* Tell do_spec what to substitute for %i. */
5527
ed1f651b 5528 input_file_number = i;
512b62fb 5529 set_input (infiles[i].name);
ed1f651b
RS
5530
5531 /* Use the same thing in %o, unless cp->spec says otherwise. */
5532
5533 outfiles[i] = input_filename;
5534
5535 /* Figure out which compiler from the file's suffix. */
5536
5537 cp = lookup_compiler (infiles[i].name, input_filename_length,
5538 infiles[i].language);
5539
5540 if (cp)
5541 {
5542 /* Ok, we found an applicable compiler. Run its spec. */
5543 /* First say how much of input_filename to substitute for %b */
ec32609a 5544 int len;
ed1f651b 5545
4689ad58
RK
5546 if (cp->spec[0][0] == '#')
5547 error ("%s: %s compiler not installed on this system",
5548 input_filename, &cp->spec[0][1]);
5549
ec32609a 5550 len = 0;
058d8521
RS
5551 for (j = 0; j < sizeof cp->spec / sizeof cp->spec[0]; j++)
5552 if (cp->spec[j])
5553 len += strlen (cp->spec[j]);
ec32609a 5554
878f32c3
KG
5555 {
5556 char *p1 = (char *) xmalloc (len + 1);
5557
5558 len = 0;
5559 for (j = 0; j < sizeof cp->spec / sizeof cp->spec[0]; j++)
5560 if (cp->spec[j])
5561 {
5562 strcpy (p1 + len, cp->spec[j]);
5563 len += strlen (cp->spec[j]);
5564 }
5565
5566 value = do_spec (p1);
5567 free (p1);
5568 }
ed1f651b
RS
5569 if (value < 0)
5570 this_file_error = 1;
5571 }
5572
5573 /* If this file's name does not contain a recognized suffix,
5574 record it as explicit linker input. */
5575
5576 else
5577 explicit_link_files[i] = 1;
5578
5579 /* Clear the delete-on-failure queue, deleting the files in it
5580 if this compilation failed. */
5581
5582 if (this_file_error)
5583 {
5584 delete_failure_queue ();
5585 error_count++;
5586 }
5587 /* If this compilation succeeded, don't delete those files later. */
5588 clear_failure_queue ();
5589 }
5590
512b62fb
JM
5591 /* Reset the output file name to the first input file name, for use
5592 with %b in LINK_SPEC on a target that prefers not to emit a.out
5593 by default. */
5594 if (n_infiles > 0)
5595 set_input (infiles[0].name);
5596
15c5edb9
TT
5597 if (error_count == 0)
5598 {
5599 /* Make sure INPUT_FILE_NUMBER points to first available open
5600 slot. */
5601 input_file_number = n_infiles;
5602 if (lang_specific_pre_link ())
5603 error_count++;
5604 }
f271358e 5605
ed1f651b
RS
5606 /* Run ld to link all the compiler output files. */
5607
5608 if (error_count == 0)
5609 {
5610 int tmp = execution_count;
b3865ca9 5611
10da1131
BM
5612 /* We'll use ld if we can't find collect2. */
5613 if (! strcmp (linker_name_spec, "collect2"))
5614 {
5615 char *s = find_a_file (&exec_prefixes, "collect2", X_OK);
5616 if (s == NULL)
5617 linker_name_spec = "ld";
5618 }
b3865ca9
RS
5619 /* Rebuild the COMPILER_PATH and LIBRARY_PATH environment variables
5620 for collect. */
512b62fb
JM
5621 putenv_from_prefixes (&exec_prefixes, "COMPILER_PATH");
5622 putenv_from_prefixes (&startfile_prefixes, LIBRARY_PATH_ENV);
b3865ca9 5623
ed1f651b
RS
5624 value = do_spec (link_command_spec);
5625 if (value < 0)
5626 error_count = 1;
5627 linker_was_run = (tmp != execution_count);
5628 }
5629
5630 /* Warn if a -B option was specified but the prefix was never used. */
48ff801b
RK
5631 unused_prefix_warnings (&exec_prefixes);
5632 unused_prefix_warnings (&startfile_prefixes);
ed1f651b
RS
5633
5634 /* If options said don't run linker,
5635 complain about input files to be given to the linker. */
5636
5637 if (! linker_was_run && error_count == 0)
e51712db 5638 for (i = 0; (int)i < n_infiles; i++)
ed1f651b
RS
5639 if (explicit_link_files[i])
5640 error ("%s: linker input file unused since linking not done",
5641 outfiles[i]);
5642
5643 /* Delete some or all of the temporary files we made. */
5644
5645 if (error_count)
5646 delete_failure_queue ();
5647 delete_temp_files ();
5648
b8468bc7
NC
5649 if (print_help_list)
5650 {
5e4adfba 5651 printf (("\nFor bug reporting instructions, please see:\n"));
8b97e23b 5652 printf ("%s\n", GCCBUGURL);
b8468bc7
NC
5653 }
5654
14a774a9
RK
5655 return (signal_count != 0 ? 2
5656 : error_count > 0 ? (pass_exit_codes ? greatest_status : 1)
5657 : 0);
ed1f651b
RS
5658}
5659
5660/* Find the proper compilation spec for the file name NAME,
004fd4d5 5661 whose length is LENGTH. LANGUAGE is the specified language,
e5e809f4 5662 or 0 if this file is to be passed to the linker. */
ed1f651b
RS
5663
5664static struct compiler *
5665lookup_compiler (name, length, language)
878f32c3 5666 const char *name;
85066503 5667 size_t length;
878f32c3 5668 const char *language;
ed1f651b
RS
5669{
5670 struct compiler *cp;
5671
3ac63d94 5672 /* If this was specified by the user to be a linker input, indicate that. */
e5e809f4
JL
5673 if (language != 0 && language[0] == '*')
5674 return 0;
5675
5676 /* Otherwise, look for the language, if one is spec'd. */
ed1f651b
RS
5677 if (language != 0)
5678 {
5679 for (cp = compilers + n_compilers - 1; cp >= compilers; cp--)
e5e809f4
JL
5680 if (cp->suffix[0] == '@' && !strcmp (cp->suffix + 1, language))
5681 return cp;
5682
ed1f651b 5683 error ("language %s not recognized", language);
e5e809f4 5684 return 0;
ed1f651b
RS
5685 }
5686
5687 /* Look for a suffix. */
5688 for (cp = compilers + n_compilers - 1; cp >= compilers; cp--)
5689 {
4cf3301c
RS
5690 if (/* The suffix `-' matches only the file name `-'. */
5691 (!strcmp (cp->suffix, "-") && !strcmp (name, "-"))
e5e809f4
JL
5692 || (strlen (cp->suffix) < length
5693 /* See if the suffix matches the end of NAME. */
e5e809f4
JL
5694 && !strcmp (cp->suffix,
5695 name + length - strlen (cp->suffix))
e5e809f4 5696 ))
03bf1c28
MK
5697 break;
5698 }
e5e809f4 5699
03bf1c28
MK
5700#if defined (OS2) ||defined (HAVE_DOS_BASED_FILE_SYSTEM)
5701 /* look again, but case-insensitively this time. */
5702 if (cp < compilers)
5703 for (cp = compilers + n_compilers - 1; cp >= compilers; cp--)
5704 {
5705 if (/* The suffix `-' matches only the file name `-'. */
5706 (!strcmp (cp->suffix, "-") && !strcmp (name, "-"))
5707 || (strlen (cp->suffix) < length
5708 /* See if the suffix matches the end of NAME. */
5709 && ((!strcmp (cp->suffix,
5710 name + length - strlen (cp->suffix))
5711 || !strpbrk (cp->suffix, "ABCDEFGHIJKLMNOPQRSTUVWXYZ"))
5712 && !strcasecmp (cp->suffix,
5713 name + length - strlen (cp->suffix)))
5714 ))
5715 break;
5716 }
5717#endif
5718
5719
5720 if (cp >= compilers)
5721 {
5722 if (cp->spec[0][0] == '@')
5723 {
5724 struct compiler *new;
5725
5726 /* An alias entry maps a suffix to a language.
5727 Search for the language; pass 0 for NAME and LENGTH
5728 to avoid infinite recursion if language not found.
5729 Construct the new compiler spec. */
5730 language = cp->spec[0] + 1;
5731 new = (struct compiler *) xmalloc (sizeof (struct compiler));
5732 new->suffix = cp->suffix;
5733 memcpy (new->spec,
5734 lookup_compiler (NULL_PTR, 0, language)->spec,
5735 sizeof new->spec);
5736 return new;
ed1f651b 5737 }
03bf1c28
MK
5738
5739 /* A non-alias entry: return it. */
5740 return cp;
ed1f651b
RS
5741 }
5742
5743 return 0;
5744}
5745\f
ed1f651b
RS
5746static char *
5747save_string (s, len)
460ee112
KG
5748 const char *s;
5749 int len;
ed1f651b
RS
5750{
5751 register char *result = xmalloc (len + 1);
5752
5753 bcopy (s, result, len);
5754 result[len] = 0;
5755 return result;
5756}
5757
5758static void
5759pfatal_with_name (name)
878f32c3 5760 const char *name;
ed1f651b 5761{
ab87f8c8
JL
5762 perror_with_name (name);
5763 delete_temp_files ();
5764 exit (1);
ed1f651b
RS
5765}
5766
5767static void
5768perror_with_name (name)
878f32c3 5769 const char *name;
ed1f651b 5770{
ed35cf6e 5771 error ("%s: %s", name, xstrerror (errno));
ed1f651b
RS
5772}
5773
5774static void
c10d53dd 5775pfatal_pexecute (errmsg_fmt, errmsg_arg)
878f32c3
KG
5776 const char *errmsg_fmt;
5777 const char *errmsg_arg;
ed1f651b 5778{
c10d53dd
DE
5779 if (errmsg_arg)
5780 {
ab87f8c8
JL
5781 int save_errno = errno;
5782
c10d53dd
DE
5783 /* Space for trailing '\0' is in %s. */
5784 char *msg = xmalloc (strlen (errmsg_fmt) + strlen (errmsg_arg));
5785 sprintf (msg, errmsg_fmt, errmsg_arg);
5786 errmsg_fmt = msg;
ab87f8c8
JL
5787
5788 errno = save_errno;
c10d53dd
DE
5789 }
5790
ab87f8c8 5791 pfatal_with_name (errmsg_fmt);
ed1f651b
RS
5792}
5793
03c41c05 5794/* Output an error message and exit */
ed1f651b
RS
5795
5796void
5797fancy_abort ()
5798{
5799 fatal ("Internal gcc abort.");
5800}
5801\f
ed1f651b
RS
5802/* Output an error message and exit */
5803
9257393c 5804void
711d877c 5805fatal VPARAMS ((const char *msgid, ...))
ed1f651b 5806{
5148a72b 5807#ifndef ANSI_PROTOTYPES
878f32c3 5808 const char *msgid;
4f90e4a0
RK
5809#endif
5810 va_list ap;
5811
ab87f8c8 5812 VA_START (ap, msgid);
4f90e4a0 5813
5148a72b 5814#ifndef ANSI_PROTOTYPES
878f32c3 5815 msgid = va_arg (ap, const char *);
4f90e4a0 5816#endif
ed1f651b 5817
ed1f651b 5818 fprintf (stderr, "%s: ", programname);
ab87f8c8 5819 vfprintf (stderr, _(msgid), ap);
ed1f651b
RS
5820 va_end (ap);
5821 fprintf (stderr, "\n");
5822 delete_temp_files ();
5823 exit (1);
5824}
5825
5826static void
711d877c 5827error VPARAMS ((const char *msgid, ...))
ed1f651b 5828{
5148a72b 5829#ifndef ANSI_PROTOTYPES
878f32c3 5830 const char *msgid;
4f90e4a0
RK
5831#endif
5832 va_list ap;
5833
ab87f8c8 5834 VA_START (ap, msgid);
4f90e4a0 5835
5148a72b 5836#ifndef ANSI_PROTOTYPES
878f32c3 5837 msgid = va_arg (ap, const char *);
4f90e4a0 5838#endif
ed1f651b 5839
ed1f651b 5840 fprintf (stderr, "%s: ", programname);
ab87f8c8 5841 vfprintf (stderr, _(msgid), ap);
ed1f651b
RS
5842 va_end (ap);
5843
5844 fprintf (stderr, "\n");
5845}
ab87f8c8
JL
5846
5847static void
711d877c 5848notice VPARAMS ((const char *msgid, ...))
ab87f8c8
JL
5849{
5850#ifndef ANSI_PROTOTYPES
878f32c3 5851 const char *msgid;
ab87f8c8
JL
5852#endif
5853 va_list ap;
5854
5855 VA_START (ap, msgid);
5856
5857#ifndef ANSI_PROTOTYPES
878f32c3 5858 msgid = va_arg (ap, const char *);
ab87f8c8
JL
5859#endif
5860
5861 vfprintf (stderr, _(msgid), ap);
5862 va_end (ap);
5863}
5864
ed1f651b
RS
5865\f
5866static void
5867validate_all_switches ()
5868{
5869 struct compiler *comp;
878f32c3 5870 register const char *p;
ed1f651b 5871 register char c;
b3865ca9 5872 struct spec_list *spec;
ed1f651b 5873
ec32609a 5874 for (comp = compilers; comp->spec[0]; comp++)
ed1f651b 5875 {
85066503 5876 size_t i;
20eec2c2 5877 for (i = 0; i < sizeof comp->spec / sizeof comp->spec[0] && comp->spec[i]; i++)
ec32609a
RS
5878 {
5879 p = comp->spec[i];
ededb2fc 5880 while ((c = *p++))
ec32609a
RS
5881 if (c == '%' && *p == '{')
5882 /* We have a switch spec. */
5883 validate_switches (p + 1);
5884 }
ed1f651b
RS
5885 }
5886
3ac63d94 5887 /* Look through the linked list of specs read from the specs file. */
ec32609a 5888 for (spec = specs; spec ; spec = spec->next)
b3865ca9 5889 {
79aff5ac 5890 p = *(spec->ptr_spec);
ededb2fc 5891 while ((c = *p++))
b3865ca9
RS
5892 if (c == '%' && *p == '{')
5893 /* We have a switch spec. */
5894 validate_switches (p + 1);
5895 }
5896
ed1f651b 5897 p = link_command_spec;
ededb2fc 5898 while ((c = *p++))
ed1f651b
RS
5899 if (c == '%' && *p == '{')
5900 /* We have a switch spec. */
5901 validate_switches (p + 1);
ed1f651b
RS
5902}
5903
5904/* Look at the switch-name that comes after START
5905 and mark as valid all supplied switches that match it. */
5906
5907static void
5908validate_switches (start)
878f32c3 5909 const char *start;
ed1f651b 5910{
878f32c3
KG
5911 register const char *p = start;
5912 const char *filter;
ed1f651b
RS
5913 register int i;
5914 int suffix = 0;
5915
5916 if (*p == '|')
5917 ++p;
5918
5919 if (*p == '!')
5920 ++p;
5921
5922 if (*p == '.')
5923 suffix = 1, ++p;
5924
5925 filter = p;
5926 while (*p != ':' && *p != '}') p++;
5927
5928 if (suffix)
5929 ;
5930 else if (p[-1] == '*')
5931 {
5932 /* Mark all matching switches as valid. */
5933 --p;
5934 for (i = 0; i < n_switches; i++)
5935 if (!strncmp (switches[i].part1, filter, p - filter))
ab87f8c8 5936 switches[i].validated = 1;
ed1f651b
RS
5937 }
5938 else
5939 {
5940 /* Mark an exact matching switch as valid. */
5941 for (i = 0; i < n_switches; i++)
5942 {
5943 if (!strncmp (switches[i].part1, filter, p - filter)
5944 && switches[i].part1[p - filter] == 0)
ab87f8c8 5945 switches[i].validated = 1;
ed1f651b
RS
5946 }
5947 }
5948}
60103a34 5949\f
961b7009 5950/* Check whether a particular argument was used. The first time we
956d6950 5951 canonicalize the switches to keep only the ones we care about. */
60103a34
DE
5952
5953static int
5954used_arg (p, len)
878f32c3 5955 const char *p;
60103a34
DE
5956 int len;
5957{
3ac63d94
NC
5958 struct mswitchstr
5959 {
3b304f5b
ZW
5960 const char *str;
5961 const char *replace;
961b7009
MM
5962 int len;
5963 int rep_len;
5964 };
5965
5966 static struct mswitchstr *mswitches;
5967 static int n_mswitches;
5968 int i, j;
5969
5970 if (!mswitches)
5971 {
5972 struct mswitchstr *matches;
3b304f5b 5973 const char *q;
c8c2dcdc 5974 int cnt = 0;
961b7009
MM
5975
5976 /* Break multilib_matches into the component strings of string and replacement
3ac63d94 5977 string. */
1a0bdd29
RK
5978 for (q = multilib_matches; *q != '\0'; q++)
5979 if (*q == ';')
961b7009
MM
5980 cnt++;
5981
5982 matches = (struct mswitchstr *) alloca ((sizeof (struct mswitchstr)) * cnt);
5983 i = 0;
5984 q = multilib_matches;
5985 while (*q != '\0')
5986 {
5987 matches[i].str = q;
5988 while (*q != ' ')
5989 {
5990 if (*q == '\0')
5991 abort ();
5992 q++;
5993 }
961b7009 5994 matches[i].len = q - matches[i].str;
60103a34 5995
961b7009
MM
5996 matches[i].replace = ++q;
5997 while (*q != ';' && *q != '\0')
5998 {
5999 if (*q == ' ')
6000 abort ();
6001 q++;
6002 }
6003 matches[i].rep_len = q - matches[i].replace;
6004 i++;
83a0c799
ZW
6005 if (*q == ';')
6006 q++;
961b7009 6007 }
60103a34 6008
71591a1d
JW
6009 /* Now build a list of the replacement string for switches that we care
6010 about. Make sure we allocate at least one entry. This prevents
6011 xmalloc from calling fatal, and prevents us from re-executing this
6012 block of code. */
6013 mswitches
6014 = (struct mswitchstr *) xmalloc ((sizeof (struct mswitchstr))
6015 * (n_switches ? n_switches : 1));
961b7009
MM
6016 for (i = 0; i < n_switches; i++)
6017 {
6018 int xlen = strlen (switches[i].part1);
6019 for (j = 0; j < cnt; j++)
3b304f5b
ZW
6020 if (xlen == matches[j].len
6021 && ! strncmp (switches[i].part1, matches[j].str, xlen))
961b7009
MM
6022 {
6023 mswitches[n_mswitches].str = matches[j].replace;
6024 mswitches[n_mswitches].len = matches[j].rep_len;
6025 mswitches[n_mswitches].replace = (char *)0;
6026 mswitches[n_mswitches].rep_len = 0;
6027 n_mswitches++;
6028 break;
6029 }
6030 }
6031 }
03c42484 6032
961b7009
MM
6033 for (i = 0; i < n_mswitches; i++)
6034 if (len == mswitches[i].len && ! strncmp (p, mswitches[i].str, len))
6035 return 1;
03c42484 6036
961b7009
MM
6037 return 0;
6038}
03c42484
RK
6039
6040static int
6041default_arg (p, len)
878f32c3 6042 const char *p;
03c42484
RK
6043 int len;
6044{
3b304f5b 6045 const char *start, *end;
03c42484 6046
961b7009
MM
6047 for (start = multilib_defaults; *start != '\0'; start = end+1)
6048 {
6049 while (*start == ' ' || *start == '\t')
6050 start++;
6051
6052 if (*start == '\0')
6053 break;
6054
6055 for (end = start+1; *end != ' ' && *end != '\t' && *end != '\0'; end++)
6056 ;
6057
6058 if ((end - start) == len && strncmp (p, start, len) == 0)
6059 return 1;
e29ef920
MM
6060
6061 if (*end == '\0')
6062 break;
961b7009 6063 }
03c42484
RK
6064
6065 return 0;
6066}
6067
0a8d6618
BC
6068/* Work out the subdirectory to use based on the options. The format of
6069 multilib_select is a list of elements. Each element is a subdirectory
6070 name followed by a list of options followed by a semicolon. The format
6071 of multilib_exclusions is the same, but without the preceding
6072 directory. First gcc will check the exclusions, if none of the options
6073 beginning with an exclamation point are present, and all of the other
6074 options are present, then we will ignore this completely. Passing
6075 that, gcc will consider each multilib_select in turn using the same
6076 rules for matching the options. If a match is found, that subdirectory
6077 will be used. */
60103a34
DE
6078
6079static void
6080set_multilib_dir ()
6081{
3b304f5b 6082 const char *p;
3ac63d94 6083 unsigned int this_path_len;
3b304f5b 6084 const char *this_path, *this_arg;
03c42484
RK
6085 int not_arg;
6086 int ok;
60103a34 6087
0a8d6618
BC
6088 p = multilib_exclusions;
6089 while (*p != '\0')
6090 {
6091 /* Ignore newlines. */
6092 if (*p == '\n')
6093 {
6094 ++p;
6095 continue;
6096 }
6097
6098 /* Check the arguments. */
6099 ok = 1;
6100 while (*p != ';')
6101 {
6102 if (*p == '\0')
6103 abort ();
6104
6105 if (! ok)
6106 {
6107 ++p;
6108 continue;
6109 }
6110
6111 this_arg = p;
6112 while (*p != ' ' && *p != ';')
6113 {
6114 if (*p == '\0')
6115 abort ();
6116 ++p;
6117 }
6118
6119 if (*this_arg != '!')
6120 not_arg = 0;
6121 else
6122 {
6123 not_arg = 1;
6124 ++this_arg;
6125 }
6126
6127 ok = used_arg (this_arg, p - this_arg);
6128 if (not_arg)
6129 ok = ! ok;
6130
6131 if (*p == ' ')
6132 ++p;
6133 }
6134
6135 if (ok)
3ac63d94 6136 return;
0a8d6618
BC
6137
6138 ++p;
6139 }
6140
6141 p = multilib_select;
60103a34
DE
6142 while (*p != '\0')
6143 {
6144 /* Ignore newlines. */
6145 if (*p == '\n')
6146 {
6147 ++p;
6148 continue;
6149 }
6150
6151 /* Get the initial path. */
6152 this_path = p;
6153 while (*p != ' ')
6154 {
6155 if (*p == '\0')
6156 abort ();
6157 ++p;
6158 }
6159 this_path_len = p - this_path;
6160
6161 /* Check the arguments. */
03c42484 6162 ok = 1;
60103a34
DE
6163 ++p;
6164 while (*p != ';')
6165 {
6166 if (*p == '\0')
6167 abort ();
6168
03c42484 6169 if (! ok)
60103a34
DE
6170 {
6171 ++p;
6172 continue;
6173 }
6174
6175 this_arg = p;
6176 while (*p != ' ' && *p != ';')
6177 {
6178 if (*p == '\0')
6179 abort ();
6180 ++p;
6181 }
6182
03c42484
RK
6183 if (*this_arg != '!')
6184 not_arg = 0;
60103a34 6185 else
03c42484
RK
6186 {
6187 not_arg = 1;
6188 ++this_arg;
6189 }
6190
6191 /* If this is a default argument, we can just ignore it.
6192 This is true even if this_arg begins with '!'. Beginning
6193 with '!' does not mean that this argument is necessarily
6194 inappropriate for this library: it merely means that
6195 there is a more specific library which uses this
6196 argument. If this argument is a default, we need not
6197 consider that more specific library. */
6198 if (! default_arg (this_arg, p - this_arg))
6199 {
6200 ok = used_arg (this_arg, p - this_arg);
6201 if (not_arg)
6202 ok = ! ok;
6203 }
60103a34
DE
6204
6205 if (*p == ' ')
6206 ++p;
6207 }
6208
03c42484 6209 if (ok)
60103a34
DE
6210 {
6211 if (this_path_len != 1
6212 || this_path[0] != '.')
6213 {
878f32c3
KG
6214 char * new_multilib_dir = xmalloc (this_path_len + 1);
6215 strncpy (new_multilib_dir, this_path, this_path_len);
6216 new_multilib_dir[this_path_len] = '\0';
6217 multilib_dir = new_multilib_dir;
60103a34
DE
6218 }
6219 break;
6220 }
6221
6222 ++p;
6223 }
6224}
6225
6226/* Print out the multiple library subdirectory selection
6227 information. This prints out a series of lines. Each line looks
6228 like SUBDIRECTORY;@OPTION@OPTION, with as many options as is
6229 required. Only the desired options are printed out, the negative
6230 matches. The options are print without a leading dash. There are
6231 no spaces to make it easy to use the information in the shell.
6232 Each subdirectory is printed only once. This assumes the ordering
0a8d6618
BC
6233 generated by the genmultilib script. Also, we leave out ones that match
6234 the exclusions. */
60103a34
DE
6235
6236static void
6237print_multilib_info ()
6238{
3b304f5b
ZW
6239 const char *p = multilib_select;
6240 const char *last_path = 0, *this_path;
03c42484 6241 int skip;
3ac63d94 6242 unsigned int last_path_len = 0;
60103a34
DE
6243
6244 while (*p != '\0')
6245 {
0a8d6618 6246 skip = 0;
60103a34
DE
6247 /* Ignore newlines. */
6248 if (*p == '\n')
6249 {
6250 ++p;
6251 continue;
6252 }
6253
6254 /* Get the initial path. */
6255 this_path = p;
6256 while (*p != ' ')
6257 {
6258 if (*p == '\0')
6259 abort ();
6260 ++p;
6261 }
6262
0a8d6618
BC
6263 /* Check for matches with the multilib_exclusions. We don't bother
6264 with the '!' in either list. If any of the exclusion rules match
6265 all of its options with the select rule, we skip it. */
6266 {
3b304f5b
ZW
6267 const char *e = multilib_exclusions;
6268 const char *this_arg;
0a8d6618
BC
6269
6270 while (*e != '\0')
6271 {
6272 int m = 1;
6273 /* Ignore newlines. */
6274 if (*e == '\n')
6275 {
6276 ++e;
6277 continue;
6278 }
6279
6280 /* Check the arguments. */
6281 while (*e != ';')
6282 {
3b304f5b 6283 const char *q;
0a8d6618
BC
6284 int mp = 0;
6285
6286 if (*e == '\0')
6287 abort ();
6288
6289 if (! m)
6290 {
6291 ++e;
6292 continue;
6293 }
6294
6295 this_arg = e;
6296
6297 while (*e != ' ' && *e != ';')
6298 {
6299 if (*e == '\0')
6300 abort ();
6301 ++e;
6302 }
6303
6304 q = p + 1;
6305 while (*q != ';')
6306 {
3b304f5b 6307 const char *arg;
0a8d6618
BC
6308 int len = e - this_arg;
6309
6310 if (*q == '\0')
6311 abort ();
6312
6313 arg = q;
6314
6315 while (*q != ' ' && *q != ';')
6316 {
6317 if (*q == '\0')
6318 abort ();
6319 ++q;
6320 }
6321
3ac63d94
NC
6322 if (! strncmp (arg, this_arg, (len < q - arg) ? q - arg : len) ||
6323 default_arg (this_arg, e - this_arg))
0a8d6618
BC
6324 {
6325 mp = 1;
6326 break;
6327 }
6328
6329 if (*q == ' ')
6330 ++q;
0a8d6618
BC
6331 }
6332
6333 if (! mp)
6334 m = 0;
6335
6336 if (*e == ' ')
6337 ++e;
6338 }
3ac63d94 6339
0a8d6618
BC
6340 if (m)
6341 {
6342 skip = 1;
6343 break;
6344 }
6345
6346 if (*e != '\0')
6347 ++e;
6348 }
6349 }
6350
6351 if (! skip)
6352 {
6353 /* If this is a duplicate, skip it. */
3ac63d94 6354 skip = (last_path != 0 && (unsigned int)(p - this_path) == last_path_len
0a8d6618 6355 && ! strncmp (last_path, this_path, last_path_len));
60103a34 6356
0a8d6618
BC
6357 last_path = this_path;
6358 last_path_len = p - this_path;
6359 }
60103a34 6360
03c42484
RK
6361 /* If this directory requires any default arguments, we can skip
6362 it. We will already have printed a directory identical to
6363 this one which does not require that default argument. */
6364 if (! skip)
6365 {
3b304f5b 6366 const char *q;
03c42484
RK
6367
6368 q = p + 1;
6369 while (*q != ';')
6370 {
3b304f5b 6371 const char *arg;
03c42484
RK
6372
6373 if (*q == '\0')
6374 abort ();
6375
6376 if (*q == '!')
6377 arg = NULL;
6378 else
6379 arg = q;
6380
6381 while (*q != ' ' && *q != ';')
6382 {
6383 if (*q == '\0')
6384 abort ();
6385 ++q;
6386 }
6387
6388 if (arg != NULL
6389 && default_arg (arg, q - arg))
6390 {
6391 skip = 1;
6392 break;
6393 }
6394
6395 if (*q == ' ')
6396 ++q;
6397 }
6398 }
6399
60103a34
DE
6400 if (! skip)
6401 {
3b304f5b 6402 const char *p1;
60103a34
DE
6403
6404 for (p1 = last_path; p1 < p; p1++)
6405 putchar (*p1);
6406 putchar (';');
6407 }
6408
6409 ++p;
6410 while (*p != ';')
6411 {
6412 int use_arg;
6413
6414 if (*p == '\0')
6415 abort ();
6416
6417 if (skip)
6418 {
6419 ++p;
6420 continue;
6421 }
6422
6423 use_arg = *p != '!';
6424
6425 if (use_arg)
6426 putchar ('@');
6427
6428 while (*p != ' ' && *p != ';')
6429 {
6430 if (*p == '\0')
6431 abort ();
6432 if (use_arg)
6433 putchar (*p);
6434 ++p;
6435 }
6436
6437 if (*p == ' ')
6438 ++p;
6439 }
6440
6441 if (! skip)
961b7009 6442 {
3ac63d94 6443 /* If there are extra options, print them now. */
961b7009
MM
6444 if (multilib_extra && *multilib_extra)
6445 {
6446 int print_at = TRUE;
3b304f5b 6447 const char *q;
961b7009
MM
6448
6449 for (q = multilib_extra; *q != '\0'; q++)
6450 {
6451 if (*q == ' ')
6452 print_at = TRUE;
6453 else
6454 {
6455 if (print_at)
6456 putchar ('@');
6457 putchar (*q);
6458 print_at = FALSE;
6459 }
6460 }
6461 }
3ac63d94 6462
961b7009
MM
6463 putchar ('\n');
6464 }
60103a34
DE
6465
6466 ++p;
6467 }
6468}