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