OSDN Git Service

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