OSDN Git Service

* c-common.c (c_tree_code_name): Const-ification.
[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 GCC.
6
7 GCC is free software; you can redistribute it and/or modify it under
8 the terms of the GNU General Public License as published by the Free
9 Software Foundation; either version 2, or (at your option) any later
10 version.
11
12 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13 WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
15 for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING.  If not, write to the Free
19 Software Foundation, 59 Temple Place - Suite 330, Boston, MA
20 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   const 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 *const standard_exec_prefix = STANDARD_EXEC_PREFIX;
1284 static const char *const 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 *const standard_startfile_prefix = STANDARD_STARTFILE_PREFIX;
1290 static const char *const standard_startfile_prefix_1 = "/lib/";
1291 static const char *const standard_startfile_prefix_2 = "/usr/lib/";
1292
1293 static const char *const tooldir_base_prefix = TOOLDIR_BASE_PREFIX;
1294 static const char *tooldir_prefix;
1295
1296 static const char *const 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 *const file_suffix =
2440     ((mode & X_OK) != 0 ? HOST_EXECUTABLE_SUFFIX : "");
2441   struct prefix_list *pl;
2442   int len = pprefix->max_len + strlen (name) + strlen (file_suffix) + 1;
2443
2444 #ifdef DEFAULT_ASSEMBLER
2445   if (! strcmp (name, "as") && access (DEFAULT_ASSEMBLER, mode) == 0)
2446     return xstrdup (DEFAULT_ASSEMBLER);
2447 #endif
2448
2449 #ifdef DEFAULT_LINKER
2450   if (! strcmp(name, "ld") && access (DEFAULT_LINKER, mode) == 0)
2451     return xstrdup (DEFAULT_LINKER);
2452 #endif
2453
2454   if (machine_suffix)
2455     len += strlen (machine_suffix);
2456
2457   temp = xmalloc (len);
2458
2459   /* Determine the filename to execute (special case for absolute paths).  */
2460
2461   if (IS_ABSOLUTE_PATHNAME (name))
2462     {
2463       if (access (name, mode) == 0)
2464         {
2465           strcpy (temp, name);
2466           return temp;
2467         }
2468     }
2469   else
2470     for (pl = pprefix->plist; pl; pl = pl->next)
2471       {
2472         if (machine_suffix)
2473           {
2474             /* Some systems have a suffix for executable files.
2475                So try appending that first.  */
2476             if (file_suffix[0] != 0)
2477               {
2478                 strcpy (temp, pl->prefix);
2479                 strcat (temp, machine_suffix);
2480                 strcat (temp, name);
2481                 strcat (temp, file_suffix);
2482                 if (access_check (temp, mode) == 0)
2483                   {
2484                     if (pl->used_flag_ptr != 0)
2485                       *pl->used_flag_ptr = 1;
2486                     return temp;
2487                   }
2488               }
2489
2490             /* Now try just the name.  */
2491             strcpy (temp, pl->prefix);
2492             strcat (temp, machine_suffix);
2493             strcat (temp, name);
2494             if (access_check (temp, mode) == 0)
2495               {
2496                 if (pl->used_flag_ptr != 0)
2497                   *pl->used_flag_ptr = 1;
2498                 return temp;
2499               }
2500           }
2501
2502         /* Certain prefixes are tried with just the machine type,
2503            not the version.  This is used for finding as, ld, etc.  */
2504         if (just_machine_suffix && pl->require_machine_suffix == 2)
2505           {
2506             /* Some systems have a suffix for executable files.
2507                So try appending that first.  */
2508             if (file_suffix[0] != 0)
2509               {
2510                 strcpy (temp, pl->prefix);
2511                 strcat (temp, just_machine_suffix);
2512                 strcat (temp, name);
2513                 strcat (temp, file_suffix);
2514                 if (access_check (temp, mode) == 0)
2515                   {
2516                     if (pl->used_flag_ptr != 0)
2517                       *pl->used_flag_ptr = 1;
2518                     return temp;
2519                   }
2520               }
2521
2522             strcpy (temp, pl->prefix);
2523             strcat (temp, just_machine_suffix);
2524             strcat (temp, name);
2525             if (access_check (temp, mode) == 0)
2526               {
2527                 if (pl->used_flag_ptr != 0)
2528                   *pl->used_flag_ptr = 1;
2529                 return temp;
2530               }
2531           }
2532
2533         /* Certain prefixes can't be used without the machine suffix
2534            when the machine or version is explicitly specified.  */
2535         if (! pl->require_machine_suffix)
2536           {
2537             /* Some systems have a suffix for executable files.
2538                So try appending that first.  */
2539             if (file_suffix[0] != 0)
2540               {
2541                 strcpy (temp, pl->prefix);
2542                 strcat (temp, name);
2543                 strcat (temp, file_suffix);
2544                 if (access_check (temp, mode) == 0)
2545                   {
2546                     if (pl->used_flag_ptr != 0)
2547                       *pl->used_flag_ptr = 1;
2548                     return temp;
2549                   }
2550               }
2551
2552             strcpy (temp, pl->prefix);
2553             strcat (temp, name);
2554             if (access_check (temp, mode) == 0)
2555               {
2556                 if (pl->used_flag_ptr != 0)
2557                   *pl->used_flag_ptr = 1;
2558                 return temp;
2559               }
2560           }
2561       }
2562
2563   free (temp);
2564   return 0;
2565 }
2566
2567 /* Ranking of prefixes in the sort list. -B prefixes are put before
2568    all others.  */
2569
2570 enum path_prefix_priority
2571 {
2572   PREFIX_PRIORITY_B_OPT,
2573   PREFIX_PRIORITY_LAST
2574 };
2575
2576 /* Add an entry for PREFIX in PLIST.  The PLIST is kept in assending
2577    order according to PRIORITY.  Within each PRIORITY, new entries are
2578    appended.
2579
2580    If WARN is nonzero, we will warn if no file is found
2581    through this prefix.  WARN should point to an int
2582    which will be set to 1 if this entry is used.
2583
2584    COMPONENT is the value to be passed to update_path.
2585
2586    REQUIRE_MACHINE_SUFFIX is 1 if this prefix can't be used without
2587    the complete value of machine_suffix.
2588    2 means try both machine_suffix and just_machine_suffix.  */
2589
2590 static void
2591 add_prefix (pprefix, prefix, component, priority, require_machine_suffix, warn)
2592      struct path_prefix *pprefix;
2593      const char *prefix;
2594      const char *component;
2595      /* enum prefix_priority */ int priority;
2596      int require_machine_suffix;
2597      int *warn;
2598 {
2599   struct prefix_list *pl, **prev;
2600   int len;
2601
2602   for (prev = &pprefix->plist;
2603        (*prev) != NULL && (*prev)->priority <= priority;
2604        prev = &(*prev)->next)
2605     ;
2606
2607   /* Keep track of the longest prefix */
2608
2609   prefix = update_path (prefix, component);
2610   len = strlen (prefix);
2611   if (len > pprefix->max_len)
2612     pprefix->max_len = len;
2613
2614   pl = (struct prefix_list *) xmalloc (sizeof (struct prefix_list));
2615   pl->prefix = prefix;
2616   pl->require_machine_suffix = require_machine_suffix;
2617   pl->used_flag_ptr = warn;
2618   pl->priority = priority;
2619   if (warn)
2620     *warn = 0;
2621
2622   /* Insert after PREV */
2623   pl->next = (*prev);
2624   (*prev) = pl;
2625 }
2626 \f
2627 /* Execute the command specified by the arguments on the current line of spec.
2628    When using pipes, this includes several piped-together commands
2629    with `|' between them.
2630
2631    Return 0 if successful, -1 if failed.  */
2632
2633 static int
2634 execute ()
2635 {
2636   int i;
2637   int n_commands;               /* # of command.  */
2638   char *string;
2639   struct command
2640   {
2641     const char *prog;           /* program name.  */
2642     const char **argv;          /* vector of args.  */
2643     int pid;                    /* pid of process for this command.  */
2644   };
2645
2646   struct command *commands;     /* each command buffer with above info.  */
2647
2648   /* Count # of piped commands.  */
2649   for (n_commands = 1, i = 0; i < argbuf_index; i++)
2650     if (strcmp (argbuf[i], "|") == 0)
2651       n_commands++;
2652
2653   /* Get storage for each command.  */
2654   commands = (struct command *) alloca (n_commands * sizeof (struct command));
2655
2656   /* Split argbuf into its separate piped processes,
2657      and record info about each one.
2658      Also search for the programs that are to be run.  */
2659
2660   commands[0].prog = argbuf[0]; /* first command.  */
2661   commands[0].argv = &argbuf[0];
2662   string = find_a_file (&exec_prefixes, commands[0].prog, X_OK);
2663
2664   if (string)
2665     commands[0].argv[0] = string;
2666
2667   for (n_commands = 1, i = 0; i < argbuf_index; i++)
2668     if (strcmp (argbuf[i], "|") == 0)
2669       {                         /* each command.  */
2670 #if defined (__MSDOS__) || defined (OS2) || defined (VMS)
2671         fatal ("-pipe not supported");
2672 #endif
2673         argbuf[i] = 0;  /* termination of command args.  */
2674         commands[n_commands].prog = argbuf[i + 1];
2675         commands[n_commands].argv = &argbuf[i + 1];
2676         string = find_a_file (&exec_prefixes, commands[n_commands].prog, X_OK);
2677         if (string)
2678           commands[n_commands].argv[0] = string;
2679         n_commands++;
2680       }
2681
2682   argbuf[argbuf_index] = 0;
2683
2684   /* If -v, print what we are about to do, and maybe query.  */
2685
2686   if (verbose_flag)
2687     {
2688       /* For help listings, put a blank line between sub-processes.  */
2689       if (print_help_list)
2690         fputc ('\n', stderr);
2691
2692       /* Print each piped command as a separate line.  */
2693       for (i = 0; i < n_commands; i++)
2694         {
2695           const char *const *j;
2696
2697           for (j = commands[i].argv; *j; j++)
2698             fprintf (stderr, " %s", *j);
2699
2700           /* Print a pipe symbol after all but the last command.  */
2701           if (i + 1 != n_commands)
2702             fprintf (stderr, " |");
2703           fprintf (stderr, "\n");
2704         }
2705       fflush (stderr);
2706 #ifdef DEBUG
2707       notice ("\nGo ahead? (y or n) ");
2708       fflush (stderr);
2709       i = getchar ();
2710       if (i != '\n')
2711         while (getchar () != '\n')
2712           ;
2713
2714       if (i != 'y' && i != 'Y')
2715         return 0;
2716 #endif /* DEBUG */
2717     }
2718
2719   /* Run each piped subprocess.  */
2720
2721   for (i = 0; i < n_commands; i++)
2722     {
2723       char *errmsg_fmt, *errmsg_arg;
2724       const char *string = commands[i].argv[0];
2725
2726       /* For some bizarre reason, the second argument of execvp() is
2727          char *const *, not const char *const *.  */
2728       commands[i].pid = pexecute (string, (char *const *) commands[i].argv,
2729                                   programname, temp_filename,
2730                                   &errmsg_fmt, &errmsg_arg,
2731                                   ((i == 0 ? PEXECUTE_FIRST : 0)
2732                                    | (i + 1 == n_commands ? PEXECUTE_LAST : 0)
2733                                    | (string == commands[i].prog
2734                                       ? PEXECUTE_SEARCH : 0)
2735                                    | (verbose_flag ? PEXECUTE_VERBOSE : 0)));
2736
2737       if (commands[i].pid == -1)
2738         pfatal_pexecute (errmsg_fmt, errmsg_arg);
2739
2740       if (string != commands[i].prog)
2741         free ((PTR) string);
2742     }
2743
2744   execution_count++;
2745
2746   /* Wait for all the subprocesses to finish.
2747      We don't care what order they finish in;
2748      we know that N_COMMANDS waits will get them all.
2749      Ignore subprocesses that we don't know about,
2750      since they can be spawned by the process that exec'ed us.  */
2751
2752   {
2753     int ret_code = 0;
2754 #ifdef HAVE_GETRUSAGE
2755     struct timeval d;
2756     double ut = 0.0, st = 0.0;
2757 #endif
2758
2759     for (i = 0; i < n_commands;)
2760       {
2761         int j;
2762         int status;
2763         int pid;
2764
2765         pid = pwait (commands[i].pid, &status, 0);
2766         if (pid < 0)
2767           abort ();
2768
2769 #ifdef HAVE_GETRUSAGE
2770         if (report_times)
2771           {
2772             /* getrusage returns the total resource usage of all children
2773                up to now.  Copy the previous values into prus, get the
2774                current statistics, then take the difference.  */
2775
2776             prus = rus;
2777             getrusage (RUSAGE_CHILDREN, &rus);
2778             d.tv_sec = rus.ru_utime.tv_sec - prus.ru_utime.tv_sec;
2779             d.tv_usec = rus.ru_utime.tv_usec - prus.ru_utime.tv_usec;
2780             ut = (double) d.tv_sec + (double) d.tv_usec / 1.0e6;
2781
2782             d.tv_sec = rus.ru_stime.tv_sec - prus.ru_stime.tv_sec;
2783             d.tv_usec = rus.ru_stime.tv_usec - prus.ru_stime.tv_usec;
2784             st = (double) d.tv_sec + (double) d.tv_usec / 1.0e6;
2785           }
2786 #endif
2787
2788         for (j = 0; j < n_commands; j++)
2789           if (commands[j].pid == pid)
2790             {
2791               i++;
2792               if (WIFSIGNALED (status))
2793                 {
2794 #ifdef SIGPIPE
2795                   /* SIGPIPE is a special case.  It happens in -pipe mode
2796                      when the compiler dies before the preprocessor is
2797                      done, or the assembler dies before the compiler is
2798                      done.  There's generally been an error already, and
2799                      this is just fallout.  So don't generate another error
2800                      unless we would otherwise have succeeded.  */
2801                   if (WTERMSIG (status) == SIGPIPE
2802                       && (signal_count || greatest_status >= MIN_FATAL_STATUS))
2803                     ;
2804                   else
2805 #endif
2806                     fatal ("\
2807 Internal error: %s (program %s)\n\
2808 Please submit a full bug report.\n\
2809 See %s for instructions.",
2810                            strsignal (WTERMSIG (status)), commands[j].prog,
2811                            GCCBUGURL);
2812                   signal_count++;
2813                   ret_code = -1;
2814                 }
2815               else if (WIFEXITED (status)
2816                        && WEXITSTATUS (status) >= MIN_FATAL_STATUS)
2817                 {
2818                   if (WEXITSTATUS (status) > greatest_status)
2819                     greatest_status = WEXITSTATUS (status);
2820                   ret_code = -1;
2821                 }
2822 #ifdef HAVE_GETRUSAGE
2823               if (report_times && ut + st != 0)
2824                 notice ("# %s %.2f %.2f\n", commands[j].prog, ut, st);
2825 #endif
2826               break;
2827             }
2828       }
2829     return ret_code;
2830   }
2831 }
2832 \f
2833 /* Find all the switches given to us
2834    and make a vector describing them.
2835    The elements of the vector are strings, one per switch given.
2836    If a switch uses following arguments, then the `part1' field
2837    is the switch itself and the `args' field
2838    is a null-terminated vector containing the following arguments.
2839    The `live_cond' field is:
2840    0 when initialized
2841    1 if the switch is true in a conditional spec,
2842    -1 if false (overridden by a later switch)
2843    -2 if this switch should be ignored (used in %{<S})
2844    The `validated' field is nonzero if any spec has looked at this switch;
2845    if it remains zero at the end of the run, it must be meaningless.  */
2846
2847 #define SWITCH_OK       0
2848 #define SWITCH_FALSE   -1
2849 #define SWITCH_IGNORE  -2
2850 #define SWITCH_LIVE     1
2851
2852 struct switchstr
2853 {
2854   const char *part1;
2855   const char **args;
2856   int live_cond;
2857   unsigned char validated;
2858   unsigned char ordering;
2859 };
2860
2861 static struct switchstr *switches;
2862
2863 static int n_switches;
2864
2865 struct infile
2866 {
2867   const char *name;
2868   const char *language;
2869 };
2870
2871 /* Also a vector of input files specified.  */
2872
2873 static struct infile *infiles;
2874
2875 int n_infiles;
2876
2877 /* This counts the number of libraries added by lang_specific_driver, so that
2878    we can tell if there were any user supplied any files or libraries.  */
2879
2880 static int added_libraries;
2881
2882 /* And a vector of corresponding output files is made up later.  */
2883
2884 const char **outfiles;
2885
2886 /* Used to track if none of the -B paths are used.  */
2887 static int warn_B;
2888
2889 /* Used to track if standard path isn't used and -b or -V is specified.  */
2890 static int warn_std;
2891
2892 /* Gives value to pass as "warn" to add_prefix for standard prefixes.  */
2893 static int *warn_std_ptr = 0;
2894 \f
2895 #if defined(HAVE_TARGET_OBJECT_SUFFIX) || defined(HAVE_TARGET_EXECUTABLE_SUFFIX)
2896
2897 /* Convert NAME to a new name if it is the standard suffix.  DO_EXE
2898    is true if we should look for an executable suffix as well.  */
2899
2900 static char *
2901 convert_filename (name, do_exe)
2902      char *name;
2903      int do_exe;
2904 {
2905   int i;
2906   int len;
2907
2908   if (name == NULL)
2909     return NULL;
2910
2911   len = strlen (name);
2912
2913 #ifdef HAVE_TARGET_OBJECT_SUFFIX
2914   /* Convert x.o to x.obj if TARGET_OBJECT_SUFFIX is ".obj".  */
2915   if (len > 2
2916       && name[len - 2] == '.'
2917       && name[len - 1] == 'o')
2918     {
2919       obstack_grow (&obstack, name, len - 2);
2920       obstack_grow0 (&obstack, TARGET_OBJECT_SUFFIX, strlen (TARGET_OBJECT_SUFFIX));
2921       name = obstack_finish (&obstack);
2922     }
2923 #endif
2924
2925 #if defined(HAVE_TARGET_EXECUTABLE_SUFFIX)
2926   /* If there is no filetype, make it the executable suffix (which includes
2927      the ".").  But don't get confused if we have just "-o".  */
2928   if (! do_exe || TARGET_EXECUTABLE_SUFFIX[0] == 0 || (len == 2 && name[0] == '-'))
2929     return name;
2930
2931   for (i = len - 1; i >= 0; i--)
2932     if (IS_DIR_SEPARATOR (name[i]))
2933       break;
2934
2935   for (i++; i < len; i++)
2936     if (name[i] == '.')
2937       return name;
2938
2939   obstack_grow (&obstack, name, len);
2940   obstack_grow0 (&obstack, TARGET_EXECUTABLE_SUFFIX,
2941                  strlen (TARGET_EXECUTABLE_SUFFIX));
2942   name = obstack_finish (&obstack);
2943 #endif
2944
2945   return name;
2946 }
2947 #endif
2948 \f
2949 /* Display the command line switches accepted by gcc.  */
2950 static void
2951 display_help ()
2952 {
2953   printf (_("Usage: %s [options] file...\n"), programname);
2954   fputs (_("Options:\n"), stdout);
2955
2956   fputs (_("  -pass-exit-codes         Exit with highest error code from a phase\n"), stdout);
2957   fputs (_("  --help                   Display this information\n"), stdout);
2958   fputs (_("  --target-help            Display target specific command line options\n"), stdout);
2959   if (! verbose_flag)
2960     fputs (_("  (Use '-v --help' to display command line options of sub-processes)\n"), stdout);
2961   fputs (_("  -dumpspecs               Display all of the built in spec strings\n"), stdout);
2962   fputs (_("  -dumpversion             Display the version of the compiler\n"), stdout);
2963   fputs (_("  -dumpmachine             Display the compiler's target processor\n"), stdout);
2964   fputs (_("  -print-search-dirs       Display the directories in the compiler's search path\n"), stdout);
2965   fputs (_("  -print-libgcc-file-name  Display the name of the compiler's companion library\n"), stdout);
2966   fputs (_("  -print-file-name=<lib>   Display the full path to library <lib>\n"), stdout);
2967   fputs (_("  -print-prog-name=<prog>  Display the full path to compiler component <prog>\n"), stdout);
2968   fputs (_("  -print-multi-directory   Display the root directory for versions of libgcc\n"), stdout);
2969   fputs (_("\
2970   -print-multi-lib         Display the mapping between command line options and\n\
2971                            multiple library search directories\n"), stdout);
2972   fputs (_("  -Wa,<options>            Pass comma-separated <options> on to the assembler\n"), stdout);
2973   fputs (_("  -Wp,<options>            Pass comma-separated <options> on to the preprocessor\n"), stdout);
2974   fputs (_("  -Wl,<options>            Pass comma-separated <options> on to the linker\n"), stdout);
2975   fputs (_("  -Xlinker <arg>           Pass <arg> on to the linker\n"), stdout);
2976   fputs (_("  -save-temps              Do not delete intermediate files\n"), stdout);
2977   fputs (_("  -pipe                    Use pipes rather than intermediate files\n"), stdout);
2978   fputs (_("  -time                    Time the execution of each subprocess\n"), stdout);
2979   fputs (_("  -specs=<file>            Override builtin specs with the contents of <file>\n"), stdout);
2980   fputs (_("  -std=<standard>          Assume that the input sources are for <standard>\n"), stdout);
2981   fputs (_("  -B <directory>           Add <directory> to the compiler's search paths\n"), stdout);
2982   fputs (_("  -b <machine>             Run gcc for target <machine>, if installed\n"), stdout);
2983   fputs (_("  -V <version>             Run gcc version number <version>, if installed\n"), stdout);
2984   fputs (_("  -v                       Display the programs invoked by the compiler\n"), stdout);
2985   fputs (_("  -E                       Preprocess only; do not compile, assemble or link\n"), stdout);
2986   fputs (_("  -S                       Compile only; do not assemble or link\n"), stdout);
2987   fputs (_("  -c                       Compile and assemble, but do not link\n"), stdout);
2988   fputs (_("  -o <file>                Place the output into <file>\n"), stdout);
2989   fputs (_("\
2990   -x <language>            Specify the language of the following input files\n\
2991                            Permissable languages include: c c++ assembler none\n\
2992                            'none' means revert to the default behaviour of\n\
2993                            guessing the language based on the file's extension\n\
2994 "), stdout);
2995
2996   printf (_("\
2997 \nOptions starting with -g, -f, -m, -O, -W, or --param are automatically\n\
2998  passed on to the various sub-processes invoked by %s.  In order to pass\n\
2999  other options on to these processes the -W<letter> options must be used.\n\
3000 "), programname);
3001
3002   /* The rest of the options are displayed by invocations of the various
3003      sub-processes.  */
3004 }
3005
3006 static void
3007 add_preprocessor_option (option, len)
3008      const char *option;
3009      int len;
3010 {
3011   n_preprocessor_options++;
3012
3013   if (! preprocessor_options)
3014     preprocessor_options
3015       = (char **) xmalloc (n_preprocessor_options * sizeof (char *));
3016   else
3017     preprocessor_options
3018       = (char **) xrealloc (preprocessor_options,
3019                             n_preprocessor_options * sizeof (char *));
3020
3021   preprocessor_options [n_preprocessor_options - 1] =
3022     save_string (option, len);
3023 }
3024
3025 static void
3026 add_assembler_option (option, len)
3027      const char *option;
3028      int len;
3029 {
3030   n_assembler_options++;
3031
3032   if (! assembler_options)
3033     assembler_options
3034       = (char **) xmalloc (n_assembler_options * sizeof (char *));
3035   else
3036     assembler_options
3037       = (char **) xrealloc (assembler_options,
3038                             n_assembler_options * sizeof (char *));
3039
3040   assembler_options [n_assembler_options - 1] = save_string (option, len);
3041 }
3042
3043 static void
3044 add_linker_option (option, len)
3045      const char *option;
3046      int len;
3047 {
3048   n_linker_options++;
3049
3050   if (! linker_options)
3051     linker_options
3052       = (char **) xmalloc (n_linker_options * sizeof (char *));
3053   else
3054     linker_options
3055       = (char **) xrealloc (linker_options,
3056                             n_linker_options * sizeof (char *));
3057
3058   linker_options [n_linker_options - 1] = save_string (option, len);
3059 }
3060 \f
3061 /* Create the vector `switches' and its contents.
3062    Store its length in `n_switches'.  */
3063
3064 static void
3065 process_command (argc, argv)
3066      int argc;
3067      const char *const *argv;
3068 {
3069   register int i;
3070   const char *temp;
3071   char *temp1;
3072   const char *spec_lang = 0;
3073   int last_language_n_infiles;
3074   int have_c = 0;
3075   int have_o = 0;
3076   int lang_n_infiles = 0;
3077 #ifdef MODIFY_TARGET_NAME
3078   int is_modify_target_name;
3079   int j;
3080 #endif
3081
3082   GET_ENV_PATH_LIST (gcc_exec_prefix, "GCC_EXEC_PREFIX");
3083
3084   n_switches = 0;
3085   n_infiles = 0;
3086   added_libraries = 0;
3087
3088   /* Figure compiler version from version string.  */
3089
3090   compiler_version = temp1 = xstrdup (version_string);
3091
3092   for (; *temp1; ++temp1)
3093     {
3094       if (*temp1 == ' ')
3095         {
3096           *temp1 = '\0';
3097           break;
3098         }
3099     }
3100
3101   /* Set up the default search paths.  If there is no GCC_EXEC_PREFIX,
3102      see if we can create it from the pathname specified in argv[0].  */
3103
3104 #ifndef VMS
3105   /* FIXME: make_relative_prefix doesn't yet work for VMS.  */
3106   if (!gcc_exec_prefix)
3107     {
3108       gcc_exec_prefix = make_relative_prefix (argv[0], standard_bindir_prefix,
3109                                               standard_exec_prefix);
3110       if (gcc_exec_prefix)
3111         putenv (concat ("GCC_EXEC_PREFIX=", gcc_exec_prefix, NULL));
3112     }
3113 #endif
3114
3115   if (gcc_exec_prefix)
3116     {
3117       int len = strlen (gcc_exec_prefix);
3118
3119       if (len > (int) sizeof ("/lib/gcc-lib/") - 1
3120           && (IS_DIR_SEPARATOR (gcc_exec_prefix[len-1])))
3121         {
3122           temp = gcc_exec_prefix + len - sizeof ("/lib/gcc-lib/") + 1;
3123           if (IS_DIR_SEPARATOR (*temp)
3124               && strncmp (temp + 1, "lib", 3) == 0
3125               && IS_DIR_SEPARATOR (temp[4])
3126               && strncmp (temp + 5, "gcc-lib", 7) == 0)
3127             len -= sizeof ("/lib/gcc-lib/") - 1;
3128         }
3129
3130       set_std_prefix (gcc_exec_prefix, len);
3131       add_prefix (&exec_prefixes, gcc_exec_prefix, "GCC",
3132                   PREFIX_PRIORITY_LAST, 0, NULL);
3133       add_prefix (&startfile_prefixes, gcc_exec_prefix, "GCC",
3134                   PREFIX_PRIORITY_LAST, 0, NULL);
3135     }
3136
3137   /* COMPILER_PATH and LIBRARY_PATH have values
3138      that are lists of directory names with colons.  */
3139
3140   GET_ENV_PATH_LIST (temp, "COMPILER_PATH");
3141   if (temp)
3142     {
3143       const char *startp, *endp;
3144       char *nstore = (char *) alloca (strlen (temp) + 3);
3145
3146       startp = endp = temp;
3147       while (1)
3148         {
3149           if (*endp == PATH_SEPARATOR || *endp == 0)
3150             {
3151               strncpy (nstore, startp, endp - startp);
3152               if (endp == startp)
3153                 strcpy (nstore, concat (".", dir_separator_str, NULL));
3154               else if (!IS_DIR_SEPARATOR (endp[-1]))
3155                 {
3156                   nstore[endp - startp] = DIR_SEPARATOR;
3157                   nstore[endp - startp + 1] = 0;
3158                 }
3159               else
3160                 nstore[endp - startp] = 0;
3161               add_prefix (&exec_prefixes, nstore, 0,
3162                           PREFIX_PRIORITY_LAST, 0, NULL);
3163               add_prefix (&include_prefixes,
3164                           concat (nstore, "include", NULL),
3165                           0, PREFIX_PRIORITY_LAST, 0, NULL);
3166               if (*endp == 0)
3167                 break;
3168               endp = startp = endp + 1;
3169             }
3170           else
3171             endp++;
3172         }
3173     }
3174
3175   GET_ENV_PATH_LIST (temp, LIBRARY_PATH_ENV);
3176   if (temp && *cross_compile == '0')
3177     {
3178       const char *startp, *endp;
3179       char *nstore = (char *) alloca (strlen (temp) + 3);
3180
3181       startp = endp = temp;
3182       while (1)
3183         {
3184           if (*endp == PATH_SEPARATOR || *endp == 0)
3185             {
3186               strncpy (nstore, startp, endp - startp);
3187               if (endp == startp)
3188                 strcpy (nstore, concat (".", dir_separator_str, NULL));
3189               else if (!IS_DIR_SEPARATOR (endp[-1]))
3190                 {
3191                   nstore[endp - startp] = DIR_SEPARATOR;
3192                   nstore[endp - startp + 1] = 0;
3193                 }
3194               else
3195                 nstore[endp - startp] = 0;
3196               add_prefix (&startfile_prefixes, nstore, NULL,
3197                           PREFIX_PRIORITY_LAST, 0, NULL);
3198               if (*endp == 0)
3199                 break;
3200               endp = startp = endp + 1;
3201             }
3202           else
3203             endp++;
3204         }
3205     }
3206
3207   /* Use LPATH like LIBRARY_PATH (for the CMU build program).  */
3208   GET_ENV_PATH_LIST (temp, "LPATH");
3209   if (temp && *cross_compile == '0')
3210     {
3211       const char *startp, *endp;
3212       char *nstore = (char *) alloca (strlen (temp) + 3);
3213
3214       startp = endp = temp;
3215       while (1)
3216         {
3217           if (*endp == PATH_SEPARATOR || *endp == 0)
3218             {
3219               strncpy (nstore, startp, endp - startp);
3220               if (endp == startp)
3221                 strcpy (nstore, concat (".", dir_separator_str, NULL));
3222               else if (!IS_DIR_SEPARATOR (endp[-1]))
3223                 {
3224                   nstore[endp - startp] = DIR_SEPARATOR;
3225                   nstore[endp - startp + 1] = 0;
3226                 }
3227               else
3228                 nstore[endp - startp] = 0;
3229               add_prefix (&startfile_prefixes, nstore, NULL,
3230                           PREFIX_PRIORITY_LAST, 0, NULL);
3231               if (*endp == 0)
3232                 break;
3233               endp = startp = endp + 1;
3234             }
3235           else
3236             endp++;
3237         }
3238     }
3239
3240   /* Convert new-style -- options to old-style.  */
3241   translate_options (&argc, &argv);
3242
3243   /* Do language-specific adjustment/addition of flags.  */
3244   lang_specific_driver (&argc, &argv, &added_libraries);
3245
3246   /* Scan argv twice.  Here, the first time, just count how many switches
3247      there will be in their vector, and how many input files in theirs.
3248      Also parse any switches that determine the configuration name, such as -b.
3249      Here we also parse the switches that cc itself uses (e.g. -v).  */
3250
3251   for (i = 1; i < argc; i++)
3252     {
3253       if (! strcmp (argv[i], "-dumpspecs"))
3254         {
3255           struct spec_list *sl;
3256           init_spec ();
3257           for (sl = specs; sl; sl = sl->next)
3258             printf ("*%s:\n%s\n\n", sl->name, *(sl->ptr_spec));
3259           if (link_command_spec)
3260             printf ("*link_command:\n%s\n\n", link_command_spec);
3261           exit (0);
3262         }
3263       else if (! strcmp (argv[i], "-dumpversion"))
3264         {
3265           printf ("%s\n", spec_version);
3266           exit (0);
3267         }
3268       else if (! strcmp (argv[i], "-dumpmachine"))
3269         {
3270           printf ("%s\n", spec_machine);
3271           exit (0);
3272         }
3273       else if (strcmp (argv[i], "-fhelp") == 0)
3274         {
3275           /* translate_options () has turned --help into -fhelp.  */
3276           print_help_list = 1;
3277
3278           /* We will be passing a dummy file on to the sub-processes.  */
3279           n_infiles++;
3280           n_switches++;
3281
3282           add_preprocessor_option ("--help", 6);
3283           add_assembler_option ("--help", 6);
3284           add_linker_option ("--help", 6);
3285         }
3286       else if (strcmp (argv[i], "-ftarget-help") == 0)
3287         {
3288           /* translate_options() has turned --target-help into -ftarget-help.  */
3289           target_help_flag = 1;
3290
3291           /* We will be passing a dummy file on to the sub-processes.  */
3292           n_infiles++;
3293           n_switches++;
3294
3295           add_preprocessor_option ("--target-help", 13);
3296           add_assembler_option ("--target-help", 13);
3297           add_linker_option ("--target-help", 13);
3298         }
3299       else if (! strcmp (argv[i], "-pass-exit-codes"))
3300         {
3301           pass_exit_codes = 1;
3302           n_switches++;
3303         }
3304       else if (! strcmp (argv[i], "-print-search-dirs"))
3305         print_search_dirs = 1;
3306       else if (! strcmp (argv[i], "-print-libgcc-file-name"))
3307         print_file_name = "libgcc.a";
3308       else if (! strncmp (argv[i], "-print-file-name=", 17))
3309         print_file_name = argv[i] + 17;
3310       else if (! strncmp (argv[i], "-print-prog-name=", 17))
3311         print_prog_name = argv[i] + 17;
3312       else if (! strcmp (argv[i], "-print-multi-lib"))
3313         print_multi_lib = 1;
3314       else if (! strcmp (argv[i], "-print-multi-directory"))
3315         print_multi_directory = 1;
3316       else if (! strncmp (argv[i], "-Wa,", 4))
3317         {
3318           int prev, j;
3319           /* Pass the rest of this option to the assembler.  */
3320
3321           /* Split the argument at commas.  */
3322           prev = 4;
3323           for (j = 4; argv[i][j]; j++)
3324             if (argv[i][j] == ',')
3325               {
3326                 add_assembler_option (argv[i] + prev, j - prev);
3327                 prev = j + 1;
3328               }
3329
3330           /* Record the part after the last comma.  */
3331           add_assembler_option (argv[i] + prev, j - prev);
3332         }
3333       else if (! strncmp (argv[i], "-Wp,", 4))
3334         {
3335           int prev, j;
3336           /* Pass the rest of this option to the preprocessor.  */
3337
3338           /* Split the argument at commas.  */
3339           prev = 4;
3340           for (j = 4; argv[i][j]; j++)
3341             if (argv[i][j] == ',')
3342               {
3343                 add_preprocessor_option (argv[i] + prev, j - prev);
3344                 prev = j + 1;
3345               }
3346
3347           /* Record the part after the last comma.  */
3348           add_preprocessor_option (argv[i] + prev, j - prev);
3349         }
3350       else if (argv[i][0] == '+' && argv[i][1] == 'e')
3351         /* The +e options to the C++ front-end.  */
3352         n_switches++;
3353       else if (strncmp (argv[i], "-Wl,", 4) == 0)
3354         {
3355           int j;
3356           /* Split the argument at commas.  */
3357           for (j = 3; argv[i][j]; j++)
3358             n_infiles += (argv[i][j] == ',');
3359         }
3360       else if (strcmp (argv[i], "-Xlinker") == 0)
3361         {
3362           if (i + 1 == argc)
3363             fatal ("argument to `-Xlinker' is missing");
3364
3365           n_infiles++;
3366           i++;
3367         }
3368       else if (strcmp (argv[i], "-l") == 0)
3369         {
3370           if (i + 1 == argc)
3371             fatal ("argument to `-l' is missing");
3372
3373           n_infiles++;
3374           i++;
3375         }
3376       else if (strncmp (argv[i], "-l", 2) == 0)
3377         n_infiles++;
3378       else if (strcmp (argv[i], "-save-temps") == 0)
3379         {
3380           save_temps_flag = 1;
3381           n_switches++;
3382         }
3383       else if (strcmp (argv[i], "-specs") == 0)
3384         {
3385           struct user_specs *user = (struct user_specs *)
3386             xmalloc (sizeof (struct user_specs));
3387           if (++i >= argc)
3388             fatal ("argument to `-specs' is missing");
3389
3390           user->next = (struct user_specs *) 0;
3391           user->filename = argv[i];
3392           if (user_specs_tail)
3393             user_specs_tail->next = user;
3394           else
3395             user_specs_head = user;
3396           user_specs_tail = user;
3397         }
3398       else if (strncmp (argv[i], "-specs=", 7) == 0)
3399         {
3400           struct user_specs *user = (struct user_specs *)
3401             xmalloc (sizeof (struct user_specs));
3402           if (strlen (argv[i]) == 7)
3403             fatal ("argument to `-specs=' is missing");
3404
3405           user->next = (struct user_specs *) 0;
3406           user->filename = argv[i] + 7;
3407           if (user_specs_tail)
3408             user_specs_tail->next = user;
3409           else
3410             user_specs_head = user;
3411           user_specs_tail = user;
3412         }
3413       else if (strcmp (argv[i], "-time") == 0)
3414         report_times = 1;
3415       else if (argv[i][0] == '-' && argv[i][1] != 0)
3416         {
3417           register const char *p = &argv[i][1];
3418           register int c = *p;
3419
3420           switch (c)
3421             {
3422             case 'b':
3423               n_switches++;
3424               if (p[1] == 0 && i + 1 == argc)
3425                 fatal ("argument to `-b' is missing");
3426               if (p[1] == 0)
3427                 spec_machine = argv[++i];
3428               else
3429                 spec_machine = p + 1;
3430
3431               warn_std_ptr = &warn_std;
3432               break;
3433
3434             case 'B':
3435               {
3436                 const char *value;
3437                 int len;
3438
3439                 if (p[1] == 0 && i + 1 == argc)
3440                   fatal ("argument to `-B' is missing");
3441                 if (p[1] == 0)
3442                   value = argv[++i];
3443                 else
3444                   value = p + 1;
3445
3446                 len = strlen (value);
3447
3448                 /* Catch the case where the user has forgotten to append a
3449                    directory seperator to the path.  Note, they may be using
3450                    -B to add an executable name prefix, eg "i386-elf-", in
3451                    order to distinguish between multiple installations of
3452                    GCC in the same directory.  Hence we must check to see
3453                    if appending a directory separator actually makes a
3454                    valid directory name.  */
3455                 if (! IS_DIR_SEPARATOR (value [len - 1])
3456                     && is_directory (value, "", 0))
3457                   {
3458                     char *tmp = xmalloc (len + 2);
3459                     strcpy (tmp, value);
3460                     tmp[len] = DIR_SEPARATOR;
3461                     tmp[++ len] = 0;
3462                     value = tmp;
3463                   }
3464                 
3465                 /* As a kludge, if the arg is "[foo/]stageN/", just
3466                    add "[foo/]include" to the include prefix.  */
3467                 if ((len == 7
3468                      || (len > 7
3469                          && (IS_DIR_SEPARATOR (value[len - 8]))))
3470                     && strncmp (value + len - 7, "stage", 5) == 0
3471                     && ISDIGIT (value[len - 2])
3472                     && (IS_DIR_SEPARATOR (value[len - 1])))
3473                   {
3474                     if (len == 7)
3475                       add_prefix (&include_prefixes, "include", NULL,
3476                                   PREFIX_PRIORITY_B_OPT, 0, NULL);
3477                     else
3478                       {
3479                         char * string = xmalloc (len + 1);
3480
3481                         strncpy (string, value, len - 7);
3482                         strcpy (string + len - 7, "include");
3483                         add_prefix (&include_prefixes, string, NULL,
3484                                     PREFIX_PRIORITY_B_OPT, 0, NULL);
3485                       }
3486                   }
3487
3488                 add_prefix (&exec_prefixes, value, NULL,
3489                             PREFIX_PRIORITY_B_OPT, 0, &warn_B);
3490                 add_prefix (&startfile_prefixes, value, NULL,
3491                             PREFIX_PRIORITY_B_OPT, 0, &warn_B);
3492                 add_prefix (&include_prefixes, concat (value, "include", NULL),
3493                             NULL, PREFIX_PRIORITY_B_OPT, 0, NULL);
3494                 n_switches++;
3495               }
3496               break;
3497
3498             case 'v':   /* Print our subcommands and print versions.  */
3499               n_switches++;
3500               /* If they do anything other than exactly `-v', don't set
3501                  verbose_flag; rather, continue on to give the error.  */
3502               if (p[1] != 0)
3503                 break;
3504               verbose_flag++;
3505               break;
3506
3507             case 'V':
3508               n_switches++;
3509               if (p[1] == 0 && i + 1 == argc)
3510                 fatal ("argument to `-V' is missing");
3511               if (p[1] == 0)
3512                 spec_version = argv[++i];
3513               else
3514                 spec_version = p + 1;
3515               compiler_version = spec_version;
3516               warn_std_ptr = &warn_std;
3517
3518               /* Validate the version number.  Use the same checks
3519                  done when inserting it into a spec.
3520
3521                  The format of the version string is
3522                  ([^0-9]*-)?[0-9]+[.][0-9]+([.][0-9]+)?([- ].*)?  */
3523               {
3524                 const char *v = compiler_version;
3525
3526                 /* Ignore leading non-digits.  i.e. "foo-" in "foo-2.7.2".  */
3527                 while (! ISDIGIT (*v))
3528                   v++;
3529
3530                 if (v > compiler_version && v[-1] != '-')
3531                   fatal ("invalid version number format");
3532
3533                 /* Set V after the first period.  */
3534                 while (ISDIGIT (*v))
3535                   v++;
3536
3537                 if (*v != '.')
3538                   fatal ("invalid version number format");
3539
3540                 v++;
3541                 while (ISDIGIT (*v))
3542                   v++;
3543
3544                 if (*v != 0 && *v != ' ' && *v != '.' && *v != '-')
3545                   fatal ("invalid version number format");
3546               }
3547               break;
3548
3549             case 'S':
3550             case 'c':
3551               if (p[1] == 0)
3552                 {
3553                   have_c = 1;
3554                   n_switches++;
3555                   break;
3556                 }
3557               goto normal_switch;
3558
3559             case 'o':
3560               have_o = 1;
3561 #if defined(HAVE_TARGET_EXECUTABLE_SUFFIX)
3562               if (! have_c)
3563                 {
3564                   int skip;
3565
3566                   /* Forward scan, just in case -S or -c is specified
3567                      after -o.  */
3568                   int j = i + 1;
3569                   if (p[1] == 0)
3570                     ++j;
3571                   while (j < argc)
3572                     {
3573                       if (argv[j][0] == '-')
3574                         {
3575                           if (SWITCH_CURTAILS_COMPILATION (argv[j][1])
3576                               && argv[j][2] == 0)
3577                             {
3578                               have_c = 1;
3579                               break;
3580                             }
3581                           else if ((skip = SWITCH_TAKES_ARG (argv[j][1])))
3582                             j += skip - (argv[j][2] != 0);
3583                           else if ((skip = WORD_SWITCH_TAKES_ARG (argv[j] + 1)))
3584                             j += skip;
3585                         }
3586                       j++;
3587                     }
3588                 }
3589 #endif
3590 #if defined(HAVE_TARGET_EXECUTABLE_SUFFIX) || defined(HAVE_TARGET_OBJECT_SUFFIX)
3591               if (p[1] == 0)
3592                 argv[i + 1] = convert_filename (argv[i + 1], ! have_c);
3593               else
3594                 argv[i] = convert_filename (argv[i], ! have_c);
3595 #endif
3596               goto normal_switch;
3597
3598             default:
3599             normal_switch:
3600
3601 #ifdef MODIFY_TARGET_NAME
3602               is_modify_target_name = 0;
3603
3604               for (j = 0;
3605                    j < sizeof modify_target / sizeof modify_target[0]; j++)
3606                 if (! strcmp (argv[i], modify_target[j].sw))
3607                   {
3608                     char *new_name
3609                       = (char *) xmalloc (strlen (modify_target[j].str)
3610                                           + strlen (spec_machine));
3611                     const char *p, *r;
3612                     char *q;
3613                     int made_addition = 0;
3614
3615                     is_modify_target_name = 1;
3616                     for (p = spec_machine, q = new_name; *p != 0; )
3617                       {
3618                         if (modify_target[j].add_del == DELETE
3619                             && (! strncmp (q, modify_target[j].str,
3620                                            strlen (modify_target[j].str))))
3621                           p += strlen (modify_target[j].str);
3622                         else if (modify_target[j].add_del == ADD
3623                                  && ! made_addition && *p == '-')
3624                           {
3625                             for (r = modify_target[j].str; *r != 0; )
3626                               *q++ = *r++;
3627                             made_addition = 1;
3628                           }
3629
3630                         *q++ = *p++;
3631                       }
3632
3633                     spec_machine = new_name;
3634                   }
3635
3636               if (is_modify_target_name)
3637                 break;
3638 #endif                
3639
3640               n_switches++;
3641
3642               if (SWITCH_TAKES_ARG (c) > (p[1] != 0))
3643                 i += SWITCH_TAKES_ARG (c) - (p[1] != 0);
3644               else if (WORD_SWITCH_TAKES_ARG (p))
3645                 i += WORD_SWITCH_TAKES_ARG (p);
3646             }
3647         }
3648       else
3649         {
3650           n_infiles++;
3651           lang_n_infiles++;
3652         }
3653     }
3654
3655   if (have_c && have_o && lang_n_infiles > 1)
3656     fatal ("cannot specify -o with -c or -S and multiple compilations");
3657
3658   /* Set up the search paths before we go looking for config files.  */
3659
3660   /* These come before the md prefixes so that we will find gcc's subcommands
3661      (such as cpp) rather than those of the host system.  */
3662   /* Use 2 as fourth arg meaning try just the machine as a suffix,
3663      as well as trying the machine and the version.  */
3664 #ifndef OS2
3665   add_prefix (&exec_prefixes, standard_exec_prefix, "GCC",
3666               PREFIX_PRIORITY_LAST, 1, warn_std_ptr);
3667   add_prefix (&exec_prefixes, standard_exec_prefix, "BINUTILS",
3668               PREFIX_PRIORITY_LAST, 2, warn_std_ptr);
3669   add_prefix (&exec_prefixes, standard_exec_prefix_1, "BINUTILS",
3670               PREFIX_PRIORITY_LAST, 2, warn_std_ptr);
3671 #endif
3672
3673   add_prefix (&startfile_prefixes, standard_exec_prefix, "BINUTILS",
3674               PREFIX_PRIORITY_LAST, 1, warn_std_ptr);
3675   add_prefix (&startfile_prefixes, standard_exec_prefix_1, "BINUTILS",
3676               PREFIX_PRIORITY_LAST, 1, warn_std_ptr);
3677
3678   tooldir_prefix = concat (tooldir_base_prefix, spec_machine,
3679                            dir_separator_str, NULL);
3680
3681   /* If tooldir is relative, base it on exec_prefixes.  A relative
3682      tooldir lets us move the installed tree as a unit.
3683
3684      If GCC_EXEC_PREFIX is defined, then we want to add two relative
3685      directories, so that we can search both the user specified directory
3686      and the standard place.  */
3687
3688   if (!IS_ABSOLUTE_PATHNAME (tooldir_prefix))
3689     {
3690       if (gcc_exec_prefix)
3691         {
3692           char *gcc_exec_tooldir_prefix
3693             = concat (gcc_exec_prefix, spec_machine, dir_separator_str,
3694                       spec_version, dir_separator_str, tooldir_prefix, NULL);
3695
3696           add_prefix (&exec_prefixes,
3697                       concat (gcc_exec_tooldir_prefix, "bin",
3698                               dir_separator_str, NULL),
3699                       NULL, PREFIX_PRIORITY_LAST, 0, NULL);
3700           add_prefix (&startfile_prefixes,
3701                       concat (gcc_exec_tooldir_prefix, "lib",
3702                               dir_separator_str, NULL),
3703                       NULL, PREFIX_PRIORITY_LAST, 0, NULL);
3704         }
3705
3706       tooldir_prefix = concat (standard_exec_prefix, spec_machine,
3707                                dir_separator_str, spec_version,
3708                                dir_separator_str, tooldir_prefix, NULL);
3709     }
3710
3711   add_prefix (&exec_prefixes,
3712               concat (tooldir_prefix, "bin", dir_separator_str, NULL),
3713               "BINUTILS", PREFIX_PRIORITY_LAST, 0, NULL);
3714   add_prefix (&startfile_prefixes,
3715               concat (tooldir_prefix, "lib", dir_separator_str, NULL),
3716               "BINUTILS", PREFIX_PRIORITY_LAST, 0, NULL);
3717
3718   /* More prefixes are enabled in main, after we read the specs file
3719      and determine whether this is cross-compilation or not.  */
3720
3721   /* Then create the space for the vectors and scan again.  */
3722
3723   switches = ((struct switchstr *)
3724               xmalloc ((n_switches + 1) * sizeof (struct switchstr)));
3725   infiles = (struct infile *) xmalloc ((n_infiles + 1) * sizeof (struct infile));
3726   n_switches = 0;
3727   n_infiles = 0;
3728   last_language_n_infiles = -1;
3729
3730   /* This, time, copy the text of each switch and store a pointer
3731      to the copy in the vector of switches.
3732      Store all the infiles in their vector.  */
3733
3734   for (i = 1; i < argc; i++)
3735     {
3736       /* Just skip the switches that were handled by the preceding loop.  */
3737 #ifdef MODIFY_TARGET_NAME
3738       is_modify_target_name = 0;
3739
3740       for (j = 0; j < sizeof modify_target / sizeof modify_target[0]; j++)
3741         if (! strcmp (argv[i], modify_target[j].sw))
3742           is_modify_target_name = 1;
3743
3744       if (is_modify_target_name)
3745         ;
3746       else
3747 #endif
3748       if (! strncmp (argv[i], "-Wa,", 4))
3749         ;
3750       else if (! strncmp (argv[i], "-Wp,", 4))
3751         ;
3752       else if (! strcmp (argv[i], "-pass-exit-codes"))
3753         ;
3754       else if (! strcmp (argv[i], "-print-search-dirs"))
3755         ;
3756       else if (! strcmp (argv[i], "-print-libgcc-file-name"))
3757         ;
3758       else if (! strncmp (argv[i], "-print-file-name=", 17))
3759         ;
3760       else if (! strncmp (argv[i], "-print-prog-name=", 17))
3761         ;
3762       else if (! strcmp (argv[i], "-print-multi-lib"))
3763         ;
3764       else if (! strcmp (argv[i], "-print-multi-directory"))
3765         ;
3766       else if (strcmp (argv[i], "-ftarget-help") == 0)
3767         {
3768            /* Create a dummy input file, so that we can pass --target-help on to
3769               the various sub-processes.  */
3770            infiles[n_infiles].language = "c";
3771            infiles[n_infiles++].name   = "target-dummy";
3772
3773            /* Preserve the --target-help switch so that it can be caught by
3774               the cc1 spec string.  */
3775            switches[n_switches].part1     = "--target-help";
3776            switches[n_switches].args      = 0;
3777            switches[n_switches].live_cond = SWITCH_OK;
3778            switches[n_switches].validated = 0;
3779
3780            n_switches++;
3781         }
3782       else if (strcmp (argv[i], "-fhelp") == 0)
3783         {
3784           if (verbose_flag)
3785             {
3786               /* Create a dummy input file, so that we can pass --help on to
3787                  the various sub-processes.  */
3788               infiles[n_infiles].language = "c";
3789               infiles[n_infiles++].name   = "help-dummy";
3790
3791               /* Preserve the --help switch so that it can be caught by the
3792                  cc1 spec string.  */
3793               switches[n_switches].part1     = "--help";
3794               switches[n_switches].args      = 0;
3795               switches[n_switches].live_cond = SWITCH_OK;
3796               switches[n_switches].validated = 0;
3797
3798               n_switches++;
3799             }
3800         }
3801       else if (argv[i][0] == '+' && argv[i][1] == 'e')
3802         {
3803           /* Compensate for the +e options to the C++ front-end;
3804              they're there simply for cfront call-compatibility.  We do
3805              some magic in default_compilers to pass them down properly.
3806              Note we deliberately start at the `+' here, to avoid passing
3807              -e0 or -e1 down into the linker.  */
3808           switches[n_switches].part1 = &argv[i][0];
3809           switches[n_switches].args = 0;
3810           switches[n_switches].live_cond = SWITCH_OK;
3811           switches[n_switches].validated = 0;
3812           n_switches++;
3813         }
3814       else if (strncmp (argv[i], "-Wl,", 4) == 0)
3815         {
3816           int prev, j;
3817           /* Split the argument at commas.  */
3818           prev = 4;
3819           for (j = 4; argv[i][j]; j++)
3820             if (argv[i][j] == ',')
3821               {
3822                 infiles[n_infiles].language = "*";
3823                 infiles[n_infiles++].name
3824                   = save_string (argv[i] + prev, j - prev);
3825                 prev = j + 1;
3826               }
3827           /* Record the part after the last comma.  */
3828           infiles[n_infiles].language = "*";
3829           infiles[n_infiles++].name = argv[i] + prev;
3830         }
3831       else if (strcmp (argv[i], "-Xlinker") == 0)
3832         {
3833           infiles[n_infiles].language = "*";
3834           infiles[n_infiles++].name = argv[++i];
3835         }
3836       else if (strcmp (argv[i], "-l") == 0)
3837         { /* POSIX allows separation of -l and the lib arg;
3838              canonicalize by concatenating -l with its arg */
3839           infiles[n_infiles].language = "*";
3840           infiles[n_infiles++].name = concat ("-l", argv[++i], NULL);
3841         }
3842       else if (strncmp (argv[i], "-l", 2) == 0)
3843         {
3844           infiles[n_infiles].language = "*";
3845           infiles[n_infiles++].name = argv[i];
3846         }
3847       else if (strcmp (argv[i], "-specs") == 0)
3848         i++;
3849       else if (strncmp (argv[i], "-specs=", 7) == 0)
3850         ;
3851       else if (strcmp (argv[i], "-time") == 0)
3852         ;
3853       else if ((save_temps_flag || report_times)
3854                && strcmp (argv[i], "-pipe") == 0)
3855         {
3856           /* -save-temps overrides -pipe, so that temp files are produced */
3857           if (save_temps_flag)
3858             error ("Warning: -pipe ignored because -save-temps specified");
3859           /* -time overrides -pipe because we can't get correct stats when
3860              multiple children are running at once.  */
3861           else if (report_times)
3862             error ("Warning: -pipe ignored because -time specified");
3863         }
3864       else if (argv[i][0] == '-' && argv[i][1] != 0)
3865         {
3866           const char *p = &argv[i][1];
3867           int c = *p;
3868
3869           if (c == 'x')
3870             {
3871               if (p[1] == 0 && i + 1 == argc)
3872                 fatal ("argument to `-x' is missing");
3873               if (p[1] == 0)
3874                 spec_lang = argv[++i];
3875               else
3876                 spec_lang = p + 1;
3877               if (! strcmp (spec_lang, "none"))
3878                 /* Suppress the warning if -xnone comes after the last input
3879                    file, because alternate command interfaces like g++ might
3880                    find it useful to place -xnone after each input file.  */
3881                 spec_lang = 0;
3882               else
3883                 last_language_n_infiles = n_infiles;
3884               continue;
3885             }
3886           switches[n_switches].part1 = p;
3887           /* Deal with option arguments in separate argv elements.  */
3888           if ((SWITCH_TAKES_ARG (c) > (p[1] != 0))
3889               || WORD_SWITCH_TAKES_ARG (p))
3890             {
3891               int j = 0;
3892               int n_args = WORD_SWITCH_TAKES_ARG (p);
3893
3894               if (n_args == 0)
3895                 {
3896                   /* Count only the option arguments in separate argv elements.  */
3897                   n_args = SWITCH_TAKES_ARG (c) - (p[1] != 0);
3898                 }
3899               if (i + n_args >= argc)
3900                 fatal ("argument to `-%s' is missing", p);
3901               switches[n_switches].args
3902                 = (const char **) xmalloc ((n_args + 1) * sizeof(const char *));
3903               while (j < n_args)
3904                 switches[n_switches].args[j++] = argv[++i];
3905               /* Null-terminate the vector.  */
3906               switches[n_switches].args[j] = 0;
3907             }
3908           else if (strchr (switches_need_spaces, c))
3909             {
3910               /* On some systems, ld cannot handle some options without
3911                  a space.  So split the option from its argument.  */
3912               char *part1 = (char *) xmalloc (2);
3913               char *tmp;
3914               part1[0] = c;
3915               part1[1] = '\0';
3916
3917               switches[n_switches].part1 = part1;
3918               switches[n_switches].args
3919                 = (const char **) xmalloc (2 * sizeof (const char *));
3920               switches[n_switches].args[0] = tmp = xmalloc (strlen (p));
3921               strcpy (tmp, &p[1]);
3922               switches[n_switches].args[1] = 0;
3923             }
3924           else
3925             switches[n_switches].args = 0;
3926
3927           switches[n_switches].live_cond = SWITCH_OK;
3928           switches[n_switches].validated = 0;
3929           switches[n_switches].ordering = 0;
3930           /* These are always valid, since gcc.c itself understands it.  */
3931           if (!strcmp (p, "save-temps")
3932               || !strcmp (p, "static-libgcc")
3933               || !strcmp (p, "shared-libgcc"))
3934             switches[n_switches].validated = 1;
3935           else
3936             {
3937               char ch = switches[n_switches].part1[0];
3938               if (ch == 'V' || ch == 'b' || ch == 'B')
3939                 switches[n_switches].validated = 1;
3940             }
3941           n_switches++;
3942         }
3943       else
3944         {
3945 #ifdef HAVE_TARGET_OBJECT_SUFFIX
3946           argv[i] = convert_filename (argv[i], 0);
3947 #endif
3948
3949           if (strcmp (argv[i], "-") != 0 && access (argv[i], F_OK) < 0)
3950             {
3951               perror_with_name (argv[i]);
3952               error_count++;
3953             }
3954           else
3955             {
3956               infiles[n_infiles].language = spec_lang;
3957               infiles[n_infiles++].name = argv[i];
3958             }
3959         }
3960     }
3961
3962   if (n_infiles == last_language_n_infiles && spec_lang != 0)
3963     error ("Warning: `-x %s' after last input file has no effect", spec_lang);
3964
3965   switches[n_switches].part1 = 0;
3966   infiles[n_infiles].name = 0;
3967 }
3968 \f
3969 /* Process a spec string, accumulating and running commands.  */
3970
3971 /* These variables describe the input file name.
3972    input_file_number is the index on outfiles of this file,
3973    so that the output file name can be stored for later use by %o.
3974    input_basename is the start of the part of the input file
3975    sans all directory names, and basename_length is the number
3976    of characters starting there excluding the suffix .c or whatever.  */
3977
3978 const char *input_filename;
3979 static int input_file_number;
3980 size_t input_filename_length;
3981 static int basename_length;
3982 static int suffixed_basename_length;
3983 static const char *input_basename;
3984 static const char *input_suffix;
3985
3986 /* The compiler used to process the current input file.  */
3987 static struct compiler *input_file_compiler;
3988
3989 /* These are variables used within do_spec and do_spec_1.  */
3990
3991 /* Nonzero if an arg has been started and not yet terminated
3992    (with space, tab or newline).  */
3993 static int arg_going;
3994
3995 /* Nonzero means %d or %g has been seen; the next arg to be terminated
3996    is a temporary file name.  */
3997 static int delete_this_arg;
3998
3999 /* Nonzero means %w has been seen; the next arg to be terminated
4000    is the output file name of this compilation.  */
4001 static int this_is_output_file;
4002
4003 /* Nonzero means %s has been seen; the next arg to be terminated
4004    is the name of a library file and we should try the standard
4005    search dirs for it.  */
4006 static int this_is_library_file;
4007
4008 /* Nonzero means that the input of this command is coming from a pipe.  */
4009 static int input_from_pipe;
4010
4011 /* Nonnull means substitute this for any suffix when outputting a switches
4012    arguments.  */
4013 static const char *suffix_subst;
4014
4015 /* Process the spec SPEC and run the commands specified therein.
4016    Returns 0 if the spec is successfully processed; -1 if failed.  */
4017
4018 int
4019 do_spec (spec)
4020      const char *spec;
4021 {
4022   int value;
4023
4024   clear_args ();
4025   arg_going = 0;
4026   delete_this_arg = 0;
4027   this_is_output_file = 0;
4028   this_is_library_file = 0;
4029   input_from_pipe = 0;
4030   suffix_subst = NULL;
4031
4032   value = do_spec_1 (spec, 0, NULL);
4033
4034   /* Force out any unfinished command.
4035      If -pipe, this forces out the last command if it ended in `|'.  */
4036   if (value == 0)
4037     {
4038       if (argbuf_index > 0 && !strcmp (argbuf[argbuf_index - 1], "|"))
4039         argbuf_index--;
4040
4041       if (argbuf_index > 0)
4042         value = execute ();
4043     }
4044
4045   return value;
4046 }
4047
4048 /* Process the sub-spec SPEC as a portion of a larger spec.
4049    This is like processing a whole spec except that we do
4050    not initialize at the beginning and we do not supply a
4051    newline by default at the end.
4052    INSWITCH nonzero means don't process %-sequences in SPEC;
4053    in this case, % is treated as an ordinary character.
4054    This is used while substituting switches.
4055    INSWITCH nonzero also causes SPC not to terminate an argument.
4056
4057    Value is zero unless a line was finished
4058    and the command on that line reported an error.  */
4059
4060 static int
4061 do_spec_1 (spec, inswitch, soft_matched_part)
4062      const char *spec;
4063      int inswitch;
4064      const char *soft_matched_part;
4065 {
4066   register const char *p = spec;
4067   register int c;
4068   int i;
4069   const char *string;
4070   int value;
4071
4072   while ((c = *p++))
4073     /* If substituting a switch, treat all chars like letters.
4074        Otherwise, NL, SPC, TAB and % are special.  */
4075     switch (inswitch ? 'a' : c)
4076       {
4077       case '\n':
4078         /* End of line: finish any pending argument,
4079            then run the pending command if one has been started.  */
4080         if (arg_going)
4081           {
4082             obstack_1grow (&obstack, 0);
4083             string = obstack_finish (&obstack);
4084             if (this_is_library_file)
4085               string = find_file (string);
4086             store_arg (string, delete_this_arg, this_is_output_file);
4087             if (this_is_output_file)
4088               outfiles[input_file_number] = string;
4089           }
4090         arg_going = 0;
4091
4092         if (argbuf_index > 0 && !strcmp (argbuf[argbuf_index - 1], "|"))
4093           {
4094             for (i = 0; i < n_switches; i++)
4095               if (!strcmp (switches[i].part1, "pipe"))
4096                 break;
4097
4098             /* A `|' before the newline means use a pipe here,
4099                but only if -pipe was specified.
4100                Otherwise, execute now and don't pass the `|' as an arg.  */
4101             if (i < n_switches)
4102               {
4103                 input_from_pipe = 1;
4104                 switches[i].validated = 1;
4105                 break;
4106               }
4107             else
4108               argbuf_index--;
4109           }
4110
4111         if (argbuf_index > 0)
4112           {
4113             value = execute ();
4114             if (value)
4115               return value;
4116           }
4117         /* Reinitialize for a new command, and for a new argument.  */
4118         clear_args ();
4119         arg_going = 0;
4120         delete_this_arg = 0;
4121         this_is_output_file = 0;
4122         this_is_library_file = 0;
4123         input_from_pipe = 0;
4124         break;
4125
4126       case '|':
4127         /* End any pending argument.  */
4128         if (arg_going)
4129           {
4130             obstack_1grow (&obstack, 0);
4131             string = obstack_finish (&obstack);
4132             if (this_is_library_file)
4133               string = find_file (string);
4134             store_arg (string, delete_this_arg, this_is_output_file);
4135             if (this_is_output_file)
4136               outfiles[input_file_number] = string;
4137           }
4138
4139         /* Use pipe */
4140         obstack_1grow (&obstack, c);
4141         arg_going = 1;
4142         break;
4143
4144       case '\t':
4145       case ' ':
4146         /* Space or tab ends an argument if one is pending.  */
4147         if (arg_going)
4148           {
4149             obstack_1grow (&obstack, 0);
4150             string = obstack_finish (&obstack);
4151             if (this_is_library_file)
4152               string = find_file (string);
4153             store_arg (string, delete_this_arg, this_is_output_file);
4154             if (this_is_output_file)
4155               outfiles[input_file_number] = string;
4156           }
4157         /* Reinitialize for a new argument.  */
4158         arg_going = 0;
4159         delete_this_arg = 0;
4160         this_is_output_file = 0;
4161         this_is_library_file = 0;
4162         break;
4163
4164       case '%':
4165         switch (c = *p++)
4166           {
4167           case 0:
4168             fatal ("Invalid specification!  Bug in cc.");
4169
4170           case 'b':
4171             obstack_grow (&obstack, input_basename, basename_length);
4172             arg_going = 1;
4173             break;
4174
4175           case 'B':
4176             obstack_grow (&obstack, input_basename, suffixed_basename_length);
4177             arg_going = 1;
4178             break;
4179
4180           case 'd':
4181             delete_this_arg = 2;
4182             break;
4183
4184           /* Dump out the directories specified with LIBRARY_PATH,
4185              followed by the absolute directories
4186              that we search for startfiles.  */
4187           case 'D':
4188             {
4189               struct prefix_list *pl = startfile_prefixes.plist;
4190               size_t bufsize = 100;
4191               char *buffer = (char *) xmalloc (bufsize);
4192               int idx;
4193
4194               for (; pl; pl = pl->next)
4195                 {
4196 #ifdef RELATIVE_PREFIX_NOT_LINKDIR
4197                   /* Used on systems which record the specified -L dirs
4198                      and use them to search for dynamic linking.  */
4199                   /* Relative directories always come from -B,
4200                      and it is better not to use them for searching
4201                      at run time.  In particular, stage1 loses.  */
4202                   if (!IS_ABSOLUTE_PATHNAME (pl->prefix))
4203                     continue;
4204 #endif
4205                   /* Try subdirectory if there is one.  */
4206                   if (multilib_dir != NULL)
4207                     {
4208                       if (machine_suffix)
4209                         {
4210                           if (strlen (pl->prefix) + strlen (machine_suffix)
4211                               >= bufsize)
4212                             bufsize = (strlen (pl->prefix)
4213                                        + strlen (machine_suffix)) * 2 + 1;
4214                           buffer = (char *) xrealloc (buffer, bufsize);
4215                           strcpy (buffer, pl->prefix);
4216                           strcat (buffer, machine_suffix);
4217                           if (is_directory (buffer, multilib_dir, 1))
4218                             {
4219                               do_spec_1 ("-L", 0, NULL);
4220 #ifdef SPACE_AFTER_L_OPTION
4221                               do_spec_1 (" ", 0, NULL);
4222 #endif
4223                               do_spec_1 (buffer, 1, NULL);
4224                               do_spec_1 (multilib_dir, 1, NULL);
4225                               /* Make this a separate argument.  */
4226                               do_spec_1 (" ", 0, NULL);
4227                             }
4228                         }
4229                       if (!pl->require_machine_suffix)
4230                         {
4231                           if (is_directory (pl->prefix, multilib_dir, 1))
4232                             {
4233                               do_spec_1 ("-L", 0, NULL);
4234 #ifdef SPACE_AFTER_L_OPTION
4235                               do_spec_1 (" ", 0, NULL);
4236 #endif
4237                               do_spec_1 (pl->prefix, 1, NULL);
4238                               do_spec_1 (multilib_dir, 1, NULL);
4239                               /* Make this a separate argument.  */
4240                               do_spec_1 (" ", 0, NULL);
4241                             }
4242                         }
4243                     }
4244                   if (machine_suffix)
4245                     {
4246                       if (is_directory (pl->prefix, machine_suffix, 1))
4247                         {
4248                           do_spec_1 ("-L", 0, NULL);
4249 #ifdef SPACE_AFTER_L_OPTION
4250                           do_spec_1 (" ", 0, NULL);
4251 #endif
4252                           do_spec_1 (pl->prefix, 1, NULL);
4253                           /* Remove slash from machine_suffix.  */
4254                           if (strlen (machine_suffix) >= bufsize)
4255                             bufsize = strlen (machine_suffix) * 2 + 1;
4256                           buffer = (char *) xrealloc (buffer, bufsize);
4257                           strcpy (buffer, machine_suffix);
4258                           idx = strlen (buffer);
4259                           if (IS_DIR_SEPARATOR (buffer[idx - 1]))
4260                             buffer[idx - 1] = 0;
4261                           do_spec_1 (buffer, 1, NULL);
4262                           /* Make this a separate argument.  */
4263                           do_spec_1 (" ", 0, NULL);
4264                         }
4265                     }
4266                   if (!pl->require_machine_suffix)
4267                     {
4268                       if (is_directory (pl->prefix, "", 1))
4269                         {
4270                           do_spec_1 ("-L", 0, NULL);
4271 #ifdef SPACE_AFTER_L_OPTION
4272                           do_spec_1 (" ", 0, NULL);
4273 #endif
4274                           /* Remove slash from pl->prefix.  */
4275                           if (strlen (pl->prefix) >= bufsize)
4276                             bufsize = strlen (pl->prefix) * 2 + 1;
4277                           buffer = (char *) xrealloc (buffer, bufsize);
4278                           strcpy (buffer, pl->prefix);
4279                           idx = strlen (buffer);
4280                           if (IS_DIR_SEPARATOR (buffer[idx - 1]))
4281                             buffer[idx - 1] = 0;
4282                           do_spec_1 (buffer, 1, NULL);
4283                           /* Make this a separate argument.  */
4284                           do_spec_1 (" ", 0, NULL);
4285                         }
4286                     }
4287                 }
4288               free (buffer);
4289             }
4290             break;
4291
4292           case 'e':
4293             /* %efoo means report an error with `foo' as error message
4294                and don't execute any more commands for this file.  */
4295             {
4296               const char *q = p;
4297               char *buf;
4298               while (*p != 0 && *p != '\n')
4299                 p++;
4300               buf = (char *) alloca (p - q + 1);
4301               strncpy (buf, q, p - q);
4302               buf[p - q] = 0;
4303               error ("%s", buf);
4304               return -1;
4305             }
4306             break;
4307           case 'n':
4308             /* %nfoo means report an notice with `foo' on stderr.  */
4309             {
4310               const char *q = p;
4311               char *buf;
4312               while (*p != 0 && *p != '\n')
4313                 p++;
4314               buf = (char *) alloca (p - q + 1);
4315               strncpy (buf, q, p - q);
4316               buf[p - q] = 0;
4317               notice ("%s\n", buf);
4318               if (*p)
4319                 p++;
4320             }
4321             break;
4322
4323           case 'j':
4324             {
4325               struct stat st;
4326
4327               /* If save_temps_flag is off, and the HOST_BIT_BUCKET is defined,
4328                  and it is not a directory, and it is writable, use it.
4329                  Otherwise, fall through and treat this like any other
4330                  temporary file.  */
4331
4332               if ((!save_temps_flag)
4333                   && (stat (HOST_BIT_BUCKET, &st) == 0) && (!S_ISDIR (st.st_mode))
4334                   && (access (HOST_BIT_BUCKET, W_OK) == 0))
4335                 {
4336                   obstack_grow (&obstack, HOST_BIT_BUCKET,
4337                                 strlen (HOST_BIT_BUCKET));
4338                   delete_this_arg = 0;
4339                   arg_going = 1;
4340                   break;
4341                 }
4342             }
4343           case 'g':
4344           case 'u':
4345           case 'U':
4346             if (save_temps_flag)
4347               {
4348                 obstack_grow (&obstack, input_basename, basename_length);
4349                 delete_this_arg = 0;
4350               }
4351             else
4352               {
4353                 struct temp_name *t;
4354                 int suffix_length;
4355                 const char *suffix = p;
4356                 char *saved_suffix = NULL;
4357
4358                 while (*p == '.' || ISALPHA ((unsigned char) *p))
4359                   p++;
4360                 suffix_length = p - suffix;
4361                 if (p[0] == '%' && p[1] == 'O')
4362                   {
4363                     p += 2;
4364                     /* We don't support extra suffix characters after %O.  */
4365                     if (*p == '.' || ISALPHA ((unsigned char) *p))
4366                       abort ();
4367                     if (suffix_length == 0)
4368                       suffix = TARGET_OBJECT_SUFFIX;
4369                     else
4370                       {
4371                         saved_suffix
4372                           = (char *) xmalloc (suffix_length
4373                                               + strlen (TARGET_OBJECT_SUFFIX));
4374                         strncpy (saved_suffix, suffix, suffix_length);
4375                         strcpy (saved_suffix + suffix_length,
4376                                 TARGET_OBJECT_SUFFIX);
4377                       }
4378                     suffix_length += strlen (TARGET_OBJECT_SUFFIX);
4379                   }
4380
4381                 /* See if we already have an association of %g/%u/%U and
4382                    suffix.  */
4383                 for (t = temp_names; t; t = t->next)
4384                   if (t->length == suffix_length
4385                       && strncmp (t->suffix, suffix, suffix_length) == 0
4386                       && t->unique == (c != 'g'))
4387                     break;
4388
4389                 /* Make a new association if needed.  %u and %j
4390                    require one.  */
4391                 if (t == 0 || c == 'u' || c == 'j')
4392                   {
4393                     if (t == 0)
4394                       {
4395                         t = (struct temp_name *) xmalloc (sizeof (struct temp_name));
4396                         t->next = temp_names;
4397                         temp_names = t;
4398                       }
4399                     t->length = suffix_length;
4400                     if (saved_suffix)
4401                       {
4402                         t->suffix = saved_suffix;
4403                         saved_suffix = NULL;
4404                       }
4405                     else
4406                       t->suffix = save_string (suffix, suffix_length);
4407                     t->unique = (c != 'g');
4408                     temp_filename = make_temp_file (t->suffix);
4409                     temp_filename_length = strlen (temp_filename);
4410                     t->filename = temp_filename;
4411                     t->filename_length = temp_filename_length;
4412                   }
4413
4414                 if (saved_suffix)
4415                   free (saved_suffix);
4416
4417                 obstack_grow (&obstack, t->filename, t->filename_length);
4418                 delete_this_arg = 1;
4419               }
4420             arg_going = 1;
4421             break;
4422
4423           case 'i':
4424             obstack_grow (&obstack, input_filename, input_filename_length);
4425             arg_going = 1;
4426             break;
4427
4428           case 'I':
4429             {
4430               struct prefix_list *pl = include_prefixes.plist;
4431
4432               if (gcc_exec_prefix)
4433                 {
4434                   do_spec_1 ("-iprefix", 1, NULL);
4435                   /* Make this a separate argument.  */
4436                   do_spec_1 (" ", 0, NULL);
4437                   do_spec_1 (gcc_exec_prefix, 1, NULL);
4438                   do_spec_1 (" ", 0, NULL);
4439                 }
4440
4441               for (; pl; pl = pl->next)
4442                 {
4443                   do_spec_1 ("-isystem", 1, NULL);
4444                   /* Make this a separate argument.  */
4445                   do_spec_1 (" ", 0, NULL);
4446                   do_spec_1 (pl->prefix, 1, NULL);
4447                   do_spec_1 (" ", 0, NULL);
4448                 }
4449             }
4450             break;
4451
4452           case 'o':
4453             {
4454               int max = n_infiles;
4455               max += lang_specific_extra_outfiles;
4456
4457               for (i = 0; i < max; i++)
4458                 if (outfiles[i])
4459                   store_arg (outfiles[i], 0, 0);
4460               break;
4461             }
4462
4463           case 'O':
4464             obstack_grow (&obstack, TARGET_OBJECT_SUFFIX, strlen (TARGET_OBJECT_SUFFIX));
4465             arg_going = 1;
4466             break;
4467
4468           case 's':
4469             this_is_library_file = 1;
4470             break;
4471
4472           case 'w':
4473             this_is_output_file = 1;
4474             break;
4475
4476           case 'W':
4477             {
4478               int cur_index = argbuf_index;
4479               /* Handle the {...} following the %W.  */
4480               if (*p != '{')
4481                 abort ();
4482               p = handle_braces (p + 1);
4483               if (p == 0)
4484                 return -1;
4485               /* If any args were output, mark the last one for deletion
4486                  on failure.  */
4487               if (argbuf_index != cur_index)
4488                 record_temp_file (argbuf[argbuf_index - 1], 0, 1);
4489               break;
4490             }
4491
4492           /* %x{OPTION} records OPTION for %X to output.  */
4493           case 'x':
4494             {
4495               const char *p1 = p;
4496               char *string;
4497
4498               /* Skip past the option value and make a copy.  */
4499               if (*p != '{')
4500                 abort ();
4501               while (*p++ != '}')
4502                 ;
4503               string = save_string (p1 + 1, p - p1 - 2);
4504
4505               /* See if we already recorded this option.  */
4506               for (i = 0; i < n_linker_options; i++)
4507                 if (! strcmp (string, linker_options[i]))
4508                   {
4509                     free (string);
4510                     return 0;
4511                   }
4512
4513               /* This option is new; add it.  */
4514               add_linker_option (string, strlen (string));
4515             }
4516             break;
4517
4518           /* Dump out the options accumulated previously using %x.  */
4519           case 'X':
4520             for (i = 0; i < n_linker_options; i++)
4521               {
4522                 do_spec_1 (linker_options[i], 1, NULL);
4523                 /* Make each accumulated option a separate argument.  */
4524                 do_spec_1 (" ", 0, NULL);
4525               }
4526             break;
4527
4528           /* Dump out the options accumulated previously using -Wa,.  */
4529           case 'Y':
4530             for (i = 0; i < n_assembler_options; i++)
4531               {
4532                 do_spec_1 (assembler_options[i], 1, NULL);
4533                 /* Make each accumulated option a separate argument.  */
4534                 do_spec_1 (" ", 0, NULL);
4535               }
4536             break;
4537
4538           /* Dump out the options accumulated previously using -Wp,.  */
4539           case 'Z':
4540             for (i = 0; i < n_preprocessor_options; i++)
4541               {
4542                 do_spec_1 (preprocessor_options[i], 1, NULL);
4543                 /* Make each accumulated option a separate argument.  */
4544                 do_spec_1 (" ", 0, NULL);
4545               }
4546             break;
4547
4548             /* Here are digits and numbers that just process
4549                a certain constant string as a spec.  */
4550
4551           case '1':
4552             value = do_spec_1 (cc1_spec, 0, NULL);
4553             if (value != 0)
4554               return value;
4555             break;
4556
4557           case '2':
4558             value = do_spec_1 (cc1plus_spec, 0, NULL);
4559             if (value != 0)
4560               return value;
4561             break;
4562
4563           case 'a':
4564             value = do_spec_1 (asm_spec, 0, NULL);
4565             if (value != 0)
4566               return value;
4567             break;
4568
4569           case 'A':
4570             value = do_spec_1 (asm_final_spec, 0, NULL);
4571             if (value != 0)
4572               return value;
4573             break;
4574
4575           case 'c':
4576             value = do_spec_1 (signed_char_spec, 0, NULL);
4577             if (value != 0)
4578               return value;
4579             break;
4580
4581           case 'C':
4582             {
4583               const char* spec 
4584                 = (input_file_compiler->cpp_spec 
4585                    ? input_file_compiler->cpp_spec 
4586                    : cpp_spec);
4587               value = do_spec_1 (spec, 0, NULL);
4588               if (value != 0)
4589                 return value;
4590             }
4591             break;
4592
4593           case 'E':
4594             value = do_spec_1 (endfile_spec, 0, NULL);
4595             if (value != 0)
4596               return value;
4597             break;
4598
4599           case 'l':
4600             value = do_spec_1 (link_spec, 0, NULL);
4601             if (value != 0)
4602               return value;
4603             break;
4604
4605           case 'L':
4606             value = do_spec_1 (lib_spec, 0, NULL);
4607             if (value != 0)
4608               return value;
4609             break;
4610
4611           case 'G':
4612             value = do_spec_1 (libgcc_spec, 0, NULL);
4613             if (value != 0)
4614               return value;
4615             break;
4616
4617           case 'M':
4618             if (multilib_dir && strcmp (multilib_dir, ".") != 0)
4619               {
4620                 char *p;
4621                 const char *q;
4622                 size_t len;
4623
4624                 len = strlen (multilib_dir);
4625                 obstack_blank (&obstack, len + 1);
4626                 p = obstack_next_free (&obstack) - (len + 1);
4627
4628                 *p++ = '_';
4629                 for (q = multilib_dir; *q ; ++q, ++p)
4630                   *p = (IS_DIR_SEPARATOR (*q) ? '_' : *q);
4631               }
4632             break;
4633
4634           case 'p':
4635             {
4636               char *x = (char *) alloca (strlen (cpp_predefines) + 1);
4637               char *buf = x;
4638               const char *y;
4639
4640               /* Copy all of the -D options in CPP_PREDEFINES into BUF.  */
4641               y = cpp_predefines;
4642               while (*y != 0)
4643                 {
4644                   if (! strncmp (y, "-D", 2))
4645                     /* Copy the whole option.  */
4646                     while (*y && *y != ' ' && *y != '\t')
4647                       *x++ = *y++;
4648                   else if (*y == ' ' || *y == '\t')
4649                     /* Copy whitespace to the result.  */
4650                     *x++ = *y++;
4651                   /* Don't copy other options.  */
4652                   else
4653                     y++;
4654                 }
4655
4656               *x = 0;
4657
4658               value = do_spec_1 (buf, 0, NULL);
4659               if (value != 0)
4660                 return value;
4661             }
4662             break;
4663
4664           case 'P':
4665             {
4666               char *x = (char *) alloca (strlen (cpp_predefines) * 4 + 1);
4667               char *buf = x;
4668               const char *y;
4669
4670               /* Copy all of CPP_PREDEFINES into BUF,
4671                  but force them all into the reserved name space if they
4672                  aren't already there.  The reserved name space is all
4673                  identifiers beginning with two underscores or with one
4674                  underscore and a capital letter.  We do the forcing by
4675                  adding up to two underscores to the beginning and end
4676                  of each symbol. e.g. mips, _mips, mips_, and _mips_ all
4677                  become __mips__.  */
4678               y = cpp_predefines;
4679               while (*y != 0)
4680                 {
4681                   if (! strncmp (y, "-D", 2))
4682                     {
4683                       int flag = 0;
4684
4685                       *x++ = *y++;
4686                       *x++ = *y++;
4687
4688                       if (*y != '_'
4689                           || (*(y + 1) != '_'
4690                               && ! ISUPPER ((unsigned char) *(y + 1))))
4691                         {
4692                           /* Stick __ at front of macro name.  */
4693                           if (*y != '_')
4694                             *x++ = '_';
4695                           *x++ = '_';
4696                           /* Arrange to stick __ at the end as well.  */
4697                           flag = 1;
4698                         }
4699
4700                       /* Copy the macro name.  */
4701                       while (*y && *y != '=' && *y != ' ' && *y != '\t')
4702                         *x++ = *y++;
4703
4704                       if (flag)
4705                         {
4706                           if (x[-1] != '_')
4707                             {
4708                               if (x[-2] != '_')
4709                                 *x++ = '_';
4710                               *x++ = '_';
4711                             }
4712                         }
4713
4714                       /* Copy the value given, if any.  */
4715                       while (*y && *y != ' ' && *y != '\t')
4716                         *x++ = *y++;
4717                     }
4718                   else if (*y == ' ' || *y == '\t')
4719                     /* Copy whitespace to the result.  */
4720                     *x++ = *y++;
4721                   /* Don't copy -A options  */
4722                   else
4723                     y++;
4724                 }
4725               *x++ = ' ';
4726
4727               /* Copy all of CPP_PREDEFINES into BUF,
4728                  but put __ after every -D.  */
4729               y = cpp_predefines;
4730               while (*y != 0)
4731                 {
4732                   if (! strncmp (y, "-D", 2))
4733                     {
4734                       y += 2;
4735
4736                       if (*y != '_'
4737                           || (*(y + 1) != '_'
4738                               && ! ISUPPER ((unsigned char) *(y + 1))))
4739                         {
4740                           /* Stick -D__ at front of macro name.  */
4741                           *x++ = '-';
4742                           *x++ = 'D';
4743                           if (*y != '_')
4744                             *x++ = '_';
4745                           *x++ = '_';
4746
4747                           /* Copy the macro name.  */
4748                           while (*y && *y != '=' && *y != ' ' && *y != '\t')
4749                             *x++ = *y++;
4750
4751                           /* Copy the value given, if any.  */
4752                           while (*y && *y != ' ' && *y != '\t')
4753                             *x++ = *y++;
4754                         }
4755                       else
4756                         {
4757                           /* Do not copy this macro - we have just done it before */
4758                           while (*y && *y != ' ' && *y != '\t')
4759                             y++;
4760                         }
4761                     }
4762                   else if (*y == ' ' || *y == '\t')
4763                     /* Copy whitespace to the result.  */
4764                     *x++ = *y++;
4765                   /* Don't copy -A options.  */
4766                   else
4767                     y++;
4768                 }
4769               *x++ = ' ';
4770
4771               /* Copy all of the -A options in CPP_PREDEFINES into BUF.  */
4772               y = cpp_predefines;
4773               while (*y != 0)
4774                 {
4775                   if (! strncmp (y, "-A", 2))
4776                     /* Copy the whole option.  */
4777                     while (*y && *y != ' ' && *y != '\t')
4778                       *x++ = *y++;
4779                   else if (*y == ' ' || *y == '\t')
4780                     /* Copy whitespace to the result.  */
4781                     *x++ = *y++;
4782                   /* Don't copy other options.  */
4783                   else
4784                     y++;
4785                 }
4786
4787               *x = 0;
4788
4789               value = do_spec_1 (buf, 0, NULL);
4790               if (value != 0)
4791                 return value;
4792             }
4793             break;
4794
4795           case 'S':
4796             value = do_spec_1 (startfile_spec, 0, NULL);
4797             if (value != 0)
4798               return value;
4799             break;
4800
4801             /* Here we define characters other than letters and digits.  */
4802
4803           case '{':
4804             p = handle_braces (p);
4805             if (p == 0)
4806               return -1;
4807             break;
4808
4809           case '%':
4810             obstack_1grow (&obstack, '%');
4811             break;
4812
4813          case '.':
4814            {
4815              unsigned len = 0;
4816
4817              while (p[len] && p[len] != ' ' && p[len] != '%')
4818                len++;
4819              suffix_subst = save_string (p - 1, len + 1);
4820              p += len;
4821            }
4822            break;
4823           
4824           case '*':
4825             if (soft_matched_part)
4826               {
4827                 do_spec_1 (soft_matched_part, 1, NULL);
4828                 do_spec_1 (" ", 0, NULL);
4829               }
4830             else
4831               /* Catch the case where a spec string contains something like
4832                  '%{foo:%*}'.  ie there is no * in the pattern on the left
4833                  hand side of the :.  */
4834               error ("Spec failure: '%%*' has not been initialised by pattern match");
4835             break;
4836
4837             /* Process a string found as the value of a spec given by name.
4838                This feature allows individual machine descriptions
4839                to add and use their own specs.
4840                %[...] modifies -D options the way %P does;
4841                %(...) uses the spec unmodified.  */
4842           case '[':
4843             error ("Warning: use of obsolete %%[ operator in specs");
4844           case '(':
4845             {
4846               const char *name = p;
4847               struct spec_list *sl;
4848               int len;
4849
4850               /* The string after the S/P is the name of a spec that is to be
4851                  processed.  */
4852               while (*p && *p != ')' && *p != ']')
4853                 p++;
4854
4855               /* See if it's in the list.  */
4856               for (len = p - name, sl = specs; sl; sl = sl->next)
4857                 if (sl->name_len == len && !strncmp (sl->name, name, len))
4858                   {
4859                     name = *(sl->ptr_spec);
4860 #ifdef DEBUG_SPECS
4861                     notice ("Processing spec %c%s%c, which is '%s'\n",
4862                             c, sl->name, (c == '(') ? ')' : ']', name);
4863 #endif
4864                     break;
4865                   }
4866
4867               if (sl)
4868                 {
4869                   if (c == '(')
4870                     {
4871                       value = do_spec_1 (name, 0, NULL);
4872                       if (value != 0)
4873                         return value;
4874                     }
4875                   else
4876                     {
4877                       char *x = (char *) alloca (strlen (name) * 2 + 1);
4878                       char *buf = x;
4879                       const char *y = name;
4880                       int flag = 0;
4881
4882                       /* Copy all of NAME into BUF, but put __ after
4883                          every -D and at the end of each arg.  */
4884                       while (1)
4885                         {
4886                           if (! strncmp (y, "-D", 2))
4887                             {
4888                               *x++ = '-';
4889                               *x++ = 'D';
4890                               *x++ = '_';
4891                               *x++ = '_';
4892                               y += 2;
4893                               flag = 1;
4894                               continue;
4895                             }
4896                           else if (flag
4897                                    && (*y == ' ' || *y == '\t' || *y == '='
4898                                        || *y == '}' || *y == 0))
4899                             {
4900                               *x++ = '_';
4901                               *x++ = '_';
4902                               flag = 0;
4903                             }
4904                           if (*y == 0)
4905                             break;
4906                           else
4907                             *x++ = *y++;
4908                         }
4909                       *x = 0;
4910
4911                       value = do_spec_1 (buf, 0, NULL);
4912                       if (value != 0)
4913                         return value;
4914                     }
4915                 }
4916
4917               /* Discard the closing paren or bracket.  */
4918               if (*p)
4919                 p++;
4920             }
4921             break;
4922
4923           case 'v':
4924             {
4925               int c1 = *p++;  /* Select first or second version number.  */
4926               const char *v = compiler_version;
4927               const char *q;
4928               static const char zeroc = '0';
4929
4930               /* The format of the version string is
4931                  ([^0-9]*-)?[0-9]+[.][0-9]+([.][0-9]+)?([- ].*)?  */
4932
4933               /* Ignore leading non-digits.  i.e. "foo-" in "foo-2.7.2".  */
4934               while (! ISDIGIT (*v))
4935                 v++;
4936               if (v > compiler_version && v[-1] != '-')
4937                 abort ();
4938
4939               /* If desired, advance to second version number.  */
4940               if (c1 >= '2')
4941                 {
4942                   /* Set V after the first period.  */
4943                   while (ISDIGIT (*v))
4944                     v++;
4945                   if (*v != '.')
4946                     abort ();
4947                   v++;
4948                 }
4949
4950               /* If desired, advance to third version number.
4951                  But don't complain if it's not present */
4952               if (c1 == '3')
4953                 {
4954                   /* Set V after the second period.  */
4955                   while (ISDIGIT (*v))
4956                     v++;
4957                   if ((*v != 0) && (*v != ' ') && (*v != '.') && (*v != '-'))
4958                     abort ();
4959                   if (*v != 0)
4960                     v++;
4961                 }
4962
4963               /* Set Q at the next period or at the end.  */
4964               q = v;
4965               while (ISDIGIT (*q))
4966                 q++;
4967               if (*q != 0 && q > v && *q != ' ' && *q != '.' && *q != '-')
4968                 abort ();
4969
4970               if (q > v)
4971                 /* Put that part into the command.  */
4972                 obstack_grow (&obstack, v, q - v);
4973               else
4974                 /* Default to "0" */
4975                 obstack_grow (&obstack, &zeroc, 1);
4976               arg_going = 1;
4977             }
4978             break;
4979
4980           case '|':
4981             if (input_from_pipe)
4982               do_spec_1 ("-", 0, NULL);
4983             break;
4984
4985           default:
4986             error ("Spec failure: Unrecognised spec option '%c'", c);
4987             break;
4988           }
4989         break;
4990
4991       case '\\':
4992         /* Backslash: treat next character as ordinary.  */
4993         c = *p++;
4994
4995         /* fall through */
4996       default:
4997         /* Ordinary character: put it into the current argument.  */
4998         obstack_1grow (&obstack, c);
4999         arg_going = 1;
5000       }
5001
5002   /* End of string.  */
5003   return 0;
5004 }
5005
5006 /* Return 0 if we call do_spec_1 and that returns -1.  */
5007
5008 static const char *
5009 handle_braces (p)
5010      register const char *p;
5011 {
5012   const char *filter, *body = NULL, *endbody = NULL;
5013   int pipe_p = 0;
5014   int true_once = 0;    /* If, in %{a|b:d}, at least one of a,b was seen.  */
5015   int negate;
5016   int suffix;
5017   int include_blanks = 1;
5018   int elide_switch = 0;
5019   int ordered = 0;
5020
5021   if (*p == '^')
5022     {
5023       /* A '^' after the open-brace means to not give blanks before args.  */
5024       include_blanks = 0;
5025       ++p;
5026     }
5027
5028   if (*p == '|')
5029     {
5030       /* A `|' after the open-brace means,
5031          if the test fails, output a single minus sign rather than nothing.
5032          This is used in %{|!pipe:...}.  */
5033       pipe_p = 1;
5034       ++p;
5035     }
5036
5037   if (*p == '<')
5038     {
5039       /* A `<' after the open-brace means that the switch should be
5040          removed from the command-line.  */
5041       elide_switch = 1;
5042       ++p;
5043     }
5044
5045 next_member:
5046   negate = suffix = 0;
5047
5048   if (*p == '!')
5049     /* A `!' after the open-brace negates the condition:
5050        succeed if the specified switch is not present.  */
5051     negate = 1, ++p;
5052
5053   if (*p == '.')
5054     /* A `.' after the open-brace means test against the current suffix.  */
5055     {
5056       if (pipe_p)
5057         abort ();
5058
5059       suffix = 1;
5060       ++p;
5061     }
5062
5063   if (elide_switch && (negate || pipe_p || suffix))
5064     {
5065       /* It doesn't make sense to mix elision with other flags.  We
5066          could fatal() here, but the standard seems to be to abort.  */
5067       abort ();
5068     }
5069
5070  next_ampersand:
5071   filter = p;
5072   while (*p != ':' && *p != '}' && *p != '|' && *p != '&')
5073     p++;
5074
5075   if (*p == '|' && (pipe_p || ordered))
5076     abort ();
5077
5078   if (!body)
5079     {
5080       if (*p != '}' && *p != '&')
5081         {
5082           register int count = 1;
5083           register const char *q = p;
5084
5085           while (*q++ != ':')
5086             continue;
5087           body = q;
5088
5089           while (count > 0)
5090             {
5091               if (*q == '{')
5092                 count++;
5093               else if (*q == '}')
5094                 count--;
5095               else if (*q == 0)
5096                 fatal ("Mismatched braces in specs");
5097               q++;
5098             }
5099           endbody = q;
5100         }
5101       else
5102         body = p, endbody = p + 1;
5103     }
5104
5105   if (suffix)
5106     {
5107       int found = (input_suffix != 0
5108                    && (long) strlen (input_suffix) == (long) (p - filter)
5109                    && strncmp (input_suffix, filter, p - filter) == 0);
5110
5111       if (body[0] == '}')
5112         abort ();
5113
5114       if (negate != found
5115           && do_spec_1 (save_string (body, endbody-body-1), 0, NULL) < 0)
5116         return 0;
5117     }
5118   else if (p[-1] == '*' && (p[0] == '}' || p[0] == '&'))
5119     {
5120       /* Substitute all matching switches as separate args.  */
5121       register int i;
5122
5123       for (i = 0; i < n_switches; i++)
5124         if (!strncmp (switches[i].part1, filter, p - 1 - filter)
5125             && check_live_switch (i, p - 1 - filter))
5126           {
5127             if (elide_switch)
5128               {
5129                 switches[i].live_cond = SWITCH_IGNORE;
5130                 switches[i].validated = 1;
5131               }
5132             else
5133               ordered = 1, switches[i].ordering = 1;
5134           }
5135     }
5136   else
5137     {
5138       /* Test for presence of the specified switch.  */
5139       register int i;
5140       int present = 0;
5141
5142       /* If name specified ends in *, as in {x*:...},
5143          check for %* and handle that case.  */
5144       if (p[-1] == '*' && !negate)
5145         {
5146           int substitution;
5147           const char *r = body;
5148
5149           /* First see whether we have %*.  */
5150           substitution = 0;
5151           while (r < endbody)
5152             {
5153               if (*r == '%' && r[1] == '*')
5154                 substitution = 1;
5155               r++;
5156             }
5157           /* If we do, handle that case.  */
5158           if (substitution)
5159             {
5160               /* Substitute all matching switches as separate args.
5161                  But do this by substituting for %*
5162                  in the text that follows the colon.  */
5163
5164               unsigned hard_match_len = p - filter - 1;
5165               char *string = save_string (body, endbody - body - 1);
5166
5167               for (i = 0; i < n_switches; i++)
5168                 if (!strncmp (switches[i].part1, filter, hard_match_len)
5169                     && check_live_switch (i, -1))
5170                   {
5171                     do_spec_1 (string, 0, &switches[i].part1[hard_match_len]);
5172                     /* Pass any arguments this switch has.  */
5173                     give_switch (i, 1, 1);
5174                     suffix_subst = NULL;
5175                   }
5176
5177               /* We didn't match.  Try again.  */
5178               if (*p++ == '|')
5179                 goto next_member;
5180               return endbody;
5181             }
5182         }
5183
5184       /* If name specified ends in *, as in {x*:...},
5185          check for presence of any switch name starting with x.  */
5186       if (p[-1] == '*')
5187         {
5188           for (i = 0; i < n_switches; i++)
5189             {
5190               unsigned hard_match_len = p - filter - 1;
5191
5192               if (!strncmp (switches[i].part1, filter, hard_match_len)
5193                   && check_live_switch (i, hard_match_len))
5194                 {
5195                   present = 1;
5196                   break;
5197                 }
5198             }
5199         }
5200       /* Otherwise, check for presence of exact name specified.  */
5201       else
5202         {
5203           for (i = 0; i < n_switches; i++)
5204             {
5205               if (!strncmp (switches[i].part1, filter, p - filter)
5206                   && switches[i].part1[p - filter] == 0
5207                   && check_live_switch (i, -1))
5208                 {
5209                   present = 1;
5210                   break;
5211                 }
5212             }
5213         }
5214
5215       /* If it is as desired (present for %{s...}, absent for %{!s...})
5216          then substitute either the switch or the specified
5217          conditional text.  */
5218       if (present != negate)
5219         {
5220           if (elide_switch)
5221             {
5222               switches[i].live_cond = SWITCH_IGNORE;
5223               switches[i].validated = 1;
5224             }
5225           else if (ordered || *p == '&')
5226             ordered = 1, switches[i].ordering = 1;
5227           else if (*p == '}')
5228             give_switch (i, 0, include_blanks);
5229           else
5230             /* Even if many alternatives are matched, only output once.  */
5231             true_once = 1;
5232         }
5233       else if (pipe_p)
5234         {
5235           /* Here if a %{|...} conditional fails: output a minus sign,
5236              which means "standard output" or "standard input".  */
5237           do_spec_1 ("-", 0, NULL);
5238           return endbody;
5239         }
5240     }
5241
5242   /* We didn't match; try again.  */
5243   if (*p++ == '|')
5244     goto next_member;
5245
5246   if (p[-1] == '&')
5247     {
5248       body = 0;
5249       goto next_ampersand;
5250     }
5251
5252   if (ordered)
5253     {
5254       int i;
5255       /* Doing this set of switches later preserves their command-line
5256          ordering.  This is needed for e.g. -U, -D and -A.  */
5257       for (i = 0; i < n_switches; i++)
5258         if (switches[i].ordering == 1)
5259           {
5260             switches[i].ordering = 0;
5261             give_switch (i, 0, include_blanks);
5262           }
5263     }
5264   /* Process the spec just once, regardless of match count.  */
5265   else if (true_once)
5266     {
5267       if (do_spec_1 (save_string (body, endbody - body - 1),
5268                      0, NULL) < 0)
5269         return 0;
5270     }
5271
5272   return endbody;
5273 }
5274 \f
5275 /* Return 0 iff switch number SWITCHNUM is obsoleted by a later switch
5276    on the command line.  PREFIX_LENGTH is the length of XXX in an {XXX*}
5277    spec, or -1 if either exact match or %* is used.
5278
5279    A -O switch is obsoleted by a later -O switch.  A -f, -m, or -W switch
5280    whose value does not begin with "no-" is obsoleted by the same value
5281    with the "no-", similarly for a switch with the "no-" prefix.  */
5282
5283 static int
5284 check_live_switch (switchnum, prefix_length)
5285      int switchnum;
5286      int prefix_length;
5287 {
5288   const char *name = switches[switchnum].part1;
5289   int i;
5290
5291   /* In the common case of {<at-most-one-letter>*}, a negating
5292      switch would always match, so ignore that case.  We will just
5293      send the conflicting switches to the compiler phase.  */
5294   if (prefix_length >= 0 && prefix_length <= 1)
5295     return 1;
5296
5297   /* If we already processed this switch and determined if it was
5298      live or not, return our past determination.  */
5299   if (switches[switchnum].live_cond != 0)
5300     return switches[switchnum].live_cond > 0;
5301
5302   /* Now search for duplicate in a manner that depends on the name.  */
5303   switch (*name)
5304     {
5305     case 'O':
5306       for (i = switchnum + 1; i < n_switches; i++)
5307         if (switches[i].part1[0] == 'O')
5308           {
5309             switches[switchnum].validated = 1;
5310             switches[switchnum].live_cond = SWITCH_FALSE;
5311             return 0;
5312           }
5313       break;
5314
5315     case 'W':  case 'f':  case 'm':
5316       if (! strncmp (name + 1, "no-", 3))
5317         {
5318           /* We have Xno-YYY, search for XYYY.  */
5319           for (i = switchnum + 1; i < n_switches; i++)
5320             if (switches[i].part1[0] == name[0]
5321                 && ! strcmp (&switches[i].part1[1], &name[4]))
5322               {
5323                 switches[switchnum].validated = 1;
5324                 switches[switchnum].live_cond = SWITCH_FALSE;
5325                 return 0;
5326               }
5327         }
5328       else
5329         {
5330           /* We have XYYY, search for Xno-YYY.  */
5331           for (i = switchnum + 1; i < n_switches; i++)
5332             if (switches[i].part1[0] == name[0]
5333                 && switches[i].part1[1] == 'n'
5334                 && switches[i].part1[2] == 'o'
5335                 && switches[i].part1[3] == '-'
5336                 && !strcmp (&switches[i].part1[4], &name[1]))
5337               {
5338                 switches[switchnum].validated = 1;
5339                 switches[switchnum].live_cond = SWITCH_FALSE;
5340                 return 0;
5341               }
5342         }
5343       break;
5344     }
5345
5346   /* Otherwise the switch is live.  */
5347   switches[switchnum].live_cond = SWITCH_LIVE;
5348   return 1;
5349 }
5350 \f
5351 /* Pass a switch to the current accumulating command
5352    in the same form that we received it.
5353    SWITCHNUM identifies the switch; it is an index into
5354    the vector of switches gcc received, which is `switches'.
5355    This cannot fail since it never finishes a command line.
5356
5357    If OMIT_FIRST_WORD is nonzero, then we omit .part1 of the argument.
5358
5359    If INCLUDE_BLANKS is nonzero, then we include blanks before each argument
5360    of the switch.  */
5361
5362 static void
5363 give_switch (switchnum, omit_first_word, include_blanks)
5364      int switchnum;
5365      int omit_first_word;
5366      int include_blanks;
5367 {
5368   if (switches[switchnum].live_cond == SWITCH_IGNORE)
5369     return;
5370
5371   if (!omit_first_word)
5372     {
5373       do_spec_1 ("-", 0, NULL);
5374       do_spec_1 (switches[switchnum].part1, 1, NULL);
5375     }
5376
5377   if (switches[switchnum].args != 0)
5378     {
5379       const char **p;
5380       for (p = switches[switchnum].args; *p; p++)
5381         {
5382           const char *arg = *p;
5383
5384           if (include_blanks)
5385             do_spec_1 (" ", 0, NULL);
5386           if (suffix_subst)
5387             {
5388               unsigned length = strlen (arg);
5389               int dot = 0;
5390
5391               while (length-- && !IS_DIR_SEPARATOR (arg[length]))
5392                 if (arg[length] == '.')
5393                   {
5394                     ((char *)arg)[length] = 0;
5395                     dot = 1;
5396                     break;
5397                   }
5398               do_spec_1 (arg, 1, NULL);
5399               if (dot)
5400                 ((char *)arg)[length] = '.';
5401               do_spec_1 (suffix_subst, 1, NULL);
5402             }
5403           else
5404             do_spec_1 (arg, 1, NULL);
5405         }
5406     }
5407
5408   do_spec_1 (" ", 0, NULL);
5409   switches[switchnum].validated = 1;
5410 }
5411 \f
5412 /* Search for a file named NAME trying various prefixes including the
5413    user's -B prefix and some standard ones.
5414    Return the absolute file name found.  If nothing is found, return NAME.  */
5415
5416 static const char *
5417 find_file (name)
5418      const char *name;
5419 {
5420   char *newname;
5421
5422   /* Try multilib_dir if it is defined.  */
5423   if (multilib_dir != NULL)
5424     {
5425       char *try;
5426
5427       try = (char *) alloca (strlen (multilib_dir) + strlen (name) + 2);
5428       strcpy (try, multilib_dir);
5429       strcat (try, dir_separator_str);
5430       strcat (try, name);
5431
5432       newname = find_a_file (&startfile_prefixes, try, R_OK);
5433
5434       /* If we don't find it in the multi library dir, then fall
5435          through and look for it in the normal places.  */
5436       if (newname != NULL)
5437         return newname;
5438     }
5439
5440   newname = find_a_file (&startfile_prefixes, name, R_OK);
5441   return newname ? newname : name;
5442 }
5443
5444 /* Determine whether a directory exists.  If LINKER, return 0 for
5445    certain fixed names not needed by the linker.  If not LINKER, it is
5446    only important to return 0 if the host machine has a small ARG_MAX
5447    limit.  */
5448
5449 static int
5450 is_directory (path1, path2, linker)
5451      const char *path1;
5452      const char *path2;
5453      int linker;
5454 {
5455   int len1 = strlen (path1);
5456   int len2 = strlen (path2);
5457   char *path = (char *) alloca (3 + len1 + len2);
5458   char *cp;
5459   struct stat st;
5460
5461 #ifndef SMALL_ARG_MAX
5462   if (! linker)
5463     return 1;
5464 #endif
5465
5466   /* Construct the path from the two parts.  Ensure the string ends with "/.".
5467      The resulting path will be a directory even if the given path is a
5468      symbolic link.  */
5469   memcpy (path, path1, len1);
5470   memcpy (path + len1, path2, len2);
5471   cp = path + len1 + len2;
5472   if (!IS_DIR_SEPARATOR (cp[-1]))
5473     *cp++ = DIR_SEPARATOR;
5474   *cp++ = '.';
5475   *cp = '\0';
5476
5477   /* Exclude directories that the linker is known to search.  */
5478   if (linker
5479       && ((cp - path == 6
5480            && strcmp (path, concat (dir_separator_str, "lib",
5481                                     dir_separator_str, ".", NULL)) == 0)
5482           || (cp - path == 10
5483               && strcmp (path, concat (dir_separator_str, "usr",
5484                                        dir_separator_str, "lib",
5485                                        dir_separator_str, ".", NULL)) == 0)))
5486     return 0;
5487
5488   return (stat (path, &st) >= 0 && S_ISDIR (st.st_mode));
5489 }
5490
5491 /* Set up the various global variables to indicate that we're processing
5492    the input file named FILENAME.  */
5493
5494 static void
5495 set_input (filename)
5496      const char *filename;
5497 {
5498   register const char *p;
5499
5500   input_filename = filename;
5501   input_filename_length = strlen (input_filename);
5502
5503   input_basename = input_filename;
5504 #ifdef HAVE_DOS_BASED_FILE_SYSTEM
5505   /* Skip drive name so 'x:foo' is handled properly.  */
5506   if (input_basename[1] == ':')
5507     input_basename += 2;
5508 #endif
5509   for (p = input_basename; *p; p++)
5510     if (IS_DIR_SEPARATOR (*p))
5511       input_basename = p + 1;
5512
5513   /* Find a suffix starting with the last period,
5514      and set basename_length to exclude that suffix.  */
5515   basename_length = strlen (input_basename);
5516   suffixed_basename_length = basename_length;
5517   p = input_basename + basename_length;
5518   while (p != input_basename && *p != '.')
5519     --p;
5520   if (*p == '.' && p != input_basename)
5521     {
5522       basename_length = p - input_basename;
5523       input_suffix = p + 1;
5524     }
5525   else
5526     input_suffix = "";
5527 }
5528 \f
5529 /* On fatal signals, delete all the temporary files.  */
5530
5531 static void
5532 fatal_error (signum)
5533      int signum;
5534 {
5535   signal (signum, SIG_DFL);
5536   delete_failure_queue ();
5537   delete_temp_files ();
5538   /* Get the same signal again, this time not handled,
5539      so its normal effect occurs.  */
5540   kill (getpid (), signum);
5541 }
5542
5543 extern int main PARAMS ((int, const char *const *));
5544
5545 int
5546 main (argc, argv)
5547      int argc;
5548      const char *const *argv;
5549 {
5550   size_t i;
5551   int value;
5552   int linker_was_run = 0;
5553   char *explicit_link_files;
5554   char *specs_file;
5555   const char *p;
5556   struct user_specs *uptr;
5557
5558   p = argv[0] + strlen (argv[0]);
5559   while (p != argv[0] && !IS_DIR_SEPARATOR (p[-1]))
5560     --p;
5561   programname = p;
5562
5563   xmalloc_set_program_name (programname);
5564
5565 #ifdef GCC_DRIVER_HOST_INITIALIZATION
5566   /* Perform host dependant initialization when needed.  */
5567   GCC_DRIVER_HOST_INITIALIZATION;
5568 #endif
5569
5570 /* LC_CTYPE determines the character set used by the terminal so it has be set
5571    to output messages correctly.  */
5572
5573 #ifdef HAVE_LC_MESSAGES
5574   setlocale (LC_CTYPE, "");
5575   setlocale (LC_MESSAGES, "");
5576 #else
5577   setlocale (LC_ALL, "");
5578 #endif
5579
5580   (void) bindtextdomain (PACKAGE, localedir);
5581   (void) textdomain (PACKAGE);
5582
5583   if (signal (SIGINT, SIG_IGN) != SIG_IGN)
5584     signal (SIGINT, fatal_error);
5585 #ifdef SIGHUP
5586   if (signal (SIGHUP, SIG_IGN) != SIG_IGN)
5587     signal (SIGHUP, fatal_error);
5588 #endif
5589   if (signal (SIGTERM, SIG_IGN) != SIG_IGN)
5590     signal (SIGTERM, fatal_error);
5591 #ifdef SIGPIPE
5592   if (signal (SIGPIPE, SIG_IGN) != SIG_IGN)
5593     signal (SIGPIPE, fatal_error);
5594 #endif
5595 #ifdef SIGCHLD
5596   /* We *MUST* set SIGCHLD to SIG_DFL so that the wait4() call will
5597      receive the signal.  A different setting is inheritable */
5598   signal (SIGCHLD, SIG_DFL);
5599 #endif
5600
5601   argbuf_length = 10;
5602   argbuf = (const char **) xmalloc (argbuf_length * sizeof (const char *));
5603
5604   obstack_init (&obstack);
5605
5606   /* Build multilib_select, et. al from the separate lines that make up each
5607      multilib selection.  */
5608   {
5609     const char *const *q = multilib_raw;
5610     int need_space;
5611
5612     obstack_init (&multilib_obstack);
5613     while ((p = *q++) != (char *) 0)
5614       obstack_grow (&multilib_obstack, p, strlen (p));
5615
5616     obstack_1grow (&multilib_obstack, 0);
5617     multilib_select = obstack_finish (&multilib_obstack);
5618
5619     q = multilib_matches_raw;
5620     while ((p = *q++) != (char *) 0)
5621       obstack_grow (&multilib_obstack, p, strlen (p));
5622
5623     obstack_1grow (&multilib_obstack, 0);
5624     multilib_matches = obstack_finish (&multilib_obstack);
5625
5626     q = multilib_exclusions_raw;
5627     while ((p = *q++) != (char *) 0)
5628       obstack_grow (&multilib_obstack, p, strlen (p));
5629
5630     obstack_1grow (&multilib_obstack, 0);
5631     multilib_exclusions = obstack_finish (&multilib_obstack);
5632
5633     need_space = FALSE;
5634     for (i = 0; i < ARRAY_SIZE (multilib_defaults_raw); i++)
5635       {
5636         if (need_space)
5637           obstack_1grow (&multilib_obstack, ' ');
5638         obstack_grow (&multilib_obstack,
5639                       multilib_defaults_raw[i],
5640                       strlen (multilib_defaults_raw[i]));
5641         need_space = TRUE;
5642       }
5643
5644     obstack_1grow (&multilib_obstack, 0);
5645     multilib_defaults = obstack_finish (&multilib_obstack);
5646   }
5647
5648   /* Set up to remember the pathname of gcc and any options
5649      needed for collect.  We use argv[0] instead of programname because
5650      we need the complete pathname.  */
5651   obstack_init (&collect_obstack);
5652   obstack_grow (&collect_obstack, "COLLECT_GCC=", sizeof ("COLLECT_GCC=") - 1);
5653   obstack_grow (&collect_obstack, argv[0], strlen (argv[0]) + 1);
5654   putenv (obstack_finish (&collect_obstack));
5655
5656 #ifdef INIT_ENVIRONMENT
5657   /* Set up any other necessary machine specific environment variables.  */
5658   putenv (INIT_ENVIRONMENT);
5659 #endif
5660
5661   /* Make a table of what switches there are (switches, n_switches).
5662      Make a table of specified input files (infiles, n_infiles).
5663      Decode switches that are handled locally.  */
5664
5665   process_command (argc, argv);
5666
5667   {
5668     int first_time;
5669
5670     /* Build COLLECT_GCC_OPTIONS to have all of the options specified to
5671        the compiler.  */
5672     obstack_grow (&collect_obstack, "COLLECT_GCC_OPTIONS=",
5673                   sizeof ("COLLECT_GCC_OPTIONS=") - 1);
5674
5675     first_time = TRUE;
5676     for (i = 0; (int) i < n_switches; i++)
5677       {
5678         const char *const *args;
5679         const char *p, *q;
5680         if (!first_time)
5681           obstack_grow (&collect_obstack, " ", 1);
5682
5683         first_time = FALSE;
5684         obstack_grow (&collect_obstack, "'-", 2);
5685         q = switches[i].part1;
5686         while ((p = strchr (q, '\'')))
5687           {
5688             obstack_grow (&collect_obstack, q, p - q);
5689             obstack_grow (&collect_obstack, "'\\''", 4);
5690             q = ++p;
5691           }
5692         obstack_grow (&collect_obstack, q, strlen (q));
5693         obstack_grow (&collect_obstack, "'", 1);
5694
5695         for (args = switches[i].args; args && *args; args++)
5696           {
5697             obstack_grow (&collect_obstack, " '", 2);
5698             q = *args;
5699             while ((p = strchr (q, '\'')))
5700               {
5701                 obstack_grow (&collect_obstack, q, p - q);
5702                 obstack_grow (&collect_obstack, "'\\''", 4);
5703                 q = ++p;
5704               }
5705             obstack_grow (&collect_obstack, q, strlen (q));
5706             obstack_grow (&collect_obstack, "'", 1);
5707           }
5708       }
5709     obstack_grow (&collect_obstack, "\0", 1);
5710     putenv (obstack_finish (&collect_obstack));
5711   }
5712
5713   /* Initialize the vector of specs to just the default.
5714      This means one element containing 0s, as a terminator.  */
5715
5716   compilers = (struct compiler *) xmalloc (sizeof default_compilers);
5717   memcpy ((char *) compilers, (char *) default_compilers,
5718           sizeof default_compilers);
5719   n_compilers = n_default_compilers;
5720
5721   /* Read specs from a file if there is one.  */
5722
5723   machine_suffix = concat (spec_machine, dir_separator_str,
5724                            spec_version, dir_separator_str, NULL);
5725   just_machine_suffix = concat (spec_machine, dir_separator_str, NULL);
5726
5727   specs_file = find_a_file (&startfile_prefixes, "specs", R_OK);
5728   /* Read the specs file unless it is a default one.  */
5729   if (specs_file != 0 && strcmp (specs_file, "specs"))
5730     read_specs (specs_file, TRUE);
5731   else
5732     init_spec ();
5733
5734   /* We need to check standard_exec_prefix/just_machine_suffix/specs
5735      for any override of as, ld and libraries.  */
5736   specs_file = (char *) alloca (strlen (standard_exec_prefix)
5737                                 + strlen (just_machine_suffix)
5738                                 + sizeof ("specs"));
5739
5740   strcpy (specs_file, standard_exec_prefix);
5741   strcat (specs_file, just_machine_suffix);
5742   strcat (specs_file, "specs");
5743   if (access (specs_file, R_OK) == 0)
5744     read_specs (specs_file, TRUE);
5745
5746   /* If not cross-compiling, look for startfiles in the standard places.  */
5747   if (*cross_compile == '0')
5748     {
5749       if (*md_exec_prefix)
5750         {
5751           add_prefix (&exec_prefixes, md_exec_prefix, "GCC",
5752                       PREFIX_PRIORITY_LAST, 0, NULL);
5753           add_prefix (&startfile_prefixes, md_exec_prefix, "GCC",
5754                       PREFIX_PRIORITY_LAST, 0, NULL);
5755         }
5756
5757       if (*md_startfile_prefix)
5758         add_prefix (&startfile_prefixes, md_startfile_prefix, "GCC",
5759                     PREFIX_PRIORITY_LAST, 0, NULL);
5760
5761       if (*md_startfile_prefix_1)
5762         add_prefix (&startfile_prefixes, md_startfile_prefix_1, "GCC",
5763                     PREFIX_PRIORITY_LAST, 0, NULL);
5764
5765       /* If standard_startfile_prefix is relative, base it on
5766          standard_exec_prefix.  This lets us move the installed tree
5767          as a unit.  If GCC_EXEC_PREFIX is defined, base
5768          standard_startfile_prefix on that as well.  */
5769       if (IS_ABSOLUTE_PATHNAME (standard_startfile_prefix))
5770         add_prefix (&startfile_prefixes, standard_startfile_prefix, "BINUTILS",
5771                     PREFIX_PRIORITY_LAST, 0, NULL);
5772       else
5773         {
5774           if (gcc_exec_prefix)
5775             add_prefix (&startfile_prefixes,
5776                         concat (gcc_exec_prefix, machine_suffix,
5777                                 standard_startfile_prefix, NULL),
5778                         NULL, PREFIX_PRIORITY_LAST, 0, NULL);
5779           add_prefix (&startfile_prefixes,
5780                       concat (standard_exec_prefix,
5781                               machine_suffix,
5782                               standard_startfile_prefix, NULL),
5783                       NULL, PREFIX_PRIORITY_LAST, 0, NULL);
5784         }
5785
5786       add_prefix (&startfile_prefixes, standard_startfile_prefix_1,
5787                   "BINUTILS", PREFIX_PRIORITY_LAST, 0, NULL);
5788       add_prefix (&startfile_prefixes, standard_startfile_prefix_2,
5789                   "BINUTILS", PREFIX_PRIORITY_LAST, 0, NULL);
5790 #if 0 /* Can cause surprises, and one can use -B./ instead.  */
5791       add_prefix (&startfile_prefixes, "./", NULL,
5792                   PREFIX_PRIORITY_LAST, 1, NULL);
5793 #endif
5794     }
5795   else
5796     {
5797       if (!IS_ABSOLUTE_PATHNAME (standard_startfile_prefix)
5798           && gcc_exec_prefix)
5799         add_prefix (&startfile_prefixes,
5800                     concat (gcc_exec_prefix, machine_suffix,
5801                             standard_startfile_prefix, NULL),
5802                     "BINUTILS", PREFIX_PRIORITY_LAST, 0, NULL);
5803     }
5804
5805   /* Process any user specified specs in the order given on the command
5806      line.  */
5807   for (uptr = user_specs_head; uptr; uptr = uptr->next)
5808     {
5809       char *filename = find_a_file (&startfile_prefixes, uptr->filename, R_OK);
5810       read_specs (filename ? filename : uptr->filename, FALSE);
5811     }
5812
5813   /* If we have a GCC_EXEC_PREFIX envvar, modify it for cpp's sake.  */
5814   if (gcc_exec_prefix)
5815     {
5816       char *temp = (char *) xmalloc (strlen (gcc_exec_prefix)
5817                                      + strlen (spec_version)
5818                                      + strlen (spec_machine) + 3);
5819       strcpy (temp, gcc_exec_prefix);
5820       strcat (temp, spec_machine);
5821       strcat (temp, dir_separator_str);
5822       strcat (temp, spec_version);
5823       strcat (temp, dir_separator_str);
5824       gcc_exec_prefix = temp;
5825     }
5826
5827   /* Now we have the specs.
5828      Set the `valid' bits for switches that match anything in any spec.  */
5829
5830   validate_all_switches ();
5831
5832   /* Now that we have the switches and the specs, set
5833      the subdirectory based on the options.  */
5834   set_multilib_dir ();
5835
5836   /* Warn about any switches that no pass was interested in.  */
5837
5838   for (i = 0; (int) i < n_switches; i++)
5839     if (! switches[i].validated)
5840       error ("unrecognized option `-%s'", switches[i].part1);
5841
5842   /* Obey some of the options.  */
5843
5844   if (print_search_dirs)
5845     {
5846       printf (_("install: %s%s\n"), standard_exec_prefix, machine_suffix);
5847       printf (_("programs: %s\n"), build_search_list (&exec_prefixes, "", 0));
5848       printf (_("libraries: %s\n"), build_search_list (&startfile_prefixes, "", 0));
5849       return (0);
5850     }
5851
5852   if (print_file_name)
5853     {
5854       printf ("%s\n", find_file (print_file_name));
5855       return (0);
5856     }
5857
5858   if (print_prog_name)
5859     {
5860       char *newname = find_a_file (&exec_prefixes, print_prog_name, X_OK);
5861       printf ("%s\n", (newname ? newname : print_prog_name));
5862       return (0);
5863     }
5864
5865   if (print_multi_lib)
5866     {
5867       print_multilib_info ();
5868       return (0);
5869     }
5870
5871   if (print_multi_directory)
5872     {
5873       if (multilib_dir == NULL)
5874         printf (".\n");
5875       else
5876         printf ("%s\n", multilib_dir);
5877       return (0);
5878     }
5879
5880   if (target_help_flag)
5881    {
5882       /* Print if any target specific options.*/
5883
5884       /* We do not exit here. Instead we have created a fake input file
5885          called 'target-dummy' which needs to be compiled, and we pass this
5886          on to the various sub-processes, along with the --target-help
5887          switch.  */
5888     }
5889
5890   if (print_help_list)
5891     {
5892       display_help ();
5893
5894       if (! verbose_flag)
5895         {
5896           printf (_("\nFor bug reporting instructions, please see:\n"));
5897           printf ("%s.\n", GCCBUGURL);
5898
5899           return (0);
5900         }
5901
5902       /* We do not exit here.  Instead we have created a fake input file
5903          called 'help-dummy' which needs to be compiled, and we pass this
5904          on the the various sub-processes, along with the --help switch.  */
5905     }
5906
5907   if (verbose_flag)
5908     {
5909       int n;
5910       const char *thrmod;
5911
5912       notice ("Configured with: %s\n", configuration_arguments);
5913
5914 #ifdef THREAD_MODEL_SPEC
5915       /* We could have defined THREAD_MODEL_SPEC to "%*" by default,
5916          but there's no point in doing all this processing just to get
5917          thread_model back.  */
5918       obstack_init (&obstack);
5919       do_spec_1 (THREAD_MODEL_SPEC, 0, thread_model);
5920       obstack_1grow (&obstack, '\0');
5921       thrmod = obstack_finish (&obstack);
5922 #else
5923       thrmod = thread_model;
5924 #endif
5925
5926       notice ("Thread model: %s\n", thrmod);
5927
5928       /* compiler_version is truncated at the first space when initialized
5929          from version string, so truncate version_string at the first space
5930          before comparing.  */
5931       for (n = 0; version_string[n]; n++)
5932         if (version_string[n] == ' ')
5933           break;
5934
5935       if (! strncmp (version_string, compiler_version, n)
5936           && compiler_version[n] == 0)
5937         notice ("gcc version %s\n", version_string);
5938       else
5939         notice ("gcc driver version %s executing gcc version %s\n",
5940                 version_string, compiler_version);
5941
5942       if (n_infiles == 0)
5943         return (0);
5944     }
5945
5946   if (n_infiles == added_libraries)
5947     fatal ("No input files");
5948
5949   /* Make a place to record the compiler output file names
5950      that correspond to the input files.  */
5951
5952   i = n_infiles;
5953   i += lang_specific_extra_outfiles;
5954   outfiles = (const char **) xcalloc (i, sizeof (char *));
5955
5956   /* Record which files were specified explicitly as link input.  */
5957
5958   explicit_link_files = xcalloc (1, n_infiles);
5959
5960   for (i = 0; (int) i < n_infiles; i++)
5961     {
5962       int this_file_error = 0;
5963
5964       /* Tell do_spec what to substitute for %i.  */
5965
5966       input_file_number = i;
5967       set_input (infiles[i].name);
5968
5969       /* Use the same thing in %o, unless cp->spec says otherwise.  */
5970
5971       outfiles[i] = input_filename;
5972
5973       /* Figure out which compiler from the file's suffix.  */
5974
5975       input_file_compiler
5976         = lookup_compiler (infiles[i].name, input_filename_length,
5977                            infiles[i].language);
5978       
5979       if (input_file_compiler)
5980         {
5981           /* Ok, we found an applicable compiler.  Run its spec.  */
5982
5983           if (input_file_compiler->spec[0] == '#')
5984             error ("%s: %s compiler not installed on this system",
5985                    input_filename, &input_file_compiler->spec[1]);
5986           value = do_spec (input_file_compiler->spec);
5987           if (value < 0)
5988             this_file_error = 1;
5989         }
5990
5991       /* If this file's name does not contain a recognized suffix,
5992          record it as explicit linker input.  */
5993
5994       else
5995         explicit_link_files[i] = 1;
5996
5997       /* Clear the delete-on-failure queue, deleting the files in it
5998          if this compilation failed.  */
5999
6000       if (this_file_error)
6001         {
6002           delete_failure_queue ();
6003           error_count++;
6004         }
6005       /* If this compilation succeeded, don't delete those files later.  */
6006       clear_failure_queue ();
6007     }
6008
6009   /* Reset the output file name to the first input file name, for use
6010      with %b in LINK_SPEC on a target that prefers not to emit a.out
6011      by default.  */
6012   if (n_infiles > 0)
6013     set_input (infiles[0].name);
6014
6015   if (error_count == 0)
6016     {
6017       /* Make sure INPUT_FILE_NUMBER points to first available open
6018          slot.  */
6019       input_file_number = n_infiles;
6020       if (lang_specific_pre_link ())
6021         error_count++;
6022     }
6023
6024   /* Run ld to link all the compiler output files.  */
6025
6026   if (error_count == 0)
6027     {
6028       int tmp = execution_count;
6029
6030       /* We'll use ld if we can't find collect2.  */
6031       if (! strcmp (linker_name_spec, "collect2"))
6032         {
6033           char *s = find_a_file (&exec_prefixes, "collect2", X_OK);
6034           if (s == NULL)
6035             linker_name_spec = "ld";
6036         }
6037       /* Rebuild the COMPILER_PATH and LIBRARY_PATH environment variables
6038          for collect.  */
6039       putenv_from_prefixes (&exec_prefixes, "COMPILER_PATH");
6040       putenv_from_prefixes (&startfile_prefixes, LIBRARY_PATH_ENV);
6041
6042       value = do_spec (link_command_spec);
6043       if (value < 0)
6044         error_count = 1;
6045       linker_was_run = (tmp != execution_count);
6046     }
6047
6048   /* If options said don't run linker,
6049      complain about input files to be given to the linker.  */
6050
6051   if (! linker_was_run && error_count == 0)
6052     for (i = 0; (int) i < n_infiles; i++)
6053       if (explicit_link_files[i])
6054         error ("%s: linker input file unused because linking not done",
6055                outfiles[i]);
6056
6057   /* Delete some or all of the temporary files we made.  */
6058
6059   if (error_count)
6060     delete_failure_queue ();
6061   delete_temp_files ();
6062
6063   if (print_help_list)
6064     {
6065       printf (("\nFor bug reporting instructions, please see:\n"));
6066       printf ("%s\n", GCCBUGURL);
6067     }
6068
6069   return (signal_count != 0 ? 2
6070           : error_count > 0 ? (pass_exit_codes ? greatest_status : 1)
6071           : 0);
6072 }
6073
6074 /* Find the proper compilation spec for the file name NAME,
6075    whose length is LENGTH.  LANGUAGE is the specified language,
6076    or 0 if this file is to be passed to the linker.  */
6077
6078 static struct compiler *
6079 lookup_compiler (name, length, language)
6080      const char *name;
6081      size_t length;
6082      const char *language;
6083 {
6084   struct compiler *cp;
6085
6086   /* If this was specified by the user to be a linker input, indicate that.  */
6087   if (language != 0 && language[0] == '*')
6088     return 0;
6089
6090   /* Otherwise, look for the language, if one is spec'd.  */
6091   if (language != 0)
6092     {
6093       for (cp = compilers + n_compilers - 1; cp >= compilers; cp--)
6094         if (cp->suffix[0] == '@' && !strcmp (cp->suffix + 1, language))
6095           return cp;
6096
6097       error ("language %s not recognized", language);
6098       return 0;
6099     }
6100
6101   /* Look for a suffix.  */
6102   for (cp = compilers + n_compilers - 1; cp >= compilers; cp--)
6103     {
6104       if (/* The suffix `-' matches only the file name `-'.  */
6105           (!strcmp (cp->suffix, "-") && !strcmp (name, "-"))
6106           || (strlen (cp->suffix) < length
6107               /* See if the suffix matches the end of NAME.  */
6108               && !strcmp (cp->suffix,
6109                           name + length - strlen (cp->suffix))
6110          ))
6111         break;
6112     }
6113
6114 #if defined (OS2) ||defined (HAVE_DOS_BASED_FILE_SYSTEM)
6115   /* look again, but case-insensitively this time.  */
6116   if (cp < compilers)
6117     for (cp = compilers + n_compilers - 1; cp >= compilers; cp--)
6118       {
6119         if (/* The suffix `-' matches only the file name `-'.  */
6120             (!strcmp (cp->suffix, "-") && !strcmp (name, "-"))
6121             || (strlen (cp->suffix) < length
6122                 /* See if the suffix matches the end of NAME.  */
6123                 && ((!strcmp (cp->suffix,
6124                              name + length - strlen (cp->suffix))
6125                      || !strpbrk (cp->suffix, "ABCDEFGHIJKLMNOPQRSTUVWXYZ"))
6126                     && !strcasecmp (cp->suffix,
6127                                     name + length - strlen (cp->suffix)))
6128            ))
6129           break;
6130       }
6131 #endif
6132
6133   if (cp >= compilers)
6134     {
6135       if (cp->spec[0] != '@')
6136         /* A non-alias entry: return it.  */
6137         return cp;
6138
6139       /* An alias entry maps a suffix to a language.
6140          Search for the language; pass 0 for NAME and LENGTH
6141          to avoid infinite recursion if language not found.  */
6142       return lookup_compiler (NULL, 0, cp->spec + 1);
6143     }
6144   return 0;
6145 }
6146 \f
6147 static char *
6148 save_string (s, len)
6149      const char *s;
6150      int len;
6151 {
6152   register char *result = xmalloc (len + 1);
6153
6154   memcpy (result, s, len);
6155   result[len] = 0;
6156   return result;
6157 }
6158
6159 void
6160 pfatal_with_name (name)
6161      const char *name;
6162 {
6163   perror_with_name (name);
6164   delete_temp_files ();
6165   exit (1);
6166 }
6167
6168 static void
6169 perror_with_name (name)
6170      const char *name;
6171 {
6172   error ("%s: %s", name, xstrerror (errno));
6173 }
6174
6175 static void
6176 pfatal_pexecute (errmsg_fmt, errmsg_arg)
6177      const char *errmsg_fmt;
6178      const char *errmsg_arg;
6179 {
6180   if (errmsg_arg)
6181     {
6182       int save_errno = errno;
6183
6184       /* Space for trailing '\0' is in %s.  */
6185       char *msg = xmalloc (strlen (errmsg_fmt) + strlen (errmsg_arg));
6186       sprintf (msg, errmsg_fmt, errmsg_arg);
6187       errmsg_fmt = msg;
6188
6189       errno = save_errno;
6190     }
6191
6192   pfatal_with_name (errmsg_fmt);
6193 }
6194
6195 /* Output an error message and exit */
6196
6197 void
6198 fancy_abort ()
6199 {
6200   fatal ("Internal gcc abort.");
6201 }
6202 \f
6203 /* Output an error message and exit */
6204
6205 void
6206 fatal VPARAMS ((const char *msgid, ...))
6207 {
6208   VA_OPEN (ap, msgid);
6209   VA_FIXEDARG (ap, const char *, msgid);
6210
6211   fprintf (stderr, "%s: ", programname);
6212   vfprintf (stderr, _(msgid), ap);
6213   VA_CLOSE (ap);
6214   fprintf (stderr, "\n");
6215   delete_temp_files ();
6216   exit (1);
6217 }
6218
6219 void
6220 error VPARAMS ((const char *msgid, ...))
6221 {
6222   VA_OPEN (ap, msgid);
6223   VA_FIXEDARG (ap, const char *, msgid);
6224
6225   fprintf (stderr, "%s: ", programname);
6226   vfprintf (stderr, _(msgid), ap);
6227   VA_CLOSE (ap);
6228
6229   fprintf (stderr, "\n");
6230 }
6231
6232 static void
6233 notice VPARAMS ((const char *msgid, ...))
6234 {
6235   VA_OPEN (ap, msgid);
6236   VA_FIXEDARG (ap, const char *, msgid);
6237
6238   vfprintf (stderr, _(msgid), ap);
6239   VA_CLOSE (ap);
6240 }
6241 \f
6242 static void
6243 validate_all_switches ()
6244 {
6245   struct compiler *comp;
6246   register const char *p;
6247   register char c;
6248   struct spec_list *spec;
6249
6250   for (comp = compilers; comp->spec; comp++)
6251     {
6252       p = comp->spec;
6253       while ((c = *p++))
6254         if (c == '%' && *p == '{')
6255           /* We have a switch spec.  */
6256           validate_switches (p + 1);
6257     }
6258
6259   /* Look through the linked list of specs read from the specs file.  */
6260   for (spec = specs; spec; spec = spec->next)
6261     {
6262       p = *(spec->ptr_spec);
6263       while ((c = *p++))
6264         if (c == '%' && *p == '{')
6265           /* We have a switch spec.  */
6266           validate_switches (p + 1);
6267     }
6268
6269   p = link_command_spec;
6270   while ((c = *p++))
6271     if (c == '%' && *p == '{')
6272       /* We have a switch spec.  */
6273       validate_switches (p + 1);
6274 }
6275
6276 /* Look at the switch-name that comes after START
6277    and mark as valid all supplied switches that match it.  */
6278
6279 static void
6280 validate_switches (start)
6281      const char *start;
6282 {
6283   register const char *p = start;
6284   const char *filter;
6285   register int i;
6286   int suffix;
6287
6288   if (*p == '|')
6289     ++p;
6290
6291 next_member:
6292   if (*p == '!')
6293     ++p;
6294
6295   suffix = 0;
6296   if (*p == '.')
6297     suffix = 1, ++p;
6298
6299   filter = p;
6300   while (*p != ':' && *p != '}' && *p != '|' && *p != '&')
6301     p++;
6302
6303   if (suffix)
6304     ;
6305   else if (p[-1] == '*')
6306     {
6307       /* Mark all matching switches as valid.  */
6308       for (i = 0; i < n_switches; i++)
6309         if (!strncmp (switches[i].part1, filter, p - filter - 1))
6310           switches[i].validated = 1;
6311     }
6312   else
6313     {
6314       /* Mark an exact matching switch as valid.  */
6315       for (i = 0; i < n_switches; i++)
6316         {
6317           if (!strncmp (switches[i].part1, filter, p - filter)
6318               && switches[i].part1[p - filter] == 0)
6319             switches[i].validated = 1;
6320         }
6321     }
6322
6323   if (*p++ == '|' || p[-1] == '&')
6324     goto next_member;
6325 }
6326 \f
6327 /* Check whether a particular argument was used.  The first time we
6328    canonicalize the switches to keep only the ones we care about.  */
6329
6330 static int
6331 used_arg (p, len)
6332      const char *p;
6333      int len;
6334 {
6335   struct mswitchstr
6336   {
6337     const char *str;
6338     const char *replace;
6339     int len;
6340     int rep_len;
6341   };
6342
6343   static struct mswitchstr *mswitches;
6344   static int n_mswitches;
6345   int i, j;
6346
6347   if (!mswitches)
6348     {
6349       struct mswitchstr *matches;
6350       const char *q;
6351       int cnt = 0;
6352
6353       /* Break multilib_matches into the component strings of string
6354          and replacement string.  */
6355       for (q = multilib_matches; *q != '\0'; q++)
6356         if (*q == ';')
6357           cnt++;
6358
6359       matches =
6360         (struct mswitchstr *) alloca ((sizeof (struct mswitchstr)) * cnt);
6361       i = 0;
6362       q = multilib_matches;
6363       while (*q != '\0')
6364         {
6365           matches[i].str = q;
6366           while (*q != ' ')
6367             {
6368               if (*q == '\0')
6369                 abort ();
6370               q++;
6371             }
6372           matches[i].len = q - matches[i].str;
6373
6374           matches[i].replace = ++q;
6375           while (*q != ';' && *q != '\0')
6376             {
6377               if (*q == ' ')
6378                 abort ();
6379               q++;
6380             }
6381           matches[i].rep_len = q - matches[i].replace;
6382           i++;
6383           if (*q == ';')
6384             q++;
6385         }
6386
6387       /* Now build a list of the replacement string for switches that we care
6388          about.  Make sure we allocate at least one entry.  This prevents
6389          xmalloc from calling fatal, and prevents us from re-executing this
6390          block of code.  */
6391       mswitches
6392         = (struct mswitchstr *) xmalloc ((sizeof (struct mswitchstr))
6393                                          * (n_switches ? n_switches : 1));
6394       for (i = 0; i < n_switches; i++)
6395         {
6396           int xlen = strlen (switches[i].part1);
6397           for (j = 0; j < cnt; j++)
6398             if (xlen == matches[j].len
6399                 && ! strncmp (switches[i].part1, matches[j].str, xlen))
6400               {
6401                 mswitches[n_mswitches].str = matches[j].replace;
6402                 mswitches[n_mswitches].len = matches[j].rep_len;
6403                 mswitches[n_mswitches].replace = (char *) 0;
6404                 mswitches[n_mswitches].rep_len = 0;
6405                 n_mswitches++;
6406                 break;
6407               }
6408         }
6409     }
6410
6411   for (i = 0; i < n_mswitches; i++)
6412     if (len == mswitches[i].len && ! strncmp (p, mswitches[i].str, len))
6413       return 1;
6414
6415   return 0;
6416 }
6417
6418 static int
6419 default_arg (p, len)
6420      const char *p;
6421      int len;
6422 {
6423   const char *start, *end;
6424
6425   for (start = multilib_defaults; *start != '\0'; start = end + 1)
6426     {
6427       while (*start == ' ' || *start == '\t')
6428         start++;
6429
6430       if (*start == '\0')
6431         break;
6432
6433       for (end = start + 1; *end != ' ' && *end != '\t' && *end != '\0'; end++)
6434         ;
6435
6436       if ((end - start) == len && strncmp (p, start, len) == 0)
6437         return 1;
6438
6439       if (*end == '\0')
6440         break;
6441     }
6442
6443   return 0;
6444 }
6445
6446 /* Work out the subdirectory to use based on the options. The format of
6447    multilib_select is a list of elements. Each element is a subdirectory
6448    name followed by a list of options followed by a semicolon. The format
6449    of multilib_exclusions is the same, but without the preceding
6450    directory. First gcc will check the exclusions, if none of the options
6451    beginning with an exclamation point are present, and all of the other
6452    options are present, then we will ignore this completely. Passing
6453    that, gcc will consider each multilib_select in turn using the same
6454    rules for matching the options. If a match is found, that subdirectory
6455    will be used.  */
6456
6457 static void
6458 set_multilib_dir ()
6459 {
6460   const char *p;
6461   unsigned int this_path_len;
6462   const char *this_path, *this_arg;
6463   int not_arg;
6464   int ok;
6465
6466   p = multilib_exclusions;
6467   while (*p != '\0')
6468     {
6469       /* Ignore newlines.  */
6470       if (*p == '\n')
6471         {
6472           ++p;
6473           continue;
6474         }
6475
6476       /* Check the arguments.  */
6477       ok = 1;
6478       while (*p != ';')
6479         {
6480           if (*p == '\0')
6481             abort ();
6482
6483           if (! ok)
6484             {
6485               ++p;
6486               continue;
6487             }
6488
6489           this_arg = p;
6490           while (*p != ' ' && *p != ';')
6491             {
6492               if (*p == '\0')
6493                 abort ();
6494               ++p;
6495             }
6496
6497           if (*this_arg != '!')
6498             not_arg = 0;
6499           else
6500             {
6501               not_arg = 1;
6502               ++this_arg;
6503             }
6504
6505           ok = used_arg (this_arg, p - this_arg);
6506           if (not_arg)
6507             ok = ! ok;
6508
6509           if (*p == ' ')
6510             ++p;
6511         }
6512
6513       if (ok)
6514         return;
6515
6516       ++p;
6517     }
6518
6519   p = multilib_select;
6520   while (*p != '\0')
6521     {
6522       /* Ignore newlines.  */
6523       if (*p == '\n')
6524         {
6525           ++p;
6526           continue;
6527         }
6528
6529       /* Get the initial path.  */
6530       this_path = p;
6531       while (*p != ' ')
6532         {
6533           if (*p == '\0')
6534             abort ();
6535           ++p;
6536         }
6537       this_path_len = p - this_path;
6538
6539       /* Check the arguments.  */
6540       ok = 1;
6541       ++p;
6542       while (*p != ';')
6543         {
6544           if (*p == '\0')
6545             abort ();
6546
6547           if (! ok)
6548             {
6549               ++p;
6550               continue;
6551             }
6552
6553           this_arg = p;
6554           while (*p != ' ' && *p != ';')
6555             {
6556               if (*p == '\0')
6557                 abort ();
6558               ++p;
6559             }
6560
6561           if (*this_arg != '!')
6562             not_arg = 0;
6563           else
6564             {
6565               not_arg = 1;
6566               ++this_arg;
6567             }
6568
6569           /* If this is a default argument, we can just ignore it.
6570              This is true even if this_arg begins with '!'.  Beginning
6571              with '!' does not mean that this argument is necessarily
6572              inappropriate for this library: it merely means that
6573              there is a more specific library which uses this
6574              argument.  If this argument is a default, we need not
6575              consider that more specific library.  */
6576           if (! default_arg (this_arg, p - this_arg))
6577             {
6578               ok = used_arg (this_arg, p - this_arg);
6579               if (not_arg)
6580                 ok = ! ok;
6581             }
6582
6583           if (*p == ' ')
6584             ++p;
6585         }
6586
6587       if (ok)
6588         {
6589           if (this_path_len != 1
6590               || this_path[0] != '.')
6591             {
6592               char *new_multilib_dir = xmalloc (this_path_len + 1);
6593               strncpy (new_multilib_dir, this_path, this_path_len);
6594               new_multilib_dir[this_path_len] = '\0';
6595               multilib_dir = new_multilib_dir;
6596             }
6597           break;
6598         }
6599
6600       ++p;
6601     }
6602 }
6603
6604 /* Print out the multiple library subdirectory selection
6605    information.  This prints out a series of lines.  Each line looks
6606    like SUBDIRECTORY;@OPTION@OPTION, with as many options as is
6607    required.  Only the desired options are printed out, the negative
6608    matches.  The options are print without a leading dash.  There are
6609    no spaces to make it easy to use the information in the shell.
6610    Each subdirectory is printed only once.  This assumes the ordering
6611    generated by the genmultilib script. Also, we leave out ones that match
6612    the exclusions.  */
6613
6614 static void
6615 print_multilib_info ()
6616 {
6617   const char *p = multilib_select;
6618   const char *last_path = 0, *this_path;
6619   int skip;
6620   unsigned int last_path_len = 0;
6621
6622   while (*p != '\0')
6623     {
6624       skip = 0;
6625       /* Ignore newlines.  */
6626       if (*p == '\n')
6627         {
6628           ++p;
6629           continue;
6630         }
6631
6632       /* Get the initial path.  */
6633       this_path = p;
6634       while (*p != ' ')
6635         {
6636           if (*p == '\0')
6637             abort ();
6638           ++p;
6639         }
6640
6641       /* Check for matches with the multilib_exclusions. We don't bother
6642          with the '!' in either list. If any of the exclusion rules match
6643          all of its options with the select rule, we skip it.  */
6644       {
6645         const char *e = multilib_exclusions;
6646         const char *this_arg;
6647
6648         while (*e != '\0')
6649           {
6650             int m = 1;
6651             /* Ignore newlines.  */
6652             if (*e == '\n')
6653               {
6654                 ++e;
6655                 continue;
6656               }
6657
6658             /* Check the arguments.  */
6659             while (*e != ';')
6660               {
6661                 const char *q;
6662                 int mp = 0;
6663
6664                 if (*e == '\0')
6665                   abort ();
6666
6667                 if (! m)
6668                   {
6669                     ++e;
6670                     continue;
6671                   }
6672
6673                 this_arg = e;
6674
6675                 while (*e != ' ' && *e != ';')
6676                   {
6677                     if (*e == '\0')
6678                       abort ();
6679                     ++e;
6680                   }
6681
6682                 q = p + 1;
6683                 while (*q != ';')
6684                   {
6685                     const char *arg;
6686                     int len = e - this_arg;
6687
6688                     if (*q == '\0')
6689                       abort ();
6690
6691                     arg = q;
6692
6693                     while (*q != ' ' && *q != ';')
6694                       {
6695                         if (*q == '\0')
6696                           abort ();
6697                         ++q;
6698                       }
6699
6700                     if (! strncmp (arg, this_arg, (len < q - arg) ? q - arg : len) ||
6701                         default_arg (this_arg, e - this_arg))
6702                       {
6703                         mp = 1;
6704                         break;
6705                       }
6706
6707                     if (*q == ' ')
6708                       ++q;
6709                   }
6710
6711                 if (! mp)
6712                   m = 0;
6713
6714                 if (*e == ' ')
6715                   ++e;
6716               }
6717
6718             if (m)
6719               {
6720                 skip = 1;
6721                 break;
6722               }
6723
6724             if (*e != '\0')
6725               ++e;
6726           }
6727       }
6728
6729       if (! skip)
6730         {
6731           /* If this is a duplicate, skip it.  */
6732           skip = (last_path != 0 && (unsigned int) (p - this_path) == last_path_len
6733                   && ! strncmp (last_path, this_path, last_path_len));
6734
6735           last_path = this_path;
6736           last_path_len = p - this_path;
6737         }
6738
6739       /* If this directory requires any default arguments, we can skip
6740          it.  We will already have printed a directory identical to
6741          this one which does not require that default argument.  */
6742       if (! skip)
6743         {
6744           const char *q;
6745
6746           q = p + 1;
6747           while (*q != ';')
6748             {
6749               const char *arg;
6750
6751               if (*q == '\0')
6752                 abort ();
6753
6754               if (*q == '!')
6755                 arg = NULL;
6756               else
6757                 arg = q;
6758
6759               while (*q != ' ' && *q != ';')
6760                 {
6761                   if (*q == '\0')
6762                     abort ();
6763                   ++q;
6764                 }
6765
6766               if (arg != NULL
6767                   && default_arg (arg, q - arg))
6768                 {
6769                   skip = 1;
6770                   break;
6771                 }
6772
6773               if (*q == ' ')
6774                 ++q;
6775             }
6776         }
6777
6778       if (! skip)
6779         {
6780           const char *p1;
6781
6782           for (p1 = last_path; p1 < p; p1++)
6783             putchar (*p1);
6784           putchar (';');
6785         }
6786
6787       ++p;
6788       while (*p != ';')
6789         {
6790           int use_arg;
6791
6792           if (*p == '\0')
6793             abort ();
6794
6795           if (skip)
6796             {
6797               ++p;
6798               continue;
6799             }
6800
6801           use_arg = *p != '!';
6802
6803           if (use_arg)
6804             putchar ('@');
6805
6806           while (*p != ' ' && *p != ';')
6807             {
6808               if (*p == '\0')
6809                 abort ();
6810               if (use_arg)
6811                 putchar (*p);
6812               ++p;
6813             }
6814
6815           if (*p == ' ')
6816             ++p;
6817         }
6818
6819       if (! skip)
6820         {
6821           /* If there are extra options, print them now.  */
6822           if (multilib_extra && *multilib_extra)
6823             {
6824               int print_at = TRUE;
6825               const char *q;
6826
6827               for (q = multilib_extra; *q != '\0'; q++)
6828                 {
6829                   if (*q == ' ')
6830                     print_at = TRUE;
6831                   else
6832                     {
6833                       if (print_at)
6834                         putchar ('@');
6835                       putchar (*q);
6836                       print_at = FALSE;
6837                     }
6838                 }
6839             }
6840
6841           putchar ('\n');
6842         }
6843
6844       ++p;
6845     }
6846 }