OSDN Git Service

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