OSDN Git Service

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