OSDN Git Service

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