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