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