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