]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/gcc.c
* i386-interix.h (STRIP_NAME_ENCODING): Declare _new_name properly.
[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{
2807 printf ("Usage: %s [options] file...\n", programname);
2808 printf ("Options:\n");
2809
14a774a9 2810 printf (" -pass-exit-codes Exit with highest error code from a phase\n");
b8468bc7
NC
2811 printf (" --help Display this information\n");
2812 if (! verbose_flag)
2813 printf (" (Use '-v --help' to display command line options of sub-processes)\n");
2814 printf (" -dumpspecs Display all of the built in spec strings\n");
2815 printf (" -dumpversion Display the version of the compiler\n");
2816 printf (" -dumpmachine Display the compiler's target processor\n");
2817 printf (" -print-search-dirs Display the directories in the compiler's search path\n");
2818 printf (" -print-libgcc-file-name Display the name of the compiler's companion library\n");
2819 printf (" -print-file-name=<lib> Display the full path to library <lib>\n");
2820 printf (" -print-prog-name=<prog> Display the full path to compiler component <prog>\n");
2821 printf (" -print-multi-directory Display the root directory for versions of libgcc\n");
2822 printf (" -print-multi-lib Display the mapping between command line options and\n");
2823 printf (" multiple library search directories\n");
40f943dd
NC
2824 printf (" -Wa,<options> Pass comma-separated <options> on to the assembler\n");
2825 printf (" -Wp,<options> Pass comma-separated <options> on to the preprocessor\n");
2826 printf (" -Wl,<options> Pass comma-separated <options> on to the linker\n");
b8468bc7
NC
2827 printf (" -Xlinker <arg> Pass <arg> on to the linker\n");
2828 printf (" -save-temps Do not delete intermediate files\n");
2829 printf (" -pipe Use pipes rather than intermediate files\n");
03c41c05 2830 printf (" -time Time the execution of each subprocess\n");
b8468bc7 2831 printf (" -specs=<file> Override builtin specs with the contents of <file>\n");
6f4d7222 2832 printf (" -std=<standard> Assume that the input sources are for <standard>\n");
b8468bc7
NC
2833 printf (" -B <directory> Add <directory> to the compiler's search paths\n");
2834 printf (" -b <machine> Run gcc for target <machine>, if installed\n");
2835 printf (" -V <version> Run gcc version number <version>, if installed\n");
2836 printf (" -v Display the programs invoked by the compiler\n");
2837 printf (" -E Preprocess only; do not compile, assemble or link\n");
2838 printf (" -S Compile only; do not assemble or link\n");
2839 printf (" -c Compile and assemble, but do not link\n");
2840 printf (" -o <file> Place the output into <file>\n");
40f943dd 2841 printf (" -x <language> Specify the language of the following input files\n");
b8468bc7
NC
2842 printf (" Permissable languages include: c c++ assembler none\n");
2843 printf (" 'none' means revert to the default behaviour of\n");
2844 printf (" guessing the language based on the file's extension\n");
2845
2846 printf ("\nOptions starting with -g, -f, -m, -O or -W are automatically passed on to\n");
2847 printf ("the various sub-processes invoked by %s. In order to pass other options\n",
2848 programname);
2849 printf ("on to these processes the -W<letter> options must be used.\n");
2850
2851 /* The rest of the options are displayed by invocations of the various
2852 sub-processes. */
2853}
2854
40f943dd
NC
2855static void
2856add_preprocessor_option (option, len)
878f32c3
KG
2857 const char * option;
2858 int len;
40f943dd 2859{
878f32c3 2860 n_preprocessor_options++;
40f943dd 2861
878f32c3
KG
2862 if (! preprocessor_options)
2863 preprocessor_options
2864 = (char **) xmalloc (n_preprocessor_options * sizeof (char *));
2865 else
2866 preprocessor_options
2867 = (char **) xrealloc (preprocessor_options,
2868 n_preprocessor_options * sizeof (char *));
40f943dd 2869
878f32c3
KG
2870 preprocessor_options [n_preprocessor_options - 1] =
2871 save_string (option, len);
40f943dd
NC
2872}
2873
2874static void
2875add_assembler_option (option, len)
878f32c3
KG
2876 const char * option;
2877 int len;
2878{
2879 n_assembler_options++;
2880
2881 if (! assembler_options)
2882 assembler_options
2883 = (char **) xmalloc (n_assembler_options * sizeof (char *));
2884 else
2885 assembler_options
2886 = (char **) xrealloc (assembler_options,
2887 n_assembler_options * sizeof (char *));
2888
2889 assembler_options [n_assembler_options - 1] = save_string (option, len);
b8468bc7 2890}
b8468bc7 2891
40f943dd
NC
2892static void
2893add_linker_option (option, len)
878f32c3
KG
2894 const char * option;
2895 int len;
2896{
2897 n_linker_options++;
2898
2899 if (! linker_options)
2900 linker_options
2901 = (char **) xmalloc (n_linker_options * sizeof (char *));
2902 else
2903 linker_options
2904 = (char **) xrealloc (linker_options,
2905 n_linker_options * sizeof (char *));
2906
2907 linker_options [n_linker_options - 1] = save_string (option, len);
40f943dd 2908}
853e0b2d 2909\f
ed1f651b
RS
2910/* Create the vector `switches' and its contents.
2911 Store its length in `n_switches'. */
2912
2913static void
2914process_command (argc, argv)
2915 int argc;
fbd40359 2916 const char **argv;
ed1f651b
RS
2917{
2918 register int i;
878f32c3
KG
2919 const char *temp;
2920 char *temp1;
fbd40359 2921 const char *spec_lang = 0;
ed1f651b 2922 int last_language_n_infiles;
f2cf3e1e
RK
2923 int have_c = 0;
2924 int have_o = 0;
3a265431 2925 int lang_n_infiles = 0;
ed1f651b 2926
2325c774 2927 GET_ENV_PATH_LIST (gcc_exec_prefix, "GCC_EXEC_PREFIX");
8eebb258 2928
ed1f651b
RS
2929 n_switches = 0;
2930 n_infiles = 0;
a2a05b0a 2931 added_libraries = 0;
2484b6d2 2932
53117a2f
RK
2933 /* Figure compiler version from version string. */
2934
ad85216e
KG
2935 compiler_version = temp1 = xstrdup (version_string);
2936
878f32c3 2937 for (; *temp1; ++temp1)
53117a2f 2938 {
878f32c3 2939 if (*temp1 == ' ')
53117a2f 2940 {
878f32c3 2941 *temp1 = '\0';
53117a2f
RK
2942 break;
2943 }
2944 }
ed1f651b 2945
0deb20df
TT
2946 /* Set up the default search paths. If there is no GCC_EXEC_PREFIX,
2947 see if we can create it from the pathname specified in argv[0]. */
2948
2949#ifndef VMS
2950 /* FIXME: make_relative_prefix doesn't yet work for VMS. */
2951 if (!gcc_exec_prefix)
2952 {
2953 gcc_exec_prefix = make_relative_prefix (argv[0], standard_bindir_prefix,
2954 standard_exec_prefix);
2955 if (gcc_exec_prefix)
2956 putenv (concat ("GCC_EXEC_PREFIX=", gcc_exec_prefix, NULL_PTR));
2957 }
2958#endif
ed1f651b 2959
8eebb258 2960 if (gcc_exec_prefix)
ed1f651b 2961 {
6ed4bb9a 2962 int len = strlen (gcc_exec_prefix);
e51712db 2963 if (len > (int) sizeof ("/lib/gcc-lib/")-1
509781a4 2964 && (IS_DIR_SEPARATOR (gcc_exec_prefix[len-1])))
6ed4bb9a
MM
2965 {
2966 temp = gcc_exec_prefix + len - sizeof ("/lib/gcc-lib/") + 1;
509781a4 2967 if (IS_DIR_SEPARATOR (*temp)
6ed4bb9a 2968 && strncmp (temp+1, "lib", 3) == 0
509781a4 2969 && IS_DIR_SEPARATOR (temp[4])
6ed4bb9a
MM
2970 && strncmp (temp+5, "gcc-lib", 7) == 0)
2971 len -= sizeof ("/lib/gcc-lib/") - 1;
2972 }
2973
2974 set_std_prefix (gcc_exec_prefix, len);
e9a25f70
JL
2975 add_prefix (&exec_prefixes, gcc_exec_prefix, "GCC", 0, 0, NULL_PTR);
2976 add_prefix (&startfile_prefixes, gcc_exec_prefix, "GCC", 0, 0, NULL_PTR);
ed1f651b
RS
2977 }
2978
2979 /* COMPILER_PATH and LIBRARY_PATH have values
2980 that are lists of directory names with colons. */
2981
b2a1e458 2982 GET_ENV_PATH_LIST (temp, "COMPILER_PATH");
ed1f651b
RS
2983 if (temp)
2984 {
878f32c3 2985 const char *startp, *endp;
ed1f651b
RS
2986 char *nstore = (char *) alloca (strlen (temp) + 3);
2987
2988 startp = endp = temp;
2989 while (1)
2990 {
f6ec7e54 2991 if (*endp == PATH_SEPARATOR || *endp == 0)
ed1f651b
RS
2992 {
2993 strncpy (nstore, startp, endp-startp);
2994 if (endp == startp)
6aa62cff 2995 strcpy (nstore, concat (".", dir_separator_str, NULL_PTR));
509781a4 2996 else if (!IS_DIR_SEPARATOR (endp[-1]))
ed1f651b 2997 {
48ff801b 2998 nstore[endp-startp] = DIR_SEPARATOR;
ed1f651b
RS
2999 nstore[endp-startp+1] = 0;
3000 }
3001 else
3002 nstore[endp-startp] = 0;
e9a25f70 3003 add_prefix (&exec_prefixes, nstore, 0, 0, 0, NULL_PTR);
aa32d841
JL
3004 add_prefix (&include_prefixes,
3005 concat (nstore, "include", NULL_PTR),
e9a25f70 3006 0, 0, 0, NULL_PTR);
ed1f651b
RS
3007 if (*endp == 0)
3008 break;
3009 endp = startp = endp + 1;
3010 }
3011 else
3012 endp++;
3013 }
3014 }
3015
512b62fb 3016 GET_ENV_PATH_LIST (temp, LIBRARY_PATH_ENV);
fcc9ad83 3017 if (temp && *cross_compile == '0')
ed1f651b 3018 {
878f32c3 3019 const char *startp, *endp;
ed1f651b
RS
3020 char *nstore = (char *) alloca (strlen (temp) + 3);
3021
3022 startp = endp = temp;
3023 while (1)
3024 {
f6ec7e54 3025 if (*endp == PATH_SEPARATOR || *endp == 0)
ed1f651b
RS
3026 {
3027 strncpy (nstore, startp, endp-startp);
3028 if (endp == startp)
6aa62cff 3029 strcpy (nstore, concat (".", dir_separator_str, NULL_PTR));
509781a4 3030 else if (!IS_DIR_SEPARATOR (endp[-1]))
ed1f651b 3031 {
48ff801b 3032 nstore[endp-startp] = DIR_SEPARATOR;
ed1f651b
RS
3033 nstore[endp-startp+1] = 0;
3034 }
3035 else
3036 nstore[endp-startp] = 0;
e9a25f70
JL
3037 add_prefix (&startfile_prefixes, nstore, NULL_PTR,
3038 0, 0, NULL_PTR);
ed1f651b
RS
3039 if (*endp == 0)
3040 break;
3041 endp = startp = endp + 1;
3042 }
3043 else
3044 endp++;
3045 }
3046 }
3047
3048 /* Use LPATH like LIBRARY_PATH (for the CMU build program). */
b2a1e458 3049 GET_ENV_PATH_LIST (temp, "LPATH");
fcc9ad83 3050 if (temp && *cross_compile == '0')
ed1f651b 3051 {
878f32c3 3052 const char *startp, *endp;
ed1f651b
RS
3053 char *nstore = (char *) alloca (strlen (temp) + 3);
3054
3055 startp = endp = temp;
3056 while (1)
3057 {
f6ec7e54 3058 if (*endp == PATH_SEPARATOR || *endp == 0)
ed1f651b
RS
3059 {
3060 strncpy (nstore, startp, endp-startp);
3061 if (endp == startp)
6aa62cff 3062 strcpy (nstore, concat (".", dir_separator_str, NULL_PTR));
509781a4 3063 else if (!IS_DIR_SEPARATOR (endp[-1]))
ed1f651b 3064 {
48ff801b 3065 nstore[endp-startp] = DIR_SEPARATOR;
ed1f651b
RS
3066 nstore[endp-startp+1] = 0;
3067 }
3068 else
3069 nstore[endp-startp] = 0;
e9a25f70
JL
3070 add_prefix (&startfile_prefixes, nstore, NULL_PTR,
3071 0, 0, NULL_PTR);
ed1f651b
RS
3072 if (*endp == 0)
3073 break;
3074 endp = startp = endp + 1;
3075 }
3076 else
3077 endp++;
3078 }
3079 }
3080
f2faf549
RS
3081 /* Convert new-style -- options to old-style. */
3082 translate_options (&argc, &argv);
3083
610c62ac 3084 /* Do language-specific adjustment/addition of flags. */
9257393c 3085 lang_specific_driver (&argc, &argv, &added_libraries);
610c62ac 3086
ed1f651b
RS
3087 /* Scan argv twice. Here, the first time, just count how many switches
3088 there will be in their vector, and how many input files in theirs.
3089 Here we also parse the switches that cc itself uses (e.g. -v). */
3090
3091 for (i = 1; i < argc; i++)
3092 {
3093 if (! strcmp (argv[i], "-dumpspecs"))
3094 {
79aff5ac 3095 struct spec_list *sl;
03fc1620 3096 init_spec ();
79aff5ac
MM
3097 for (sl = specs; sl; sl = sl->next)
3098 printf ("*%s:\n%s\n\n", sl->name, *(sl->ptr_spec));
e4175312
ME
3099 if (link_command_spec)
3100 printf ("*link_command:\n%s\n\n", link_command_spec);
ed1f651b
RS
3101 exit (0);
3102 }
3103 else if (! strcmp (argv[i], "-dumpversion"))
3104 {
e5e809f4 3105 printf ("%s\n", spec_version);
ed1f651b
RS
3106 exit (0);
3107 }
9b783fc9
RK
3108 else if (! strcmp (argv[i], "-dumpmachine"))
3109 {
3110 printf ("%s\n", spec_machine);
3111 exit (0);
3112 }
b8468bc7
NC
3113 else if (strcmp (argv[i], "-fhelp") == 0)
3114 {
3115 /* translate_options () has turned --help into -fhelp. */
3116 print_help_list = 1;
3117
3118 /* We will be passing a dummy file on to the sub-processes. */
3119 n_infiles++;
3120 n_switches++;
3121
3122 add_preprocessor_option ("--help", 6);
3123 add_assembler_option ("--help", 6);
3124 add_linker_option ("--help", 6);
3125 }
14a774a9
RK
3126 else if (! strcmp (argv[i], "-pass-exit-codes"))
3127 {
3128 pass_exit_codes = 1;
3129 n_switches++;
3130 }
2628b9d3
DE
3131 else if (! strcmp (argv[i], "-print-search-dirs"))
3132 print_search_dirs = 1;
2dcb563f 3133 else if (! strcmp (argv[i], "-print-libgcc-file-name"))
2628b9d3 3134 print_file_name = "libgcc.a";
6a9e290e 3135 else if (! strncmp (argv[i], "-print-file-name=", 17))
2628b9d3 3136 print_file_name = argv[i] + 17;
6a9e290e 3137 else if (! strncmp (argv[i], "-print-prog-name=", 17))
2628b9d3 3138 print_prog_name = argv[i] + 17;
60103a34
DE
3139 else if (! strcmp (argv[i], "-print-multi-lib"))
3140 print_multi_lib = 1;
3141 else if (! strcmp (argv[i], "-print-multi-directory"))
3142 print_multi_directory = 1;
c9ebacb8
RS
3143 else if (! strncmp (argv[i], "-Wa,", 4))
3144 {
3145 int prev, j;
3146 /* Pass the rest of this option to the assembler. */
3147
c9ebacb8
RS
3148 /* Split the argument at commas. */
3149 prev = 4;
3150 for (j = 4; argv[i][j]; j++)
3151 if (argv[i][j] == ',')
3152 {
b8468bc7 3153 add_assembler_option (argv[i] + prev, j - prev);
c9ebacb8
RS
3154 prev = j + 1;
3155 }
b8468bc7 3156
c9ebacb8 3157 /* Record the part after the last comma. */
b8468bc7 3158 add_assembler_option (argv[i] + prev, j - prev);
c9ebacb8 3159 }
57cb9b60
JW
3160 else if (! strncmp (argv[i], "-Wp,", 4))
3161 {
3162 int prev, j;
3163 /* Pass the rest of this option to the preprocessor. */
3164
57cb9b60
JW
3165 /* Split the argument at commas. */
3166 prev = 4;
3167 for (j = 4; argv[i][j]; j++)
3168 if (argv[i][j] == ',')
3169 {
b8468bc7 3170 add_preprocessor_option (argv[i] + prev, j - prev);
57cb9b60
JW
3171 prev = j + 1;
3172 }
b8468bc7 3173
57cb9b60 3174 /* Record the part after the last comma. */
b8468bc7 3175 add_preprocessor_option (argv[i] + prev, j - prev);
57cb9b60 3176 }
301a5c0b 3177 else if (argv[i][0] == '+' && argv[i][1] == 'e')
f2faf549 3178 /* The +e options to the C++ front-end. */
301a5c0b 3179 n_switches++;
368dfd3a 3180 else if (strncmp (argv[i], "-Wl,", 4) == 0)
9b226f90
TG
3181 {
3182 int j;
3183 /* Split the argument at commas. */
3184 for (j = 3; argv[i][j]; j++)
3185 n_infiles += (argv[i][j] == ',');
3186 }
368dfd3a
TG
3187 else if (strcmp (argv[i], "-Xlinker") == 0)
3188 {
3189 if (i + 1 == argc)
3190 fatal ("argument to `-Xlinker' is missing");
3191
3192 n_infiles++;
3193 i++;
3194 }
3195 else if (strncmp (argv[i], "-l", 2) == 0)
3196 n_infiles++;
3a265431
DE
3197 else if (strcmp (argv[i], "-save-temps") == 0)
3198 {
3199 save_temps_flag = 1;
3200 n_switches++;
3201 }
d9ac3a07
MM
3202 else if (strcmp (argv[i], "-specs") == 0)
3203 {
3204 struct user_specs *user = (struct user_specs *)
3205 xmalloc (sizeof (struct user_specs));
3206 if (++i >= argc)
3207 fatal ("argument to `-specs' is missing");
3208
3209 user->next = (struct user_specs *)0;
3210 user->filename = argv[i];
3211 if (user_specs_tail)
3212 user_specs_tail->next = user;
3213 else
3214 user_specs_head = user;
3215 user_specs_tail = user;
3216 }
3217 else if (strncmp (argv[i], "-specs=", 7) == 0)
3218 {
3219 struct user_specs *user = (struct user_specs *)
3220 xmalloc (sizeof (struct user_specs));
3221 if (strlen (argv[i]) == 7)
3222 fatal ("argument to `-specs=' is missing");
3223
3224 user->next = (struct user_specs *)0;
3225 user->filename = argv[i]+7;
3226 if (user_specs_tail)
3227 user_specs_tail->next = user;
3228 else
3229 user_specs_head = user;
3230 user_specs_tail = user;
3231 }
03c41c05
ZW
3232 else if (strcmp (argv[i], "-time") == 0)
3233 report_times = 1;
368dfd3a 3234 else if (argv[i][0] == '-' && argv[i][1] != 0)
ed1f651b 3235 {
fbd40359 3236 register const char *p = &argv[i][1];
ed1f651b
RS
3237 register int c = *p;
3238
3239 switch (c)
3240 {
3241 case 'b':
aa32d841 3242 n_switches++;
ed1f651b
RS
3243 if (p[1] == 0 && i + 1 == argc)
3244 fatal ("argument to `-b' is missing");
3245 if (p[1] == 0)
3246 spec_machine = argv[++i];
3247 else
3248 spec_machine = p + 1;
5d7bb90c
RK
3249
3250 warn_std_ptr = &warn_std;
ed1f651b
RS
3251 break;
3252
3253 case 'B':
3254 {
fbd40359 3255 const char *value;
ed1f651b
RS
3256 if (p[1] == 0 && i + 1 == argc)
3257 fatal ("argument to `-B' is missing");
3258 if (p[1] == 0)
3259 value = argv[++i];
3260 else
3261 value = p + 1;
e9a25f70
JL
3262 add_prefix (&exec_prefixes, value, NULL_PTR, 1, 0, &warn_B);
3263 add_prefix (&startfile_prefixes, value, NULL_PTR,
3264 1, 0, &warn_B);
3265 add_prefix (&include_prefixes, concat (value, "include",
3266 NULL_PTR),
3267 NULL_PTR, 1, 0, NULL_PTR);
6b0639bc 3268
a78a8d58 3269 /* As a kludge, if the arg is "[foo/]stageN/", just add
e21c472a 3270 "[foo/]include" to the include prefix. */
ea694f2d
DE
3271 {
3272 int len = strlen (value);
48ff801b
RK
3273 if ((len == 7
3274 || (len > 7
509781a4 3275 && (IS_DIR_SEPARATOR (value[len - 8]))))
a78a8d58 3276 && strncmp (value + len - 7, "stage", 5) == 0
17248a6b 3277 && ISDIGIT (value[len - 2])
509781a4 3278 && (IS_DIR_SEPARATOR (value[len - 1])))
e21c472a
JW
3279 {
3280 if (len == 7)
e9a25f70 3281 add_prefix (&include_prefixes, "include", NULL_PTR,
5d7bb90c 3282 1, 0, NULL_PTR);
e21c472a
JW
3283 else
3284 {
eb2be0e6 3285 char *string = xmalloc (len + 1);
e21c472a 3286 strncpy (string, value, len-7);
853f1cc3 3287 strcpy (string+len-7, "include");
e9a25f70 3288 add_prefix (&include_prefixes, string, NULL_PTR,
5d7bb90c 3289 1, 0, NULL_PTR);
e21c472a
JW
3290 }
3291 }
ea694f2d 3292 }
aa32d841 3293 n_switches++;
ed1f651b
RS
3294 }
3295 break;
3296
3297 case 'v': /* Print our subcommands and print versions. */
ed1f651b 3298 n_switches++;
8436fe35
RS
3299 /* If they do anything other than exactly `-v', don't set
3300 verbose_flag; rather, continue on to give the error. */
3301 if (p[1] != 0)
3302 break;
3303 verbose_flag++;
ed1f651b
RS
3304 break;
3305
3306 case 'V':
aa32d841 3307 n_switches++;
ed1f651b
RS
3308 if (p[1] == 0 && i + 1 == argc)
3309 fatal ("argument to `-V' is missing");
3310 if (p[1] == 0)
3311 spec_version = argv[++i];
3312 else
3313 spec_version = p + 1;
53117a2f 3314 compiler_version = spec_version;
5d7bb90c 3315 warn_std_ptr = &warn_std;
e5e809f4
JL
3316
3317 /* Validate the version number. Use the same checks
3318 done when inserting it into a spec.
3319
3320 The format of the version string is
3321 ([^0-9]*-)?[0-9]+[.][0-9]+([.][0-9]+)?([- ].*)? */
3322 {
878f32c3 3323 const char *v = compiler_version;
e5e809f4
JL
3324
3325 /* Ignore leading non-digits. i.e. "foo-" in "foo-2.7.2". */
e9a780ec 3326 while (! ISDIGIT (*v))
e5e809f4
JL
3327 v++;
3328
3329 if (v > compiler_version && v[-1] != '-')
3330 fatal ("invalid version number format");
3331
3332 /* Set V after the first period. */
e9a780ec 3333 while (ISDIGIT (*v))
e5e809f4
JL
3334 v++;
3335
3336 if (*v != '.')
3337 fatal ("invalid version number format");
3338
3339 v++;
e9a780ec 3340 while (ISDIGIT (*v))
e5e809f4
JL
3341 v++;
3342
3343 if (*v != 0 && *v != ' ' && *v != '.' && *v != '-')
3344 fatal ("invalid version number format");
3345 }
ed1f651b
RS
3346 break;
3347
88117d44 3348 case 'S':
3a265431
DE
3349 case 'c':
3350 if (p[1] == 0)
ed1f651b 3351 {
3a265431 3352 have_c = 1;
8eebb258 3353 n_switches++;
ed1f651b
RS
3354 break;
3355 }
5fc08cad 3356 goto normal_switch;
f2cf3e1e 3357
f2cf3e1e
RK
3358 case 'o':
3359 have_o = 1;
88117d44
NC
3360#if defined(HAVE_EXECUTABLE_SUFFIX)
3361 if (! have_c)
3362 {
3363 int skip;
3364
3365 /* Forward scan, just in case -S or -c is specified
3366 after -o. */
3367 int j = i + 1;
3368 if (p[1] == 0)
3369 ++j;
3370 while (j < argc)
3371 {
3372 if (argv[j][0] == '-')
3373 {
3374 if (SWITCH_CURTAILS_COMPILATION (argv[j][1])
3375 && argv[j][2] == 0)
3376 {
3377 have_c = 1;
3378 break;
3379 }
3380 else if (skip = SWITCH_TAKES_ARG (argv[j][1]))
3381 j += skip - (argv[j][2] != 0);
3382 else if (skip = WORD_SWITCH_TAKES_ARG (argv[j] + 1))
3383 j += skip;
3384 }
3385 j++;
3386 }
3387 }
3388#endif
853e0b2d 3389#if defined(HAVE_EXECUTABLE_SUFFIX) || defined(HAVE_OBJECT_SUFFIX)
853e0b2d 3390 if (p[1] == 0)
88117d44
NC
3391 argv[i+1] = convert_filename (argv[i+1], ! have_c);
3392 else
3393 argv[i] = convert_filename (argv[i], ! have_c);
853e0b2d 3394#endif
5fc08cad 3395 goto normal_switch;
f2cf3e1e 3396
ed1f651b 3397 default:
5fc08cad 3398 normal_switch:
ed1f651b
RS
3399 n_switches++;
3400
3401 if (SWITCH_TAKES_ARG (c) > (p[1] != 0))
3402 i += SWITCH_TAKES_ARG (c) - (p[1] != 0);
3403 else if (WORD_SWITCH_TAKES_ARG (p))
3404 i += WORD_SWITCH_TAKES_ARG (p);
3405 }
3406 }
3407 else
3a265431
DE
3408 {
3409 n_infiles++;
3410 lang_n_infiles++;
3411 }
ed1f651b
RS
3412 }
3413
3a265431 3414 if (have_c && have_o && lang_n_infiles > 1)
c74c0cff 3415 fatal ("cannot specify -o with -c or -S and multiple compilations");
f2cf3e1e 3416
ed1f651b
RS
3417 /* Set up the search paths before we go looking for config files. */
3418
3419 /* These come before the md prefixes so that we will find gcc's subcommands
3420 (such as cpp) rather than those of the host system. */
ae04227b
CH
3421 /* Use 2 as fourth arg meaning try just the machine as a suffix,
3422 as well as trying the machine and the version. */
48ff801b 3423#ifndef OS2
14a774a9
RK
3424 add_prefix (&exec_prefixes, standard_exec_prefix, "GCC",
3425 0, 1, warn_std_ptr);
e9a25f70
JL
3426 add_prefix (&exec_prefixes, standard_exec_prefix, "BINUTILS",
3427 0, 2, warn_std_ptr);
3428 add_prefix (&exec_prefixes, standard_exec_prefix_1, "BINUTILS",
3429 0, 2, warn_std_ptr);
48ff801b 3430#endif
ed1f651b 3431
e9a25f70
JL
3432 add_prefix (&startfile_prefixes, standard_exec_prefix, "BINUTILS",
3433 0, 1, warn_std_ptr);
3434 add_prefix (&startfile_prefixes, standard_exec_prefix_1, "BINUTILS",
3435 0, 1, warn_std_ptr);
ed1f651b 3436
6aa62cff
DE
3437 tooldir_prefix = concat (tooldir_base_prefix, spec_machine,
3438 dir_separator_str, NULL_PTR);
c648ab8a 3439
48ff801b 3440 /* If tooldir is relative, base it on exec_prefixes. A relative
c648ab8a
RS
3441 tooldir lets us move the installed tree as a unit.
3442
3443 If GCC_EXEC_PREFIX is defined, then we want to add two relative
3444 directories, so that we can search both the user specified directory
3445 and the standard place. */
3446
509781a4 3447 if (!IS_DIR_SEPARATOR (*tooldir_prefix))
c648ab8a
RS
3448 {
3449 if (gcc_exec_prefix)
3450 {
3451 char *gcc_exec_tooldir_prefix
6aa62cff
DE
3452 = concat (gcc_exec_prefix, spec_machine, dir_separator_str,
3453 spec_version, dir_separator_str, tooldir_prefix, NULL_PTR);
c648ab8a 3454
48ff801b 3455 add_prefix (&exec_prefixes,
6aa62cff
DE
3456 concat (gcc_exec_tooldir_prefix, "bin",
3457 dir_separator_str, NULL_PTR),
e9a25f70 3458 NULL_PTR, 0, 0, NULL_PTR);
48ff801b 3459 add_prefix (&startfile_prefixes,
6aa62cff
DE
3460 concat (gcc_exec_tooldir_prefix, "lib",
3461 dir_separator_str, NULL_PTR),
e9a25f70 3462 NULL_PTR, 0, 0, NULL_PTR);
c648ab8a
RS
3463 }
3464
6aa62cff
DE
3465 tooldir_prefix = concat (standard_exec_prefix, spec_machine,
3466 dir_separator_str, spec_version,
3467 dir_separator_str, tooldir_prefix, NULL_PTR);
c648ab8a
RS
3468 }
3469
48ff801b 3470 add_prefix (&exec_prefixes,
6aa62cff 3471 concat (tooldir_prefix, "bin", dir_separator_str, NULL_PTR),
e9a25f70 3472 "BINUTILS", 0, 0, NULL_PTR);
48ff801b 3473 add_prefix (&startfile_prefixes,
6aa62cff 3474 concat (tooldir_prefix, "lib", dir_separator_str, NULL_PTR),
e9a25f70 3475 "BINUTILS", 0, 0, NULL_PTR);
f18fd956 3476
004fd4d5
RS
3477 /* More prefixes are enabled in main, after we read the specs file
3478 and determine whether this is cross-compilation or not. */
ed1f651b 3479
ed1f651b
RS
3480
3481 /* Then create the space for the vectors and scan again. */
3482
3483 switches = ((struct switchstr *)
3484 xmalloc ((n_switches + 1) * sizeof (struct switchstr)));
3485 infiles = (struct infile *) xmalloc ((n_infiles + 1) * sizeof (struct infile));
3486 n_switches = 0;
3487 n_infiles = 0;
3488 last_language_n_infiles = -1;
3489
3490 /* This, time, copy the text of each switch and store a pointer
3491 to the copy in the vector of switches.
3492 Store all the infiles in their vector. */
3493
3494 for (i = 1; i < argc; i++)
3495 {
2ef32c88 3496 /* Just skip the switches that were handled by the preceding loop. */
368dfd3a 3497 if (! strncmp (argv[i], "-Wa,", 4))
2ef32c88 3498 ;
57cb9b60
JW
3499 else if (! strncmp (argv[i], "-Wp,", 4))
3500 ;
14a774a9
RK
3501 else if (! strcmp (argv[i], "-pass-exit-codes"))
3502 ;
2628b9d3
DE
3503 else if (! strcmp (argv[i], "-print-search-dirs"))
3504 ;
2dcb563f 3505 else if (! strcmp (argv[i], "-print-libgcc-file-name"))
2ef32c88 3506 ;
6a9e290e
RK
3507 else if (! strncmp (argv[i], "-print-file-name=", 17))
3508 ;
3509 else if (! strncmp (argv[i], "-print-prog-name=", 17))
3510 ;
60103a34
DE
3511 else if (! strcmp (argv[i], "-print-multi-lib"))
3512 ;
3513 else if (! strcmp (argv[i], "-print-multi-directory"))
3514 ;
b8468bc7
NC
3515 else if (strcmp (argv[i], "-fhelp") == 0)
3516 {
3517 if (verbose_flag)
3518 {
3519 /* Create a dummy input file, so that we can pass --help on to
3520 the various sub-processes. */
3521 infiles[n_infiles].language = "c";
3522 infiles[n_infiles++].name = "help-dummy";
3523
40f943dd 3524 /* Preserve the --help switch so that it can be caught by the
b8468bc7
NC
3525 cc1 spec string. */
3526 switches[n_switches].part1 = "--help";
3527 switches[n_switches].args = 0;
8097c429 3528 switches[n_switches].live_cond = SWITCH_OK;
ab87f8c8 3529 switches[n_switches].validated = 0;
b8468bc7
NC
3530
3531 n_switches++;
3532 }
3533 }
cc6fc442
RS
3534 else if (argv[i][0] == '+' && argv[i][1] == 'e')
3535 {
3536 /* Compensate for the +e options to the C++ front-end;
a1c37766 3537 they're there simply for cfront call-compatibility. We do
cc6fc442
RS
3538 some magic in default_compilers to pass them down properly.
3539 Note we deliberately start at the `+' here, to avoid passing
3540 -e0 or -e1 down into the linker. */
3541 switches[n_switches].part1 = &argv[i][0];
3542 switches[n_switches].args = 0;
8097c429 3543 switches[n_switches].live_cond = SWITCH_OK;
ab87f8c8 3544 switches[n_switches].validated = 0;
cc6fc442
RS
3545 n_switches++;
3546 }
368dfd3a
TG
3547 else if (strncmp (argv[i], "-Wl,", 4) == 0)
3548 {
9b226f90
TG
3549 int prev, j;
3550 /* Split the argument at commas. */
3551 prev = 4;
3552 for (j = 4; argv[i][j]; j++)
3553 if (argv[i][j] == ',')
3554 {
e5e809f4 3555 infiles[n_infiles].language = "*";
9b226f90
TG
3556 infiles[n_infiles++].name
3557 = save_string (argv[i] + prev, j - prev);
3558 prev = j + 1;
3559 }
3560 /* Record the part after the last comma. */
e5e809f4 3561 infiles[n_infiles].language = "*";
9b226f90 3562 infiles[n_infiles++].name = argv[i] + prev;
368dfd3a
TG
3563 }
3564 else if (strcmp (argv[i], "-Xlinker") == 0)
3565 {
e5e809f4 3566 infiles[n_infiles].language = "*";
368dfd3a
TG
3567 infiles[n_infiles++].name = argv[++i];
3568 }
3569 else if (strncmp (argv[i], "-l", 2) == 0)
3570 {
e5e809f4 3571 infiles[n_infiles].language = "*";
368dfd3a
TG
3572 infiles[n_infiles++].name = argv[i];
3573 }
d9ac3a07
MM
3574 else if (strcmp (argv[i], "-specs") == 0)
3575 i++;
3576 else if (strncmp (argv[i], "-specs=", 7) == 0)
3577 ;
03c41c05
ZW
3578 else if (strcmp (argv[i], "-time") == 0)
3579 ;
3580 else if ((save_temps_flag || report_times)
3581 && strcmp (argv[i], "-pipe") == 0)
3582 {
3583 /* -save-temps overrides -pipe, so that temp files are produced */
3584 if (save_temps_flag)
3585 error ("Warning: -pipe ignored since -save-temps specified");
3586 /* -time overrides -pipe because we can't get correct stats when
3587 multiple children are running at once. */
3588 else if (report_times)
3589 error ("Warning: -pipe ignored since -time specified");
3590 }
368dfd3a 3591 else if (argv[i][0] == '-' && argv[i][1] != 0)
ed1f651b 3592 {
fbd40359
ZW
3593 const char *p = &argv[i][1];
3594 int c = *p;
ed1f651b 3595
ed1f651b
RS
3596 if (c == 'x')
3597 {
3598 if (p[1] == 0 && i + 1 == argc)
3599 fatal ("argument to `-x' is missing");
3600 if (p[1] == 0)
3601 spec_lang = argv[++i];
3602 else
3603 spec_lang = p + 1;
3604 if (! strcmp (spec_lang, "none"))
34dd3838
RK
3605 /* Suppress the warning if -xnone comes after the last input
3606 file, because alternate command interfaces like g++ might
3607 find it useful to place -xnone after each input file. */
ed1f651b
RS
3608 spec_lang = 0;
3609 else
3610 last_language_n_infiles = n_infiles;
3611 continue;
3612 }
3613 switches[n_switches].part1 = p;
3614 /* Deal with option arguments in separate argv elements. */
3615 if ((SWITCH_TAKES_ARG (c) > (p[1] != 0))
14553b75
RS
3616 || WORD_SWITCH_TAKES_ARG (p))
3617 {
3618 int j = 0;
3619 int n_args = WORD_SWITCH_TAKES_ARG (p);
ed1f651b 3620
14553b75
RS
3621 if (n_args == 0)
3622 {
3623 /* Count only the option arguments in separate argv elements. */
3624 n_args = SWITCH_TAKES_ARG (c) - (p[1] != 0);
3625 }
3626 if (i + n_args >= argc)
3627 fatal ("argument to `-%s' is missing", p);
3628 switches[n_switches].args
fbd40359 3629 = (const char **) xmalloc ((n_args + 1) * sizeof(const char *));
14553b75
RS
3630 while (j < n_args)
3631 switches[n_switches].args[j++] = argv[++i];
3632 /* Null-terminate the vector. */
3633 switches[n_switches].args[j] = 0;
ed1f651b 3634 }
bb9da768 3635 else if (index (switches_need_spaces, c))
14553b75 3636 {
bb9da768
RK
3637 /* On some systems, ld cannot handle some options without
3638 a space. So split the option from its argument. */
3639 char *part1 = (char *) xmalloc (2);
fbd40359 3640 char *tmp;
bb9da768
RK
3641 part1[0] = c;
3642 part1[1] = '\0';
3643
3644 switches[n_switches].part1 = part1;
fbd40359
ZW
3645 switches[n_switches].args
3646 = (const char **) xmalloc (2 * sizeof (const char *));
3647 switches[n_switches].args[0] = tmp = xmalloc (strlen (p));
3648 strcpy (tmp, &p[1]);
14553b75
RS
3649 switches[n_switches].args[1] = 0;
3650 }
3651 else
ed1f651b 3652 switches[n_switches].args = 0;
f5b0eb4e 3653
8097c429 3654 switches[n_switches].live_cond = SWITCH_OK;
ab87f8c8 3655 switches[n_switches].validated = 0;
ed1f651b
RS
3656 /* This is always valid, since gcc.c itself understands it. */
3657 if (!strcmp (p, "save-temps"))
ab87f8c8 3658 switches[n_switches].validated = 1;
aa32d841
JL
3659 else
3660 {
3661 char ch = switches[n_switches].part1[0];
3662 if (ch == 'V' || ch == 'b' || ch == 'B')
ab87f8c8 3663 switches[n_switches].validated = 1;
aa32d841 3664 }
ed1f651b
RS
3665 n_switches++;
3666 }
3667 else
3668 {
f70165f6 3669#ifdef HAVE_OBJECT_SUFFIX
853e0b2d 3670 argv[i] = convert_filename (argv[i], 0);
f70165f6
RK
3671#endif
3672
368dfd3a 3673 if (strcmp (argv[i], "-") != 0 && access (argv[i], R_OK) < 0)
48fb792a
BK
3674 {
3675 perror_with_name (argv[i]);
3676 error_count++;
3677 }
3678 else
3679 {
3680 infiles[n_infiles].language = spec_lang;
3681 infiles[n_infiles++].name = argv[i];
3682 }
ed1f651b
RS
3683 }
3684 }
3685
fa0d5369 3686 if (n_infiles == last_language_n_infiles && spec_lang != 0)
ed1f651b
RS
3687 error ("Warning: `-x %s' after last input file has no effect", spec_lang);
3688
3689 switches[n_switches].part1 = 0;
3690 infiles[n_infiles].name = 0;
3691}
3692\f
3693/* Process a spec string, accumulating and running commands. */
3694
3695/* These variables describe the input file name.
3696 input_file_number is the index on outfiles of this file,
3697 so that the output file name can be stored for later use by %o.
3698 input_basename is the start of the part of the input file
3699 sans all directory names, and basename_length is the number
3700 of characters starting there excluding the suffix .c or whatever. */
3701
878f32c3 3702const char *input_filename;
ed1f651b 3703static int input_file_number;
f271358e 3704size_t input_filename_length;
ed1f651b 3705static int basename_length;
878f32c3
KG
3706static const char *input_basename;
3707static const char *input_suffix;
ed1f651b
RS
3708
3709/* These are variables used within do_spec and do_spec_1. */
3710
3711/* Nonzero if an arg has been started and not yet terminated
3712 (with space, tab or newline). */
3713static int arg_going;
3714
3715/* Nonzero means %d or %g has been seen; the next arg to be terminated
3716 is a temporary file name. */
3717static int delete_this_arg;
3718
3719/* Nonzero means %w has been seen; the next arg to be terminated
3720 is the output file name of this compilation. */
3721static int this_is_output_file;
3722
3723/* Nonzero means %s has been seen; the next arg to be terminated
3724 is the name of a library file and we should try the standard
3725 search dirs for it. */
3726static int this_is_library_file;
3727
a99bf70c
JW
3728/* Nonzero means that the input of this command is coming from a pipe. */
3729static int input_from_pipe;
3730
ed1f651b
RS
3731/* Process the spec SPEC and run the commands specified therein.
3732 Returns 0 if the spec is successfully processed; -1 if failed. */
3733
f271358e 3734int
ed1f651b 3735do_spec (spec)
878f32c3 3736 const char *spec;
ed1f651b
RS
3737{
3738 int value;
3739
3740 clear_args ();
3741 arg_going = 0;
3742 delete_this_arg = 0;
3743 this_is_output_file = 0;
3744 this_is_library_file = 0;
a99bf70c 3745 input_from_pipe = 0;
ed1f651b 3746
906c4e36 3747 value = do_spec_1 (spec, 0, NULL_PTR);
ed1f651b
RS
3748
3749 /* Force out any unfinished command.
3750 If -pipe, this forces out the last command if it ended in `|'. */
3751 if (value == 0)
3752 {
3753 if (argbuf_index > 0 && !strcmp (argbuf[argbuf_index - 1], "|"))
3754 argbuf_index--;
3755
3756 if (argbuf_index > 0)
3757 value = execute ();
3758 }
3759
3760 return value;
3761}
3762
3763/* Process the sub-spec SPEC as a portion of a larger spec.
3764 This is like processing a whole spec except that we do
3765 not initialize at the beginning and we do not supply a
3766 newline by default at the end.
3767 INSWITCH nonzero means don't process %-sequences in SPEC;
3768 in this case, % is treated as an ordinary character.
3769 This is used while substituting switches.
3770 INSWITCH nonzero also causes SPC not to terminate an argument.
3771
3772 Value is zero unless a line was finished
3773 and the command on that line reported an error. */
3774
3775static int
3776do_spec_1 (spec, inswitch, soft_matched_part)
878f32c3 3777 const char *spec;
ed1f651b 3778 int inswitch;
878f32c3 3779 const char *soft_matched_part;
ed1f651b 3780{
878f32c3 3781 register const char *p = spec;
ed1f651b
RS
3782 register int c;
3783 int i;
878f32c3 3784 const char *string;
3279bba6 3785 int value;
ed1f651b 3786
ededb2fc 3787 while ((c = *p++))
ed1f651b
RS
3788 /* If substituting a switch, treat all chars like letters.
3789 Otherwise, NL, SPC, TAB and % are special. */
3790 switch (inswitch ? 'a' : c)
3791 {
3792 case '\n':
3793 /* End of line: finish any pending argument,
3794 then run the pending command if one has been started. */
3795 if (arg_going)
3796 {
3797 obstack_1grow (&obstack, 0);
3798 string = obstack_finish (&obstack);
3799 if (this_is_library_file)
3800 string = find_file (string);
3801 store_arg (string, delete_this_arg, this_is_output_file);
3802 if (this_is_output_file)
3803 outfiles[input_file_number] = string;
3804 }
3805 arg_going = 0;
3806
3807 if (argbuf_index > 0 && !strcmp (argbuf[argbuf_index - 1], "|"))
3808 {
ed1f651b
RS
3809 for (i = 0; i < n_switches; i++)
3810 if (!strcmp (switches[i].part1, "pipe"))
3811 break;
3812
3813 /* A `|' before the newline means use a pipe here,
3814 but only if -pipe was specified.
3815 Otherwise, execute now and don't pass the `|' as an arg. */
3816 if (i < n_switches)
3817 {
a99bf70c 3818 input_from_pipe = 1;
ab87f8c8 3819 switches[i].validated = 1;
ed1f651b
RS
3820 break;
3821 }
3822 else
3823 argbuf_index--;
3824 }
3825
3826 if (argbuf_index > 0)
3827 {
3279bba6 3828 value = execute ();
ed1f651b
RS
3829 if (value)
3830 return value;
3831 }
3832 /* Reinitialize for a new command, and for a new argument. */
3833 clear_args ();
3834 arg_going = 0;
3835 delete_this_arg = 0;
3836 this_is_output_file = 0;
3837 this_is_library_file = 0;
a99bf70c 3838 input_from_pipe = 0;
ed1f651b
RS
3839 break;
3840
3841 case '|':
3842 /* End any pending argument. */
3843 if (arg_going)
3844 {
3845 obstack_1grow (&obstack, 0);
3846 string = obstack_finish (&obstack);
3847 if (this_is_library_file)
3848 string = find_file (string);
3849 store_arg (string, delete_this_arg, this_is_output_file);
3850 if (this_is_output_file)
3851 outfiles[input_file_number] = string;
3852 }
3853
3854 /* Use pipe */
3855 obstack_1grow (&obstack, c);
3856 arg_going = 1;
3857 break;
3858
3859 case '\t':
3860 case ' ':
3861 /* Space or tab ends an argument if one is pending. */
3862 if (arg_going)
3863 {
3864 obstack_1grow (&obstack, 0);
3865 string = obstack_finish (&obstack);
3866 if (this_is_library_file)
3867 string = find_file (string);
3868 store_arg (string, delete_this_arg, this_is_output_file);
3869 if (this_is_output_file)
3870 outfiles[input_file_number] = string;
3871 }
3872 /* Reinitialize for a new argument. */
3873 arg_going = 0;
3874 delete_this_arg = 0;
3875 this_is_output_file = 0;
3876 this_is_library_file = 0;
3877 break;
3878
3879 case '%':
3880 switch (c = *p++)
3881 {
3882 case 0:
3883 fatal ("Invalid specification! Bug in cc.");
3884
3885 case 'b':
3886 obstack_grow (&obstack, input_basename, basename_length);
3887 arg_going = 1;
3888 break;
3889
3890 case 'd':
3891 delete_this_arg = 2;
3892 break;
3893
3894 /* Dump out the directories specified with LIBRARY_PATH,
004fd4d5
RS
3895 followed by the absolute directories
3896 that we search for startfiles. */
ed1f651b 3897 case 'D':
8cacec76 3898 {
48ff801b 3899 struct prefix_list *pl = startfile_prefixes.plist;
85066503 3900 size_t bufsize = 100;
8cacec76
JW
3901 char *buffer = (char *) xmalloc (bufsize);
3902 int idx;
59014d0a 3903
8cacec76
JW
3904 for (; pl; pl = pl->next)
3905 {
004fd4d5 3906#ifdef RELATIVE_PREFIX_NOT_LINKDIR
8cacec76
JW
3907 /* Used on systems which record the specified -L dirs
3908 and use them to search for dynamic linking. */
3909 /* Relative directories always come from -B,
3910 and it is better not to use them for searching
3ac63d94 3911 at run time. In particular, stage1 loses. */
509781a4 3912 if (!IS_DIR_SEPARATOR (pl->prefix[0]))
8cacec76 3913 continue;
004fd4d5 3914#endif
60103a34
DE
3915 /* Try subdirectory if there is one. */
3916 if (multilib_dir != NULL)
3917 {
3918 if (machine_suffix)
3919 {
3920 if (strlen (pl->prefix) + strlen (machine_suffix)
3921 >= bufsize)
3922 bufsize = (strlen (pl->prefix)
3923 + strlen (machine_suffix)) * 2 + 1;
3924 buffer = (char *) xrealloc (buffer, bufsize);
3925 strcpy (buffer, pl->prefix);
3926 strcat (buffer, machine_suffix);
3927 if (is_directory (buffer, multilib_dir, 1))
3928 {
3929 do_spec_1 ("-L", 0, NULL_PTR);
3930#ifdef SPACE_AFTER_L_OPTION
3931 do_spec_1 (" ", 0, NULL_PTR);
3932#endif
3933 do_spec_1 (buffer, 1, NULL_PTR);
3934 do_spec_1 (multilib_dir, 1, NULL_PTR);
3935 /* Make this a separate argument. */
3936 do_spec_1 (" ", 0, NULL_PTR);
3937 }
3938 }
3939 if (!pl->require_machine_suffix)
3940 {
3941 if (is_directory (pl->prefix, multilib_dir, 1))
3942 {
3943 do_spec_1 ("-L", 0, NULL_PTR);
3944#ifdef SPACE_AFTER_L_OPTION
3945 do_spec_1 (" ", 0, NULL_PTR);
3946#endif
3947 do_spec_1 (pl->prefix, 1, NULL_PTR);
3948 do_spec_1 (multilib_dir, 1, NULL_PTR);
3949 /* Make this a separate argument. */
3950 do_spec_1 (" ", 0, NULL_PTR);
3951 }
3952 }
3953 }
8cacec76
JW
3954 if (machine_suffix)
3955 {
0ad5835e 3956 if (is_directory (pl->prefix, machine_suffix, 1))
8cacec76
JW
3957 {
3958 do_spec_1 ("-L", 0, NULL_PTR);
004fd4d5 3959#ifdef SPACE_AFTER_L_OPTION
8cacec76 3960 do_spec_1 (" ", 0, NULL_PTR);
004fd4d5 3961#endif
8cacec76
JW
3962 do_spec_1 (pl->prefix, 1, NULL_PTR);
3963 /* Remove slash from machine_suffix. */
3964 if (strlen (machine_suffix) >= bufsize)
3965 bufsize = strlen (machine_suffix) * 2 + 1;
3966 buffer = (char *) xrealloc (buffer, bufsize);
3967 strcpy (buffer, machine_suffix);
3968 idx = strlen (buffer);
509781a4 3969 if (IS_DIR_SEPARATOR (buffer[idx - 1]))
8cacec76
JW
3970 buffer[idx - 1] = 0;
3971 do_spec_1 (buffer, 1, NULL_PTR);
3972 /* Make this a separate argument. */
3973 do_spec_1 (" ", 0, NULL_PTR);
3974 }
3975 }
3976 if (!pl->require_machine_suffix)
3977 {
0ad5835e 3978 if (is_directory (pl->prefix, "", 1))
8cacec76
JW
3979 {
3980 do_spec_1 ("-L", 0, NULL_PTR);
004fd4d5 3981#ifdef SPACE_AFTER_L_OPTION
8cacec76 3982 do_spec_1 (" ", 0, NULL_PTR);
004fd4d5 3983#endif
8cacec76
JW
3984 /* Remove slash from pl->prefix. */
3985 if (strlen (pl->prefix) >= bufsize)
3986 bufsize = strlen (pl->prefix) * 2 + 1;
3987 buffer = (char *) xrealloc (buffer, bufsize);
3988 strcpy (buffer, pl->prefix);
3989 idx = strlen (buffer);
509781a4 3990 if (IS_DIR_SEPARATOR (buffer[idx - 1]))
8cacec76
JW
3991 buffer[idx - 1] = 0;
3992 do_spec_1 (buffer, 1, NULL_PTR);
3993 /* Make this a separate argument. */
3994 do_spec_1 (" ", 0, NULL_PTR);
3995 }
3996 }
3997 }
3998 free (buffer);
3999 }
ed1f651b
RS
4000 break;
4001
4002 case 'e':
ab87f8c8 4003 /* %efoo means report an error with `foo' as error message
ed1f651b
RS
4004 and don't execute any more commands for this file. */
4005 {
878f32c3 4006 const char *q = p;
ed1f651b
RS
4007 char *buf;
4008 while (*p != 0 && *p != '\n') p++;
4009 buf = (char *) alloca (p - q + 1);
4010 strncpy (buf, q, p - q);
4011 buf[p - q] = 0;
913d0833 4012 error ("%s", buf);
ed1f651b
RS
4013 return -1;
4014 }
4015 break;
4016
4017 case 'g':
d887e808 4018 case 'u':
4401b31c 4019 case 'U':
ed1f651b 4020 if (save_temps_flag)
3061ec2b
SS
4021 {
4022 obstack_grow (&obstack, input_basename, basename_length);
4023 delete_this_arg = 0;
4024 }
ed1f651b
RS
4025 else
4026 {
fb266030
TW
4027#ifdef MKTEMP_EACH_FILE
4028 /* ??? This has a problem: the total number of
4029 values mktemp can return is limited.
4030 That matters for the names of object files.
4031 In 2.4, do something about that. */
4032 struct temp_name *t;
dd75c292 4033 int suffix_length;
878f32c3 4034 const char *suffix = p;
a1d9074c 4035 char *saved_suffix = NULL;
dd75c292 4036
a1d9074c
TT
4037 while (*p == '.' || ISALPHA ((unsigned char)*p))
4038 p++;
4039 suffix_length = p - suffix;
dd75c292
CB
4040 if (p[0] == '%' && p[1] == 'O')
4041 {
cbc54665 4042 p += 2;
dd75c292 4043 /* We don't support extra suffix characters after %O. */
e51712db 4044 if (*p == '.' || ISALPHA ((unsigned char)*p))
dd75c292 4045 abort ();
a1d9074c
TT
4046 if (suffix_length == 0)
4047 suffix = OBJECT_SUFFIX;
4048 else
4049 {
4050 saved_suffix
4051 = (char *) xmalloc (suffix_length
4052 + strlen (OBJECT_SUFFIX));
4053 strncpy (saved_suffix, suffix, suffix_length);
4054 strcpy (saved_suffix + suffix_length,
4055 OBJECT_SUFFIX);
4056 }
4057 suffix_length += strlen (OBJECT_SUFFIX);
dd75c292 4058 }
fb266030
TW
4059
4060 /* See if we already have an association of %g/%u/%U and
4061 suffix. */
4062 for (t = temp_names; t; t = t->next)
dd75c292
CB
4063 if (t->length == suffix_length
4064 && strncmp (t->suffix, suffix, suffix_length) == 0
fb266030
TW
4065 && t->unique == (c != 'g'))
4066 break;
4067
4068 /* Make a new association if needed. %u requires one. */
4069 if (t == 0 || c == 'u')
4070 {
4071 if (t == 0)
4072 {
4073 t = (struct temp_name *) xmalloc (sizeof (struct temp_name));
4074 t->next = temp_names;
4075 temp_names = t;
4076 }
dd75c292
CB
4077 t->length = suffix_length;
4078 t->suffix = save_string (suffix, suffix_length);
4079 t->unique = (c != 'g');
4080 temp_filename = make_temp_file (t->suffix);
6aa62cff 4081 temp_filename_length = strlen (temp_filename);
fb266030
TW
4082 t->filename = temp_filename;
4083 t->filename_length = temp_filename_length;
4084 }
4085
a1d9074c
TT
4086 if (saved_suffix)
4087 free (saved_suffix);
4088
fb266030 4089 obstack_grow (&obstack, t->filename, t->filename_length);
b9490a6e
RS
4090 delete_this_arg = 1;
4091#else
ed1f651b 4092 obstack_grow (&obstack, temp_filename, temp_filename_length);
4401b31c 4093 if (c == 'u' || c == 'U')
d887e808
TW
4094 {
4095 static int unique;
4096 char buff[9];
4401b31c
MM
4097 if (c == 'u')
4098 unique++;
4099 sprintf (buff, "%d", unique);
d887e808
TW
4100 obstack_grow (&obstack, buff, strlen (buff));
4101 }
b9490a6e 4102#endif
ed1f651b
RS
4103 delete_this_arg = 1;
4104 }
4105 arg_going = 1;
4106 break;
4107
4108 case 'i':
4109 obstack_grow (&obstack, input_filename, input_filename_length);
4110 arg_going = 1;
4111 break;
4112
8eebb258 4113 case 'I':
2d879387 4114 {
48ff801b 4115 struct prefix_list *pl = include_prefixes.plist;
2d879387
JW
4116
4117 if (gcc_exec_prefix)
4118 {
4119 do_spec_1 ("-iprefix", 1, NULL_PTR);
4120 /* Make this a separate argument. */
4121 do_spec_1 (" ", 0, NULL_PTR);
4122 do_spec_1 (gcc_exec_prefix, 1, NULL_PTR);
4123 do_spec_1 (" ", 0, NULL_PTR);
4124 }
4125
4126 for (; pl; pl = pl->next)
4127 {
4128 do_spec_1 ("-isystem", 1, NULL_PTR);
4129 /* Make this a separate argument. */
4130 do_spec_1 (" ", 0, NULL_PTR);
4131 do_spec_1 (pl->prefix, 1, NULL_PTR);
4132 do_spec_1 (" ", 0, NULL_PTR);
4133 }
4134 }
8eebb258
RS
4135 break;
4136
ed1f651b 4137 case 'o':
15c5edb9
TT
4138 {
4139 int max = n_infiles;
15c5edb9 4140 max += lang_specific_extra_outfiles;
08dc830e 4141
15c5edb9
TT
4142 for (i = 0; i < max; i++)
4143 if (outfiles[i])
4144 store_arg (outfiles[i], 0, 0);
4145 break;
4146 }
ed1f651b 4147
ed7dae04
RK
4148 case 'O':
4149 obstack_grow (&obstack, OBJECT_SUFFIX, strlen (OBJECT_SUFFIX));
4150 arg_going = 1;
4151 break;
4152
ed1f651b
RS
4153 case 's':
4154 this_is_library_file = 1;
4155 break;
4156
4157 case 'w':
4158 this_is_output_file = 1;
4159 break;
4160
4161 case 'W':
4162 {
ed846da3 4163 int cur_index = argbuf_index;
ed1f651b
RS
4164 /* Handle the {...} following the %W. */
4165 if (*p != '{')
4166 abort ();
4167 p = handle_braces (p + 1);
4168 if (p == 0)
4169 return -1;
4170 /* If any args were output, mark the last one for deletion
4171 on failure. */
ed846da3 4172 if (argbuf_index != cur_index)
ed1f651b
RS
4173 record_temp_file (argbuf[argbuf_index - 1], 0, 1);
4174 break;
4175 }
4176
4177 /* %x{OPTION} records OPTION for %X to output. */
4178 case 'x':
4179 {
878f32c3 4180 const char *p1 = p;
ed1f651b
RS
4181 char *string;
4182
4183 /* Skip past the option value and make a copy. */
4184 if (*p != '{')
4185 abort ();
4186 while (*p++ != '}')
4187 ;
4188 string = save_string (p1 + 1, p - p1 - 2);
4189
4190 /* See if we already recorded this option. */
4191 for (i = 0; i < n_linker_options; i++)
4192 if (! strcmp (string, linker_options[i]))
4193 {
4194 free (string);
4195 return 0;
4196 }
4197
4198 /* This option is new; add it. */
b8468bc7 4199 add_linker_option (string, strlen (string));
ed1f651b
RS
4200 }
4201 break;
4202
368dfd3a 4203 /* Dump out the options accumulated previously using %x. */
ed1f651b
RS
4204 case 'X':
4205 for (i = 0; i < n_linker_options; i++)
4206 {
906c4e36 4207 do_spec_1 (linker_options[i], 1, NULL_PTR);
ed1f651b 4208 /* Make each accumulated option a separate argument. */
906c4e36 4209 do_spec_1 (" ", 0, NULL_PTR);
ed1f651b
RS
4210 }
4211 break;
4212
c9ebacb8
RS
4213 /* Dump out the options accumulated previously using -Wa,. */
4214 case 'Y':
4215 for (i = 0; i < n_assembler_options; i++)
4216 {
4217 do_spec_1 (assembler_options[i], 1, NULL_PTR);
4218 /* Make each accumulated option a separate argument. */
4219 do_spec_1 (" ", 0, NULL_PTR);
4220 }
4221 break;
4222
57cb9b60
JW
4223 /* Dump out the options accumulated previously using -Wp,. */
4224 case 'Z':
4225 for (i = 0; i < n_preprocessor_options; i++)
4226 {
4227 do_spec_1 (preprocessor_options[i], 1, NULL_PTR);
4228 /* Make each accumulated option a separate argument. */
4229 do_spec_1 (" ", 0, NULL_PTR);
4230 }
4231 break;
4232
ed1f651b
RS
4233 /* Here are digits and numbers that just process
4234 a certain constant string as a spec. */
4235
4236 case '1':
3279bba6
RS
4237 value = do_spec_1 (cc1_spec, 0, NULL_PTR);
4238 if (value != 0)
4239 return value;
ed1f651b
RS
4240 break;
4241
4242 case '2':
3279bba6
RS
4243 value = do_spec_1 (cc1plus_spec, 0, NULL_PTR);
4244 if (value != 0)
4245 return value;
ed1f651b
RS
4246 break;
4247
4248 case 'a':
3279bba6
RS
4249 value = do_spec_1 (asm_spec, 0, NULL_PTR);
4250 if (value != 0)
4251 return value;
ed1f651b
RS
4252 break;
4253
4254 case 'A':
3279bba6
RS
4255 value = do_spec_1 (asm_final_spec, 0, NULL_PTR);
4256 if (value != 0)
4257 return value;
ed1f651b
RS
4258 break;
4259
4260 case 'c':
3279bba6
RS
4261 value = do_spec_1 (signed_char_spec, 0, NULL_PTR);
4262 if (value != 0)
4263 return value;
ed1f651b
RS
4264 break;
4265
4266 case 'C':
3279bba6
RS
4267 value = do_spec_1 (cpp_spec, 0, NULL_PTR);
4268 if (value != 0)
4269 return value;
ed1f651b
RS
4270 break;
4271
4272 case 'E':
3279bba6
RS
4273 value = do_spec_1 (endfile_spec, 0, NULL_PTR);
4274 if (value != 0)
4275 return value;
ed1f651b
RS
4276 break;
4277
4278 case 'l':
3279bba6
RS
4279 value = do_spec_1 (link_spec, 0, NULL_PTR);
4280 if (value != 0)
4281 return value;
ed1f651b
RS
4282 break;
4283
4284 case 'L':
3279bba6
RS
4285 value = do_spec_1 (lib_spec, 0, NULL_PTR);
4286 if (value != 0)
4287 return value;
ed1f651b
RS
4288 break;
4289
68d69835
JM
4290 case 'G':
4291 value = do_spec_1 (libgcc_spec, 0, NULL_PTR);
4292 if (value != 0)
4293 return value;
4294 break;
4295
ed1f651b
RS
4296 case 'p':
4297 {
4298 char *x = (char *) alloca (strlen (cpp_predefines) + 1);
4299 char *buf = x;
3b304f5b 4300 const char *y;
ed1f651b
RS
4301
4302 /* Copy all of the -D options in CPP_PREDEFINES into BUF. */
4303 y = cpp_predefines;
4304 while (*y != 0)
4305 {
4306 if (! strncmp (y, "-D", 2))
4307 /* Copy the whole option. */
4308 while (*y && *y != ' ' && *y != '\t')
4309 *x++ = *y++;
4310 else if (*y == ' ' || *y == '\t')
4311 /* Copy whitespace to the result. */
4312 *x++ = *y++;
4313 /* Don't copy other options. */
4314 else
4315 y++;
4316 }
4317
4318 *x = 0;
4319
3279bba6
RS
4320 value = do_spec_1 (buf, 0, NULL_PTR);
4321 if (value != 0)
4322 return value;
ed1f651b
RS
4323 }
4324 break;
4325
4326 case 'P':
4327 {
4328 char *x = (char *) alloca (strlen (cpp_predefines) * 4 + 1);
4329 char *buf = x;
3b304f5b 4330 const char *y;
ed1f651b
RS
4331
4332 /* Copy all of CPP_PREDEFINES into BUF,
3ac63d94
NC
4333 but force them all into the reserved name space if they
4334 aren't already there. The reserved name space is all
52c207e2
ZW
4335 identifiers beginning with two underscores or with one
4336 underscore and a capital letter. We do the forcing by
4337 adding up to two underscores to the beginning and end
4338 of each symbol. e.g. mips, _mips, mips_, and _mips_ all
4339 become __mips__. */
ed1f651b
RS
4340 y = cpp_predefines;
4341 while (*y != 0)
4342 {
4343 if (! strncmp (y, "-D", 2))
4344 {
4345 int flag = 0;
4346
4347 *x++ = *y++;
4348 *x++ = *y++;
4349
35364692 4350 if (*y != '_'
e51712db
KG
4351 || (*(y+1) != '_'
4352 && ! ISUPPER ((unsigned char)*(y+1))))
ed1f651b
RS
4353 {
4354 /* Stick __ at front of macro name. */
52c207e2
ZW
4355 if (*y != '_')
4356 *x++ = '_';
ed1f651b
RS
4357 *x++ = '_';
4358 /* Arrange to stick __ at the end as well. */
4359 flag = 1;
4360 }
4361
4362 /* Copy the macro name. */
4363 while (*y && *y != '=' && *y != ' ' && *y != '\t')
4364 *x++ = *y++;
4365
4366 if (flag)
4367 {
52c207e2
ZW
4368 if (x[-1] != '_')
4369 {
4370 if (x[-2] != '_')
4371 *x++ = '_';
4372 *x++ = '_';
4373 }
ed1f651b
RS
4374 }
4375
4376 /* Copy the value given, if any. */
4377 while (*y && *y != ' ' && *y != '\t')
4378 *x++ = *y++;
4379 }
4380 else if (*y == ' ' || *y == '\t')
4381 /* Copy whitespace to the result. */
4382 *x++ = *y++;
4383 /* Don't copy -A options */
4384 else
4385 y++;
4386 }
4387 *x++ = ' ';
4388
4389 /* Copy all of CPP_PREDEFINES into BUF,
4390 but put __ after every -D. */
4391 y = cpp_predefines;
4392 while (*y != 0)
4393 {
4394 if (! strncmp (y, "-D", 2))
4395 {
54a88f92 4396 y += 2;
ed1f651b 4397
35364692 4398 if (*y != '_'
e51712db
KG
4399 || (*(y+1) != '_'
4400 && ! ISUPPER ((unsigned char)*(y+1))))
ed1f651b 4401 {
54a88f92
RK
4402 /* Stick -D__ at front of macro name. */
4403 *x++ = '-';
4404 *x++ = 'D';
52c207e2
ZW
4405 if (*y != '_')
4406 *x++ = '_';
ed1f651b 4407 *x++ = '_';
ed1f651b 4408
54a88f92
RK
4409 /* Copy the macro name. */
4410 while (*y && *y != '=' && *y != ' ' && *y != '\t')
4411 *x++ = *y++;
ed1f651b 4412
54a88f92
RK
4413 /* Copy the value given, if any. */
4414 while (*y && *y != ' ' && *y != '\t')
4415 *x++ = *y++;
4416 }
4417 else
4418 {
4419 /* Do not copy this macro - we have just done it before */
4420 while (*y && *y != ' ' && *y != '\t')
4421 y++;
4422 }
ed1f651b
RS
4423 }
4424 else if (*y == ' ' || *y == '\t')
4425 /* Copy whitespace to the result. */
4426 *x++ = *y++;
3ac63d94 4427 /* Don't copy -A options. */
ed1f651b
RS
4428 else
4429 y++;
4430 }
4431 *x++ = ' ';
4432
4433 /* Copy all of the -A options in CPP_PREDEFINES into BUF. */
4434 y = cpp_predefines;
4435 while (*y != 0)
4436 {
4437 if (! strncmp (y, "-A", 2))
4438 /* Copy the whole option. */
4439 while (*y && *y != ' ' && *y != '\t')
4440 *x++ = *y++;
4441 else if (*y == ' ' || *y == '\t')
4442 /* Copy whitespace to the result. */
4443 *x++ = *y++;
4444 /* Don't copy other options. */
4445 else
4446 y++;
4447 }
4448
4449 *x = 0;
4450
3279bba6
RS
4451 value = do_spec_1 (buf, 0, NULL_PTR);
4452 if (value != 0)
4453 return value;
ed1f651b
RS
4454 }
4455 break;
4456
4457 case 'S':
3279bba6
RS
4458 value = do_spec_1 (startfile_spec, 0, NULL_PTR);
4459 if (value != 0)
4460 return value;
ed1f651b
RS
4461 break;
4462
4463 /* Here we define characters other than letters and digits. */
4464
4465 case '{':
4466 p = handle_braces (p);
4467 if (p == 0)
4468 return -1;
4469 break;
4470
4471 case '%':
4472 obstack_1grow (&obstack, '%');
4473 break;
4474
4475 case '*':
3ac63d94
NC
4476 if (soft_matched_part)
4477 {
4478 do_spec_1 (soft_matched_part, 1, NULL_PTR);
4479 do_spec_1 (" ", 0, NULL_PTR);
4480 }
4481 else
4482 /* Catch the case where a spec string contains something like
4483 '%{foo:%*}'. ie there is no * in the pattern on the left
4484 hand side of the :. */
4485 error ("Spec failure: '%%*' has not been initialised by pattern match");
ed1f651b
RS
4486 break;
4487
4488 /* Process a string found as the value of a spec given by name.
4489 This feature allows individual machine descriptions
4089dfab
JL
4490 to add and use their own specs.
4491 %[...] modifies -D options the way %P does;
4492 %(...) uses the spec unmodified. */
4493 case '[':
50ea20cf 4494 error ("Warning: use of obsolete %%[ operator in specs");
ed1f651b 4495 case '(':
ed1f651b 4496 {
878f32c3 4497 const char *name = p;
ed1f651b
RS
4498 struct spec_list *sl;
4499 int len;
4500
4501 /* The string after the S/P is the name of a spec that is to be
0f41302f 4502 processed. */
4089dfab 4503 while (*p && *p != ')' && *p != ']')
ed1f651b
RS
4504 p++;
4505
3ac63d94 4506 /* See if it's in the list. */
ed1f651b 4507 for (len = p - name, sl = specs; sl; sl = sl->next)
79aff5ac 4508 if (sl->name_len == len && !strncmp (sl->name, name, len))
ed1f651b 4509 {
79aff5ac 4510 name = *(sl->ptr_spec);
20df0482 4511#ifdef DEBUG_SPECS
ab87f8c8
JL
4512 notice ("Processing spec %c%s%c, which is '%s'\n",
4513 c, sl->name, (c == '(') ? ')' : ']', name);
20df0482 4514#endif
ed1f651b
RS
4515 break;
4516 }
4517
4518 if (sl)
4519 {
4089dfab
JL
4520 if (c == '(')
4521 {
4522 value = do_spec_1 (name, 0, NULL_PTR);
4523 if (value != 0)
4524 return value;
4525 }
4526 else
4527 {
4528 char *x = (char *) alloca (strlen (name) * 2 + 1);
4529 char *buf = x;
878f32c3 4530 const char *y = name;
4089dfab
JL
4531 int flag = 0;
4532
4533 /* Copy all of NAME into BUF, but put __ after
3ac63d94 4534 every -D and at the end of each arg. */
4089dfab
JL
4535 while (1)
4536 {
4537 if (! strncmp (y, "-D", 2))
4538 {
4539 *x++ = '-';
4540 *x++ = 'D';
4541 *x++ = '_';
4542 *x++ = '_';
4543 y += 2;
4544 flag = 1;
4545 continue;
4546 }
4547 else if (flag && (*y == ' ' || *y == '\t' || *y == '='
4548 || *y == '}' || *y == 0))
4549 {
4550 *x++ = '_';
4551 *x++ = '_';
4552 flag = 0;
4553 }
4554 if (*y == 0)
4555 break;
4556 else
4557 *x++ = *y++;
4558 }
4559 *x = 0;
4560
4561 value = do_spec_1 (buf, 0, NULL_PTR);
4562 if (value != 0)
4563 return value;
4564 }
ed1f651b 4565 }
b3865ca9 4566
4089dfab 4567 /* Discard the closing paren or bracket. */
b3865ca9
RS
4568 if (*p)
4569 p++;
ed1f651b
RS
4570 }
4571 break;
4572
829407e1
RS
4573 case 'v':
4574 {
500c9e81 4575 int c1 = *p++; /* Select first or second version number. */
3b304f5b
ZW
4576 const char *v = compiler_version;
4577 const char *q;
3ea8083f 4578 static const char zeroc = '0';
fd5e7009
DE
4579
4580 /* The format of the version string is
4581 ([^0-9]*-)?[0-9]+[.][0-9]+([.][0-9]+)?([- ].*)? */
4582
4583 /* Ignore leading non-digits. i.e. "foo-" in "foo-2.7.2". */
17248a6b 4584 while (! ISDIGIT (*v))
fd5e7009
DE
4585 v++;
4586 if (v > compiler_version && v[-1] != '-')
4587 abort ();
4588
500c9e81 4589 /* If desired, advance to second version number. */
3ea8083f 4590 if (c1 >= '2')
500c9e81 4591 {
164c4c91 4592 /* Set V after the first period. */
17248a6b 4593 while (ISDIGIT (*v))
53117a2f 4594 v++;
fd5e7009
DE
4595 if (*v != '.')
4596 abort ();
4597 v++;
500c9e81 4598 }
fd5e7009 4599
3ea8083f
JL
4600 /* If desired, advance to third version number.
4601 But don't complain if it's not present */
4602 if (c1 == '3')
4603 {
4604 /* Set V after the second period. */
4605 while (ISDIGIT (*v))
4606 v++;
4607 if ((*v != 0) && (*v != ' ') && (*v != '.') && (*v != '-'))
4608 abort ();
4609 if (*v != 0)
4610 v++;
4611 }
4612
500c9e81 4613 /* Set Q at the next period or at the end. */
53117a2f 4614 q = v;
17248a6b 4615 while (ISDIGIT (*q))
53117a2f 4616 q++;
289b3cc5 4617 if (*q != 0 && q > v && *q != ' ' && *q != '.' && *q != '-')
fd5e7009
DE
4618 abort ();
4619
3ea8083f
JL
4620 if (q > v)
4621 /* Put that part into the command. */
4622 obstack_grow (&obstack, v, q - v);
4623 else
4624 /* Default to "0" */
4625 obstack_grow (&obstack, &zeroc, 1);
829407e1
RS
4626 arg_going = 1;
4627 }
4628 break;
4629
a99bf70c
JW
4630 case '|':
4631 if (input_from_pipe)
4632 do_spec_1 ("-", 0, NULL_PTR);
4633 break;
4634
ed1f651b 4635 default:
3ac63d94
NC
4636 error ("Spec failure: Unrecognised spec option '%c'", c);
4637 break;
ed1f651b
RS
4638 }
4639 break;
4640
4641 case '\\':
4642 /* Backslash: treat next character as ordinary. */
4643 c = *p++;
4644
4645 /* fall through */
4646 default:
4647 /* Ordinary character: put it into the current argument. */
4648 obstack_1grow (&obstack, c);
4649 arg_going = 1;
4650 }
4651
4652 return 0; /* End of string */
4653}
4654
4655/* Return 0 if we call do_spec_1 and that returns -1. */
4656
878f32c3 4657static const char *
ed1f651b 4658handle_braces (p)
878f32c3 4659 register const char *p;
ed1f651b 4660{
878f32c3 4661 const char *filter, *body = NULL, *endbody = NULL;
f2cf3e1e 4662 int pipe_p = 0;
9bf09437
RH
4663 int negate;
4664 int suffix;
9f3c45fd 4665 int include_blanks = 1;
8097c429 4666 int elide_switch = 0;
9f3c45fd
RK
4667
4668 if (*p == '^')
8097c429
TT
4669 {
4670 /* A '^' after the open-brace means to not give blanks before args. */
4671 include_blanks = 0;
4672 ++p;
4673 }
ed1f651b
RS
4674
4675 if (*p == '|')
8097c429
TT
4676 {
4677 /* A `|' after the open-brace means,
4678 if the test fails, output a single minus sign rather than nothing.
4679 This is used in %{|!pipe:...}. */
4680 pipe_p = 1;
4681 ++p;
4682 }
4683
4684 if (*p == '<')
4685 {
4686 /* A `<' after the open-brace means that the switch should be
4687 removed from the command-line. */
4688 elide_switch = 1;
4689 ++p;
4690 }
ed1f651b 4691
9bf09437
RH
4692next_member:
4693 negate = suffix = 0;
4694
ed1f651b
RS
4695 if (*p == '!')
4696 /* A `!' after the open-brace negates the condition:
4697 succeed if the specified switch is not present. */
4698 negate = 1, ++p;
4699
4700 if (*p == '.')
4701 /* A `.' after the open-brace means test against the current suffix. */
4702 {
f2cf3e1e 4703 if (pipe_p)
ed1f651b
RS
4704 abort ();
4705
4706 suffix = 1;
4707 ++p;
4708 }
4709
8097c429
TT
4710 if (elide_switch && (negate || pipe_p || suffix))
4711 {
4712 /* It doesn't make sense to mix elision with other flags. We
4713 could fatal() here, but the standard seems to be to abort. */
4714 abort ();
4715 }
4716
ed1f651b 4717 filter = p;
9bf09437
RH
4718 while (*p != ':' && *p != '}' && *p != '|') p++;
4719
4720 if (*p == '|' && pipe_p)
4721 abort ();
4722
4723 if (!body)
ed1f651b 4724 {
9bf09437
RH
4725 if (*p != '}')
4726 {
4727 register int count = 1;
878f32c3 4728 register const char *q = p;
9bf09437
RH
4729
4730 while (*q++ != ':') continue;
4731 body = q;
4732
4733 while (count > 0)
4734 {
4735 if (*q == '{')
4736 count++;
4737 else if (*q == '}')
4738 count--;
4739 else if (*q == 0)
4740 abort ();
4741 q++;
4742 }
4743 endbody = q;
ed1f651b 4744 }
9bf09437
RH
4745 else
4746 body = p, endbody = p+1;
ed1f651b 4747 }
ed1f651b
RS
4748
4749 if (suffix)
4750 {
4751 int found = (input_suffix != 0
e51712db 4752 && (long) strlen (input_suffix) == (long)(p - filter)
ed1f651b
RS
4753 && strncmp (input_suffix, filter, p - filter) == 0);
4754
9bf09437 4755 if (body[0] == '}')
ed1f651b
RS
4756 abort ();
4757
4758 if (negate != found
9bf09437 4759 && do_spec_1 (save_string (body, endbody-body-1), 0, NULL_PTR) < 0)
ed1f651b 4760 return 0;
ed1f651b
RS
4761 }
4762 else if (p[-1] == '*' && p[0] == '}')
4763 {
4764 /* Substitute all matching switches as separate args. */
4765 register int i;
4766 --p;
4767 for (i = 0; i < n_switches; i++)
f5b0eb4e
RK
4768 if (!strncmp (switches[i].part1, filter, p - filter)
4769 && check_live_switch (i, p - filter))
9f3c45fd 4770 give_switch (i, 0, include_blanks);
ed1f651b
RS
4771 }
4772 else
4773 {
4774 /* Test for presence of the specified switch. */
4775 register int i;
4776 int present = 0;
4777
4778 /* If name specified ends in *, as in {x*:...},
4779 check for %* and handle that case. */
4780 if (p[-1] == '*' && !negate)
4781 {
4782 int substitution;
878f32c3 4783 const char *r = body;
ed1f651b
RS
4784
4785 /* First see whether we have %*. */
4786 substitution = 0;
9bf09437 4787 while (r < endbody)
ed1f651b
RS
4788 {
4789 if (*r == '%' && r[1] == '*')
4790 substitution = 1;
4791 r++;
4792 }
4793 /* If we do, handle that case. */
4794 if (substitution)
4795 {
4796 /* Substitute all matching switches as separate args.
4797 But do this by substituting for %*
4798 in the text that follows the colon. */
4799
4800 unsigned hard_match_len = p - filter - 1;
9bf09437 4801 char *string = save_string (body, endbody - body - 1);
ed1f651b
RS
4802
4803 for (i = 0; i < n_switches; i++)
f5b0eb4e 4804 if (!strncmp (switches[i].part1, filter, hard_match_len)
6c396fb5 4805 && check_live_switch (i, -1))
ed1f651b
RS
4806 {
4807 do_spec_1 (string, 0, &switches[i].part1[hard_match_len]);
4808 /* Pass any arguments this switch has. */
1ba9a487 4809 give_switch (i, 1, 1);
ed1f651b
RS
4810 }
4811
9bf09437
RH
4812 /* We didn't match. Try again. */
4813 if (*p++ == '|')
4814 goto next_member;
4815 return endbody;
ed1f651b
RS
4816 }
4817 }
4818
4819 /* If name specified ends in *, as in {x*:...},
4820 check for presence of any switch name starting with x. */
4821 if (p[-1] == '*')
4822 {
4823 for (i = 0; i < n_switches; i++)
4824 {
4825 unsigned hard_match_len = p - filter - 1;
4826
f5b0eb4e
RK
4827 if (!strncmp (switches[i].part1, filter, hard_match_len)
4828 && check_live_switch (i, hard_match_len))
ed1f651b 4829 {
ed1f651b 4830 present = 1;
1f58da7f 4831 break;
ed1f651b
RS
4832 }
4833 }
4834 }
4835 /* Otherwise, check for presence of exact name specified. */
4836 else
4837 {
4838 for (i = 0; i < n_switches; i++)
4839 {
4840 if (!strncmp (switches[i].part1, filter, p - filter)
f5b0eb4e 4841 && switches[i].part1[p - filter] == 0
6c396fb5 4842 && check_live_switch (i, -1))
ed1f651b 4843 {
ed1f651b
RS
4844 present = 1;
4845 break;
4846 }
4847 }
4848 }
4849
9bf09437 4850 /* If it is as desired (present for %{s...}, absent for %{!s...})
ed1f651b
RS
4851 then substitute either the switch or the specified
4852 conditional text. */
4853 if (present != negate)
4854 {
8097c429
TT
4855 if (elide_switch)
4856 {
4857 switches[i].live_cond = SWITCH_IGNORE;
4858 switches[i].validated = 1;
4859 }
4860 else if (*p == '}')
ed1f651b 4861 {
9f3c45fd 4862 give_switch (i, 0, include_blanks);
ed1f651b
RS
4863 }
4864 else
4865 {
9bf09437
RH
4866 if (do_spec_1 (save_string (body, endbody - body - 1),
4867 0, NULL_PTR) < 0)
ed1f651b
RS
4868 return 0;
4869 }
4870 }
f2cf3e1e 4871 else if (pipe_p)
ed1f651b
RS
4872 {
4873 /* Here if a %{|...} conditional fails: output a minus sign,
4874 which means "standard output" or "standard input". */
906c4e36 4875 do_spec_1 ("-", 0, NULL_PTR);
9bf09437 4876 return endbody;
ed1f651b
RS
4877 }
4878 }
4879
9bf09437
RH
4880 /* We didn't match; try again. */
4881 if (*p++ == '|')
4882 goto next_member;
4883
4884 return endbody;
ed1f651b 4885}
f5b0eb4e 4886\f
6c396fb5
RK
4887/* Return 0 iff switch number SWITCHNUM is obsoleted by a later switch
4888 on the command line. PREFIX_LENGTH is the length of XXX in an {XXX*}
4889 spec, or -1 if either exact match or %* is used.
f5b0eb4e
RK
4890
4891 A -O switch is obsoleted by a later -O switch. A -f, -m, or -W switch
4892 whose value does not begin with "no-" is obsoleted by the same value
4893 with the "no-", similarly for a switch with the "no-" prefix. */
4894
4895static int
6c396fb5 4896check_live_switch (switchnum, prefix_length)
f5b0eb4e 4897 int switchnum;
6c396fb5 4898 int prefix_length;
f5b0eb4e 4899{
878f32c3 4900 const char *name = switches[switchnum].part1;
f5b0eb4e
RK
4901 int i;
4902
6c396fb5 4903 /* In the common case of {<at-most-one-letter>*}, a negating
f5b0eb4e
RK
4904 switch would always match, so ignore that case. We will just
4905 send the conflicting switches to the compiler phase. */
6c396fb5 4906 if (prefix_length >= 0 && prefix_length <= 1)
f5b0eb4e
RK
4907 return 1;
4908
4909 /* If we already processed this switch and determined if it was
4910 live or not, return our past determination. */
4911 if (switches[switchnum].live_cond != 0)
4912 return switches[switchnum].live_cond > 0;
4913
4914 /* Now search for duplicate in a manner that depends on the name. */
4915 switch (*name)
4916 {
4917 case 'O':
f5b0eb4e
RK
4918 for (i = switchnum + 1; i < n_switches; i++)
4919 if (switches[i].part1[0] == 'O')
4920 {
ab87f8c8 4921 switches[switchnum].validated = 1;
8097c429 4922 switches[switchnum].live_cond = SWITCH_FALSE;
f5b0eb4e
RK
4923 return 0;
4924 }
4925 break;
ed1f651b 4926
f5b0eb4e 4927 case 'W': case 'f': case 'm':
6c396fb5 4928 if (! strncmp (name + 1, "no-", 3))
f5b0eb4e 4929 {
0f41302f 4930 /* We have Xno-YYY, search for XYYY. */
f5b0eb4e
RK
4931 for (i = switchnum + 1; i < n_switches; i++)
4932 if (switches[i].part1[0] == name[0]
4933 && ! strcmp (&switches[i].part1[1], &name[4]))
4934 {
ab87f8c8 4935 switches[switchnum].validated = 1;
8097c429 4936 switches[switchnum].live_cond = SWITCH_FALSE;
f5b0eb4e
RK
4937 return 0;
4938 }
4939 }
4940 else
4941 {
4942 /* We have XYYY, search for Xno-YYY. */
4943 for (i = switchnum + 1; i < n_switches; i++)
4944 if (switches[i].part1[0] == name[0]
4945 && switches[i].part1[1] == 'n'
4946 && switches[i].part1[2] == 'o'
4947 && switches[i].part1[3] == '-'
4948 && !strcmp (&switches[i].part1[4], &name[1]))
4949 {
ab87f8c8 4950 switches[switchnum].validated = 1;
8097c429 4951 switches[switchnum].live_cond = SWITCH_FALSE;
f5b0eb4e
RK
4952 return 0;
4953 }
4954 }
4955 break;
4956 }
4957
4958 /* Otherwise the switch is live. */
8097c429 4959 switches[switchnum].live_cond = SWITCH_LIVE;
f5b0eb4e
RK
4960 return 1;
4961}
4962\f
ed1f651b
RS
4963/* Pass a switch to the current accumulating command
4964 in the same form that we received it.
4965 SWITCHNUM identifies the switch; it is an index into
4966 the vector of switches gcc received, which is `switches'.
4967 This cannot fail since it never finishes a command line.
4968
1ba9a487
RK
4969 If OMIT_FIRST_WORD is nonzero, then we omit .part1 of the argument.
4970
4971 If INCLUDE_BLANKS is nonzero, then we include blanks before each argument
4972 of the switch. */
ed1f651b
RS
4973
4974static void
1ba9a487 4975give_switch (switchnum, omit_first_word, include_blanks)
ed1f651b
RS
4976 int switchnum;
4977 int omit_first_word;
1ba9a487 4978 int include_blanks;
ed1f651b 4979{
8097c429
TT
4980 if (switches[switchnum].live_cond == SWITCH_IGNORE)
4981 return;
4982
ed1f651b
RS
4983 if (!omit_first_word)
4984 {
906c4e36
RK
4985 do_spec_1 ("-", 0, NULL_PTR);
4986 do_spec_1 (switches[switchnum].part1, 1, NULL_PTR);
ed1f651b 4987 }
1ba9a487 4988
ed1f651b
RS
4989 if (switches[switchnum].args != 0)
4990 {
fbd40359 4991 const char **p;
ed1f651b
RS
4992 for (p = switches[switchnum].args; *p; p++)
4993 {
1ba9a487
RK
4994 if (include_blanks)
4995 do_spec_1 (" ", 0, NULL_PTR);
906c4e36 4996 do_spec_1 (*p, 1, NULL_PTR);
ed1f651b
RS
4997 }
4998 }
1ba9a487
RK
4999
5000 do_spec_1 (" ", 0, NULL_PTR);
ab87f8c8 5001 switches[switchnum].validated = 1;
ed1f651b
RS
5002}
5003\f
5004/* Search for a file named NAME trying various prefixes including the
5005 user's -B prefix and some standard ones.
5006 Return the absolute file name found. If nothing is found, return NAME. */
5007
878f32c3 5008static const char *
ed1f651b 5009find_file (name)
878f32c3 5010 const char *name;
ed1f651b
RS
5011{
5012 char *newname;
5013
60103a34
DE
5014 /* Try multilib_dir if it is defined. */
5015 if (multilib_dir != NULL)
5016 {
5017 char *try;
5018
5019 try = (char *) alloca (strlen (multilib_dir) + strlen (name) + 2);
5020 strcpy (try, multilib_dir);
48ff801b 5021 strcat (try, dir_separator_str);
60103a34
DE
5022 strcat (try, name);
5023
48ff801b 5024 newname = find_a_file (&startfile_prefixes, try, R_OK);
60103a34
DE
5025
5026 /* If we don't find it in the multi library dir, then fall
5027 through and look for it in the normal places. */
5028 if (newname != NULL)
5029 return newname;
5030 }
5031
48ff801b 5032 newname = find_a_file (&startfile_prefixes, name, R_OK);
ed1f651b
RS
5033 return newname ? newname : name;
5034}
5035
0ad5835e
ILT
5036/* Determine whether a directory exists. If LINKER, return 0 for
5037 certain fixed names not needed by the linker. If not LINKER, it is
5038 only important to return 0 if the host machine has a small ARG_MAX
5039 limit. */
ed1f651b
RS
5040
5041static int
0ad5835e 5042is_directory (path1, path2, linker)
878f32c3
KG
5043 const char *path1;
5044 const char *path2;
0ad5835e 5045 int linker;
ed1f651b
RS
5046{
5047 int len1 = strlen (path1);
5048 int len2 = strlen (path2);
5049 char *path = (char *) alloca (3 + len1 + len2);
5050 char *cp;
5051 struct stat st;
5052
0ad5835e
ILT
5053#ifndef SMALL_ARG_MAX
5054 if (! linker)
5055 return 1;
5056#endif
5057
ed1f651b
RS
5058 /* Construct the path from the two parts. Ensure the string ends with "/.".
5059 The resulting path will be a directory even if the given path is a
5060 symbolic link. */
7e2231e7
PB
5061 memcpy (path, path1, len1);
5062 memcpy (path + len1, path2, len2);
ed1f651b 5063 cp = path + len1 + len2;
509781a4 5064 if (!IS_DIR_SEPARATOR (cp[-1]))
48ff801b 5065 *cp++ = DIR_SEPARATOR;
ed1f651b
RS
5066 *cp++ = '.';
5067 *cp = '\0';
5068
5069 /* Exclude directories that the linker is known to search. */
0ad5835e 5070 if (linker
48ff801b 5071 && ((cp - path == 6
6aa62cff
DE
5072 && strcmp (path, concat (dir_separator_str, "lib",
5073 dir_separator_str, ".", NULL_PTR)) == 0)
48ff801b 5074 || (cp - path == 10
6aa62cff
DE
5075 && strcmp (path, concat (dir_separator_str, "usr",
5076 dir_separator_str, "lib",
5077 dir_separator_str, ".", NULL_PTR)) == 0)))
ed1f651b
RS
5078 return 0;
5079
5080 return (stat (path, &st) >= 0 && S_ISDIR (st.st_mode));
5081}
512b62fb
JM
5082
5083/* Set up the various global variables to indicate that we're processing
5084 the input file named FILENAME. */
5085
5086static void
5087set_input (filename)
5088 const char *filename;
5089{
5090 register const char *p;
5091
5092 input_filename = filename;
5093 input_filename_length = strlen (input_filename);
5094
5095 input_basename = input_filename;
4ebe197a
ME
5096#ifdef HAVE_DOS_BASED_FILE_SYSTEM
5097 /* Skip drive name so 'x:foo' is handled properly. */
5098 if (input_basename[1] == ':')
5099 input_basename += 2;
5100#endif
5101 for (p = input_basename; *p; p++)
512b62fb
JM
5102 if (IS_DIR_SEPARATOR (*p))
5103 input_basename = p + 1;
5104
5105 /* Find a suffix starting with the last period,
5106 and set basename_length to exclude that suffix. */
5107 basename_length = strlen (input_basename);
5108 p = input_basename + basename_length;
5109 while (p != input_basename && *p != '.') --p;
5110 if (*p == '.' && p != input_basename)
5111 {
5112 basename_length = p - input_basename;
5113 input_suffix = p + 1;
5114 }
5115 else
5116 input_suffix = "";
5117}
ed1f651b
RS
5118\f
5119/* On fatal signals, delete all the temporary files. */
5120
5121static void
5122fatal_error (signum)
5123 int signum;
5124{
5125 signal (signum, SIG_DFL);
5126 delete_failure_queue ();
5127 delete_temp_files ();
5128 /* Get the same signal again, this time not handled,
5129 so its normal effect occurs. */
5130 kill (getpid (), signum);
5131}
5132
c809adda 5133extern int main PARAMS ((int, char **));
a8f227e7 5134
ed1f651b
RS
5135int
5136main (argc, argv)
5137 int argc;
e9cefc3e 5138 char **argv;
ed1f651b 5139{
85066503
MH
5140 register size_t i;
5141 size_t j;
ed1f651b 5142 int value;
ed1f651b
RS
5143 int linker_was_run = 0;
5144 char *explicit_link_files;
5145 char *specs_file;
878f32c3 5146 const char *p;
d9ac3a07 5147 struct user_specs *uptr;
ed1f651b 5148
afcd8a02 5149 p = argv[0] + strlen (argv[0]);
509781a4
ME
5150 while (p != argv[0] && !IS_DIR_SEPARATOR (p[-1]))
5151 --p;
afcd8a02 5152 programname = p;
ed1f651b 5153
d9b53430 5154#ifdef HAVE_LC_MESSAGES
ab87f8c8 5155 setlocale (LC_MESSAGES, "");
d9b53430 5156#endif
735396d9
KG
5157 (void) bindtextdomain (PACKAGE, localedir);
5158 (void) textdomain (PACKAGE);
ab87f8c8 5159
ed1f651b
RS
5160 if (signal (SIGINT, SIG_IGN) != SIG_IGN)
5161 signal (SIGINT, fatal_error);
2a353d3a 5162#ifdef SIGHUP
ed1f651b
RS
5163 if (signal (SIGHUP, SIG_IGN) != SIG_IGN)
5164 signal (SIGHUP, fatal_error);
2a353d3a 5165#endif
ed1f651b
RS
5166 if (signal (SIGTERM, SIG_IGN) != SIG_IGN)
5167 signal (SIGTERM, fatal_error);
5168#ifdef SIGPIPE
5169 if (signal (SIGPIPE, SIG_IGN) != SIG_IGN)
5170 signal (SIGPIPE, fatal_error);
5171#endif
5172
5173 argbuf_length = 10;
fbd40359 5174 argbuf = (const char **) xmalloc (argbuf_length * sizeof (const char *));
ed1f651b
RS
5175
5176 obstack_init (&obstack);
5177
961b7009
MM
5178 /* Build multilib_select, et. al from the separate lines that make up each
5179 multilib selection. */
ffd86336 5180 {
3b304f5b 5181 const char *const *q = multilib_raw;
961b7009 5182 int need_space;
ffd86336
JW
5183
5184 obstack_init (&multilib_obstack);
0f41302f 5185 while ((p = *q++) != (char *) 0)
ffd86336
JW
5186 obstack_grow (&multilib_obstack, p, strlen (p));
5187
5188 obstack_1grow (&multilib_obstack, 0);
5189 multilib_select = obstack_finish (&multilib_obstack);
961b7009
MM
5190
5191 q = multilib_matches_raw;
5192 while ((p = *q++) != (char *) 0)
5193 obstack_grow (&multilib_obstack, p, strlen (p));
5194
5195 obstack_1grow (&multilib_obstack, 0);
5196 multilib_matches = obstack_finish (&multilib_obstack);
5197
0a8d6618
BC
5198 q = multilib_exclusions_raw;
5199 while ((p = *q++) != (char *) 0)
5200 obstack_grow (&multilib_obstack, p, strlen (p));
5201
5202 obstack_1grow (&multilib_obstack, 0);
5203 multilib_exclusions = obstack_finish (&multilib_obstack);
5204
961b7009
MM
5205 need_space = FALSE;
5206 for (i = 0;
5207 i < sizeof (multilib_defaults_raw) / sizeof (multilib_defaults_raw[0]);
5208 i++)
5209 {
5210 if (need_space)
5211 obstack_1grow (&multilib_obstack, ' ');
5212 obstack_grow (&multilib_obstack,
5213 multilib_defaults_raw[i],
5214 strlen (multilib_defaults_raw[i]));
5215 need_space = TRUE;
5216 }
5217
5218 obstack_1grow (&multilib_obstack, 0);
5219 multilib_defaults = obstack_finish (&multilib_obstack);
ffd86336
JW
5220 }
5221
b3865ca9 5222 /* Set up to remember the pathname of gcc and any options
1d23c208
JW
5223 needed for collect. We use argv[0] instead of programname because
5224 we need the complete pathname. */
b3865ca9
RS
5225 obstack_init (&collect_obstack);
5226 obstack_grow (&collect_obstack, "COLLECT_GCC=", sizeof ("COLLECT_GCC=")-1);
1d23c208 5227 obstack_grow (&collect_obstack, argv[0], strlen (argv[0])+1);
b3865ca9
RS
5228 putenv (obstack_finish (&collect_obstack));
5229
8faf4a68
JW
5230#ifdef INIT_ENVIRONMENT
5231 /* Set up any other necessary machine specific environment variables. */
5232 putenv (INIT_ENVIRONMENT);
5233#endif
5234
ed1f651b
RS
5235 /* Choose directory for temp files. */
5236
003ac91d 5237#ifndef MKTEMP_EACH_FILE
6aa62cff
DE
5238 temp_filename = choose_temp_base ();
5239 temp_filename_length = strlen (temp_filename);
003ac91d 5240#endif
ed1f651b
RS
5241
5242 /* Make a table of what switches there are (switches, n_switches).
5243 Make a table of specified input files (infiles, n_infiles).
5244 Decode switches that are handled locally. */
5245
5246 process_command (argc, argv);
5247
aa32d841 5248 {
aa32d841
JL
5249 int first_time;
5250
5251 /* Build COLLECT_GCC_OPTIONS to have all of the options specified to
5252 the compiler. */
5253 obstack_grow (&collect_obstack, "COLLECT_GCC_OPTIONS=",
5254 sizeof ("COLLECT_GCC_OPTIONS=")-1);
5255
5256 first_time = TRUE;
e51712db 5257 for (i = 0; (int)i < n_switches; i++)
aa32d841 5258 {
fbd40359 5259 const char **args;
878f32c3 5260 const char *p, *q;
aa32d841
JL
5261 if (!first_time)
5262 obstack_grow (&collect_obstack, " ", 1);
5263
5264 first_time = FALSE;
5265 obstack_grow (&collect_obstack, "'-", 2);
5266 q = switches[i].part1;
670ee920 5267 while ((p = index (q,'\'')))
aa32d841
JL
5268 {
5269 obstack_grow (&collect_obstack, q, p-q);
5270 obstack_grow (&collect_obstack, "'\\''", 4);
5271 q = ++p;
5272 }
5273 obstack_grow (&collect_obstack, q, strlen (q));
5274 obstack_grow (&collect_obstack, "'", 1);
5275
5276 for (args = switches[i].args; args && *args; args++)
5277 {
5278 obstack_grow (&collect_obstack, " '", 2);
5279 q = *args;
670ee920 5280 while ((p = index (q,'\'')))
aa32d841
JL
5281 {
5282 obstack_grow (&collect_obstack, q, p-q);
5283 obstack_grow (&collect_obstack, "'\\''", 4);
5284 q = ++p;
5285 }
5286 obstack_grow (&collect_obstack, q, strlen (q));
5287 obstack_grow (&collect_obstack, "'", 1);
5288 }
5289 }
5290 obstack_grow (&collect_obstack, "\0", 1);
5291 putenv (obstack_finish (&collect_obstack));
5292 }
5293
ed1f651b
RS
5294 /* Initialize the vector of specs to just the default.
5295 This means one element containing 0s, as a terminator. */
5296
5297 compilers = (struct compiler *) xmalloc (sizeof default_compilers);
4c9a05bc
RK
5298 bcopy ((char *) default_compilers, (char *) compilers,
5299 sizeof default_compilers);
ed1f651b
RS
5300 n_compilers = n_default_compilers;
5301
5302 /* Read specs from a file if there is one. */
5303
6aa62cff
DE
5304 machine_suffix = concat (spec_machine, dir_separator_str,
5305 spec_version, dir_separator_str, NULL_PTR);
5306 just_machine_suffix = concat (spec_machine, dir_separator_str, NULL_PTR);
ed1f651b 5307
48ff801b 5308 specs_file = find_a_file (&startfile_prefixes, "specs", R_OK);
ed1f651b
RS
5309 /* Read the specs file unless it is a default one. */
5310 if (specs_file != 0 && strcmp (specs_file, "specs"))
20df0482
MM
5311 read_specs (specs_file, TRUE);
5312 else
5313 init_spec ();
841faeed 5314
5bb67e36 5315 /* We need to check standard_exec_prefix/just_machine_suffix/specs
3ac63d94 5316 for any override of as, ld and libraries. */
5bb67e36
RK
5317 specs_file = (char *) alloca (strlen (standard_exec_prefix)
5318 + strlen (just_machine_suffix)
5319 + sizeof ("specs"));
5320
5321 strcpy (specs_file, standard_exec_prefix);
5322 strcat (specs_file, just_machine_suffix);
5323 strcat (specs_file, "specs");
5324 if (access (specs_file, R_OK) == 0)
5325 read_specs (specs_file, TRUE);
5326
004fd4d5 5327 /* If not cross-compiling, look for startfiles in the standard places. */
fcc9ad83 5328 if (*cross_compile == '0')
004fd4d5
RS
5329 {
5330#ifdef MD_EXEC_PREFIX
e9a25f70
JL
5331 add_prefix (&exec_prefixes, md_exec_prefix, "GCC", 0, 0, NULL_PTR);
5332 add_prefix (&startfile_prefixes, md_exec_prefix, "GCC", 0, 0, NULL_PTR);
004fd4d5
RS
5333#endif
5334
5335#ifdef MD_STARTFILE_PREFIX
e9a25f70
JL
5336 add_prefix (&startfile_prefixes, md_startfile_prefix, "GCC",
5337 0, 0, NULL_PTR);
004fd4d5
RS
5338#endif
5339
607a4f7d 5340#ifdef MD_STARTFILE_PREFIX_1
e9a25f70
JL
5341 add_prefix (&startfile_prefixes, md_startfile_prefix_1, "GCC",
5342 0, 0, NULL_PTR);
607a4f7d
RS
5343#endif
5344
4dbc7773
ILT
5345 /* If standard_startfile_prefix is relative, base it on
5346 standard_exec_prefix. This lets us move the installed tree
5347 as a unit. If GCC_EXEC_PREFIX is defined, base
5348 standard_startfile_prefix on that as well. */
509781a4
ME
5349 if (IS_DIR_SEPARATOR (*standard_startfile_prefix)
5350 || *standard_startfile_prefix == '$'
0deb20df 5351#ifdef HAVE_DOS_BASED_FILE_SYSTEM
509781a4 5352 /* Check for disk name on MS-DOS-based systems. */
e5e809f4 5353 || (standard_startfile_prefix[1] == ':'
509781a4 5354 && (IS_DIR_SEPARATOR (standard_startfile_prefix[2])))
e5e809f4
JL
5355#endif
5356 )
e9a25f70
JL
5357 add_prefix (&startfile_prefixes, standard_startfile_prefix, "BINUTILS",
5358 0, 0, NULL_PTR);
4dbc7773
ILT
5359 else
5360 {
5361 if (gcc_exec_prefix)
48ff801b 5362 add_prefix (&startfile_prefixes,
6aa62cff
DE
5363 concat (gcc_exec_prefix, machine_suffix,
5364 standard_startfile_prefix, NULL_PTR),
e9a25f70 5365 NULL_PTR, 0, 0, NULL_PTR);
48ff801b 5366 add_prefix (&startfile_prefixes,
6aa62cff
DE
5367 concat (standard_exec_prefix,
5368 machine_suffix,
5369 standard_startfile_prefix, NULL_PTR),
e9a25f70 5370 NULL_PTR, 0, 0, NULL_PTR);
4dbc7773
ILT
5371 }
5372
e9a25f70
JL
5373 add_prefix (&startfile_prefixes, standard_startfile_prefix_1,
5374 "BINUTILS", 0, 0, NULL_PTR);
5375 add_prefix (&startfile_prefixes, standard_startfile_prefix_2,
5376 "BINUTILS", 0, 0, NULL_PTR);
004fd4d5 5377#if 0 /* Can cause surprises, and one can use -B./ instead. */
e9a25f70 5378 add_prefix (&startfile_prefixes, "./", NULL_PTR, 0, 1, NULL_PTR);
004fd4d5
RS
5379#endif
5380 }
e8601ecb
JW
5381 else
5382 {
509781a4 5383 if (!IS_DIR_SEPARATOR (*standard_startfile_prefix) && gcc_exec_prefix)
e8601ecb 5384 add_prefix (&startfile_prefixes,
6aa62cff
DE
5385 concat (gcc_exec_prefix, machine_suffix,
5386 standard_startfile_prefix, NULL_PTR),
e9a25f70 5387 "BINUTILS", 0, 0, NULL_PTR);
e8601ecb
JW
5388 }
5389
8607048d
TT
5390 /* Process any user specified specs in the order given on the command
5391 line. */
5392 for (uptr = user_specs_head; uptr; uptr = uptr->next)
5393 {
5394 char *filename = find_a_file (&startfile_prefixes, uptr->filename, R_OK);
5395 read_specs (filename ? filename : uptr->filename, FALSE);
5396 }
5397
e8601ecb
JW
5398 /* If we have a GCC_EXEC_PREFIX envvar, modify it for cpp's sake. */
5399 if (gcc_exec_prefix)
5400 {
5401 char * temp = (char *) xmalloc (strlen (gcc_exec_prefix)
5402 + strlen (spec_version)
5403 + strlen (spec_machine) + 3);
5404 strcpy (temp, gcc_exec_prefix);
5405 strcat (temp, spec_machine);
5406 strcat (temp, dir_separator_str);
5407 strcat (temp, spec_version);
5408 strcat (temp, dir_separator_str);
5409 gcc_exec_prefix = temp;
5410 }
004fd4d5 5411
ed1f651b
RS
5412 /* Now we have the specs.
5413 Set the `valid' bits for switches that match anything in any spec. */
5414
5415 validate_all_switches ();
5416
60103a34
DE
5417 /* Now that we have the switches and the specs, set
5418 the subdirectory based on the options. */
5419 set_multilib_dir ();
5420
ed1f651b
RS
5421 /* Warn about any switches that no pass was interested in. */
5422
e51712db 5423 for (i = 0; (int)i < n_switches; i++)
ab87f8c8 5424 if (! switches[i].validated)
ed1f651b
RS
5425 error ("unrecognized option `-%s'", switches[i].part1);
5426
6a9e290e
RK
5427 /* Obey some of the options. */
5428
2628b9d3
DE
5429 if (print_search_dirs)
5430 {
5431 printf ("install: %s%s\n", standard_exec_prefix, machine_suffix);
5432 printf ("programs: %s\n", build_search_list (&exec_prefixes, "", 0));
5433 printf ("libraries: %s\n", build_search_list (&startfile_prefixes, "", 0));
9257393c 5434 return (0);
2628b9d3
DE
5435 }
5436
6a9e290e 5437 if (print_file_name)
2dcb563f 5438 {
6a9e290e 5439 printf ("%s\n", find_file (print_file_name));
9257393c 5440 return (0);
2dcb563f
RS
5441 }
5442
6a9e290e
RK
5443 if (print_prog_name)
5444 {
48ff801b 5445 char *newname = find_a_file (&exec_prefixes, print_prog_name, X_OK);
6a9e290e 5446 printf ("%s\n", (newname ? newname : print_prog_name));
9257393c 5447 return (0);
6a9e290e 5448 }
ed1f651b 5449
60103a34
DE
5450 if (print_multi_lib)
5451 {
5452 print_multilib_info ();
9257393c 5453 return (0);
60103a34
DE
5454 }
5455
5456 if (print_multi_directory)
5457 {
5458 if (multilib_dir == NULL)
5459 printf (".\n");
5460 else
5461 printf ("%s\n", multilib_dir);
9257393c 5462 return (0);
60103a34
DE
5463 }
5464
b8468bc7
NC
5465 if (print_help_list)
5466 {
5467 display_help ();
5468
5469 if (! verbose_flag)
5470 {
e67df273 5471 printf ("\nFor bug reporting instructions, please see:\n");
8b97e23b 5472 printf ("%s.\n", GCCBUGURL);
b8468bc7 5473
9257393c 5474 return (0);
b8468bc7
NC
5475 }
5476
5477 /* We do not exit here. Instead we have created a fake input file
5478 called 'help-dummy' which needs to be compiled, and we pass this
5479 on the the various sub-processes, along with the --help switch. */
5480 }
5481
ed1f651b
RS
5482 if (verbose_flag)
5483 {
7ad9ff7a
DE
5484 int n;
5485
5486 /* compiler_version is truncated at the first space when initialized
5487 from version string, so truncate version_string at the first space
5488 before comparing. */
5489 for (n = 0; version_string[n]; n++)
5490 if (version_string[n] == ' ')
5491 break;
5492
5493 if (! strncmp (version_string, compiler_version, n)
5494 && compiler_version[n] == 0)
ab87f8c8 5495 notice ("gcc version %s\n", version_string);
9c4faac1 5496 else
ab87f8c8
JL
5497 notice ("gcc driver version %s executing gcc version %s\n",
5498 version_string, compiler_version);
9c4faac1 5499
ed1f651b 5500 if (n_infiles == 0)
9257393c 5501 return (0);
ed1f651b
RS
5502 }
5503
a2a05b0a 5504 if (n_infiles == added_libraries)
1df80ae4 5505 fatal ("No input files");
ed1f651b
RS
5506
5507 /* Make a place to record the compiler output file names
5508 that correspond to the input files. */
5509
f271358e 5510 i = n_infiles;
e37cda9b 5511 i += lang_specific_extra_outfiles;
ad85216e 5512 outfiles = (const char **) xcalloc (i, sizeof (char *));
ed1f651b
RS
5513
5514 /* Record which files were specified explicitly as link input. */
5515
ad85216e 5516 explicit_link_files = xcalloc (1, n_infiles);
ed1f651b 5517
e51712db 5518 for (i = 0; (int)i < n_infiles; i++)
ed1f651b
RS
5519 {
5520 register struct compiler *cp = 0;
5521 int this_file_error = 0;
5522
5523 /* Tell do_spec what to substitute for %i. */
5524
ed1f651b 5525 input_file_number = i;
512b62fb 5526 set_input (infiles[i].name);
ed1f651b
RS
5527
5528 /* Use the same thing in %o, unless cp->spec says otherwise. */
5529
5530 outfiles[i] = input_filename;
5531
5532 /* Figure out which compiler from the file's suffix. */
5533
5534 cp = lookup_compiler (infiles[i].name, input_filename_length,
5535 infiles[i].language);
5536
5537 if (cp)
5538 {
5539 /* Ok, we found an applicable compiler. Run its spec. */
5540 /* First say how much of input_filename to substitute for %b */
ec32609a 5541 int len;
ed1f651b 5542
4689ad58
RK
5543 if (cp->spec[0][0] == '#')
5544 error ("%s: %s compiler not installed on this system",
5545 input_filename, &cp->spec[0][1]);
5546
ec32609a 5547 len = 0;
058d8521
RS
5548 for (j = 0; j < sizeof cp->spec / sizeof cp->spec[0]; j++)
5549 if (cp->spec[j])
5550 len += strlen (cp->spec[j]);
ec32609a 5551
878f32c3
KG
5552 {
5553 char *p1 = (char *) xmalloc (len + 1);
5554
5555 len = 0;
5556 for (j = 0; j < sizeof cp->spec / sizeof cp->spec[0]; j++)
5557 if (cp->spec[j])
5558 {
5559 strcpy (p1 + len, cp->spec[j]);
5560 len += strlen (cp->spec[j]);
5561 }
5562
5563 value = do_spec (p1);
5564 free (p1);
5565 }
ed1f651b
RS
5566 if (value < 0)
5567 this_file_error = 1;
5568 }
5569
5570 /* If this file's name does not contain a recognized suffix,
5571 record it as explicit linker input. */
5572
5573 else
5574 explicit_link_files[i] = 1;
5575
5576 /* Clear the delete-on-failure queue, deleting the files in it
5577 if this compilation failed. */
5578
5579 if (this_file_error)
5580 {
5581 delete_failure_queue ();
5582 error_count++;
5583 }
5584 /* If this compilation succeeded, don't delete those files later. */
5585 clear_failure_queue ();
5586 }
5587
512b62fb
JM
5588 /* Reset the output file name to the first input file name, for use
5589 with %b in LINK_SPEC on a target that prefers not to emit a.out
5590 by default. */
5591 if (n_infiles > 0)
5592 set_input (infiles[0].name);
5593
15c5edb9
TT
5594 if (error_count == 0)
5595 {
5596 /* Make sure INPUT_FILE_NUMBER points to first available open
5597 slot. */
5598 input_file_number = n_infiles;
5599 if (lang_specific_pre_link ())
5600 error_count++;
5601 }
f271358e 5602
ed1f651b
RS
5603 /* Run ld to link all the compiler output files. */
5604
5605 if (error_count == 0)
5606 {
5607 int tmp = execution_count;
b3865ca9 5608
10da1131
BM
5609 /* We'll use ld if we can't find collect2. */
5610 if (! strcmp (linker_name_spec, "collect2"))
5611 {
5612 char *s = find_a_file (&exec_prefixes, "collect2", X_OK);
5613 if (s == NULL)
5614 linker_name_spec = "ld";
5615 }
b3865ca9
RS
5616 /* Rebuild the COMPILER_PATH and LIBRARY_PATH environment variables
5617 for collect. */
512b62fb
JM
5618 putenv_from_prefixes (&exec_prefixes, "COMPILER_PATH");
5619 putenv_from_prefixes (&startfile_prefixes, LIBRARY_PATH_ENV);
b3865ca9 5620
ed1f651b
RS
5621 value = do_spec (link_command_spec);
5622 if (value < 0)
5623 error_count = 1;
5624 linker_was_run = (tmp != execution_count);
5625 }
5626
5627 /* Warn if a -B option was specified but the prefix was never used. */
48ff801b
RK
5628 unused_prefix_warnings (&exec_prefixes);
5629 unused_prefix_warnings (&startfile_prefixes);
ed1f651b
RS
5630
5631 /* If options said don't run linker,
5632 complain about input files to be given to the linker. */
5633
5634 if (! linker_was_run && error_count == 0)
e51712db 5635 for (i = 0; (int)i < n_infiles; i++)
ed1f651b
RS
5636 if (explicit_link_files[i])
5637 error ("%s: linker input file unused since linking not done",
5638 outfiles[i]);
5639
5640 /* Delete some or all of the temporary files we made. */
5641
5642 if (error_count)
5643 delete_failure_queue ();
5644 delete_temp_files ();
5645
b8468bc7
NC
5646 if (print_help_list)
5647 {
e67df273 5648 printf ("\nFor bug reporting instructions, please see:\n");
8b97e23b 5649 printf ("%s\n", GCCBUGURL);
b8468bc7
NC
5650 }
5651
14a774a9
RK
5652 return (signal_count != 0 ? 2
5653 : error_count > 0 ? (pass_exit_codes ? greatest_status : 1)
5654 : 0);
ed1f651b
RS
5655}
5656
5657/* Find the proper compilation spec for the file name NAME,
004fd4d5 5658 whose length is LENGTH. LANGUAGE is the specified language,
e5e809f4 5659 or 0 if this file is to be passed to the linker. */
ed1f651b
RS
5660
5661static struct compiler *
5662lookup_compiler (name, length, language)
878f32c3 5663 const char *name;
85066503 5664 size_t length;
878f32c3 5665 const char *language;
ed1f651b
RS
5666{
5667 struct compiler *cp;
5668
3ac63d94 5669 /* If this was specified by the user to be a linker input, indicate that. */
e5e809f4
JL
5670 if (language != 0 && language[0] == '*')
5671 return 0;
5672
5673 /* Otherwise, look for the language, if one is spec'd. */
ed1f651b
RS
5674 if (language != 0)
5675 {
5676 for (cp = compilers + n_compilers - 1; cp >= compilers; cp--)
e5e809f4
JL
5677 if (cp->suffix[0] == '@' && !strcmp (cp->suffix + 1, language))
5678 return cp;
5679
ed1f651b 5680 error ("language %s not recognized", language);
e5e809f4 5681 return 0;
ed1f651b
RS
5682 }
5683
5684 /* Look for a suffix. */
5685 for (cp = compilers + n_compilers - 1; cp >= compilers; cp--)
5686 {
4cf3301c
RS
5687 if (/* The suffix `-' matches only the file name `-'. */
5688 (!strcmp (cp->suffix, "-") && !strcmp (name, "-"))
e5e809f4
JL
5689 || (strlen (cp->suffix) < length
5690 /* See if the suffix matches the end of NAME. */
e5e809f4
JL
5691 && !strcmp (cp->suffix,
5692 name + length - strlen (cp->suffix))
e5e809f4 5693 ))
03bf1c28
MK
5694 break;
5695 }
e5e809f4 5696
03bf1c28
MK
5697#if defined (OS2) ||defined (HAVE_DOS_BASED_FILE_SYSTEM)
5698 /* look again, but case-insensitively this time. */
5699 if (cp < compilers)
5700 for (cp = compilers + n_compilers - 1; cp >= compilers; cp--)
5701 {
5702 if (/* The suffix `-' matches only the file name `-'. */
5703 (!strcmp (cp->suffix, "-") && !strcmp (name, "-"))
5704 || (strlen (cp->suffix) < length
5705 /* See if the suffix matches the end of NAME. */
5706 && ((!strcmp (cp->suffix,
5707 name + length - strlen (cp->suffix))
5708 || !strpbrk (cp->suffix, "ABCDEFGHIJKLMNOPQRSTUVWXYZ"))
5709 && !strcasecmp (cp->suffix,
5710 name + length - strlen (cp->suffix)))
5711 ))
5712 break;
5713 }
5714#endif
5715
5716
5717 if (cp >= compilers)
5718 {
5719 if (cp->spec[0][0] == '@')
5720 {
5721 struct compiler *new;
5722
5723 /* An alias entry maps a suffix to a language.
5724 Search for the language; pass 0 for NAME and LENGTH
5725 to avoid infinite recursion if language not found.
5726 Construct the new compiler spec. */
5727 language = cp->spec[0] + 1;
5728 new = (struct compiler *) xmalloc (sizeof (struct compiler));
5729 new->suffix = cp->suffix;
5730 memcpy (new->spec,
5731 lookup_compiler (NULL_PTR, 0, language)->spec,
5732 sizeof new->spec);
5733 return new;
ed1f651b 5734 }
03bf1c28
MK
5735
5736 /* A non-alias entry: return it. */
5737 return cp;
ed1f651b
RS
5738 }
5739
5740 return 0;
5741}
5742\f
ed1f651b
RS
5743static char *
5744save_string (s, len)
460ee112
KG
5745 const char *s;
5746 int len;
ed1f651b
RS
5747{
5748 register char *result = xmalloc (len + 1);
5749
5750 bcopy (s, result, len);
5751 result[len] = 0;
5752 return result;
5753}
5754
5755static void
5756pfatal_with_name (name)
878f32c3 5757 const char *name;
ed1f651b 5758{
ab87f8c8
JL
5759 perror_with_name (name);
5760 delete_temp_files ();
5761 exit (1);
ed1f651b
RS
5762}
5763
5764static void
5765perror_with_name (name)
878f32c3 5766 const char *name;
ed1f651b 5767{
ed35cf6e 5768 error ("%s: %s", name, xstrerror (errno));
ed1f651b
RS
5769}
5770
5771static void
c10d53dd 5772pfatal_pexecute (errmsg_fmt, errmsg_arg)
878f32c3
KG
5773 const char *errmsg_fmt;
5774 const char *errmsg_arg;
ed1f651b 5775{
c10d53dd
DE
5776 if (errmsg_arg)
5777 {
ab87f8c8
JL
5778 int save_errno = errno;
5779
c10d53dd
DE
5780 /* Space for trailing '\0' is in %s. */
5781 char *msg = xmalloc (strlen (errmsg_fmt) + strlen (errmsg_arg));
5782 sprintf (msg, errmsg_fmt, errmsg_arg);
5783 errmsg_fmt = msg;
ab87f8c8
JL
5784
5785 errno = save_errno;
c10d53dd
DE
5786 }
5787
ab87f8c8 5788 pfatal_with_name (errmsg_fmt);
ed1f651b
RS
5789}
5790
03c41c05 5791/* Output an error message and exit */
ed1f651b
RS
5792
5793void
5794fancy_abort ()
5795{
5796 fatal ("Internal gcc abort.");
5797}
5798\f
ed1f651b
RS
5799/* Output an error message and exit */
5800
9257393c 5801void
711d877c 5802fatal VPARAMS ((const char *msgid, ...))
ed1f651b 5803{
5148a72b 5804#ifndef ANSI_PROTOTYPES
878f32c3 5805 const char *msgid;
4f90e4a0
RK
5806#endif
5807 va_list ap;
5808
ab87f8c8 5809 VA_START (ap, msgid);
4f90e4a0 5810
5148a72b 5811#ifndef ANSI_PROTOTYPES
878f32c3 5812 msgid = va_arg (ap, const char *);
4f90e4a0 5813#endif
ed1f651b 5814
ed1f651b 5815 fprintf (stderr, "%s: ", programname);
ab87f8c8 5816 vfprintf (stderr, _(msgid), ap);
ed1f651b
RS
5817 va_end (ap);
5818 fprintf (stderr, "\n");
5819 delete_temp_files ();
5820 exit (1);
5821}
5822
5823static void
711d877c 5824error VPARAMS ((const char *msgid, ...))
ed1f651b 5825{
5148a72b 5826#ifndef ANSI_PROTOTYPES
878f32c3 5827 const char *msgid;
4f90e4a0
RK
5828#endif
5829 va_list ap;
5830
ab87f8c8 5831 VA_START (ap, msgid);
4f90e4a0 5832
5148a72b 5833#ifndef ANSI_PROTOTYPES
878f32c3 5834 msgid = va_arg (ap, const char *);
4f90e4a0 5835#endif
ed1f651b 5836
ed1f651b 5837 fprintf (stderr, "%s: ", programname);
ab87f8c8 5838 vfprintf (stderr, _(msgid), ap);
ed1f651b
RS
5839 va_end (ap);
5840
5841 fprintf (stderr, "\n");
5842}
ab87f8c8
JL
5843
5844static void
711d877c 5845notice VPARAMS ((const char *msgid, ...))
ab87f8c8
JL
5846{
5847#ifndef ANSI_PROTOTYPES
878f32c3 5848 const char *msgid;
ab87f8c8
JL
5849#endif
5850 va_list ap;
5851
5852 VA_START (ap, msgid);
5853
5854#ifndef ANSI_PROTOTYPES
878f32c3 5855 msgid = va_arg (ap, const char *);
ab87f8c8
JL
5856#endif
5857
5858 vfprintf (stderr, _(msgid), ap);
5859 va_end (ap);
5860}
5861
ed1f651b
RS
5862\f
5863static void
5864validate_all_switches ()
5865{
5866 struct compiler *comp;
878f32c3 5867 register const char *p;
ed1f651b 5868 register char c;
b3865ca9 5869 struct spec_list *spec;
ed1f651b 5870
ec32609a 5871 for (comp = compilers; comp->spec[0]; comp++)
ed1f651b 5872 {
85066503 5873 size_t i;
20eec2c2 5874 for (i = 0; i < sizeof comp->spec / sizeof comp->spec[0] && comp->spec[i]; i++)
ec32609a
RS
5875 {
5876 p = comp->spec[i];
ededb2fc 5877 while ((c = *p++))
ec32609a
RS
5878 if (c == '%' && *p == '{')
5879 /* We have a switch spec. */
5880 validate_switches (p + 1);
5881 }
ed1f651b
RS
5882 }
5883
3ac63d94 5884 /* Look through the linked list of specs read from the specs file. */
ec32609a 5885 for (spec = specs; spec ; spec = spec->next)
b3865ca9 5886 {
79aff5ac 5887 p = *(spec->ptr_spec);
ededb2fc 5888 while ((c = *p++))
b3865ca9
RS
5889 if (c == '%' && *p == '{')
5890 /* We have a switch spec. */
5891 validate_switches (p + 1);
5892 }
5893
ed1f651b 5894 p = link_command_spec;
ededb2fc 5895 while ((c = *p++))
ed1f651b
RS
5896 if (c == '%' && *p == '{')
5897 /* We have a switch spec. */
5898 validate_switches (p + 1);
ed1f651b
RS
5899}
5900
5901/* Look at the switch-name that comes after START
5902 and mark as valid all supplied switches that match it. */
5903
5904static void
5905validate_switches (start)
878f32c3 5906 const char *start;
ed1f651b 5907{
878f32c3
KG
5908 register const char *p = start;
5909 const char *filter;
ed1f651b
RS
5910 register int i;
5911 int suffix = 0;
5912
5913 if (*p == '|')
5914 ++p;
5915
5916 if (*p == '!')
5917 ++p;
5918
5919 if (*p == '.')
5920 suffix = 1, ++p;
5921
5922 filter = p;
5923 while (*p != ':' && *p != '}') p++;
5924
5925 if (suffix)
5926 ;
5927 else if (p[-1] == '*')
5928 {
5929 /* Mark all matching switches as valid. */
5930 --p;
5931 for (i = 0; i < n_switches; i++)
5932 if (!strncmp (switches[i].part1, filter, p - filter))
ab87f8c8 5933 switches[i].validated = 1;
ed1f651b
RS
5934 }
5935 else
5936 {
5937 /* Mark an exact matching switch as valid. */
5938 for (i = 0; i < n_switches; i++)
5939 {
5940 if (!strncmp (switches[i].part1, filter, p - filter)
5941 && switches[i].part1[p - filter] == 0)
ab87f8c8 5942 switches[i].validated = 1;
ed1f651b
RS
5943 }
5944 }
5945}
60103a34 5946\f
961b7009 5947/* Check whether a particular argument was used. The first time we
956d6950 5948 canonicalize the switches to keep only the ones we care about. */
60103a34
DE
5949
5950static int
5951used_arg (p, len)
878f32c3 5952 const char *p;
60103a34
DE
5953 int len;
5954{
3ac63d94
NC
5955 struct mswitchstr
5956 {
3b304f5b
ZW
5957 const char *str;
5958 const char *replace;
961b7009
MM
5959 int len;
5960 int rep_len;
5961 };
5962
5963 static struct mswitchstr *mswitches;
5964 static int n_mswitches;
5965 int i, j;
5966
5967 if (!mswitches)
5968 {
5969 struct mswitchstr *matches;
3b304f5b 5970 const char *q;
c8c2dcdc 5971 int cnt = 0;
961b7009
MM
5972
5973 /* Break multilib_matches into the component strings of string and replacement
3ac63d94 5974 string. */
1a0bdd29
RK
5975 for (q = multilib_matches; *q != '\0'; q++)
5976 if (*q == ';')
961b7009
MM
5977 cnt++;
5978
5979 matches = (struct mswitchstr *) alloca ((sizeof (struct mswitchstr)) * cnt);
5980 i = 0;
5981 q = multilib_matches;
5982 while (*q != '\0')
5983 {
5984 matches[i].str = q;
5985 while (*q != ' ')
5986 {
5987 if (*q == '\0')
5988 abort ();
5989 q++;
5990 }
961b7009 5991 matches[i].len = q - matches[i].str;
60103a34 5992
961b7009
MM
5993 matches[i].replace = ++q;
5994 while (*q != ';' && *q != '\0')
5995 {
5996 if (*q == ' ')
5997 abort ();
5998 q++;
5999 }
6000 matches[i].rep_len = q - matches[i].replace;
6001 i++;
83a0c799
ZW
6002 if (*q == ';')
6003 q++;
961b7009 6004 }
60103a34 6005
71591a1d
JW
6006 /* Now build a list of the replacement string for switches that we care
6007 about. Make sure we allocate at least one entry. This prevents
6008 xmalloc from calling fatal, and prevents us from re-executing this
6009 block of code. */
6010 mswitches
6011 = (struct mswitchstr *) xmalloc ((sizeof (struct mswitchstr))
6012 * (n_switches ? n_switches : 1));
961b7009
MM
6013 for (i = 0; i < n_switches; i++)
6014 {
6015 int xlen = strlen (switches[i].part1);
6016 for (j = 0; j < cnt; j++)
3b304f5b
ZW
6017 if (xlen == matches[j].len
6018 && ! strncmp (switches[i].part1, matches[j].str, xlen))
961b7009
MM
6019 {
6020 mswitches[n_mswitches].str = matches[j].replace;
6021 mswitches[n_mswitches].len = matches[j].rep_len;
6022 mswitches[n_mswitches].replace = (char *)0;
6023 mswitches[n_mswitches].rep_len = 0;
6024 n_mswitches++;
6025 break;
6026 }
6027 }
6028 }
03c42484 6029
961b7009
MM
6030 for (i = 0; i < n_mswitches; i++)
6031 if (len == mswitches[i].len && ! strncmp (p, mswitches[i].str, len))
6032 return 1;
03c42484 6033
961b7009
MM
6034 return 0;
6035}
03c42484
RK
6036
6037static int
6038default_arg (p, len)
878f32c3 6039 const char *p;
03c42484
RK
6040 int len;
6041{
3b304f5b 6042 const char *start, *end;
03c42484 6043
961b7009
MM
6044 for (start = multilib_defaults; *start != '\0'; start = end+1)
6045 {
6046 while (*start == ' ' || *start == '\t')
6047 start++;
6048
6049 if (*start == '\0')
6050 break;
6051
6052 for (end = start+1; *end != ' ' && *end != '\t' && *end != '\0'; end++)
6053 ;
6054
6055 if ((end - start) == len && strncmp (p, start, len) == 0)
6056 return 1;
e29ef920
MM
6057
6058 if (*end == '\0')
6059 break;
961b7009 6060 }
03c42484
RK
6061
6062 return 0;
6063}
6064
0a8d6618
BC
6065/* Work out the subdirectory to use based on the options. The format of
6066 multilib_select is a list of elements. Each element is a subdirectory
6067 name followed by a list of options followed by a semicolon. The format
6068 of multilib_exclusions is the same, but without the preceding
6069 directory. First gcc will check the exclusions, if none of the options
6070 beginning with an exclamation point are present, and all of the other
6071 options are present, then we will ignore this completely. Passing
6072 that, gcc will consider each multilib_select in turn using the same
6073 rules for matching the options. If a match is found, that subdirectory
6074 will be used. */
60103a34
DE
6075
6076static void
6077set_multilib_dir ()
6078{
3b304f5b 6079 const char *p;
3ac63d94 6080 unsigned int this_path_len;
3b304f5b 6081 const char *this_path, *this_arg;
03c42484
RK
6082 int not_arg;
6083 int ok;
60103a34 6084
0a8d6618
BC
6085 p = multilib_exclusions;
6086 while (*p != '\0')
6087 {
6088 /* Ignore newlines. */
6089 if (*p == '\n')
6090 {
6091 ++p;
6092 continue;
6093 }
6094
6095 /* Check the arguments. */
6096 ok = 1;
6097 while (*p != ';')
6098 {
6099 if (*p == '\0')
6100 abort ();
6101
6102 if (! ok)
6103 {
6104 ++p;
6105 continue;
6106 }
6107
6108 this_arg = p;
6109 while (*p != ' ' && *p != ';')
6110 {
6111 if (*p == '\0')
6112 abort ();
6113 ++p;
6114 }
6115
6116 if (*this_arg != '!')
6117 not_arg = 0;
6118 else
6119 {
6120 not_arg = 1;
6121 ++this_arg;
6122 }
6123
6124 ok = used_arg (this_arg, p - this_arg);
6125 if (not_arg)
6126 ok = ! ok;
6127
6128 if (*p == ' ')
6129 ++p;
6130 }
6131
6132 if (ok)
3ac63d94 6133 return;
0a8d6618
BC
6134
6135 ++p;
6136 }
6137
6138 p = multilib_select;
60103a34
DE
6139 while (*p != '\0')
6140 {
6141 /* Ignore newlines. */
6142 if (*p == '\n')
6143 {
6144 ++p;
6145 continue;
6146 }
6147
6148 /* Get the initial path. */
6149 this_path = p;
6150 while (*p != ' ')
6151 {
6152 if (*p == '\0')
6153 abort ();
6154 ++p;
6155 }
6156 this_path_len = p - this_path;
6157
6158 /* Check the arguments. */
03c42484 6159 ok = 1;
60103a34
DE
6160 ++p;
6161 while (*p != ';')
6162 {
6163 if (*p == '\0')
6164 abort ();
6165
03c42484 6166 if (! ok)
60103a34
DE
6167 {
6168 ++p;
6169 continue;
6170 }
6171
6172 this_arg = p;
6173 while (*p != ' ' && *p != ';')
6174 {
6175 if (*p == '\0')
6176 abort ();
6177 ++p;
6178 }
6179
03c42484
RK
6180 if (*this_arg != '!')
6181 not_arg = 0;
60103a34 6182 else
03c42484
RK
6183 {
6184 not_arg = 1;
6185 ++this_arg;
6186 }
6187
6188 /* If this is a default argument, we can just ignore it.
6189 This is true even if this_arg begins with '!'. Beginning
6190 with '!' does not mean that this argument is necessarily
6191 inappropriate for this library: it merely means that
6192 there is a more specific library which uses this
6193 argument. If this argument is a default, we need not
6194 consider that more specific library. */
6195 if (! default_arg (this_arg, p - this_arg))
6196 {
6197 ok = used_arg (this_arg, p - this_arg);
6198 if (not_arg)
6199 ok = ! ok;
6200 }
60103a34
DE
6201
6202 if (*p == ' ')
6203 ++p;
6204 }
6205
03c42484 6206 if (ok)
60103a34
DE
6207 {
6208 if (this_path_len != 1
6209 || this_path[0] != '.')
6210 {
878f32c3
KG
6211 char * new_multilib_dir = xmalloc (this_path_len + 1);
6212 strncpy (new_multilib_dir, this_path, this_path_len);
6213 new_multilib_dir[this_path_len] = '\0';
6214 multilib_dir = new_multilib_dir;
60103a34
DE
6215 }
6216 break;
6217 }
6218
6219 ++p;
6220 }
6221}
6222
6223/* Print out the multiple library subdirectory selection
6224 information. This prints out a series of lines. Each line looks
6225 like SUBDIRECTORY;@OPTION@OPTION, with as many options as is
6226 required. Only the desired options are printed out, the negative
6227 matches. The options are print without a leading dash. There are
6228 no spaces to make it easy to use the information in the shell.
6229 Each subdirectory is printed only once. This assumes the ordering
0a8d6618
BC
6230 generated by the genmultilib script. Also, we leave out ones that match
6231 the exclusions. */
60103a34
DE
6232
6233static void
6234print_multilib_info ()
6235{
3b304f5b
ZW
6236 const char *p = multilib_select;
6237 const char *last_path = 0, *this_path;
03c42484 6238 int skip;
3ac63d94 6239 unsigned int last_path_len = 0;
60103a34
DE
6240
6241 while (*p != '\0')
6242 {
0a8d6618 6243 skip = 0;
60103a34
DE
6244 /* Ignore newlines. */
6245 if (*p == '\n')
6246 {
6247 ++p;
6248 continue;
6249 }
6250
6251 /* Get the initial path. */
6252 this_path = p;
6253 while (*p != ' ')
6254 {
6255 if (*p == '\0')
6256 abort ();
6257 ++p;
6258 }
6259
0a8d6618
BC
6260 /* Check for matches with the multilib_exclusions. We don't bother
6261 with the '!' in either list. If any of the exclusion rules match
6262 all of its options with the select rule, we skip it. */
6263 {
3b304f5b
ZW
6264 const char *e = multilib_exclusions;
6265 const char *this_arg;
0a8d6618
BC
6266
6267 while (*e != '\0')
6268 {
6269 int m = 1;
6270 /* Ignore newlines. */
6271 if (*e == '\n')
6272 {
6273 ++e;
6274 continue;
6275 }
6276
6277 /* Check the arguments. */
6278 while (*e != ';')
6279 {
3b304f5b 6280 const char *q;
0a8d6618
BC
6281 int mp = 0;
6282
6283 if (*e == '\0')
6284 abort ();
6285
6286 if (! m)
6287 {
6288 ++e;
6289 continue;
6290 }
6291
6292 this_arg = e;
6293
6294 while (*e != ' ' && *e != ';')
6295 {
6296 if (*e == '\0')
6297 abort ();
6298 ++e;
6299 }
6300
6301 q = p + 1;
6302 while (*q != ';')
6303 {
3b304f5b 6304 const char *arg;
0a8d6618
BC
6305 int len = e - this_arg;
6306
6307 if (*q == '\0')
6308 abort ();
6309
6310 arg = q;
6311
6312 while (*q != ' ' && *q != ';')
6313 {
6314 if (*q == '\0')
6315 abort ();
6316 ++q;
6317 }
6318
3ac63d94
NC
6319 if (! strncmp (arg, this_arg, (len < q - arg) ? q - arg : len) ||
6320 default_arg (this_arg, e - this_arg))
0a8d6618
BC
6321 {
6322 mp = 1;
6323 break;
6324 }
6325
6326 if (*q == ' ')
6327 ++q;
0a8d6618
BC
6328 }
6329
6330 if (! mp)
6331 m = 0;
6332
6333 if (*e == ' ')
6334 ++e;
6335 }
3ac63d94 6336
0a8d6618
BC
6337 if (m)
6338 {
6339 skip = 1;
6340 break;
6341 }
6342
6343 if (*e != '\0')
6344 ++e;
6345 }
6346 }
6347
6348 if (! skip)
6349 {
6350 /* If this is a duplicate, skip it. */
3ac63d94 6351 skip = (last_path != 0 && (unsigned int)(p - this_path) == last_path_len
0a8d6618 6352 && ! strncmp (last_path, this_path, last_path_len));
60103a34 6353
0a8d6618
BC
6354 last_path = this_path;
6355 last_path_len = p - this_path;
6356 }
60103a34 6357
03c42484
RK
6358 /* If this directory requires any default arguments, we can skip
6359 it. We will already have printed a directory identical to
6360 this one which does not require that default argument. */
6361 if (! skip)
6362 {
3b304f5b 6363 const char *q;
03c42484
RK
6364
6365 q = p + 1;
6366 while (*q != ';')
6367 {
3b304f5b 6368 const char *arg;
03c42484
RK
6369
6370 if (*q == '\0')
6371 abort ();
6372
6373 if (*q == '!')
6374 arg = NULL;
6375 else
6376 arg = q;
6377
6378 while (*q != ' ' && *q != ';')
6379 {
6380 if (*q == '\0')
6381 abort ();
6382 ++q;
6383 }
6384
6385 if (arg != NULL
6386 && default_arg (arg, q - arg))
6387 {
6388 skip = 1;
6389 break;
6390 }
6391
6392 if (*q == ' ')
6393 ++q;
6394 }
6395 }
6396
60103a34
DE
6397 if (! skip)
6398 {
3b304f5b 6399 const char *p1;
60103a34
DE
6400
6401 for (p1 = last_path; p1 < p; p1++)
6402 putchar (*p1);
6403 putchar (';');
6404 }
6405
6406 ++p;
6407 while (*p != ';')
6408 {
6409 int use_arg;
6410
6411 if (*p == '\0')
6412 abort ();
6413
6414 if (skip)
6415 {
6416 ++p;
6417 continue;
6418 }
6419
6420 use_arg = *p != '!';
6421
6422 if (use_arg)
6423 putchar ('@');
6424
6425 while (*p != ' ' && *p != ';')
6426 {
6427 if (*p == '\0')
6428 abort ();
6429 if (use_arg)
6430 putchar (*p);
6431 ++p;
6432 }
6433
6434 if (*p == ' ')
6435 ++p;
6436 }
6437
6438 if (! skip)
961b7009 6439 {
3ac63d94 6440 /* If there are extra options, print them now. */
961b7009
MM
6441 if (multilib_extra && *multilib_extra)
6442 {
6443 int print_at = TRUE;
3b304f5b 6444 const char *q;
961b7009
MM
6445
6446 for (q = multilib_extra; *q != '\0'; q++)
6447 {
6448 if (*q == ' ')
6449 print_at = TRUE;
6450 else
6451 {
6452 if (print_at)
6453 putchar ('@');
6454 putchar (*q);
6455 print_at = FALSE;
6456 }
6457 }
6458 }
3ac63d94 6459
961b7009
MM
6460 putchar ('\n');
6461 }
60103a34
DE
6462
6463 ++p;
6464 }
6465}