OSDN Git Service

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