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