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