gcc.c 220 KB
Newer Older
Richard Stallman committed
1
/* Compiler driver program that can handle many languages.
Kazu Hirata committed
2
   Copyright (C) 1987, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
3 4
   1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007
   Free Software Foundation, Inc.
Richard Stallman committed
5

6
This file is part of GCC.
Richard Stallman committed
7

8 9 10 11
GCC is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free
Software Foundation; either version 2, or (at your option) any later
version.
Richard Stallman committed
12

13 14 15 16
GCC is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
for more details.
Richard Stallman committed
17 18

You should have received a copy of the GNU General Public License
19
along with GCC; see the file COPYING.  If not, write to the Free
Kelley Cook committed
20 21
Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301, USA.
Richard Stallman committed
22 23 24 25 26 27 28 29 30 31 32 33 34

This paragraph is here to try to keep Sun CC from dying.
The number of chars here seems crucial!!!!  */

/* This program is the user interface to the C compiler and possibly to
other compilers.  It is used because compilation is a complicated procedure
which involves running several programs and passing temporary files between
them, forwarding the users switches to those programs selectively,
and deleting the temporary files at the end.

CC recognizes how to compile each input file by suffixes in the file names.
Once it knows which kind of compilation to perform, the procedure for
compilation is specified by a string called a "spec".  */
Jeff Law committed
35

36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
/* A Short Introduction to Adding a Command-Line Option.

   Before adding a command-line option, consider if it is really
   necessary.  Each additional command-line option adds complexity and
   is difficult to remove in subsequent versions.

   In the following, consider adding the command-line argument
   `--bar'.

   1. Each command-line option is specified in the specs file.  The
   notation is described below in the comment entitled "The Specs
   Language".  Read it.

   2. In this file, add an entry to "option_map" equating the long
   `--' argument version and any shorter, single letter version.  Read
   the comments in the declaration of "struct option_map" for an
   explanation.  Do not omit the first `-'.

   3. Look in the "specs" file to determine which program or option
   list should be given the argument, e.g., "cc1_options".  Add the
   appropriate syntax for the shorter option version to the
   corresponding "const char *" entry in this file.  Omit the first
   `-' from the option.  For example, use `-bar', rather than `--bar'.

   4. If the argument takes an argument, e.g., `--baz argument1',
   modify either DEFAULT_SWITCH_TAKES_ARG or
62
   DEFAULT_WORD_SWITCH_TAKES_ARG in gcc.h.  Omit the first `-'
63 64 65 66 67 68 69 70 71 72 73
   from `--baz'.

   5. Document the option in this file's display_help().  If the
   option is passed to a subprogram, modify its corresponding
   function, e.g., cppinit.c:print_help() or toplev.c:display_help(),
   instead.

   6. Compile and test.  Make sure that your new specs file is being
   read.  For example, use a debugger to investigate the value of
   "specs_file" in main().  */

74
#include "config.h"
75
#include "system.h"
76
#include "coretypes.h"
77
#include "multilib.h" /* before tm.h */
78
#include "tm.h"
79
#include <signal.h>
80 81 82
#if ! defined( SIGCHLD ) && defined( SIGCLD )
#  define SIGCHLD SIGCLD
#endif
Geoffrey Keating committed
83
#include "xregex.h"
84
#include "obstack.h"
85
#include "intl.h"
86
#include "prefix.h"
87
#include "gcc.h"
88
#include "flags.h"
89
#include "opts.h"
90

91 92 93 94
/* By default there is no special suffix for target executables.  */
/* FIXME: when autoconf is fixed, remove the host check - dj */
#if defined(TARGET_EXECUTABLE_SUFFIX) && defined(HOST_EXECUTABLE_SUFFIX)
#define HAVE_TARGET_EXECUTABLE_SUFFIX
Richard Stallman committed
95
#endif
96

97 98 99
/* By default there is no special suffix for host executables.  */
#ifdef HOST_EXECUTABLE_SUFFIX
#define HAVE_HOST_EXECUTABLE_SUFFIX
100
#else
101 102 103 104 105 106 107 108
#define HOST_EXECUTABLE_SUFFIX ""
#endif

/* By default, the suffix for target object files is ".o".  */
#ifdef TARGET_OBJECT_SUFFIX
#define HAVE_TARGET_OBJECT_SUFFIX
#else
#define TARGET_OBJECT_SUFFIX ".o"
109 110
#endif

111
static const char dir_separator_str[] = { DIR_SEPARATOR, 0 };
112

113 114 115 116 117
/* Most every one is fine with LIBRARY_PATH.  For some, it conflicts.  */
#ifndef LIBRARY_PATH_ENV
#define LIBRARY_PATH_ENV "LIBRARY_PATH"
#endif

Jeff Law committed
118 119 120 121
#ifndef HAVE_KILL
#define kill(p,s) raise(s)
#endif

Richard Stallman committed
122 123 124 125 126
/* If a stage of compilation returns an exit status >= 1,
   compilation of that file ceases.  */

#define MIN_FATAL_STATUS 1

127 128 129
/* Flag set by cppspec.c to 1.  */
int is_cpp_driver;

Richard Kenner committed
130 131 132 133
/* Flag saying to pass the greatest exit code returned by a sub-process
   to the calling program.  */
static int pass_exit_codes;

134 135 136
/* Definition of string containing the arguments given to configure.  */
#include "configargs.h"

137 138 139 140 141
/* Flag saying to print the directories gcc will search through looking for
   programs, libraries, etc.  */

static int print_search_dirs;

142
/* Flag saying to print the full filename of this file
143 144
   as found through our usual search mechanism.  */

145
static const char *print_file_name = NULL;
146

Mike Stump committed
147
/* As print_file_name, but search for executable file.  */
148

149
static const char *print_prog_name = NULL;
150

Doug Evans committed
151 152 153 154 155
/* Flag saying to print the relative path we'd use to
   find libgcc.a given the current compiler flags.  */

static int print_multi_directory;

156 157 158 159 160
/* Flag saying to print the relative path we'd use to
   find OS libraries given the current compiler flags.  */

static int print_multi_os_directory;

Doug Evans committed
161 162 163 164 165
/* Flag saying to print the list of subdirectories and
   compiler flags used to select them in a standard form.  */

static int print_multi_lib;

Nick Clifton committed
166 167 168 169 170
/* Flag saying to print the command line options understood by gcc and its
   sub-processes.  */

static int print_help_list;

171 172 173 174 175
/* Flag saying to print the sysroot suffix used for searching for
   headers.  */

static int print_sysroot_headers_suffix;

Richard Stallman committed
176 177 178 179
/* Flag indicating whether we should print the command and arguments */

static int verbose_flag;

180 181 182 183 184 185 186
/* Flag indicating whether we should ONLY print the command and
   arguments (like verbose_flag) without executing the command.
   Displayed arguments are quoted so that the generated command
   line is suitable for execution.  This is intended for use in
   shell scripts to capture the driver-generated command line.  */
static int verbose_only_flag;

187
/* Flag indicating how to print command line options of sub-processes.  */
188

189
static int print_subprocess_help;
190

191 192 193 194 195
/* Flag indicating whether we should report subprocess execution times
   (if this is supported by the system - see pexecute.c).  */

static int report_times;

196 197 198
/* Nonzero means place this string before uses of /, so that include
   and library files can be found in an alternate location.  */

199
#ifdef TARGET_SYSTEM_ROOT
200
static const char *target_system_root = TARGET_SYSTEM_ROOT;
201 202 203
#else
static const char *target_system_root = 0;
#endif
204

205 206 207 208
/* Nonzero means pass the updated target_system_root to the compiler.  */

static int target_system_root_changed;

209 210 211 212 213 214 215 216
/* Nonzero means append this string to target_system_root.  */

static const char *target_sysroot_suffix = 0;

/* Nonzero means append this string to target_system_root for headers.  */

static const char *target_sysroot_hdrs_suffix = 0;

Richard Stallman committed
217 218 219 220 221
/* Nonzero means write "temp" files in source directory
   and use the source file's name in them, and don't delete them.  */

static int save_temps_flag;

222 223 224 225
/* Nonzero means pass multiple source files to the compiler at one time.  */

static int combine_flag = 0;

226 227 228 229 230
/* Nonzero means use pipes to communicate between subprocesses.
   Overridden by either of the above two flags.  */

static int use_pipes;

231
/* The compiler version.  */
Richard Stallman committed
232

Zack Weinberg committed
233
static const char *compiler_version;
234 235 236

/* The target version specified with -V */

237
static const char *const spec_version = DEFAULT_TARGET_VERSION;
Richard Stallman committed
238 239 240

/* The target machine specified with -b.  */

241
static const char *spec_machine = DEFAULT_TARGET_MACHINE;
Richard Stallman committed
242

243 244 245
/* Nonzero if cross-compiling.
   When -b is used, the value comes from the `specs' file.  */

246
#ifdef CROSS_DIRECTORY_STRUCTURE
Zack Weinberg committed
247
static const char *cross_compile = "1";
248
#else
Zack Weinberg committed
249
static const char *cross_compile = "0";
250 251
#endif

252 253 254 255 256 257
#ifdef MODIFY_TARGET_NAME

/* Information on how to alter the target name based on a command-line
   switch.  The only case we support now is simply appending or deleting a
   string to or from the end of the first part of the configuration name.  */

258
static const struct modify_target
259
{
260 261 262
  const char *const sw;
  const enum add_del {ADD, DELETE} add_del;
  const char *const str;
263 264 265
}
modify_target[] = MODIFY_TARGET_NAME;
#endif
266

267
/* The number of errors that have occurred; the link phase will not be
268
   run if this is nonzero.  */
269 270
static int error_count = 0;

Richard Kenner committed
271 272 273 274
/* Greatest exit code of sub-processes that has been encountered up to
   now.  */
static int greatest_status = 1;

Richard Stallman committed
275 276 277 278
/* This is the obstack which we use to allocate many strings.  */

static struct obstack obstack;

279
/* This is the obstack to build an environment variable to pass to
280
   collect2 that describes all of the relevant switches of what to
281 282 283 284 285
   pass the compiler in building the list of pointers to constructors
   and destructors.  */

static struct obstack collect_obstack;

Doug Evans committed
286 287
/* Forward declaration for prototypes.  */
struct path_prefix;
288
struct prefix_list;
Doug Evans committed
289

290 291 292 293 294 295
static void init_spec (void);
static void store_arg (const char *, int, int);
static char *load_specs (const char *);
static void read_specs (const char *, int);
static void set_spec (const char *, const char *);
static struct compiler *lookup_compiler (const char *, size_t, const char *);
296 297 298 299
static char *build_search_list (const struct path_prefix *, const char *,
				bool, bool);
static void putenv_from_prefixes (const struct path_prefix *, const char *,
				  bool);
300
static int access_check (const char *, int);
301
static char *find_a_file (const struct path_prefix *, const char *, int, bool);
302
static void add_prefix (struct path_prefix *, const char *, const char *,
303
			int, int, int);
304
static void add_sysrooted_prefix (struct path_prefix *, const char *,
305
				  const char *, int, int, int);
306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328
static void translate_options (int *, const char *const **);
static char *skip_whitespace (char *);
static void delete_if_ordinary (const char *);
static void delete_temp_files (void);
static void delete_failure_queue (void);
static void clear_failure_queue (void);
static int check_live_switch (int, int);
static const char *handle_braces (const char *);
static inline bool input_suffix_matches (const char *, const char *);
static inline bool switch_matches (const char *, const char *, int);
static inline void mark_matching_switches (const char *, const char *, int);
static inline void process_marked_switches (void);
static const char *process_brace_body (const char *, const char *, const char *, int, int);
static const struct spec_function *lookup_spec_function (const char *);
static const char *eval_spec_function (const char *, const char *);
static const char *handle_spec_function (const char *);
static char *save_string (const char *, int);
static void set_collect_gcc_options (void);
static int do_spec_1 (const char *, int, const char *);
static int do_spec_2 (const char *);
static void do_option_spec (const char *, const char *);
static void do_self_spec (const char *);
static const char *find_file (const char *);
329
static int is_directory (const char *, bool);
330 331 332 333 334 335 336 337 338
static const char *validate_switches (const char *);
static void validate_all_switches (void);
static inline void validate_switches_from_spec (const char *);
static void give_switch (int, int);
static int used_arg (const char *, int);
static int default_arg (const char *, int);
static void set_multilib_dir (void);
static void print_multilib_info (void);
static void perror_with_name (const char *);
339
static void fatal_ice (const char *, ...) ATTRIBUTE_PRINTF_1 ATTRIBUTE_NORETURN;
340 341 342 343 344
static void notice (const char *, ...) ATTRIBUTE_PRINTF_1;
static void display_help (void);
static void add_preprocessor_option (const char *, int);
static void add_assembler_option (const char *, int);
static void add_linker_option (const char *, int);
345
static void process_command (int, const char **);
346 347 348 349
static int execute (void);
static void alloc_args (void);
static void clear_args (void);
static void fatal_error (int);
350
#if defined(ENABLE_SHARED_LIBGCC) && !defined(REAL_LIBGCC_SPEC)
351 352
static void init_gcc_specs (struct obstack *, const char *, const char *,
			    const char *);
353
#endif
354
#if defined(HAVE_TARGET_OBJECT_SUFFIX) || defined(HAVE_TARGET_EXECUTABLE_SUFFIX)
355
static const char *convert_filename (const char *, int, int);
356
#endif
357

358
static const char *getenv_spec_function (int, const char **);
359 360
static const char *if_exists_spec_function (int, const char **);
static const char *if_exists_else_spec_function (int, const char **);
361
static const char *replace_outfile_spec_function (int, const char **);
Geoffrey Keating committed
362
static const char *version_compare_spec_function (int, const char **);
Diego Novillo committed
363
static const char *include_spec_function (int, const char **);
Richard Stallman committed
364

365 366 367
/* The Specs Language

Specs are strings containing lines, each of which (if not blank)
Richard Stallman committed
368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384
is made up of a program name, and arguments separated by spaces.
The program name must be exact and start from root, since no path
is searched and it is unreliable to depend on the current working directory.
Redirection of input or output is not supported; the subprograms must
accept filenames saying what files to read and write.

In addition, the specs can contain %-sequences to substitute variable text
or for conditional text.  Here is a table of all defined %-sequences.
Note that spaces are not generated automatically around the results of
expanding these sequences; therefore, you can concatenate them together
or with constant text in a single argument.

 %%	substitute one % into the program name or argument.
 %i     substitute the name of the input file being processed.
 %b     substitute the basename of the input file being processed.
	This is the substring up to (and not including) the last period
	and not including the directory.
385
 %B	same as %b, but include the file suffix (text after the last period).
386 387 388 389 390 391 392
 %gSUFFIX
	substitute a file name that has suffix SUFFIX and is chosen
	once per compilation, and mark the argument a la %d.  To reduce
	exposure to denial-of-service attacks, the file name is now
	chosen in a way that is hard to predict even when previously
	chosen file names are known.  For example, `%g.s ... %g.o ... %g.s'
	might turn into `ccUVUUAU.s ccXYAXZ12.o ccUVUUAU.s'.  SUFFIX matches
393
	the regexp "[.0-9A-Za-z]*%O"; "%O" is treated exactly as if it
394 395 396 397
	had been pre-processed.  Previously, %g was simply substituted
	with a file name chosen once per compilation, without regard
	to any appended suffix (which was therefore treated just like
	ordinary text), making such attacks more likely to succeed.
398 399 400 401 402 403
 %|SUFFIX
	like %g, but if -pipe is in effect, expands simply to "-".
 %mSUFFIX
        like %g, but if -pipe is in effect, expands to nothing.  (We have both
	%| and %m to accommodate differences between system assemblers; see
	the AS_NEEDS_DASH_FOR_PIPED_INPUT target macro.)
404 405 406 407 408 409 410 411 412 413 414 415
 %uSUFFIX
	like %g, but generates a new temporary file name even if %uSUFFIX
	was already seen.
 %USUFFIX
	substitutes the last file name generated with %uSUFFIX, generating a
	new one if there is no such last file name.  In the absence of any
	%uSUFFIX, this is just like %gSUFFIX, except they don't share
	the same suffix "space", so `%g.s ... %U.s ... %g.s ... %U.s'
	would involve the generation of two distinct file names, one
	for each `%g.s' and another for each `%U.s'.  Previously, %U was
	simply substituted with a file name chosen for the previous %u,
	without regard to any appended suffix.
416 417 418 419 420 421
 %jSUFFIX
        substitutes the name of the HOST_BIT_BUCKET, if any, and if it is
        writable, and if save-temps is off; otherwise, substitute the name
        of a temporary file, just like %u.  This temporary file is not
        meant for communication between processes, but rather as a junk
        disposal mechanism.
422 423 424 425
 %.SUFFIX
        substitutes .SUFFIX for the suffixes of a matched switch's args when
        it is subsequently output with %*. SUFFIX is terminated by the next
        space or %.
Richard Stallman committed
426 427 428 429 430 431
 %d	marks the argument containing or following the %d as a
	temporary file name, so that that file will be deleted if CC exits
	successfully.  Unlike %g, this contributes no text to the argument.
 %w	marks the argument containing or following the %w as the
	"output file" of this compilation.  This puts the argument
	into the sequence of arguments that %o will substitute later.
432
 %V	indicates that this compilation produces no "output file".
Richard Stallman committed
433 434 435 436 437 438 439 440 441 442
 %W{...}
	like %{...} but mark last argument supplied within
	as a file to be deleted on failure.
 %o	substitutes the names of all the output files, with spaces
	automatically placed around them.  You should write spaces
	around the %o as well or the results are undefined.
	%o is for use in the specs for running the linker.
	Input files whose names have no recognized suffix are not compiled
	at all, but they are included among the output files, so they will
	be linked.
443
 %O	substitutes the suffix for object files.  Note that this is
444 445 446 447 448 449 450
        handled specially when it immediately follows %g, %u, or %U
	(with or without a suffix argument) because of the need for
	those to form complete file names.  The handling is such that
	%O is treated exactly as if it had already been substituted,
	except that %g, %u, and %U do not currently support additional
	SUFFIX characters following %O as they would following, for
	example, `.o'.
451
 %I	Substitute any of -iprefix (made from GCC_EXEC_PREFIX), -isysroot
452 453
	(made from TARGET_SYSTEM_ROOT), -isystem (made from COMPILER_PATH
	and -B options) and -imultilib as necessary.
Richard Stallman committed
454 455 456 457 458
 %s     current argument is the name of a library or startup file of some sort.
        Search for that file in a standard list of directories
	and substitute the full name found.
 %eSTR  Print STR as an error message.  STR is terminated by a newline.
        Use this when inconsistent options are detected.
459
 %nSTR  Print STR as a notice.  STR is terminated by a newline.
Richard Stallman committed
460 461
 %x{OPTION}	Accumulate an option for %X.
 %X	Output the accumulated linker options specified by compilations.
462
 %Y	Output the accumulated assembler options specified by compilations.
463
 %Z	Output the accumulated preprocessor options specified by compilations.
Richard Stallman committed
464 465 466 467
 %a     process ASM_SPEC as a spec.
        This allows config.h to specify part of the spec for running as.
 %A	process ASM_FINAL_SPEC as a spec.  A capital A is actually
	used here.  This can be used to run a post-processor after the
468
	assembler has done its job.
469
 %D	Dump out a -L option for each directory in startfile_prefixes.
Doug Evans committed
470
	If multilib_dir is set, extra entries are generated with it affixed.
Richard Stallman committed
471 472
 %l     process LINK_SPEC as a spec.
 %L     process LIB_SPEC as a spec.
Jason Merrill committed
473
 %G     process LIBGCC_SPEC as a spec.
474 475
 %R     Output the concatenation of target_system_root and
        target_sysroot_suffix.
Richard Stallman committed
476 477
 %S     process STARTFILE_SPEC as a spec.  A capital S is actually used here.
 %E     process ENDFILE_SPEC as a spec.  A capital E is actually used here.
478
 %C     process CPP_SPEC as a spec.
Richard Stallman committed
479 480 481 482 483
 %1	process CC1_SPEC as a spec.
 %2	process CC1PLUS_SPEC as a spec.
 %*	substitute the variable part of a matched option.  (See below.)
	Note that each comma in the substituted string is replaced by
	a single space.
484 485 486 487 488 489
 %<S    remove all occurrences of -S from the command line.
        Note - this command is position dependent.  % commands in the
        spec string before this one will see -S, % commands in the
        spec string after this one will not.
 %<S*	remove all occurrences of all switches beginning with -S from the
        command line.
490 491 492 493 494 495
 %:function(args)
	Call the named function FUNCTION, passing it ARGS.  ARGS is
	first processed as a nested spec string, then split into an
	argument vector in the usual fashion.  The function returns
	a string which is processed as if it had appeared literally
	as part of the current spec.
Richard Stallman committed
496 497 498 499
 %{S}   substitutes the -S switch, if that switch was given to CC.
	If that switch was not specified, this substitutes nothing.
	Here S is a metasyntactic variable.
 %{S*}  substitutes all the switches specified to CC whose names start
500
	with -S.  This is used for -o, -I, etc; switches that take
Richard Stallman committed
501 502 503
	arguments.  CC considers `-o foo' as being one switch whose
	name starts with `o'.  %{o*} would substitute this text,
	including the space; thus, two arguments would be generated.
504
 %{S*&T*} likewise, but preserve order of S and T options (the order
505 506 507
	of S and T in the spec is not significant).  Can be any number
	of ampersand-separated variables; for each the wild card is
	optional.  Useful for CPP as %{D*&U*&A*}.
508 509 510 511 512 513 514 515 516 517 518

 %{S:X}   substitutes X, if the -S switch was given to CC.
 %{!S:X}  substitutes X, if the -S switch was NOT given to CC.
 %{S*:X}  substitutes X if one or more switches whose names start
          with -S was given to CC.  Normally X is substituted only
          once, no matter how many such switches appeared.  However,
          if %* appears somewhere in X, then X will be substituted
          once for each matching switch, with the %* replaced by the
          part of that switch that matched the '*'.
 %{.S:X}  substitutes X, if processing a file with suffix S.
 %{!.S:X} substitutes X, if NOT processing a file with suffix S.
519 520 521
 %{,S:X}  substitutes X, if processing a file which will use spec S.
 %{!,S:X} substitutes X, if NOT processing a file which will use spec S.
	  
522
 %{S|T:X} substitutes X if either -S or -T was given to CC.  This may be
523 524
	  combined with '!', '.', ',', and '*' as above binding stronger
	  than the OR.
525 526 527 528 529
	  If %* appears in X, all of the alternatives must be starred, and
	  only the first matching alternative is substituted.
 %{S:X;   if S was given to CC, substitutes X;
   T:Y;   else if T was given to CC, substitutes Y;
    :D}   else substitutes D.  There can be as many clauses as you need.
530
          This may be combined with '.', '!', ',', '|', and '*' as above.
531

532
 %(Spec) processes a specification defined in a specs file as *Spec:
533
 %[Spec] as above, but put __ around -D arguments
Richard Stallman committed
534

535
The conditional text X in a %{S:X} or similar construct may contain
Richard Stallman committed
536
other nested % constructs or spaces, or even newlines.  They are
537 538 539 540
processed as usual, as described above.  Trailing white space in X is
ignored.  White space may also appear anywhere on the left side of the
colon in these constructs, except between . or * and the corresponding
word.
Richard Stallman committed
541

542
The -O, -f, -m, and -W switches are handled specifically in these
543 544
constructs.  If another value of -O or the negated form of a -f, -m, or
-W switch is found later in the command line, the earlier switch
545 546
value is ignored, except with {S*} where S is just one letter; this
passes all matching options.
547

548 549 550
The character | at the beginning of the predicate text is used to indicate
that a command should be piped to the following command, but only if -pipe
is specified.
Richard Stallman committed
551 552 553 554 555 556 557 558 559 560 561 562 563

Note that it is built into CC which switches take arguments and which
do not.  You might think it would be useful to generalize this to
allow each compiler's spec to say which switches take arguments.  But
this cannot be done in a consistent fashion.  CC cannot even decide
which input files have been specified without knowing which switches
take arguments, and it must know which input files to compile in order
to tell which compilers to run.

CC also knows implicitly that arguments starting in `-l' are to be
treated as compiler output files, and passed to the linker in their
proper position among the other output files.  */

564
/* Define the macros used for specs %a, %l, %L, %S, %C, %1.  */
Richard Stallman committed
565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603

/* config.h can define ASM_SPEC to provide extra args to the assembler
   or extra switch-translations.  */
#ifndef ASM_SPEC
#define ASM_SPEC ""
#endif

/* config.h can define ASM_FINAL_SPEC to run a post processor after
   the assembler has run.  */
#ifndef ASM_FINAL_SPEC
#define ASM_FINAL_SPEC ""
#endif

/* config.h can define CPP_SPEC to provide extra args to the C preprocessor
   or extra switch-translations.  */
#ifndef CPP_SPEC
#define CPP_SPEC ""
#endif

/* config.h can define CC1_SPEC to provide extra args to cc1 and cc1plus
   or extra switch-translations.  */
#ifndef CC1_SPEC
#define CC1_SPEC ""
#endif

/* config.h can define CC1PLUS_SPEC to provide extra args to cc1plus
   or extra switch-translations.  */
#ifndef CC1PLUS_SPEC
#define CC1PLUS_SPEC ""
#endif

/* config.h can define LINK_SPEC to provide extra args to the linker
   or extra switch-translations.  */
#ifndef LINK_SPEC
#define LINK_SPEC ""
#endif

/* config.h can define LIB_SPEC to override the default libraries.  */
#ifndef LIB_SPEC
Jason Merrill committed
604 605 606
#define LIB_SPEC "%{!shared:%{g*:-lg} %{!p:%{!pg:-lc}}%{p:-lc_p}%{pg:-lc_p}}"
#endif

607 608 609 610 611 612 613
/* mudflap specs */
#ifndef MFWRAP_SPEC
/* XXX: valid only for GNU ld */
/* XXX: should exactly match hooks provided by libmudflap.a */
#define MFWRAP_SPEC " %{static: %{fmudflap|fmudflapth: \
 --wrap=malloc --wrap=free --wrap=calloc --wrap=realloc\
 --wrap=mmap --wrap=munmap --wrap=alloca\
614
} %{fmudflapth: --wrap=pthread_create\
615 616 617
}} %{fmudflap|fmudflapth: --wrap=main}"
#endif
#ifndef MFLIB_SPEC
618
#define MFLIB_SPEC "%{fmudflap|fmudflapth: -export-dynamic}"
619 620
#endif

Jason Merrill committed
621 622 623
/* config.h can define LIBGCC_SPEC to override how and when libgcc.a is
   included.  */
#ifndef LIBGCC_SPEC
624 625
#if defined(REAL_LIBGCC_SPEC)
#define LIBGCC_SPEC REAL_LIBGCC_SPEC
626
#elif defined(LINK_LIBGCC_SPECIAL_1)
Jason Merrill committed
627
/* Have gcc do the search for libgcc.a.  */
628
#define LIBGCC_SPEC "libgcc.a%s"
Jason Merrill committed
629
#else
630
#define LIBGCC_SPEC "-lgcc"
Jason Merrill committed
631
#endif
Richard Stallman committed
632 633 634 635 636
#endif

/* config.h can define STARTFILE_SPEC to override the default crt0 files.  */
#ifndef STARTFILE_SPEC
#define STARTFILE_SPEC  \
637
  "%{!shared:%{pg:gcrt0%O%s}%{!pg:%{p:mcrt0%O%s}%{!p:crt0%O%s}}}"
Richard Stallman committed
638 639
#endif

640 641
/* config.h can define SWITCHES_NEED_SPACES to control which options
   require spaces between the option and the argument.  */
Richard Stallman committed
642 643 644 645 646 647 648 649 650
#ifndef SWITCHES_NEED_SPACES
#define SWITCHES_NEED_SPACES ""
#endif

/* config.h can define ENDFILE_SPEC to override the default crtn files.  */
#ifndef ENDFILE_SPEC
#define ENDFILE_SPEC ""
#endif

Bob Manson committed
651 652 653 654
#ifndef LINKER_NAME
#define LINKER_NAME "collect2"
#endif

655 656 657
/* Define ASM_DEBUG_SPEC to be a spec suitable for translating '-g'
   to the assembler.  */
#ifndef ASM_DEBUG_SPEC
658 659 660
# if defined(DBX_DEBUGGING_INFO) && defined(DWARF2_DEBUGGING_INFO) \
     && defined(HAVE_AS_GDWARF2_DEBUG_FLAG) && defined(HAVE_AS_GSTABS_DEBUG_FLAG)
#  define ASM_DEBUG_SPEC					\
661 662 663
      (PREFERRED_DEBUGGING_TYPE == DBX_DEBUG			\
       ? "%{gdwarf-2*:--gdwarf2}%{!gdwarf-2*:%{g*:--gstabs}}"	\
       : "%{gstabs*:--gstabs}%{!gstabs*:%{g*:--gdwarf2}}")
664 665 666 667 668 669
# else
#  if defined(DBX_DEBUGGING_INFO) && defined(HAVE_AS_GSTABS_DEBUG_FLAG)
#   define ASM_DEBUG_SPEC "%{g*:--gstabs}"
#  endif
#  if defined(DWARF2_DEBUGGING_INFO) && defined(HAVE_AS_GDWARF2_DEBUG_FLAG)
#   define ASM_DEBUG_SPEC "%{g*:--gdwarf2}"
670 671 672
#  endif
# endif
#endif
673 674 675
#ifndef ASM_DEBUG_SPEC
# define ASM_DEBUG_SPEC ""
#endif
676

677 678
/* Here is the spec for running the linker, after compiling all files.  */

679 680 681 682 683 684 685
/* This is overridable by the target in case they need to specify the
   -lgcc and -lc order specially, yet not require them to override all
   of LINK_COMMAND_SPEC.  */
#ifndef LINK_GCC_C_SEQUENCE_SPEC
#define LINK_GCC_C_SEQUENCE_SPEC "%G %L %G"
#endif

686 687 688 689
#ifndef LINK_SSP_SPEC
#ifdef TARGET_LIBC_PROVIDES_SSP
#define LINK_SSP_SPEC "%{fstack-protector:}"
#else
690
#define LINK_SSP_SPEC "%{fstack-protector|fstack-protector-all:-lssp_nonshared -lssp}"
691 692 693
#endif
#endif

694 695 696 697 698 699 700 701
#ifndef LINK_PIE_SPEC
#ifdef HAVE_LD_PIE
#define LINK_PIE_SPEC "%{pie:-pie} "
#else
#define LINK_PIE_SPEC "%{pie:} "
#endif
#endif

702 703 704 705 706 707 708 709 710
/* -u* was put back because both BSD and SysV seem to support it.  */
/* %{static:} simply prevents an error message if the target machine
   doesn't handle -static.  */
/* We want %{T*} after %{L*} and %D so that it can be used to specify linker
   scripts which exist in user specified directories, or in standard
   directories.  */
#ifndef LINK_COMMAND_SPEC
#define LINK_COMMAND_SPEC "\
%{!fsyntax-only:%{!c:%{!M:%{!MM:%{!E:%{!S:\
711 712
    %(linker) %l " LINK_PIE_SPEC "%X %{o*} %{A} %{d} %{e*} %{m} %{N} %{n} %{r}\
    %{s} %{t} %{u*} %{x} %{z} %{Z} %{!A:%{!nostdlib:%{!nostartfiles:%S}}}\
713 714
    %{static:} %{L*} %(mfwrap) %(link_libgcc) %o\
    %{fopenmp:%:include(libgomp.spec)%(link_gomp)} %(mflib)\
715
    %{fprofile-arcs|fprofile-generate|coverage:-lgcov}\
716
    %{!nostdlib:%{!nodefaultlibs:%(link_ssp) %(link_gcc_c_sequence)}}\
717 718 719 720
    %{!A:%{!nostdlib:%{!nostartfiles:%E}}} %{T*} }}}}}}"
#endif

#ifndef LINK_LIBGCC_SPEC
721 722
/* Generate -L options for startfile prefix list.  */
# define LINK_LIBGCC_SPEC "%D"
723 724
#endif

725 726 727 728
#ifndef STARTFILE_PREFIX_SPEC
# define STARTFILE_PREFIX_SPEC ""
#endif

729 730 731 732
#ifndef SYSROOT_SPEC
# define SYSROOT_SPEC "--sysroot=%R"
#endif

733 734 735 736 737 738 739 740
#ifndef SYSROOT_SUFFIX_SPEC
# define SYSROOT_SUFFIX_SPEC ""
#endif

#ifndef SYSROOT_HEADERS_SUFFIX_SPEC
# define SYSROOT_HEADERS_SUFFIX_SPEC ""
#endif

741
static const char *asm_debug;
Zack Weinberg committed
742 743 744
static const char *cpp_spec = CPP_SPEC;
static const char *cc1_spec = CC1_SPEC;
static const char *cc1plus_spec = CC1PLUS_SPEC;
745
static const char *link_gcc_c_sequence_spec = LINK_GCC_C_SEQUENCE_SPEC;
746
static const char *link_ssp_spec = LINK_SSP_SPEC;
Zack Weinberg committed
747 748 749 750
static const char *asm_spec = ASM_SPEC;
static const char *asm_final_spec = ASM_FINAL_SPEC;
static const char *link_spec = LINK_SPEC;
static const char *lib_spec = LIB_SPEC;
751 752
static const char *mfwrap_spec = MFWRAP_SPEC;
static const char *mflib_spec = MFLIB_SPEC;
Diego Novillo committed
753
static const char *link_gomp_spec = "";
Zack Weinberg committed
754 755 756 757 758
static const char *libgcc_spec = LIBGCC_SPEC;
static const char *endfile_spec = ENDFILE_SPEC;
static const char *startfile_spec = STARTFILE_SPEC;
static const char *switches_need_spaces = SWITCHES_NEED_SPACES;
static const char *linker_name_spec = LINKER_NAME;
759 760
static const char *link_command_spec = LINK_COMMAND_SPEC;
static const char *link_libgcc_spec = LINK_LIBGCC_SPEC;
761
static const char *startfile_prefix_spec = STARTFILE_PREFIX_SPEC;
762
static const char *sysroot_spec = SYSROOT_SPEC;
763 764
static const char *sysroot_suffix_spec = SYSROOT_SUFFIX_SPEC;
static const char *sysroot_hdrs_suffix_spec = SYSROOT_HEADERS_SUFFIX_SPEC;
765 766 767 768 769 770 771

/* Standard options to cpp, cc1, and as, to reduce duplication in specs.
   There should be no need to override these in target dependent files,
   but we need to copy them to the specs file so that newer versions
   of the GCC driver can correctly drive older tool chains with the
   appropriate -B options.  */

772 773 774
/* When cpplib handles traditional preprocessing, get rid of this, and
   call cc1 (or cc1obj in objc/lang-specs.h) from the main specs so
   that we default the front end language better.  */
775
static const char *trad_capable_cpp =
776
"cc1 -E %{traditional|ftraditional|traditional-cpp:-traditional-cpp}";
777

778 779 780
/* We don't wrap .d files in %W{} since a missing .d file, and
   therefore no dependency entry, confuses make into thinking a .o
   file that happens to exist is up-to-date.  */
781
static const char *cpp_unique_options =
Neil Booth committed
782
"%{C|CC:%{!E:%eGCC does not support -C or -CC without -E}}\
783
 %{!Q:-quiet} %{nostdinc*} %{C} %{CC} %{v} %{I*&F*} %{P} %I\
784 785 786
 %{MD:-MD %{!o:%b.d}%{o*:%.d%*}}\
 %{MMD:-MMD %{!o:%b.d}%{o*:%.d%*}}\
 %{M} %{MM} %{MF*} %{MG} %{MP} %{MQ*} %{MT*}\
787
 %{!E:%{!M:%{!MM:%{!MT:%{!MQ:%{MD|MMD:%{o*:-MQ %*}}}}}}}\
788 789
 %{remap} %{g3|ggdb3|gstabs3|gcoff3|gxcoff3|gvms3:-dD}\
 %{H} %C %{D*&U*&A*} %{i*} %Z %i\
790 791
 %{fmudflap:-D_MUDFLAP -include mf-runtime.h}\
 %{fmudflapth:-D_MUDFLAP -D_MUDFLAPTH -include mf-runtime.h}\
792
 %{E|M|MM:%W{o*}}";
793 794

/* This contains cpp options which are common with cc1_options and are passed
Chris Demetriou committed
795 796 797 798
   only when preprocessing only to avoid duplication.  We pass the cc1 spec
   options to the preprocessor so that it the cc1 spec may manipulate
   options used to set target flags.  Those special target flags settings may
   in turn cause preprocessor symbols to be defined specially.  */
799
static const char *cpp_options =
800 801 802
"%(cpp_unique_options) %1 %{m*} %{std*&ansi&trigraphs} %{W*&pedantic*} %{w}\
 %{f*} %{g*:%{!g0:%{!fno-working-directory:-fworking-directory}}} %{O*}\
 %{undef} %{save-temps:-fpch-preprocess}";
803

804 805 806 807
/* This contains cpp options which are not passed when the preprocessor
   output will be used by another program.  */
static const char *cpp_debug_options = "%{d*}";

808
/* NB: This is shared amongst all front-ends.  */
809 810 811
static const char *cc1_options =
"%{pg:%{fomit-frame-pointer:%e-pg and -fomit-frame-pointer are incompatible}}\
 %1 %{!Q:-quiet} -dumpbase %B %{d*} %{m*} %{a*}\
812
 %{c|S:%{o*:-auxbase-strip %*}%{!o*:-auxbase %b}}%{!c:%{!S:-auxbase %b}}\
813
 %{g*} %{O*} %{W*&pedantic*} %{w} %{std*&ansi&trigraphs}\
Neil Booth committed
814
 %{v:-version} %{pg:-p} %{p} %{f*} %{undef}\
815
 %{Qn:-fno-ident} %{--help:--help}\
816
 %{--target-help:--target-help}\
817
 %{--help=*:--help=%(VALUE)}\
818
 %{!fsyntax-only:%{S:%W{o*}%{!o*:-o %b.s}}}\
819
 %{fsyntax-only:-o %j} %{-param*}\
820 821
 %{fmudflap|fmudflapth:-fno-builtin -fno-merge-constants}\
 %{coverage:-fprofile-arcs -ftest-coverage}";
822 823 824

static const char *asm_options =
"%a %Y %{c:%W{o*}%{!o*:-o %w%b%O}}%{!c:-o %d%w%u%O}";
825

826
static const char *invoke_as =
827 828 829 830 831
#ifdef AS_NEEDS_DASH_FOR_PIPED_INPUT
"%{!S:-o %|.s |\n as %(asm_options) %|.s %A }";
#else
"%{!S:-o %|.s |\n as %(asm_options) %m.s %A }";
#endif
832

833
/* Some compilers have limits on line lengths, and the multilib_select
834 835
   and/or multilib_matches strings can be very long, so we build them at
   run time.  */
836
static struct obstack multilib_obstack;
Zack Weinberg committed
837 838 839 840
static const char *multilib_select;
static const char *multilib_matches;
static const char *multilib_defaults;
static const char *multilib_exclusions;
841 842 843 844 845 846 847

/* Check whether a particular argument is a default argument.  */

#ifndef MULTILIB_DEFAULTS
#define MULTILIB_DEFAULTS { "" }
#endif

Kazu Hirata committed
848
static const char *const multilib_defaults_raw[] = MULTILIB_DEFAULTS;
Richard Stallman committed
849

850 851 852 853
#ifndef DRIVER_SELF_SPECS
#define DRIVER_SELF_SPECS ""
#endif

Diego Novillo committed
854 855 856 857 858 859 860 861 862
/* Adding -fopenmp should imply pthreads.  This is particularly important
   for targets that use different start files and suchlike.  */
#ifndef GOMP_SELF_SPECS
#define GOMP_SELF_SPECS "%{fopenmp: -pthread}"
#endif

static const char *const driver_self_specs[] = {
  DRIVER_SELF_SPECS, GOMP_SELF_SPECS
};
863

864 865 866 867 868 869 870 871 872 873 874 875 876
#ifndef OPTION_DEFAULT_SPECS
#define OPTION_DEFAULT_SPECS { "", "" }
#endif

struct default_spec
{
  const char *name;
  const char *spec;
};

static const struct default_spec
  option_default_specs[] = { OPTION_DEFAULT_SPECS };

877 878
struct user_specs
{
Michael Meissner committed
879
  struct user_specs *next;
880
  const char *filename;
Michael Meissner committed
881 882 883 884
};

static struct user_specs *user_specs_head, *user_specs_tail;

885 886
#ifndef SWITCH_TAKES_ARG
#define SWITCH_TAKES_ARG(CHAR) DEFAULT_SWITCH_TAKES_ARG(CHAR)
Richard Stallman committed
887 888
#endif

889 890
#ifndef WORD_SWITCH_TAKES_ARG
#define WORD_SWITCH_TAKES_ARG(STR) DEFAULT_WORD_SWITCH_TAKES_ARG (STR)
Richard Stallman committed
891 892
#endif

893
#ifdef HAVE_TARGET_EXECUTABLE_SUFFIX
894 895 896 897 898 899 900 901 902 903
/* This defines which switches stop a full compilation.  */
#define DEFAULT_SWITCH_CURTAILS_COMPILATION(CHAR) \
  ((CHAR) == 'c' || (CHAR) == 'S')

#ifndef SWITCH_CURTAILS_COMPILATION
#define SWITCH_CURTAILS_COMPILATION(CHAR) \
  DEFAULT_SWITCH_CURTAILS_COMPILATION(CHAR)
#endif
#endif

Richard Stallman committed
904 905 906 907
/* Record the mapping from file suffixes for compilation specs.  */

struct compiler
{
908
  const char *suffix;		/* Use this compiler for input files
Richard Stallman committed
909
				   whose names end in this suffix.  */
910

911
  const char *spec;		/* To use this compiler, run this spec.  */
912 913 914 915

  const char *cpp_spec;         /* If non-NULL, substitute this spec
				   for `%C', rather than the usual
				   cpp_spec.  */
916
  const int combinable;          /* If nonzero, compiler can deal with
917
				    multiple source files at once (IMA).  */
918
  const int needs_preprocessing; /* If nonzero, source files need to
919
				    be run through a preprocessor.  */
Richard Stallman committed
920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938
};

/* Pointer to a vector of `struct compiler' that gives the spec for
   compiling a file, based on its suffix.
   A file that does not end in any of these suffixes will be passed
   unchanged to the loader and nothing else will be done to it.

   An entry containing two 0s is used to terminate the vector.

   If multiple entries match a file, the last matching one is used.  */

static struct compiler *compilers;

/* Number of entries in `compilers', not counting the null terminator.  */

static int n_compilers;

/* The default list of file name suffixes and their compilation specs.  */

939
static const struct compiler default_compilers[] =
Richard Stallman committed
940
{
941
  /* Add lists of suffixes of known languages here.  If those languages
942 943
     were not present when we built the driver, we will hit these copies
     and be given a more meaningful error than "file not used since
944
     linking is not done".  */
945
  {".m",  "#Objective-C", 0, 0, 0}, {".mi",  "#Objective-C", 0, 0, 0},
946 947
  {".mm", "#Objective-C++", 0, 0, 0}, {".M", "#Objective-C++", 0, 0, 0},
  {".mii", "#Objective-C++", 0, 0, 0},
948 949
  {".cc", "#C++", 0, 0, 0}, {".cxx", "#C++", 0, 0, 0},
  {".cpp", "#C++", 0, 0, 0}, {".cp", "#C++", 0, 0, 0},
950 951 952
  {".c++", "#C++", 0, 0, 0}, {".C", "#C++", 0, 0, 0},
  {".CPP", "#C++", 0, 0, 0}, {".ii", "#C++", 0, 0, 0},
  {".ads", "#Ada", 0, 0, 0}, {".adb", "#Ada", 0, 0, 0},
953 954
  {".f", "#Fortran", 0, 0, 0}, {".for", "#Fortran", 0, 0, 0},
  {".fpp", "#Fortran", 0, 0, 0}, {".F", "#Fortran", 0, 0, 0},
955
  {".FOR", "#Fortran", 0, 0, 0}, {".FPP", "#Fortran", 0, 0, 0},
956 957
  {".f90", "#Fortran", 0, 0, 0}, {".f95", "#Fortran", 0, 0, 0},
  {".F90", "#Fortran", 0, 0, 0}, {".F95", "#Fortran", 0, 0, 0},
958 959 960 961
  {".r", "#Ratfor", 0, 0, 0},
  {".p", "#Pascal", 0, 0, 0}, {".pas", "#Pascal", 0, 0, 0},
  {".java", "#Java", 0, 0, 0}, {".class", "#Java", 0, 0, 0},
  {".zip", "#Java", 0, 0, 0}, {".jar", "#Java", 0, 0, 0},
962
  /* Next come the entries for C.  */
963
  {".c", "@c", 0, 1, 1},
Richard Stallman committed
964
  {"@c",
965
   /* cc1 has an integrated ISO C preprocessor.  We should invoke the
966
      external preprocessor if -save-temps is given.  */
967
     "%{E|M|MM:%(trad_capable_cpp) %(cpp_options) %(cpp_debug_options)}\
968
      %{!E:%{!M:%{!MM:\
969 970
          %{traditional|ftraditional:\
%eGNU C no longer supports -traditional without -E}\
971
       %{!combine:\
972
	  %{save-temps|traditional-cpp|no-integrated-cpp:%(trad_capable_cpp) \
973 974 975
		%(cpp_options) -o %{save-temps:%b.i} %{!save-temps:%g.i} \n\
		    cc1 -fpreprocessed %{save-temps:%b.i} %{!save-temps:%g.i} \
			%(cc1_options)}\
976 977
	  %{!save-temps:%{!traditional-cpp:%{!no-integrated-cpp:\
		cc1 %(cpp_unique_options) %(cc1_options)}}}\
978 979 980 981 982 983 984
          %{!fsyntax-only:%(invoke_as)}} \
      %{combine:\
	  %{save-temps|traditional-cpp|no-integrated-cpp:%(trad_capable_cpp) \
		%(cpp_options) -o %{save-temps:%b.i} %{!save-temps:%g.i}}\
	  %{!save-temps:%{!traditional-cpp:%{!no-integrated-cpp:\
		cc1 %(cpp_unique_options) %(cc1_options)}}\
                %{!fsyntax-only:%(invoke_as)}}}}}}", 0, 1, 1},
Richard Stallman committed
985
  {"-",
986
   "%{!E:%e-E or -x required when input is from standard input}\
987 988
    %(trad_capable_cpp) %(cpp_options) %(cpp_debug_options)", 0, 0, 0},
  {".h", "@c-header", 0, 0, 0},
Richard Stallman committed
989
  {"@c-header",
990 991 992 993
   /* cc1 has an integrated ISO C preprocessor.  We should invoke the
      external preprocessor if -save-temps is given.  */
     "%{E|M|MM:%(trad_capable_cpp) %(cpp_options) %(cpp_debug_options)}\
      %{!E:%{!M:%{!MM:\
994 995 996 997
	  %{save-temps|traditional-cpp|no-integrated-cpp:%(trad_capable_cpp) \
		%(cpp_options) -o %{save-temps:%b.i} %{!save-temps:%g.i} \n\
		    cc1 -fpreprocessed %{save-temps:%b.i} %{!save-temps:%g.i} \
			%(cc1_options)\
998
                        -o %g.s %{!o*:--output-pch=%i.gch}\
999
                        %W{o*:--output-pch=%*}%V}\
1000
	  %{!save-temps:%{!traditional-cpp:%{!no-integrated-cpp:\
1001
		cc1 %(cpp_unique_options) %(cc1_options)\
1002
                    -o %g.s %{!o*:--output-pch=%i.gch}\
1003 1004
                    %W{o*:--output-pch=%*}%V}}}}}}", 0, 0, 0},
  {".i", "@cpp-output", 0, 1, 0},
Richard Stallman committed
1005
  {"@cpp-output",
1006
   "%{!M:%{!MM:%{!E:cc1 -fpreprocessed %i %(cc1_options) %{!fsyntax-only:%(invoke_as)}}}}", 0, 1, 0},
1007
  {".s", "@assembler", 0, 1, 0},
Richard Stallman committed
1008
  {"@assembler",
1009 1010
   "%{!M:%{!MM:%{!E:%{!S:as %(asm_debug) %(asm_options) %i %A }}}}", 0, 1, 0},
  {".S", "@assembler-with-cpp", 0, 1, 0},
Richard Stallman committed
1011
  {"@assembler-with-cpp",
1012
#ifdef AS_NEEDS_DASH_FOR_PIPED_INPUT
1013
   "%(trad_capable_cpp) -lang-asm %(cpp_options)\
1014
      %{E|M|MM:%(cpp_debug_options)}\
1015 1016 1017 1018 1019 1020 1021 1022
      %{!M:%{!MM:%{!E:%{!S:-o %|.s |\n\
       as %(asm_debug) %(asm_options) %|.s %A }}}}"
#else
   "%(trad_capable_cpp) -lang-asm %(cpp_options)\
      %{E|M|MM:%(cpp_debug_options)}\
      %{!M:%{!MM:%{!E:%{!S:-o %|.s |\n\
       as %(asm_debug) %(asm_options) %m.s %A }}}}"
#endif
1023
   , 0, 1, 0},
1024

1025
#include "specs.h"
1026
  /* Mark end of table.  */
1027
  {0, 0, 0, 0, 0}
Richard Stallman committed
1028 1029 1030 1031
};

/* Number of elements in default_compilers, not counting the terminator.  */

1032
static const int n_default_compilers = ARRAY_SIZE (default_compilers) - 1;
Richard Stallman committed
1033 1034

/* A vector of options to give to the linker.
1035
   These options are accumulated by %x,
Richard Stallman committed
1036 1037 1038
   and substituted into the linker command with %X.  */
static int n_linker_options;
static char **linker_options;
1039 1040 1041

/* A vector of options to give to the assembler.
   These options are accumulated by -Wa,
1042
   and substituted into the assembler command with %Y.  */
1043 1044
static int n_assembler_options;
static char **assembler_options;
1045 1046 1047 1048 1049 1050

/* A vector of options to give to the preprocessor.
   These options are accumulated by -Wp,
   and substituted into the preprocessor command with %Z.  */
static int n_preprocessor_options;
static char **preprocessor_options;
Richard Stallman committed
1051

1052 1053 1054 1055 1056 1057
/* Define how to map long options into short ones.  */

/* This structure describes one mapping.  */
struct option_map
{
  /* The long option's name.  */
1058
  const char *const name;
1059
  /* The equivalent short option.  */
1060
  const char *const equivalent;
1061 1062 1063 1064
  /* Argument info.  A string of flag chars; NULL equals no options.
     a => argument required.
     o => argument optional.
     j => join argument to equivalent, making one word.
1065
     * => require other text after NAME as an argument.  */
1066
  const char *const arg_info;
1067 1068 1069 1070 1071
};

/* This is the table of mappings.  Mappings are tried sequentially
   for each option encountered; the first one that matches, wins.  */

1072
static const struct option_map option_map[] =
1073
 {
1074 1075 1076 1077
   {"--all-warnings", "-Wall", 0},
   {"--ansi", "-ansi", 0},
   {"--assemble", "-S", 0},
   {"--assert", "-A", "a"},
1078
   {"--classpath", "-fclasspath=", "aj"},
1079 1080
   {"--bootclasspath", "-fbootclasspath=", "aj"},
   {"--CLASSPATH", "-fclasspath=", "aj"},
1081
   {"--combine", "-combine", 0},
1082
   {"--comments", "-C", 0},
1083
   {"--comments-in-macros", "-CC", 0},
1084
   {"--compile", "-c", 0},
1085
   {"--debug", "-g", "oj"},
1086
   {"--define-macro", "-D", "aj"},
1087
   {"--dependencies", "-M", 0},
1088
   {"--dump", "-d", "a"},
1089
   {"--dumpbase", "-dumpbase", "a"},
1090
   {"--encoding", "-fencoding=", "aj"},
1091
   {"--entry", "-e", 0},
1092
   {"--extra-warnings", "-W", 0},
1093
   {"--extdirs", "-fextdirs=", "aj"},
1094 1095 1096
   {"--for-assembler", "-Wa", "a"},
   {"--for-linker", "-Xlinker", "a"},
   {"--force-link", "-u", "a"},
1097
   {"--coverage", "-coverage", 0},
1098
   {"--imacros", "-imacros", "a"},
1099 1100
   {"--include", "-include", "a"},
   {"--include-barrier", "-I-", 0},
1101
   {"--include-directory", "-I", "aj"},
1102
   {"--include-directory-after", "-idirafter", "a"},
1103
   {"--include-prefix", "-iprefix", "a"},
1104
   {"--include-with-prefix", "-iwithprefix", "a"},
1105 1106
   {"--include-with-prefix-before", "-iwithprefixbefore", "a"},
   {"--include-with-prefix-after", "-iwithprefix", "a"},
1107 1108
   {"--language", "-x", "a"},
   {"--library-directory", "-L", "a"},
1109
   {"--machine", "-m", "aj"},
1110
   {"--machine-", "-m", "*j"},
1111
   {"--no-integrated-cpp", "-no-integrated-cpp", 0},
1112 1113
   {"--no-line-commands", "-P", 0},
   {"--no-precompiled-includes", "-noprecomp", 0},
1114 1115 1116 1117
   {"--no-standard-includes", "-nostdinc", 0},
   {"--no-standard-libraries", "-nostdlib", 0},
   {"--no-warnings", "-w", 0},
   {"--optimize", "-O", "oj"},
1118
   {"--output", "-o", "a"},
1119
   {"--output-class-directory", "-foutput-class-dir=", "ja"},
1120
   {"--param", "--param", "a"},
1121
   {"--pass-exit-codes", "-pass-exit-codes", 0},
1122 1123
   {"--pedantic", "-pedantic", 0},
   {"--pedantic-errors", "-pedantic-errors", 0},
1124
   {"--pie", "-pie", 0},
1125 1126 1127
   {"--pipe", "-pipe", 0},
   {"--prefix", "-B", "a"},
   {"--preprocess", "-E", 0},
1128
   {"--print-search-dirs", "-print-search-dirs", 0},
1129
   {"--print-file-name", "-print-file-name=", "aj"},
1130 1131
   {"--print-libgcc-file-name", "-print-libgcc-file-name", 0},
   {"--print-missing-file-dependencies", "-MG", 0},
Doug Evans committed
1132 1133
   {"--print-multi-lib", "-print-multi-lib", 0},
   {"--print-multi-directory", "-print-multi-directory", 0},
1134
   {"--print-multi-os-directory", "-print-multi-os-directory", 0},
1135
   {"--print-prog-name", "-print-prog-name=", "aj"},
1136
   {"--print-sysroot-headers-suffix", "-print-sysroot-headers-suffix", 0},
1137 1138 1139
   {"--profile", "-p", 0},
   {"--profile-blocks", "-a", 0},
   {"--quiet", "-q", 0},
1140
   {"--resource", "-fcompile-resource=", "aj"},
1141
   {"--save-temps", "-save-temps", 0},
1142
   {"--shared", "-shared", 0},
1143
   {"--silent", "-q", 0},
Michael Meissner committed
1144
   {"--specs", "-specs=", "aj"},
1145
   {"--static", "-static", 0},
1146
   {"--std", "-std=", "aj"},
1147
   {"--symbolic", "-symbolic", 0},
1148
   {"--sysroot", "--sysroot=", "aj"},
1149
   {"--time", "-time", 0},
1150 1151 1152 1153
   {"--trace-includes", "-H", 0},
   {"--traditional", "-traditional", 0},
   {"--traditional-cpp", "-traditional-cpp", 0},
   {"--trigraphs", "-trigraphs", 0},
1154
   {"--undefine-macro", "-U", "aj"},
1155 1156 1157 1158 1159
   {"--user-dependencies", "-MM", 0},
   {"--verbose", "-v", 0},
   {"--warn-", "-W", "*j"},
   {"--write-dependencies", "-MD", 0},
   {"--write-user-dependencies", "-MMD", 0},
1160 1161 1162
   {"--", "-f", "*j"}
 };

1163 1164

#ifdef TARGET_OPTION_TRANSLATE_TABLE
1165 1166 1167
static const struct {
  const char *const option_found;
  const char *const replacements;
1168 1169 1170 1171 1172 1173 1174
} target_option_translations[] =
{
  TARGET_OPTION_TRANSLATE_TABLE,
  { 0, 0 }
};
#endif

1175 1176 1177 1178 1179
/* Translate the options described by *ARGCP and *ARGVP.
   Make a new vector and store it back in *ARGVP,
   and store its length in *ARGVC.  */

static void
1180
translate_options (int *argcp, const char *const **argvp)
1181
{
Kaveh R. Ghazi committed
1182
  int i;
1183
  int argc = *argcp;
1184
  const char *const *argv = *argvp;
1185
  int newvsize = (argc + 2) * 2 * sizeof (const char *);
1186
  const char **newv = xmalloc (newvsize);
1187 1188 1189 1190 1191 1192 1193
  int newindex = 0;

  i = 0;
  newv[newindex++] = argv[i++];

  while (i < argc)
    {
1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215
#ifdef TARGET_OPTION_TRANSLATE_TABLE
      int tott_idx;

      for (tott_idx = 0;
	   target_option_translations[tott_idx].option_found;
	   tott_idx++)
	{
	  if (strcmp (target_option_translations[tott_idx].option_found,
		      argv[i]) == 0)
	    {
	      int spaces = 1;
	      const char *sp;
	      char *np;

	      for (sp = target_option_translations[tott_idx].replacements;
		   *sp; sp++)
		{
		  if (*sp == ' ')
		    spaces ++;
		}

	      newvsize += spaces * sizeof (const char *);
1216
	      newv =  xrealloc (newv, newvsize);
1217 1218

	      sp = target_option_translations[tott_idx].replacements;
1219
	      np = xstrdup (sp);
1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242

	      while (1)
		{
		  while (*np == ' ')
		    np++;
		  if (*np == 0)
		    break;
		  newv[newindex++] = np;
		  while (*np != ' ' && *np)
		    np++;
		  if (*np == 0)
		    break;
		  *np++ = 0;
		}

	      i ++;
	      break;
	    }
	}
      if (target_option_translations[tott_idx].option_found)
	continue;
#endif

1243 1244 1245
      /* Translate -- options.  */
      if (argv[i][0] == '-' && argv[i][1] == '-')
	{
Kaveh R. Ghazi committed
1246
	  size_t j;
1247
	  /* Find a mapping that applies to this option.  */
1248
	  for (j = 0; j < ARRAY_SIZE (option_map); j++)
1249
	    {
1250 1251 1252
	      size_t optlen = strlen (option_map[j].name);
	      size_t arglen = strlen (argv[i]);
	      size_t complen = arglen > optlen ? optlen : arglen;
1253
	      const char *arginfo = option_map[j].arg_info;
1254 1255 1256

	      if (arginfo == 0)
		arginfo = "";
1257

1258 1259
	      if (!strncmp (argv[i], option_map[j].name, complen))
		{
1260
		  const char *arg = 0;
1261

1262 1263
		  if (arglen < optlen)
		    {
Kaveh R. Ghazi committed
1264
		      size_t k;
1265
		      for (k = j + 1; k < ARRAY_SIZE (option_map); k++)
1266 1267 1268
			if (strlen (option_map[k].name) >= arglen
			    && !strncmp (argv[i], option_map[k].name, arglen))
			  {
1269
			    error ("ambiguous abbreviation %s", argv[i]);
1270 1271 1272
			    break;
			  }

1273
		      if (k != ARRAY_SIZE (option_map))
1274 1275 1276 1277
			break;
		    }

		  if (arglen > optlen)
1278 1279 1280 1281
		    {
		      /* If the option has an argument, accept that.  */
		      if (argv[i][optlen] == '=')
			arg = argv[i] + optlen + 1;
1282 1283

		      /* If this mapping requires extra text at end of name,
1284
			 accept that as "argument".  */
1285
		      else if (strchr (arginfo, '*') != 0)
1286
			arg = argv[i] + optlen;
1287

1288 1289 1290 1291 1292
		      /* Otherwise, extra text at end means mismatch.
			 Try other mappings.  */
		      else
			continue;
		    }
1293

1294
		  else if (strchr (arginfo, '*') != 0)
1295
		    {
1296
		      error ("incomplete '%s' option", option_map[j].name);
1297 1298
		      break;
		    }
1299 1300

		  /* Handle arguments.  */
1301
		  if (strchr (arginfo, 'a') != 0)
1302 1303 1304 1305
		    {
		      if (arg == 0)
			{
			  if (i + 1 == argc)
1306
			    {
1307
			      error ("missing argument to '%s' option",
1308 1309 1310 1311
				     option_map[j].name);
			      break;
			    }

1312 1313 1314
			  arg = argv[++i];
			}
		    }
1315
		  else if (strchr (arginfo, '*') != 0)
1316
		    ;
1317
		  else if (strchr (arginfo, 'o') == 0)
1318 1319
		    {
		      if (arg != 0)
1320
			error ("extraneous argument to '%s' option",
1321 1322 1323 1324 1325
			       option_map[j].name);
		      arg = 0;
		    }

		  /* Store the translation as one argv elt or as two.  */
1326
		  if (arg != 0 && strchr (arginfo, 'j') != 0)
1327
		    newv[newindex++] = concat (option_map[j].equivalent, arg,
1328
					       NULL);
1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341
		  else if (arg != 0)
		    {
		      newv[newindex++] = option_map[j].equivalent;
		      newv[newindex++] = arg;
		    }
		  else
		    newv[newindex++] = option_map[j].equivalent;

		  break;
		}
	    }
	  i++;
	}
1342

1343 1344 1345 1346
      /* Handle old-fashioned options--just copy them through,
	 with their arguments.  */
      else if (argv[i][0] == '-')
	{
1347
	  const char *p = argv[i] + 1;
1348 1349 1350 1351 1352 1353 1354
	  int c = *p;
	  int nskip = 1;

	  if (SWITCH_TAKES_ARG (c) > (p[1] != 0))
	    nskip += SWITCH_TAKES_ARG (c) - (p[1] != 0);
	  else if (WORD_SWITCH_TAKES_ARG (p))
	    nskip += WORD_SWITCH_TAKES_ARG (p);
1355
	  else if ((c == 'B' || c == 'b' || c == 'x')
1356 1357 1358 1359
		   && p[1] == 0)
	    nskip += 1;
	  else if (! strcmp (p, "Xlinker"))
	    nskip += 1;
1360 1361 1362 1363
	  else if (! strcmp (p, "Xpreprocessor"))
	    nskip += 1;
	  else if (! strcmp (p, "Xassembler"))
	    nskip += 1;
1364

1365 1366 1367 1368 1369 1370
	  /* Watch out for an option at the end of the command line that
	     is missing arguments, and avoid skipping past the end of the
	     command line.  */
	  if (nskip + i > argc)
	    nskip = argc - i;

1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387
	  while (nskip > 0)
	    {
	      newv[newindex++] = argv[i++];
	      nskip--;
	    }
	}
      else
	/* Ordinary operands, or +e options.  */
	newv[newindex++] = argv[i++];
    }

  newv[newindex] = 0;

  *argvp = newv;
  *argcp = newindex;
}

Richard Stallman committed
1388
static char *
1389
skip_whitespace (char *p)
Richard Stallman committed
1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400
{
  while (1)
    {
      /* A fully-blank line is a delimiter in the SPEC file and shouldn't
	 be considered whitespace.  */
      if (p[0] == '\n' && p[1] == '\n' && p[2] == '\n')
	return p + 1;
      else if (*p == '\n' || *p == ' ' || *p == '\t')
	p++;
      else if (*p == '#')
	{
Kazu Hirata committed
1401 1402
	  while (*p != '\n')
	    p++;
Richard Stallman committed
1403 1404 1405 1406 1407 1408 1409 1410
	  p++;
	}
      else
	break;
    }

  return p;
}
1411 1412 1413 1414
/* Structures to keep track of prefixes to try when looking for files.  */

struct prefix_list
{
1415
  const char *prefix;	      /* String to prepend to the path.  */
1416 1417 1418
  struct prefix_list *next;   /* Next in linked list.  */
  int require_machine_suffix; /* Don't use without machine_suffix.  */
  /* 2 means try both machine_suffix and just_machine_suffix.  */
1419 1420 1421
  int priority;		      /* Sort key - priority within list.  */
  int os_multilib;	      /* 1 if OS multilib scheme should be used,
				 0 for GCC multilib scheme.  */
1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456
};

struct path_prefix
{
  struct prefix_list *plist;  /* List of prefixes to try */
  int max_len;                /* Max length of a prefix in PLIST */
  const char *name;           /* Name of this list (used in config stuff) */
};

/* List of prefixes to try when looking for executables.  */

static struct path_prefix exec_prefixes = { 0, 0, "exec" };

/* List of prefixes to try when looking for startup (crt0) files.  */

static struct path_prefix startfile_prefixes = { 0, 0, "startfile" };

/* List of prefixes to try when looking for include files.  */

static struct path_prefix include_prefixes = { 0, 0, "include" };

/* Suffix to attach to directories searched for commands.
   This looks like `MACHINE/VERSION/'.  */

static const char *machine_suffix = 0;

/* Suffix to attach to directories searched for commands.
   This is just `MACHINE/'.  */

static const char *just_machine_suffix = 0;

/* Adjusted value of GCC_EXEC_PREFIX envvar.  */

static const char *gcc_exec_prefix;

1457 1458 1459 1460
/* Adjusted value of standard_libexec_prefix.  */

static const char *gcc_libexec_prefix;

1461 1462
/* Default prefixes to attach to command names.  */

1463 1464 1465 1466 1467 1468
#ifndef STANDARD_STARTFILE_PREFIX_1
#define STANDARD_STARTFILE_PREFIX_1 "/lib/"
#endif
#ifndef STANDARD_STARTFILE_PREFIX_2
#define STANDARD_STARTFILE_PREFIX_2 "/usr/lib/"
#endif
1469

1470
#ifdef CROSS_DIRECTORY_STRUCTURE  /* Don't use these prefixes for a cross compiler.  */
1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486
#undef MD_EXEC_PREFIX
#undef MD_STARTFILE_PREFIX
#undef MD_STARTFILE_PREFIX_1
#endif

/* If no prefixes defined, use the null string, which will disable them.  */
#ifndef MD_EXEC_PREFIX
#define MD_EXEC_PREFIX ""
#endif
#ifndef MD_STARTFILE_PREFIX
#define MD_STARTFILE_PREFIX ""
#endif
#ifndef MD_STARTFILE_PREFIX_1
#define MD_STARTFILE_PREFIX_1 ""
#endif

1487 1488 1489 1490 1491 1492
/* These directories are locations set at configure-time based on the
   --prefix option provided to configure.  Their initializers are
   defined in Makefile.in.  These paths are not *directly* used when
   gcc_exec_prefix is set because, in that case, we know where the
   compiler has been installed, and use paths relative to that
   location instead.  */
1493
static const char *const standard_exec_prefix = STANDARD_EXEC_PREFIX;
1494 1495 1496 1497 1498 1499 1500
static const char *const standard_libexec_prefix = STANDARD_LIBEXEC_PREFIX;
static const char *const standard_bindir_prefix = STANDARD_BINDIR_PREFIX;
static const char *const standard_startfile_prefix = STANDARD_STARTFILE_PREFIX;

/* For native compilers, these are well-known paths containing
   components that may be provided by the system.  For cross
   compilers, these paths are not used.  */
1501 1502
static const char *const standard_exec_prefix_1 = "/usr/libexec/gcc/";
static const char *const standard_exec_prefix_2 = "/usr/lib/gcc/";
1503 1504 1505
static const char *md_exec_prefix = MD_EXEC_PREFIX;
static const char *md_startfile_prefix = MD_STARTFILE_PREFIX;
static const char *md_startfile_prefix_1 = MD_STARTFILE_PREFIX_1;
1506
static const char *const standard_startfile_prefix_1
1507 1508 1509
  = STANDARD_STARTFILE_PREFIX_1;
static const char *const standard_startfile_prefix_2
  = STANDARD_STARTFILE_PREFIX_2;
1510

1511 1512
/* A relative path to be used in finding the location of tools
   relative to the driver.  */
1513
static const char *const tooldir_base_prefix = TOOLDIR_BASE_PREFIX;
1514

1515 1516 1517 1518
/* Subdirectory to use for locating libraries.  Set by
   set_multilib_dir based on the compilation options.  */

static const char *multilib_dir;
1519 1520 1521 1522 1523

/* Subdirectory to use for locating libraries in OS conventions.  Set by
   set_multilib_dir based on the compilation options.  */

static const char *multilib_os_dir;
Richard Stallman committed
1524

Mike Stump committed
1525
/* Structure to keep track of the specs that have been defined so far.
1526 1527
   These are accessed using %(specname) or %[specname] in a compiler
   or link spec.  */
Richard Stallman committed
1528 1529 1530

struct spec_list
{
Michael Meissner committed
1531 1532
				/* The following 2 fields must be first */
				/* to allow EXTRA_SPECS to be initialized */
Zack Weinberg committed
1533 1534
  const char *name;		/* name of the spec.  */
  const char *ptr;		/* available ptr if no static pointer */
Michael Meissner committed
1535 1536 1537

				/* The following fields are not initialized */
				/* by EXTRA_SPECS */
Zack Weinberg committed
1538
  const char **ptr_spec;	/* pointer to the spec itself.  */
Michael Meissner committed
1539 1540 1541
  struct spec_list *next;	/* Next spec in linked list.  */
  int name_len;			/* length of the name */
  int alloc_p;			/* whether string was allocated */
Richard Stallman committed
1542 1543
};

Michael Meissner committed
1544
#define INIT_STATIC_SPEC(NAME,PTR) \
1545
{ NAME, NULL, PTR, (struct spec_list *) 0, sizeof (NAME) - 1, 0 }
Michael Meissner committed
1546

1547 1548 1549
/* List of statically defined specs.  */
static struct spec_list static_specs[] =
{
Michael Meissner committed
1550
  INIT_STATIC_SPEC ("asm",			&asm_spec),
1551
  INIT_STATIC_SPEC ("asm_debug",		&asm_debug),
Michael Meissner committed
1552
  INIT_STATIC_SPEC ("asm_final",		&asm_final_spec),
1553
  INIT_STATIC_SPEC ("asm_options",		&asm_options),
1554
  INIT_STATIC_SPEC ("invoke_as",		&invoke_as),
Michael Meissner committed
1555
  INIT_STATIC_SPEC ("cpp",			&cpp_spec),
1556
  INIT_STATIC_SPEC ("cpp_options",		&cpp_options),
1557
  INIT_STATIC_SPEC ("cpp_debug_options",	&cpp_debug_options),
1558
  INIT_STATIC_SPEC ("cpp_unique_options",	&cpp_unique_options),
1559
  INIT_STATIC_SPEC ("trad_capable_cpp",		&trad_capable_cpp),
Michael Meissner committed
1560
  INIT_STATIC_SPEC ("cc1",			&cc1_spec),
1561
  INIT_STATIC_SPEC ("cc1_options",		&cc1_options),
Michael Meissner committed
1562
  INIT_STATIC_SPEC ("cc1plus",			&cc1plus_spec),
1563
  INIT_STATIC_SPEC ("link_gcc_c_sequence",	&link_gcc_c_sequence_spec),
1564
  INIT_STATIC_SPEC ("link_ssp",			&link_ssp_spec),
Michael Meissner committed
1565 1566 1567
  INIT_STATIC_SPEC ("endfile",			&endfile_spec),
  INIT_STATIC_SPEC ("link",			&link_spec),
  INIT_STATIC_SPEC ("lib",			&lib_spec),
1568 1569
  INIT_STATIC_SPEC ("mfwrap",			&mfwrap_spec),
  INIT_STATIC_SPEC ("mflib",			&mflib_spec),
Diego Novillo committed
1570
  INIT_STATIC_SPEC ("link_gomp",		&link_gomp_spec),
Michael Meissner committed
1571 1572 1573 1574 1575 1576 1577 1578 1579
  INIT_STATIC_SPEC ("libgcc",			&libgcc_spec),
  INIT_STATIC_SPEC ("startfile",		&startfile_spec),
  INIT_STATIC_SPEC ("switches_need_spaces",	&switches_need_spaces),
  INIT_STATIC_SPEC ("cross_compile",		&cross_compile),
  INIT_STATIC_SPEC ("version",			&compiler_version),
  INIT_STATIC_SPEC ("multilib",			&multilib_select),
  INIT_STATIC_SPEC ("multilib_defaults",	&multilib_defaults),
  INIT_STATIC_SPEC ("multilib_extra",		&multilib_extra),
  INIT_STATIC_SPEC ("multilib_matches",		&multilib_matches),
1580
  INIT_STATIC_SPEC ("multilib_exclusions",	&multilib_exclusions),
1581
  INIT_STATIC_SPEC ("multilib_options",		&multilib_options),
Bob Manson committed
1582
  INIT_STATIC_SPEC ("linker",			&linker_name_spec),
1583
  INIT_STATIC_SPEC ("link_libgcc",		&link_libgcc_spec),
1584 1585 1586
  INIT_STATIC_SPEC ("md_exec_prefix",		&md_exec_prefix),
  INIT_STATIC_SPEC ("md_startfile_prefix",	&md_startfile_prefix),
  INIT_STATIC_SPEC ("md_startfile_prefix_1",	&md_startfile_prefix_1),
1587
  INIT_STATIC_SPEC ("startfile_prefix_spec",	&startfile_prefix_spec),
1588
  INIT_STATIC_SPEC ("sysroot_spec",             &sysroot_spec),
1589 1590
  INIT_STATIC_SPEC ("sysroot_suffix_spec",	&sysroot_suffix_spec),
  INIT_STATIC_SPEC ("sysroot_hdrs_suffix_spec",	&sysroot_hdrs_suffix_spec),
Michael Meissner committed
1591 1592 1593
};

#ifdef EXTRA_SPECS		/* additional specs needed */
Kaveh R. Ghazi committed
1594
/* Structure to keep track of just the first two args of a spec_list.
1595
   That is all that the EXTRA_SPECS macro gives us.  */
Kaveh R. Ghazi committed
1596 1597
struct spec_list_1
{
1598 1599
  const char *const name;
  const char *const ptr;
Kaveh R. Ghazi committed
1600 1601
};

1602
static const struct spec_list_1 extra_specs_1[] = { EXTRA_SPECS };
Kazu Hirata committed
1603
static struct spec_list *extra_specs = (struct spec_list *) 0;
Michael Meissner committed
1604 1605 1606 1607
#endif

/* List of dynamically allocates specs that have been defined so far.  */

Kazu Hirata committed
1608
static struct spec_list *specs = (struct spec_list *) 0;
Michael Meissner committed
1609

1610 1611 1612 1613
/* List of static spec functions.  */

static const struct spec_function static_spec_functions[] =
{
1614
  { "getenv",                   getenv_spec_function },
1615
  { "if-exists",		if_exists_spec_function },
1616
  { "if-exists-else",		if_exists_else_spec_function },
1617
  { "replace-outfile",		replace_outfile_spec_function },
Geoffrey Keating committed
1618
  { "version-compare",		version_compare_spec_function },
Diego Novillo committed
1619
  { "include",			include_spec_function },
1620 1621 1622
#ifdef EXTRA_SPEC_FUNCTIONS
  EXTRA_SPEC_FUNCTIONS
#endif
1623 1624 1625 1626 1627
  { 0, 0 }
};

static int processing_spec_function;

1628 1629 1630
/* Add appropriate libgcc specs to OBSTACK, taking into account
   various permutations of -shared-libgcc, -shared, and such.  */

1631
#if defined(ENABLE_SHARED_LIBGCC) && !defined(REAL_LIBGCC_SPEC)
1632 1633 1634 1635 1636

#ifndef USE_LD_AS_NEEDED
#define USE_LD_AS_NEEDED 0
#endif

1637
static void
1638 1639
init_gcc_specs (struct obstack *obstack, const char *shared_name,
		const char *static_name, const char *eh_name)
1640
{
1641 1642
  char *buf;

1643 1644
  buf = concat ("%{static|static-libgcc:", static_name, " ", eh_name, "}"
		"%{!static:%{!static-libgcc:"
1645
#if USE_LD_AS_NEEDED
1646 1647 1648 1649 1650 1651
		"%{!shared-libgcc:",
		static_name, " --as-needed ", shared_name, " --no-as-needed"
		"}"
		"%{shared-libgcc:",
		shared_name, "%{!shared: ", static_name, "}"
		"}"
1652
#else
1653 1654 1655 1656
		"%{!shared:"
		"%{!shared-libgcc:", static_name, " ", eh_name, "}"
		"%{shared-libgcc:", shared_name, " ", static_name, "}"
		"}"
1657
#ifdef LINK_EH_SPEC
1658 1659 1660 1661
		"%{shared:"
		"%{shared-libgcc:", shared_name, "}"
		"%{!shared-libgcc:", static_name, "}"
		"}"
1662
#else
1663
		"%{shared:", shared_name, "}"
1664
#endif
1665
#endif
1666
		"}}", NULL);
1667 1668 1669

  obstack_grow (obstack, buf, strlen (buf));
  free (buf);
1670
}
1671
#endif /* ENABLE_SHARED_LIBGCC */
1672

Michael Meissner committed
1673 1674 1675
/* Initialize the specs lookup routines.  */

static void
1676
init_spec (void)
Michael Meissner committed
1677
{
Kazu Hirata committed
1678 1679
  struct spec_list *next = (struct spec_list *) 0;
  struct spec_list *sl   = (struct spec_list *) 0;
Michael Meissner committed
1680 1681 1682
  int i;

  if (specs)
1683
    return;			/* Already initialized.  */
Michael Meissner committed
1684

1685
  if (verbose_flag)
1686
    notice ("Using built-in specs.\n");
1687

Michael Meissner committed
1688
#ifdef EXTRA_SPECS
1689 1690
  extra_specs = xcalloc (sizeof (struct spec_list),
			 ARRAY_SIZE (extra_specs_1));
Kazu Hirata committed
1691

1692
  for (i = ARRAY_SIZE (extra_specs_1) - 1; i >= 0; i--)
1693 1694
    {
      sl = &extra_specs[i];
Kaveh R. Ghazi committed
1695 1696
      sl->name = extra_specs_1[i].name;
      sl->ptr = extra_specs_1[i].ptr;
1697 1698 1699 1700 1701
      sl->next = next;
      sl->name_len = strlen (sl->name);
      sl->ptr_spec = &sl->ptr;
      next = sl;
    }
Michael Meissner committed
1702 1703
#endif

1704 1705 1706 1707
  /* Initialize here, not in definition.  The IRIX 6 O32 cc sometimes chokes
     on ?: in file-scope variable initializations.  */
  asm_debug = ASM_DEBUG_SPEC;

1708
  for (i = ARRAY_SIZE (static_specs) - 1; i >= 0; i--)
Michael Meissner committed
1709 1710 1711 1712 1713 1714
    {
      sl = &static_specs[i];
      sl->next = next;
      next = sl;
    }

1715
#if defined(ENABLE_SHARED_LIBGCC) && !defined(REAL_LIBGCC_SPEC)
1716 1717 1718 1719 1720 1721 1722 1723 1724 1725 1726 1727 1728
  /* ??? If neither -shared-libgcc nor --static-libgcc was
     seen, then we should be making an educated guess.  Some proposed
     heuristics for ELF include:

	(1) If "-Wl,--export-dynamic", then it's a fair bet that the
	    program will be doing dynamic loading, which will likely
	    need the shared libgcc.

	(2) If "-ldl", then it's also a fair bet that we're doing
	    dynamic loading.

	(3) For each ET_DYN we're linking against (either through -lfoo
	    or /some/path/foo.so), check to see whether it or one of
1729
	    its dependencies depends on a shared libgcc.
1730 1731 1732 1733 1734 1735 1736 1737 1738 1739 1740 1741 1742 1743 1744 1745

	(4) If "-shared"

	    If the runtime is fixed to look for program headers instead
	    of calling __register_frame_info at all, for each object,
	    use the shared libgcc if any EH symbol referenced.

	    If crtstuff is fixed to not invoke __register_frame_info
	    automatically, for each object, use the shared libgcc if
	    any non-empty unwind section found.

     Doing any of this probably requires invoking an external program to
     do the actual object file scanning.  */
  {
    const char *p = libgcc_spec;
    int in_sep = 1;
1746

1747
    /* Transform the extant libgcc_spec into one that uses the shared libgcc
1748 1749 1750
       when given the proper command line arguments.  */
    while (*p)
      {
1751
	if (in_sep && *p == '-' && strncmp (p, "-lgcc", 5) == 0)
1752
	  {
1753 1754
	    init_gcc_specs (&obstack,
			    "-lgcc_s"
1755 1756 1757
#ifdef USE_LIBUNWIND_EXCEPTIONS
			    " -lunwind"
#endif
1758 1759 1760
			    ,
			    "-lgcc",
			    "-lgcc_eh"
1761
#ifdef USE_LIBUNWIND_EXCEPTIONS
1762 1763 1764
# ifdef HAVE_LD_STATIC_DYNAMIC
			    " %{!static:-Bstatic} -lunwind %{!static:-Bdynamic}"
# else
1765
			    " -lunwind"
1766
# endif
1767
#endif
1768 1769
			    );

1770
	    p += 5;
1771 1772
	    in_sep = 0;
	  }
1773
	else if (in_sep && *p == 'l' && strncmp (p, "libgcc.a%s", 10) == 0)
1774 1775 1776
	  {
	    /* Ug.  We don't know shared library extensions.  Hope that
	       systems that use this form don't do shared libraries.  */
1777
	    init_gcc_specs (&obstack,
1778
			    "-lgcc_s",
1779
			    "libgcc.a%s",
James E Wilson committed
1780 1781 1782 1783 1784
			    "libgcc_eh.a%s"
#ifdef USE_LIBUNWIND_EXCEPTIONS
			    " -lunwind"
#endif
			    );
1785
	    p += 10;
1786 1787 1788 1789 1790 1791 1792 1793 1794 1795 1796
	    in_sep = 0;
	  }
	else
	  {
	    obstack_1grow (&obstack, *p);
	    in_sep = (*p == ' ');
	    p += 1;
	  }
      }

    obstack_1grow (&obstack, '\0');
1797
    libgcc_spec = XOBFINISH (&obstack, const char *);
1798 1799
  }
#endif
1800 1801 1802
#ifdef USE_AS_TRADITIONAL_FORMAT
  /* Prepend "--traditional-format" to whatever asm_spec we had before.  */
  {
1803
    static const char tf[] = "--traditional-format ";
1804 1805
    obstack_grow (&obstack, tf, sizeof(tf) - 1);
    obstack_grow0 (&obstack, asm_spec, strlen (asm_spec));
1806
    asm_spec = XOBFINISH (&obstack, const char *);
1807 1808
  }
#endif
1809 1810 1811 1812
#ifdef LINK_EH_SPEC
  /* Prepend LINK_EH_SPEC to whatever link_spec we had before.  */
  obstack_grow (&obstack, LINK_EH_SPEC, sizeof(LINK_EH_SPEC) - 1);
  obstack_grow0 (&obstack, link_spec, strlen (link_spec));
1813
  link_spec = XOBFINISH (&obstack, const char *);
1814
#endif
1815

Michael Meissner committed
1816 1817
  specs = sl;
}
Richard Stallman committed
1818 1819 1820

/* Change the value of spec NAME to SPEC.  If SPEC is empty, then the spec is
   removed; If the spec starts with a + then SPEC is added to the end of the
Mike Stump committed
1821
   current spec.  */
Richard Stallman committed
1822 1823

static void
1824
set_spec (const char *name, const char *spec)
Richard Stallman committed
1825 1826
{
  struct spec_list *sl;
Zack Weinberg committed
1827
  const char *old_spec;
Michael Meissner committed
1828 1829 1830
  int name_len = strlen (name);
  int i;

1831
  /* If this is the first call, initialize the statically allocated specs.  */
1832 1833
  if (!specs)
    {
Kazu Hirata committed
1834
      struct spec_list *next = (struct spec_list *) 0;
1835
      for (i = ARRAY_SIZE (static_specs) - 1; i >= 0; i--)
1836 1837 1838 1839 1840 1841 1842 1843
	{
	  sl = &static_specs[i];
	  sl->next = next;
	  next = sl;
	}
      specs = sl;
    }

1844
  /* See if the spec already exists.  */
Richard Stallman committed
1845
  for (sl = specs; sl; sl = sl->next)
Michael Meissner committed
1846
    if (name_len == sl->name_len && !strcmp (sl->name, name))
Richard Stallman committed
1847 1848 1849 1850
      break;

  if (!sl)
    {
1851
      /* Not found - make it.  */
1852
      sl = XNEW (struct spec_list);
1853
      sl->name = xstrdup (name);
Michael Meissner committed
1854 1855 1856 1857
      sl->name_len = name_len;
      sl->ptr_spec = &sl->ptr;
      sl->alloc_p = 0;
      *(sl->ptr_spec) = "";
Richard Stallman committed
1858 1859 1860 1861
      sl->next = specs;
      specs = sl;
    }

Michael Meissner committed
1862
  old_spec = *(sl->ptr_spec);
Kaveh R. Ghazi committed
1863
  *(sl->ptr_spec) = ((spec[0] == '+' && ISSPACE ((unsigned char)spec[1]))
1864
		     ? concat (old_spec, spec + 1, NULL)
1865
		     : xstrdup (spec));
Michael Meissner committed
1866

1867 1868
#ifdef DEBUG_SPECS
  if (verbose_flag)
1869
    notice ("Setting spec %s to '%s'\n\n", name, *(sl->ptr_spec));
1870 1871
#endif

1872
  /* Free the old spec.  */
Michael Meissner committed
1873
  if (old_spec && sl->alloc_p)
1874
    free ((void *) old_spec);
Michael Meissner committed
1875 1876

  sl->alloc_p = 1;
Richard Stallman committed
1877 1878 1879 1880 1881 1882
}

/* Accumulate a command (program name and args), and run it.  */

/* Vector of pointers to arguments in the current line of specifications.  */

Zack Weinberg committed
1883
static const char **argbuf;
Richard Stallman committed
1884 1885 1886 1887 1888 1889 1890 1891 1892

/* Number of elements allocated in argbuf.  */

static int argbuf_length;

/* Number of elements in argbuf currently in use (containing args).  */

static int argbuf_index;

1893 1894 1895 1896 1897
/* Position in the argbuf array containing the name of the output file
   (the value associated with the "-o" flag).  */

static int have_o_argbuf_index = 0;

1898 1899 1900 1901 1902 1903
/* Were the options -c or -S passed.  */
static int have_c = 0;

/* Was the option -o passed.  */
static int have_o = 0;

1904 1905 1906
/* This is the list of suffixes and codes (%g/%u/%U/%j) and the associated
   temp file.  If the HOST_BIT_BUCKET is used for %j, no entry is made for
   it here.  */
Tom Wood committed
1907 1908

static struct temp_name {
1909
  const char *suffix;	/* suffix associated with the code.  */
Tom Wood committed
1910 1911
  int length;		/* strlen (suffix).  */
  int unique;		/* Indicates whether %g or %u/%U was used.  */
1912
  const char *filename;	/* associated filename.  */
Tom Wood committed
1913 1914 1915
  int filename_length;	/* strlen (filename).  */
  struct temp_name *next;
} *temp_names;
1916

Richard Stallman committed
1917 1918 1919 1920
/* Number of commands executed so far.  */

static int execution_count;

1921 1922 1923 1924
/* Number of commands that exited with a signal.  */

static int signal_count;

Richard Stallman committed
1925 1926
/* Name with which this program was invoked.  */

1927
static const char *programname;
Richard Stallman committed
1928

1929 1930 1931
/* Allocate the argument vector.  */

static void
1932
alloc_args (void)
1933 1934
{
  argbuf_length = 10;
1935
  argbuf = XNEWVEC (const char *, argbuf_length);
1936 1937
}

Richard Stallman committed
1938 1939 1940
/* Clear out the vector of arguments (after a command is executed).  */

static void
1941
clear_args (void)
Richard Stallman committed
1942 1943 1944 1945 1946 1947 1948 1949 1950 1951 1952 1953
{
  argbuf_index = 0;
}

/* Add one argument to the vector at the end.
   This is done when a space is seen or at the end of the line.
   If DELETE_ALWAYS is nonzero, the arg is a filename
    and the file should be deleted eventually.
   If DELETE_FAILURE is nonzero, the arg is a filename
    and the file should be deleted if this compilation fails.  */

static void
1954
store_arg (const char *arg, int delete_always, int delete_failure)
Richard Stallman committed
1955 1956
{
  if (argbuf_index + 1 == argbuf_length)
1957
    argbuf = xrealloc (argbuf, (argbuf_length *= 2) * sizeof (const char *));
Richard Stallman committed
1958 1959 1960 1961

  argbuf[argbuf_index++] = arg;
  argbuf[argbuf_index] = 0;

1962 1963
  if (strcmp (arg, "-o") == 0)
    have_o_argbuf_index = argbuf_index;
Richard Stallman committed
1964 1965 1966 1967
  if (delete_always || delete_failure)
    record_temp_file (arg, delete_always, delete_failure);
}

1968
/* Load specs from a file name named FILENAME, replacing occurrences of
Kazu Hirata committed
1969
   various different types of line-endings, \r\n, \n\r and just \r, with
1970
   a single \n.  */
1971

Kazu Hirata committed
1972
static char *
1973
load_specs (const char *filename)
1974 1975 1976 1977 1978
{
  int desc;
  int readlen;
  struct stat statbuf;
  char *buffer;
1979 1980 1981
  char *buffer_p;
  char *specs;
  char *specs_p;
1982 1983

  if (verbose_flag)
1984
    notice ("Reading specs from %s\n", filename);
1985 1986 1987 1988 1989 1990 1991 1992 1993

  /* Open and stat the file.  */
  desc = open (filename, O_RDONLY, 0);
  if (desc < 0)
    pfatal_with_name (filename);
  if (stat (filename, &statbuf) < 0)
    pfatal_with_name (filename);

  /* Read contents of file into BUFFER.  */
1994
  buffer = XNEWVEC (char, statbuf.st_size + 1);
1995 1996 1997 1998 1999 2000
  readlen = read (desc, buffer, (unsigned) statbuf.st_size);
  if (readlen < 0)
    pfatal_with_name (filename);
  buffer[readlen] = 0;
  close (desc);

2001
  specs = XNEWVEC (char, readlen + 1);
2002 2003 2004 2005 2006 2007
  specs_p = specs;
  for (buffer_p = buffer; buffer_p && *buffer_p; buffer_p++)
    {
      int skip = 0;
      char c = *buffer_p;
      if (c == '\r')
Kazu Hirata committed
2008 2009
	{
	  if (buffer_p > buffer && *(buffer_p - 1) == '\n')	/* \n\r */
2010
	    skip = 1;
Kazu Hirata committed
2011
	  else if (*(buffer_p + 1) == '\n')			/* \r\n */
2012 2013 2014 2015 2016 2017 2018 2019 2020 2021 2022 2023 2024 2025 2026 2027 2028 2029
	    skip = 1;
	  else							/* \r */
	    c = '\n';
	}
      if (! skip)
	*specs_p++ = c;
    }
  *specs_p = '\0';

  free (buffer);
  return (specs);
}

/* Read compilation specs from a file named FILENAME,
   replacing the default ones.

   A suffix which starts with `*' is a definition for
   one of the machine-specific sub-specs.  The "suffix" should be
2030
   *asm, *cc1, *cpp, *link, *startfile, etc.
2031 2032 2033 2034 2035 2036
   The corresponding spec is stored in asm_spec, etc.,
   rather than in the `compilers' vector.

   Anything invalid in the file is a fatal error.  */

static void
2037
read_specs (const char *filename, int main_p)
2038 2039
{
  char *buffer;
2040
  char *p;
2041 2042 2043

  buffer = load_specs (filename);

2044 2045 2046 2047 2048 2049 2050 2051 2052 2053 2054 2055 2056 2057 2058 2059 2060 2061 2062
  /* Scan BUFFER for specs, putting them in the vector.  */
  p = buffer;
  while (1)
    {
      char *suffix;
      char *spec;
      char *in, *out, *p1, *p2, *p3;

      /* Advance P in BUFFER to the next nonblank nocomment line.  */
      p = skip_whitespace (p);
      if (*p == 0)
	break;

      /* Is this a special command that starts with '%'? */
      /* Don't allow this for the main specs file, since it would
	 encourage people to overwrite it.  */
      if (*p == '%' && !main_p)
	{
	  p1 = p;
2063 2064 2065
	  while (*p && *p != '\n')
	    p++;

Kazu Hirata committed
2066 2067
	  /* Skip '\n'.  */
	  p++;
2068

Kazu Hirata committed
2069
	  if (!strncmp (p1, "%include", sizeof ("%include") - 1)
2070 2071
	      && (p1[sizeof "%include" - 1] == ' '
		  || p1[sizeof "%include" - 1] == '\t'))
2072 2073 2074 2075
	    {
	      char *new_filename;

	      p1 += sizeof ("%include");
2076 2077
	      while (*p1 == ' ' || *p1 == '\t')
		p1++;
2078 2079

	      if (*p1++ != '<' || p[-2] != '>')
Kaveh R. Ghazi committed
2080 2081
		fatal ("specs %%include syntax malformed after %ld characters",
		       (long) (p1 - buffer + 1));
2082 2083

	      p[-2] = '\0';
2084
	      new_filename = find_a_file (&startfile_prefixes, p1, R_OK, true);
2085 2086 2087
	      read_specs (new_filename ? new_filename : p1, FALSE);
	      continue;
	    }
2088 2089 2090
	  else if (!strncmp (p1, "%include_noerr", sizeof "%include_noerr" - 1)
		   && (p1[sizeof "%include_noerr" - 1] == ' '
		       || p1[sizeof "%include_noerr" - 1] == '\t'))
2091 2092 2093
	    {
	      char *new_filename;

2094
	      p1 += sizeof "%include_noerr";
Kazu Hirata committed
2095 2096
	      while (*p1 == ' ' || *p1 == '\t')
		p1++;
2097 2098

	      if (*p1++ != '<' || p[-2] != '>')
Kaveh R. Ghazi committed
2099 2100
		fatal ("specs %%include syntax malformed after %ld characters",
		       (long) (p1 - buffer + 1));
2101 2102

	      p[-2] = '\0';
2103
	      new_filename = find_a_file (&startfile_prefixes, p1, R_OK, true);
2104 2105 2106
	      if (new_filename)
		read_specs (new_filename, FALSE);
	      else if (verbose_flag)
2107
		notice ("could not find specs file %s\n", p1);
2108 2109
	      continue;
	    }
2110 2111 2112
	  else if (!strncmp (p1, "%rename", sizeof "%rename" - 1)
		   && (p1[sizeof "%rename" - 1] == ' '
		       || p1[sizeof "%rename" - 1] == '\t'))
2113 2114 2115
	    {
	      int name_len;
	      struct spec_list *sl;
2116
	      struct spec_list *newsl;
2117

2118
	      /* Get original name.  */
2119 2120 2121 2122
	      p1 += sizeof "%rename";
	      while (*p1 == ' ' || *p1 == '\t')
		p1++;

Kazu Hirata committed
2123
	      if (! ISALPHA ((unsigned char) *p1))
Kaveh R. Ghazi committed
2124 2125
		fatal ("specs %%rename syntax malformed after %ld characters",
		       (long) (p1 - buffer));
2126 2127

	      p2 = p1;
Kazu Hirata committed
2128
	      while (*p2 && !ISSPACE ((unsigned char) *p2))
2129 2130
		p2++;

2131
	      if (*p2 != ' ' && *p2 != '\t')
Kaveh R. Ghazi committed
2132 2133
		fatal ("specs %%rename syntax malformed after %ld characters",
		       (long) (p2 - buffer));
2134 2135 2136

	      name_len = p2 - p1;
	      *p2++ = '\0';
2137 2138 2139
	      while (*p2 == ' ' || *p2 == '\t')
		p2++;

Kazu Hirata committed
2140
	      if (! ISALPHA ((unsigned char) *p2))
Kaveh R. Ghazi committed
2141 2142
		fatal ("specs %%rename syntax malformed after %ld characters",
		       (long) (p2 - buffer));
2143

Kazu Hirata committed
2144
	      /* Get new spec name.  */
2145
	      p3 = p2;
Kazu Hirata committed
2146
	      while (*p3 && !ISSPACE ((unsigned char) *p3))
2147 2148
		p3++;

Kazu Hirata committed
2149
	      if (p3 != p - 1)
Kaveh R. Ghazi committed
2150 2151
		fatal ("specs %%rename syntax malformed after %ld characters",
		       (long) (p3 - buffer));
2152 2153 2154 2155 2156 2157 2158 2159 2160
	      *p3 = '\0';

	      for (sl = specs; sl; sl = sl->next)
		if (name_len == sl->name_len && !strcmp (sl->name, p1))
		  break;

	      if (!sl)
		fatal ("specs %s spec was not found to be renamed", p1);

2161
	      if (strcmp (p1, p2) == 0)
2162 2163
		continue;

2164 2165 2166 2167 2168
	      for (newsl = specs; newsl; newsl = newsl->next)
		if (strcmp (newsl->name, p2) == 0)
		  fatal ("%s: attempt to rename spec '%s' to already defined spec '%s'",
		    filename, p1, p2);

2169 2170
	      if (verbose_flag)
		{
2171
		  notice ("rename spec %s to %s\n", p1, p2);
2172
#ifdef DEBUG_SPECS
2173
		  notice ("spec is '%s'\n\n", *(sl->ptr_spec));
2174 2175 2176 2177 2178
#endif
		}

	      set_spec (p2, *(sl->ptr_spec));
	      if (sl->alloc_p)
2179
		free ((void *) *(sl->ptr_spec));
2180 2181 2182 2183 2184 2185

	      *(sl->ptr_spec) = "";
	      sl->alloc_p = 0;
	      continue;
	    }
	  else
Kaveh R. Ghazi committed
2186 2187
	    fatal ("specs unknown %% command after %ld characters",
		   (long) (p1 - buffer));
2188 2189 2190 2191
	}

      /* Find the colon that should end the suffix.  */
      p1 = p;
2192 2193 2194
      while (*p1 && *p1 != ':' && *p1 != '\n')
	p1++;

2195 2196
      /* The colon shouldn't be missing.  */
      if (*p1 != ':')
Kaveh R. Ghazi committed
2197 2198
	fatal ("specs file malformed after %ld characters",
	       (long) (p1 - buffer));
2199

2200 2201
      /* Skip back over trailing whitespace.  */
      p2 = p1;
2202 2203 2204
      while (p2 > buffer && (p2[-1] == ' ' || p2[-1] == '\t'))
	p2--;

2205 2206 2207 2208 2209
      /* Copy the suffix to a string.  */
      suffix = save_string (p, p2 - p);
      /* Find the next line.  */
      p = skip_whitespace (p1 + 1);
      if (p[1] == 0)
Kaveh R. Ghazi committed
2210 2211
	fatal ("specs file malformed after %ld characters",
	       (long) (p - buffer));
2212

2213
      p1 = p;
2214 2215
      /* Find next blank line or end of string.  */
      while (*p1 && !(*p1 == '\n' && (p1[1] == '\n' || p1[1] == '\0')))
2216 2217
	p1++;

2218 2219 2220 2221 2222 2223 2224 2225 2226 2227 2228 2229
      /* Specs end at the blank line and do not include the newline.  */
      spec = save_string (p, p1 - p);
      p = p1;

      /* Delete backslash-newline sequences from the spec.  */
      in = spec;
      out = spec;
      while (*in != 0)
	{
	  if (in[0] == '\\' && in[1] == '\n')
	    in += 2;
	  else if (in[0] == '#')
2230 2231 2232
	    while (*in && *in != '\n')
	      in++;

2233 2234 2235 2236 2237 2238 2239 2240 2241 2242 2243 2244 2245 2246 2247 2248
	  else
	    *out++ = *in++;
	}
      *out = 0;

      if (suffix[0] == '*')
	{
	  if (! strcmp (suffix, "*link_command"))
	    link_command_spec = spec;
	  else
	    set_spec (suffix + 1, spec);
	}
      else
	{
	  /* Add this pair to the vector.  */
	  compilers
2249 2250
	    = xrealloc (compilers,
			(n_compilers + 2) * sizeof (struct compiler));
2251

2252
	  compilers[n_compilers].suffix = suffix;
2253
	  compilers[n_compilers].spec = spec;
2254
	  n_compilers++;
2255
	  memset (&compilers[n_compilers], 0, sizeof compilers[n_compilers]);
2256 2257 2258 2259 2260 2261 2262 2263 2264 2265
	}

      if (*suffix == 0)
	link_command_spec = spec;
    }

  if (link_command_spec == 0)
    fatal ("spec file has no spec for linking");
}

Richard Stallman committed
2266 2267 2268 2269 2270
/* Record the names of temporary files we tell compilers to write,
   and delete them at the end of the run.  */

/* This is the common prefix we use to make temp file names.
   It is chosen once for each run of this program.
2271
   It is substituted into a spec by %g or %j.
Richard Stallman committed
2272 2273 2274 2275 2276
   Thus, all temp file names contain this prefix.
   In practice, all temp file names start with this prefix.

   This prefix comes from the envvar TMPDIR if it is defined;
   otherwise, from the P_tmpdir macro if that is defined;
2277 2278
   otherwise, in /usr/tmp or /tmp;
   or finally the current directory if all else fails.  */
Richard Stallman committed
2279

2280
static const char *temp_filename;
Richard Stallman committed
2281 2282 2283 2284 2285 2286 2287 2288 2289

/* Length of the prefix.  */

static int temp_filename_length;

/* Define the list of temporary files to delete.  */

struct temp_file
{
2290
  const char *name;
Richard Stallman committed
2291 2292 2293 2294 2295 2296 2297 2298 2299 2300 2301 2302 2303 2304
  struct temp_file *next;
};

/* Queue of files to delete on success or failure of compilation.  */
static struct temp_file *always_delete_queue;
/* Queue of files to delete on failure of compilation.  */
static struct temp_file *failure_delete_queue;

/* Record FILENAME as a file to be deleted automatically.
   ALWAYS_DELETE nonzero means delete it if all compilation succeeds;
   otherwise delete it in any case.
   FAIL_DELETE nonzero means delete it if a compilation step fails;
   otherwise delete it in any case.  */

2305
void
2306
record_temp_file (const char *filename, int always_delete, int fail_delete)
Richard Stallman committed
2307
{
2308
  char *const name = xstrdup (filename);
Richard Stallman committed
2309 2310 2311

  if (always_delete)
    {
2312
      struct temp_file *temp;
Richard Stallman committed
2313 2314 2315
      for (temp = always_delete_queue; temp; temp = temp->next)
	if (! strcmp (name, temp->name))
	  goto already1;
2316

2317
      temp = XNEW (struct temp_file);
Richard Stallman committed
2318 2319 2320
      temp->next = always_delete_queue;
      temp->name = name;
      always_delete_queue = temp;
2321

Richard Stallman committed
2322 2323 2324 2325 2326
    already1:;
    }

  if (fail_delete)
    {
2327
      struct temp_file *temp;
Richard Stallman committed
2328 2329 2330
      for (temp = failure_delete_queue; temp; temp = temp->next)
	if (! strcmp (name, temp->name))
	  goto already2;
2331

2332
      temp = XNEW (struct temp_file);
Richard Stallman committed
2333 2334 2335
      temp->next = failure_delete_queue;
      temp->name = name;
      failure_delete_queue = temp;
2336

Richard Stallman committed
2337 2338 2339 2340 2341 2342
    already2:;
    }
}

/* Delete all the temporary files whose names we previously recorded.  */

2343 2344 2345 2346 2347 2348 2349 2350 2351 2352 2353
#ifndef DELETE_IF_ORDINARY
#define DELETE_IF_ORDINARY(NAME,ST,VERBOSE_FLAG)        \
do                                                      \
  {                                                     \
    if (stat (NAME, &ST) >= 0 && S_ISREG (ST.st_mode))  \
      if (unlink (NAME) < 0)                            \
	if (VERBOSE_FLAG)                               \
	  perror_with_name (NAME);                      \
  } while (0)
#endif

Richard Stallman committed
2354
static void
2355
delete_if_ordinary (const char *name)
2356 2357 2358 2359 2360 2361 2362 2363 2364
{
  struct stat st;
#ifdef DEBUG
  int i, c;

  printf ("Delete %s? (y or n) ", name);
  fflush (stdout);
  i = getchar ();
  if (i != '\n')
2365 2366 2367
    while ((c = getchar ()) != '\n' && c != EOF)
      ;

2368 2369
  if (i == 'y' || i == 'Y')
#endif /* DEBUG */
2370
  DELETE_IF_ORDINARY (name, st, verbose_flag);
2371 2372 2373
}

static void
2374
delete_temp_files (void)
Richard Stallman committed
2375
{
2376
  struct temp_file *temp;
Richard Stallman committed
2377 2378

  for (temp = always_delete_queue; temp; temp = temp->next)
2379
    delete_if_ordinary (temp->name);
Richard Stallman committed
2380 2381 2382 2383 2384 2385
  always_delete_queue = 0;
}

/* Delete all the files to be deleted on error.  */

static void
2386
delete_failure_queue (void)
Richard Stallman committed
2387
{
2388
  struct temp_file *temp;
Richard Stallman committed
2389 2390

  for (temp = failure_delete_queue; temp; temp = temp->next)
2391
    delete_if_ordinary (temp->name);
Richard Stallman committed
2392 2393 2394
}

static void
2395
clear_failure_queue (void)
Richard Stallman committed
2396 2397 2398 2399
{
  failure_delete_queue = 0;
}

2400 2401 2402 2403 2404 2405 2406 2407 2408 2409 2410 2411 2412 2413 2414 2415 2416 2417 2418
/* Call CALLBACK for each path in PATHS, breaking out early if CALLBACK
   returns non-NULL.
   If DO_MULTI is true iterate over the paths twice, first with multilib
   suffix then without, otherwise iterate over the paths once without
   adding a multilib suffix.  When DO_MULTI is true, some attempt is made
   to avoid visiting the same path twice, but we could do better.  For
   instance, /usr/lib/../lib is considered different from /usr/lib.
   At least EXTRA_SPACE chars past the end of the path passed to
   CALLBACK are available for use by the callback.
   CALLBACK_INFO allows extra parameters to be passed to CALLBACK.

   Returns the value returned by CALLBACK.  */

static void *
for_each_path (const struct path_prefix *paths,
	       bool do_multi,
	       size_t extra_space,
	       void *(*callback) (char *, void *),
	       void *callback_info)
2419
{
2420 2421 2422 2423 2424 2425 2426 2427 2428 2429 2430 2431 2432
  struct prefix_list *pl;
  const char *multi_dir = NULL;
  const char *multi_os_dir = NULL;
  const char *multi_suffix;
  const char *just_multi_suffix;
  char *path = NULL;
  void *ret = NULL;
  bool skip_multi_dir = false;
  bool skip_multi_os_dir = false;

  multi_suffix = machine_suffix;
  just_multi_suffix = just_machine_suffix;
  if (do_multi && multilib_dir && strcmp (multilib_dir, ".") != 0)
2433
    {
2434 2435 2436 2437 2438 2439
      multi_dir = concat (multilib_dir, dir_separator_str, NULL);
      multi_suffix = concat (multi_suffix, multi_dir, NULL);
      just_multi_suffix = concat (just_multi_suffix, multi_dir, NULL);
    }
  if (do_multi && multilib_os_dir && strcmp (multilib_os_dir, ".") != 0)
    multi_os_dir = concat (multilib_os_dir, dir_separator_str, NULL);
2440

2441 2442 2443 2444 2445 2446 2447 2448 2449 2450 2451 2452 2453 2454 2455 2456
  while (1)
    {
      size_t multi_dir_len = 0;
      size_t multi_os_dir_len = 0;
      size_t suffix_len;
      size_t just_suffix_len;
      size_t len;

      if (multi_dir)
	multi_dir_len = strlen (multi_dir);
      if (multi_os_dir)
	multi_os_dir_len = strlen (multi_os_dir);
      suffix_len = strlen (multi_suffix);
      just_suffix_len = strlen (just_multi_suffix);

      if (path == NULL)
2457
	{
2458 2459 2460 2461 2462
	  len = paths->max_len + extra_space + 1;
	  if (suffix_len > multi_os_dir_len)
	    len += suffix_len;
	  else
	    len += multi_os_dir_len;
2463
	  path = XNEWVEC (char, len);
2464 2465
	}

2466
      for (pl = paths->plist; pl != 0; pl = pl->next)
Charles Hannum committed
2467
	{
2468 2469
	  len = strlen (pl->prefix);
	  memcpy (path, pl->prefix, len);
Kazu Hirata committed
2470

2471 2472 2473 2474 2475 2476 2477 2478 2479 2480 2481 2482 2483 2484 2485 2486 2487 2488 2489 2490 2491 2492 2493 2494 2495 2496 2497 2498 2499 2500 2501 2502 2503 2504 2505 2506 2507 2508 2509 2510 2511 2512 2513 2514 2515 2516 2517
	  /* Look first in MACHINE/VERSION subdirectory.  */
	  if (!skip_multi_dir)
	    {
	      memcpy (path + len, multi_suffix, suffix_len + 1);
	      ret = callback (path, callback_info);
	      if (ret)
		break;
	    }

	  /* Some paths are tried with just the machine (ie. target)
	     subdir.  This is used for finding as, ld, etc.  */
	  if (!skip_multi_dir
	      && pl->require_machine_suffix == 2)
	    {
	      memcpy (path + len, just_multi_suffix, just_suffix_len + 1);
	      ret = callback (path, callback_info);
	      if (ret)
		break;
	    }

	  /* Now try the base path.  */
	  if (!pl->require_machine_suffix
	      && !(pl->os_multilib ? skip_multi_os_dir : skip_multi_dir))
	    {
	      const char *this_multi;
	      size_t this_multi_len;

	      if (pl->os_multilib)
		{
		  this_multi = multi_os_dir;
		  this_multi_len = multi_os_dir_len;
		}
	      else
		{
		  this_multi = multi_dir;
		  this_multi_len = multi_dir_len;
		}

	      if (this_multi_len)
		memcpy (path + len, this_multi, this_multi_len + 1);
	      else
		path[len] = '\0';

	      ret = callback (path, callback_info);
	      if (ret)
		break;
	    }
Charles Hannum committed
2518
	}
2519 2520
      if (pl)
	break;
Charles Hannum committed
2521

2522 2523
      if (multi_dir == NULL && multi_os_dir == NULL)
	break;
2524

2525 2526 2527 2528 2529 2530 2531 2532 2533 2534
      /* Run through the paths again, this time without multilibs.
	 Don't repeat any we have already seen.  */
      if (multi_dir)
	{
	  free ((char *) multi_dir);
	  multi_dir = NULL;
	  free ((char *) multi_suffix);
	  multi_suffix = machine_suffix;
	  free ((char *) just_multi_suffix);
	  just_multi_suffix = just_machine_suffix;
2535
	}
2536 2537 2538 2539 2540 2541 2542 2543 2544 2545 2546 2547 2548 2549 2550 2551
      else
	skip_multi_dir = true;
      if (multi_os_dir)
	{
	  free ((char *) multi_os_dir);
	  multi_os_dir = NULL;
	}
      else
	skip_multi_os_dir = true;
    }

  if (multi_dir)
    {
      free ((char *) multi_dir);
      free ((char *) multi_suffix);
      free ((char *) just_multi_suffix);
2552
    }
2553 2554 2555 2556 2557 2558 2559 2560 2561 2562 2563 2564 2565 2566 2567 2568 2569 2570 2571 2572 2573 2574 2575 2576 2577 2578 2579 2580 2581 2582 2583 2584 2585 2586 2587 2588 2589 2590 2591 2592 2593 2594 2595 2596 2597 2598 2599 2600 2601 2602 2603 2604 2605 2606
  if (multi_os_dir)
    free ((char *) multi_os_dir);
  if (ret != path)
    free (path);
  return ret;
}

/* Callback for build_search_list.  Adds path to obstack being built.  */

struct add_to_obstack_info {
  struct obstack *ob;
  bool check_dir;
  bool first_time;
};

static void *
add_to_obstack (char *path, void *data)
{
  struct add_to_obstack_info *info = data;

  if (info->check_dir && !is_directory (path, false))
    return NULL;

  if (!info->first_time)
    obstack_1grow (info->ob, PATH_SEPARATOR);

  obstack_grow (info->ob, path, strlen (path));

  info->first_time = false;
  return NULL;
}

/* Build a list of search directories from PATHS.
   PREFIX is a string to prepend to the list.
   If CHECK_DIR_P is true we ensure the directory exists.
   If DO_MULTI is true, multilib paths are output first, then
   non-multilib paths.
   This is used mostly by putenv_from_prefixes so we use `collect_obstack'.
   It is also used by the --print-search-dirs flag.  */

static char *
build_search_list (const struct path_prefix *paths, const char *prefix,
		   bool check_dir, bool do_multi)
{
  struct add_to_obstack_info info;

  info.ob = &collect_obstack;
  info.check_dir = check_dir;
  info.first_time = true;

  obstack_grow (&collect_obstack, prefix, strlen (prefix));
  obstack_1grow (&collect_obstack, '=');

  for_each_path (paths, do_multi, 0, add_to_obstack, &info);
2607

2608
  obstack_1grow (&collect_obstack, '\0');
2609
  return XOBFINISH (&collect_obstack, char *);
2610 2611
}

Mike Stump committed
2612 2613
/* Rebuild the COMPILER_PATH and LIBRARY_PATH environment variables
   for collect.  */
2614 2615

static void
2616 2617
putenv_from_prefixes (const struct path_prefix *paths, const char *env_var,
		      bool do_multi)
2618
{
2619
  putenv (build_search_list (paths, env_var, true, do_multi));
2620
}
2621

2622 2623 2624 2625
/* Check whether NAME can be accessed in MODE.  This is like access,
   except that it never considers directories to be executable.  */

static int
2626
access_check (const char *name, int mode)
2627 2628 2629 2630 2631 2632 2633 2634 2635 2636 2637 2638 2639
{
  if (mode == X_OK)
    {
      struct stat st;

      if (stat (name, &st) < 0
	  || S_ISDIR (st.st_mode))
	return -1;
    }

  return access (name, mode);
}

2640 2641 2642 2643 2644 2645 2646 2647 2648 2649 2650 2651 2652 2653 2654 2655 2656 2657 2658 2659 2660 2661 2662 2663 2664 2665 2666 2667 2668 2669 2670 2671 2672 2673 2674 2675 2676
/* Callback for find_a_file.  Appends the file name to the directory
   path.  If the resulting file exists in the right mode, return the
   full pathname to the file.  */

struct file_at_path_info {
  const char *name;
  const char *suffix;
  int name_len;
  int suffix_len;
  int mode;
};

static void *
file_at_path (char *path, void *data)
{
  struct file_at_path_info *info = data;
  size_t len = strlen (path);

  memcpy (path + len, info->name, info->name_len);
  len += info->name_len;

  /* Some systems have a suffix for executable files.
     So try appending that first.  */
  if (info->suffix_len)
    {
      memcpy (path + len, info->suffix, info->suffix_len + 1);
      if (access_check (path, info->mode) == 0)
	return path;
    }

  path[len] = '\0';
  if (access_check (path, info->mode) == 0)
    return path;

  return NULL;
}

Richard Stallman committed
2677
/* Search for NAME using the prefix list PREFIXES.  MODE is passed to
2678 2679
   access to check permissions.  If DO_MULTI is true, search multilib
   paths then non-multilib paths, otherwise do not search multilib paths.
Mike Stump committed
2680
   Return 0 if not found, otherwise return its name, allocated with malloc.  */
Richard Stallman committed
2681 2682

static char *
2683 2684
find_a_file (const struct path_prefix *pprefix, const char *name, int mode,
	     bool do_multi)
Richard Stallman committed
2685
{
2686
  struct file_at_path_info info;
Richard Stallman committed
2687

2688
#ifdef DEFAULT_ASSEMBLER
2689
  if (! strcmp (name, "as") && access (DEFAULT_ASSEMBLER, mode) == 0)
2690
    return xstrdup (DEFAULT_ASSEMBLER);
2691 2692 2693
#endif

#ifdef DEFAULT_LINKER
2694 2695
  if (! strcmp(name, "ld") && access (DEFAULT_LINKER, mode) == 0)
    return xstrdup (DEFAULT_LINKER);
2696 2697
#endif

Richard Stallman committed
2698 2699
  /* Determine the filename to execute (special case for absolute paths).  */

2700
  if (IS_ABSOLUTE_PATH (name))
Richard Stallman committed
2701
    {
2702
      if (access (name, mode) == 0)
2703
	return xstrdup (name);
2704

2705 2706
      return NULL;
    }
2707

2708 2709 2710 2711 2712
  info.name = name;
  info.suffix = (mode & X_OK) != 0 ? HOST_EXECUTABLE_SUFFIX : "";
  info.name_len = strlen (info.name);
  info.suffix_len = strlen (info.suffix);
  info.mode = mode;
Richard Stallman committed
2713

2714 2715
  return for_each_path (pprefix, do_multi, info.name_len + info.suffix_len,
			file_at_path, &info);
Richard Stallman committed
2716 2717
}

2718
/* Ranking of prefixes in the sort list. -B prefixes are put before
Kazu Hirata committed
2719
   all others.  */
2720 2721 2722 2723 2724 2725 2726

enum path_prefix_priority
{
  PREFIX_PRIORITY_B_OPT,
  PREFIX_PRIORITY_LAST
};

2727
/* Add an entry for PREFIX in PLIST.  The PLIST is kept in ascending
2728 2729
   order according to PRIORITY.  Within each PRIORITY, new entries are
   appended.
Richard Stallman committed
2730 2731 2732

   If WARN is nonzero, we will warn if no file is found
   through this prefix.  WARN should point to an int
Charles Hannum committed
2733 2734
   which will be set to 1 if this entry is used.

2735 2736
   COMPONENT is the value to be passed to update_path.

Charles Hannum committed
2737 2738 2739
   REQUIRE_MACHINE_SUFFIX is 1 if this prefix can't be used without
   the complete value of machine_suffix.
   2 means try both machine_suffix and just_machine_suffix.  */
Richard Stallman committed
2740 2741

static void
2742 2743
add_prefix (struct path_prefix *pprefix, const char *prefix,
	    const char *component, /* enum prefix_priority */ int priority,
2744
	    int require_machine_suffix, int os_multilib)
Richard Stallman committed
2745 2746 2747 2748
{
  struct prefix_list *pl, **prev;
  int len;

2749 2750 2751 2752
  for (prev = &pprefix->plist;
       (*prev) != NULL && (*prev)->priority <= priority;
       prev = &(*prev)->next)
    ;
Richard Stallman committed
2753

2754
  /* Keep track of the longest prefix.  */
Richard Stallman committed
2755

2756
  prefix = update_path (prefix, component);
Richard Stallman committed
2757 2758 2759 2760
  len = strlen (prefix);
  if (len > pprefix->max_len)
    pprefix->max_len = len;

2761
  pl = XNEW (struct prefix_list);
2762
  pl->prefix = prefix;
Richard Stallman committed
2763
  pl->require_machine_suffix = require_machine_suffix;
2764
  pl->priority = priority;
2765
  pl->os_multilib = os_multilib;
Richard Stallman committed
2766

2767
  /* Insert after PREV.  */
2768 2769
  pl->next = (*prev);
  (*prev) = pl;
Richard Stallman committed
2770
}
2771 2772

/* Same as add_prefix, but prepending target_system_root to prefix.  */
2773
/* The target_system_root prefix has been relocated by gcc_exec_prefix.  */
2774
static void
2775 2776 2777
add_sysrooted_prefix (struct path_prefix *pprefix, const char *prefix,
		      const char *component,
		      /* enum prefix_priority */ int priority,
2778
		      int require_machine_suffix, int os_multilib)
2779
{
2780
  if (!IS_ABSOLUTE_PATH (prefix))
2781
    fatal ("system path '%s' is not absolute", prefix);
2782 2783 2784

  if (target_system_root)
    {
2785 2786
      if (target_sysroot_suffix)
	  prefix = concat (target_sysroot_suffix, prefix, NULL);
2787
      prefix = concat (target_system_root, prefix, NULL);
2788

2789 2790 2791 2792 2793 2794
      /* We have to override this because GCC's notion of sysroot
	 moves along with GCC.  */
      component = "GCC";
    }

  add_prefix (pprefix, prefix, component, priority,
2795
	      require_machine_suffix, os_multilib);
2796
}
Richard Stallman committed
2797 2798 2799 2800 2801 2802 2803 2804

/* Execute the command specified by the arguments on the current line of spec.
   When using pipes, this includes several piped-together commands
   with `|' between them.

   Return 0 if successful, -1 if failed.  */

static int
2805
execute (void)
Richard Stallman committed
2806 2807 2808 2809
{
  int i;
  int n_commands;		/* # of command.  */
  char *string;
2810
  struct pex_obj *pex;
Richard Stallman committed
2811
  struct command
Kazu Hirata committed
2812 2813 2814 2815
  {
    const char *prog;		/* program name.  */
    const char **argv;		/* vector of args.  */
  };
Richard Stallman committed
2816 2817 2818

  struct command *commands;	/* each command buffer with above info.  */

2819
  gcc_assert (!processing_spec_function);
2820

Richard Stallman committed
2821 2822 2823 2824 2825 2826
  /* Count # of piped commands.  */
  for (n_commands = 1, i = 0; i < argbuf_index; i++)
    if (strcmp (argbuf[i], "|") == 0)
      n_commands++;

  /* Get storage for each command.  */
2827
  commands = alloca (n_commands * sizeof (struct command));
Richard Stallman committed
2828 2829 2830 2831 2832 2833 2834

  /* Split argbuf into its separate piped processes,
     and record info about each one.
     Also search for the programs that are to be run.  */

  commands[0].prog = argbuf[0]; /* first command.  */
  commands[0].argv = &argbuf[0];
2835
  string = find_a_file (&exec_prefixes, commands[0].prog, X_OK, false);
Bob Manson committed
2836

Richard Stallman committed
2837 2838 2839 2840 2841 2842
  if (string)
    commands[0].argv[0] = string;

  for (n_commands = 1, i = 0; i < argbuf_index; i++)
    if (strcmp (argbuf[i], "|") == 0)
      {				/* each command.  */
2843
#if defined (__MSDOS__) || defined (OS2) || defined (VMS)
Kazu Hirata committed
2844
	fatal ("-pipe not supported");
Richard Stallman committed
2845 2846 2847 2848
#endif
	argbuf[i] = 0;	/* termination of command args.  */
	commands[n_commands].prog = argbuf[i + 1];
	commands[n_commands].argv = &argbuf[i + 1];
2849
	string = find_a_file (&exec_prefixes, commands[n_commands].prog,
2850
			      X_OK, false);
Richard Stallman committed
2851 2852 2853 2854 2855 2856 2857 2858 2859
	if (string)
	  commands[n_commands].argv[0] = string;
	n_commands++;
      }

  argbuf[argbuf_index] = 0;

  /* If -v, print what we are about to do, and maybe query.  */

2860
  if (verbose_flag)
Richard Stallman committed
2861
    {
Nick Clifton committed
2862 2863 2864
      /* For help listings, put a blank line between sub-processes.  */
      if (print_help_list)
	fputc ('\n', stderr);
Kazu Hirata committed
2865

Richard Stallman committed
2866
      /* Print each piped command as a separate line.  */
Kazu Hirata committed
2867
      for (i = 0; i < n_commands; i++)
Richard Stallman committed
2868
	{
2869
	  const char *const *j;
Richard Stallman committed
2870

2871 2872
	  if (verbose_only_flag)
	    {
2873 2874
	      for (j = commands[i].argv; *j; j++)
		{
2875
		  const char *p;
2876 2877 2878 2879 2880 2881 2882 2883 2884
		  fprintf (stderr, " \"");
		  for (p = *j; *p; ++p)
		    {
		      if (*p == '"' || *p == '\\' || *p == '$')
			fputc ('\\', stderr);
		      fputc (*p, stderr);
		    }
		  fputc ('"', stderr);
		}
2885 2886
	    }
	  else
2887 2888
	    for (j = commands[i].argv; *j; j++)
	      fprintf (stderr, " %s", *j);
Richard Stallman committed
2889 2890 2891 2892 2893 2894 2895

	  /* Print a pipe symbol after all but the last command.  */
	  if (i + 1 != n_commands)
	    fprintf (stderr, " |");
	  fprintf (stderr, "\n");
	}
      fflush (stderr);
2896
      if (verbose_only_flag != 0)
2897 2898 2899
        {
	  /* verbose_only_flag should act as if the spec was
	     executed, so increment execution_count before
2900
	     returning.  This prevents spurious warnings about
2901 2902 2903 2904
	     unused linker input files, etc.  */
	  execution_count++;
	  return 0;
        }
Richard Stallman committed
2905
#ifdef DEBUG
2906
      notice ("\nGo ahead? (y or n) ");
Richard Stallman committed
2907 2908 2909
      fflush (stderr);
      i = getchar ();
      if (i != '\n')
2910 2911 2912
	while (getchar () != '\n')
	  ;

Richard Stallman committed
2913 2914 2915 2916 2917
      if (i != 'y' && i != 'Y')
	return 0;
#endif /* DEBUG */
    }

2918
#ifdef ENABLE_VALGRIND_CHECKING
2919
  /* Run the each command through valgrind.  To simplify prepending the
2920 2921 2922 2923 2924 2925 2926 2927 2928 2929 2930 2931 2932 2933 2934 2935 2936 2937 2938 2939 2940 2941 2942 2943 2944
     path to valgrind and the option "-q" (for quiet operation unless
     something triggers), we allocate a separate argv array.  */

  for (i = 0; i < n_commands; i++)
    {
      const char **argv;
      int argc;
      int j;

      for (argc = 0; commands[i].argv[argc] != NULL; argc++)
	;

      argv = alloca ((argc + 3) * sizeof (char *));

      argv[0] = VALGRIND_PATH;
      argv[1] = "-q";
      for (j = 2; j < argc + 2; j++)
	argv[j] = commands[i].argv[j - 2];
      argv[j] = NULL;

      commands[i].argv = argv;
      commands[i].prog = argv[0];
    }
#endif

Richard Stallman committed
2945 2946
  /* Run each piped subprocess.  */

2947 2948 2949 2950 2951
  pex = pex_init (PEX_USE_PIPES | (report_times ? PEX_RECORD_TIMES : 0),
		  programname, temp_filename);
  if (pex == NULL)
    pfatal_with_name (_("pex_init failed"));

Richard Stallman committed
2952 2953
  for (i = 0; i < n_commands; i++)
    {
2954 2955
      const char *errmsg;
      int err;
Zack Weinberg committed
2956
      const char *string = commands[i].argv[0];
Richard Stallman committed
2957

2958 2959 2960 2961 2962 2963 2964 2965 2966 2967 2968 2969 2970 2971 2972
      errmsg = pex_run (pex,
			((i + 1 == n_commands ? PEX_LAST : 0)
			 | (string == commands[i].prog ? PEX_SEARCH : 0)),
			string, (char * const *) commands[i].argv,
			NULL, NULL, &err);
      if (errmsg != NULL)
	{
	  if (err == 0)
	    fatal (errmsg);
	  else
	    {
	      errno = err;
	      pfatal_with_name (errmsg);
	    }
	}
Richard Stallman committed
2973 2974

      if (string != commands[i].prog)
2975
	free ((void *) string);
Richard Stallman committed
2976 2977 2978 2979
    }

  execution_count++;

2980
  /* Wait for all the subprocesses to finish.  */
Richard Stallman committed
2981 2982

  {
2983 2984
    int *statuses;
    struct pex_time *times = NULL;
Richard Stallman committed
2985 2986
    int ret_code = 0;

2987 2988 2989 2990 2991
    statuses = alloca (n_commands * sizeof (int));
    if (!pex_get_status (pex, n_commands, statuses))
      pfatal_with_name (_("failed to get exit status"));

    if (report_times)
Richard Stallman committed
2992
      {
2993 2994 2995 2996
	times = alloca (n_commands * sizeof (struct pex_time));
	if (!pex_get_times (pex, n_commands, times))
	  pfatal_with_name (_("failed to get process times"));
      }
Richard Stallman committed
2997

2998
    pex_free (pex);
Richard Stallman committed
2999

3000 3001 3002
    for (i = 0; i < n_commands; ++i)
      {
	int status = statuses[i];
3003

3004 3005
	if (WIFSIGNALED (status))
	  {
3006
#ifdef SIGPIPE
3007 3008 3009 3010 3011 3012 3013 3014
	    /* SIGPIPE is a special case.  It happens in -pipe mode
	       when the compiler dies before the preprocessor is done,
	       or the assembler dies before the compiler is done.
	       There's generally been an error already, and this is
	       just fallout.  So don't generate another error unless
	       we would otherwise have succeeded.  */
	    if (WTERMSIG (status) == SIGPIPE
		&& (signal_count || greatest_status >= MIN_FATAL_STATUS))
3015 3016 3017 3018
	      {
		signal_count++;
		ret_code = -1;
	      }
3019 3020
	    else
#endif
3021
	      fatal_ice ("\
3022 3023 3024
Internal error: %s (program %s)\n\
Please submit a full bug report.\n\
See %s for instructions.",
3025 3026
		 	strsignal (WTERMSIG (status)), commands[i].prog,
		 	bug_report_url);
3027 3028 3029 3030 3031 3032 3033 3034 3035 3036 3037 3038 3039 3040 3041 3042 3043 3044 3045 3046 3047 3048
	  }
	else if (WIFEXITED (status)
		 && WEXITSTATUS (status) >= MIN_FATAL_STATUS)
	  {
	    if (WEXITSTATUS (status) > greatest_status)
	      greatest_status = WEXITSTATUS (status);
	    ret_code = -1;
	  }

	if (report_times)
	  {
	    struct pex_time *pt = &times[i];
	    double ut, st;

	    ut = ((double) pt->user_seconds
		  + (double) pt->user_microseconds / 1.0e6);
	    st = ((double) pt->system_seconds
		  + (double) pt->system_microseconds / 1.0e6);

	    if (ut + st != 0)
	      notice ("# %s %.2f %.2f\n", commands[i].prog, ut, st);
	  }
Richard Stallman committed
3049
      }
3050

Richard Stallman committed
3051 3052 3053 3054 3055 3056 3057 3058 3059 3060
    return ret_code;
  }
}

/* Find all the switches given to us
   and make a vector describing them.
   The elements of the vector are strings, one per switch given.
   If a switch uses following arguments, then the `part1' field
   is the switch itself and the `args' field
   is a null-terminated vector containing the following arguments.
3061 3062 3063 3064
   The `live_cond' field is:
   0 when initialized
   1 if the switch is true in a conditional spec,
   -1 if false (overridden by a later switch)
3065
   -2 if this switch should be ignored (used in %<S)
3066
   The `validated' field is nonzero if any spec has looked at this switch;
Richard Stallman committed
3067 3068
   if it remains zero at the end of the run, it must be meaningless.  */

3069 3070 3071 3072 3073
#define SWITCH_OK       0
#define SWITCH_FALSE   -1
#define SWITCH_IGNORE  -2
#define SWITCH_LIVE     1

Richard Stallman committed
3074 3075
struct switchstr
{
3076
  const char *part1;
Zack Weinberg committed
3077
  const char **args;
3078
  int live_cond;
3079 3080
  unsigned char validated;
  unsigned char ordering;
Richard Stallman committed
3081 3082 3083 3084 3085 3086
};

static struct switchstr *switches;

static int n_switches;

3087 3088 3089 3090 3091 3092 3093
/* Language is one of three things:

   1) The name of a real programming language.
   2) NULL, indicating that no one has figured out
   what it is yet.
   3) '*', indicating that the file should be passed
   to the linker.  */
Richard Stallman committed
3094 3095
struct infile
{
3096 3097
  const char *name;
  const char *language;
3098 3099 3100
  struct compiler *incompiler;
  bool compiled;
  bool preprocessed;
Richard Stallman committed
3101 3102 3103 3104 3105 3106
};

/* Also a vector of input files specified.  */

static struct infile *infiles;

3107
int n_infiles;
Richard Stallman committed
3108

Geoffrey Keating committed
3109 3110 3111 3112 3113
/* True if multiple input files are being compiled to a single
   assembly file.  */

static bool combine_inputs;

3114
/* This counts the number of libraries added by lang_specific_driver, so that
3115 3116 3117 3118
   we can tell if there were any user supplied any files or libraries.  */

static int added_libraries;

Richard Stallman committed
3119 3120
/* And a vector of corresponding output files is made up later.  */

3121
const char **outfiles;
3122

3123
#if defined(HAVE_TARGET_OBJECT_SUFFIX) || defined(HAVE_TARGET_EXECUTABLE_SUFFIX)
3124 3125

/* Convert NAME to a new name if it is the standard suffix.  DO_EXE
3126 3127
   is true if we should look for an executable suffix.  DO_OBJ
   is true if we should look for an object suffix.  */
3128

3129
static const char *
3130 3131
convert_filename (const char *name, int do_exe ATTRIBUTE_UNUSED,
		  int do_obj ATTRIBUTE_UNUSED)
3132
{
3133
#if defined(HAVE_TARGET_EXECUTABLE_SUFFIX)
3134
  int i;
3135
#endif
3136 3137 3138 3139
  int len;

  if (name == NULL)
    return NULL;
Kazu Hirata committed
3140

3141
  len = strlen (name);
3142

3143 3144
#ifdef HAVE_TARGET_OBJECT_SUFFIX
  /* Convert x.o to x.obj if TARGET_OBJECT_SUFFIX is ".obj".  */
3145
  if (do_obj && len > 2
3146 3147 3148
      && name[len - 2] == '.'
      && name[len - 1] == 'o')
    {
3149
      obstack_grow (&obstack, name, len - 2);
3150
      obstack_grow0 (&obstack, TARGET_OBJECT_SUFFIX, strlen (TARGET_OBJECT_SUFFIX));
3151
      name = XOBFINISH (&obstack, const char *);
3152 3153 3154
    }
#endif

3155
#if defined(HAVE_TARGET_EXECUTABLE_SUFFIX)
3156 3157
  /* If there is no filetype, make it the executable suffix (which includes
     the ".").  But don't get confused if we have just "-o".  */
3158
  if (! do_exe || TARGET_EXECUTABLE_SUFFIX[0] == 0 || (len == 2 && name[0] == '-'))
3159 3160
    return name;

3161
  for (i = len - 1; i >= 0; i--)
3162
    if (IS_DIR_SEPARATOR (name[i]))
3163 3164 3165
      break;

  for (i++; i < len; i++)
3166 3167 3168 3169
    if (name[i] == '.')
      return name;

  obstack_grow (&obstack, name, len);
Richard Kenner committed
3170 3171
  obstack_grow0 (&obstack, TARGET_EXECUTABLE_SUFFIX,
		 strlen (TARGET_EXECUTABLE_SUFFIX));
3172
  name = XOBFINISH (&obstack, const char *);
3173 3174 3175 3176 3177 3178
#endif

  return name;
}
#endif

Nick Clifton committed
3179 3180
/* Display the command line switches accepted by gcc.  */
static void
3181
display_help (void)
Nick Clifton committed
3182
{
3183 3184
  printf (_("Usage: %s [options] file...\n"), programname);
  fputs (_("Options:\n"), stdout);
Nick Clifton committed
3185

3186 3187
  fputs (_("  -pass-exit-codes         Exit with highest error code from a phase\n"), stdout);
  fputs (_("  --help                   Display this information\n"), stdout);
3188
  fputs (_("  --target-help            Display target specific command line options\n"), stdout);
3189 3190
  fputs (_("  --help={target|optimizers|warnings|undocumented|params}[,{[^]joined|[^]separate}]\n"), stdout);
  fputs (_("                           Display specific types of command line options\n"), stdout);
Nick Clifton committed
3191
  if (! verbose_flag)
3192 3193 3194 3195 3196 3197 3198 3199 3200 3201 3202 3203
    fputs (_("  (Use '-v --help' to display command line options of sub-processes)\n"), stdout);
  fputs (_("  -dumpspecs               Display all of the built in spec strings\n"), stdout);
  fputs (_("  -dumpversion             Display the version of the compiler\n"), stdout);
  fputs (_("  -dumpmachine             Display the compiler's target processor\n"), stdout);
  fputs (_("  -print-search-dirs       Display the directories in the compiler's search path\n"), stdout);
  fputs (_("  -print-libgcc-file-name  Display the name of the compiler's companion library\n"), stdout);
  fputs (_("  -print-file-name=<lib>   Display the full path to library <lib>\n"), stdout);
  fputs (_("  -print-prog-name=<prog>  Display the full path to compiler component <prog>\n"), stdout);
  fputs (_("  -print-multi-directory   Display the root directory for versions of libgcc\n"), stdout);
  fputs (_("\
  -print-multi-lib         Display the mapping between command line options and\n\
                           multiple library search directories\n"), stdout);
3204
  fputs (_("  -print-multi-os-directory Display the relative path to OS libraries\n"), stdout);
3205
  fputs (_("  -print-sysroot-headers-suffix Display the sysroot suffix used to find headers\n"), stdout);
3206 3207 3208
  fputs (_("  -Wa,<options>            Pass comma-separated <options> on to the assembler\n"), stdout);
  fputs (_("  -Wp,<options>            Pass comma-separated <options> on to the preprocessor\n"), stdout);
  fputs (_("  -Wl,<options>            Pass comma-separated <options> on to the linker\n"), stdout);
3209 3210
  fputs (_("  -Xassembler <arg>        Pass <arg> on to the assembler\n"), stdout);
  fputs (_("  -Xpreprocessor <arg>     Pass <arg> on to the preprocessor\n"), stdout);
3211
  fputs (_("  -Xlinker <arg>           Pass <arg> on to the linker\n"), stdout);
3212
  fputs (_("  -combine                 Pass multiple source files to compiler at once\n"), stdout);
3213 3214 3215
  fputs (_("  -save-temps              Do not delete intermediate files\n"), stdout);
  fputs (_("  -pipe                    Use pipes rather than intermediate files\n"), stdout);
  fputs (_("  -time                    Time the execution of each subprocess\n"), stdout);
3216
  fputs (_("  -specs=<file>            Override built-in specs with the contents of <file>\n"), stdout);
3217
  fputs (_("  -std=<standard>          Assume that the input sources are for <standard>\n"), stdout);
3218 3219
  fputs (_("\
  --sysroot=<directory>    Use <directory> as the root directory for headers\n\
3220
                           and libraries\n"), stdout);
3221 3222 3223 3224
  fputs (_("  -B <directory>           Add <directory> to the compiler's search paths\n"), stdout);
  fputs (_("  -b <machine>             Run gcc for target <machine>, if installed\n"), stdout);
  fputs (_("  -V <version>             Run gcc version number <version>, if installed\n"), stdout);
  fputs (_("  -v                       Display the programs invoked by the compiler\n"), stdout);
3225
  fputs (_("  -###                     Like -v but options quoted and commands not executed\n"), stdout);
3226 3227 3228 3229 3230 3231
  fputs (_("  -E                       Preprocess only; do not compile, assemble or link\n"), stdout);
  fputs (_("  -S                       Compile only; do not assemble or link\n"), stdout);
  fputs (_("  -c                       Compile and assemble, but do not link\n"), stdout);
  fputs (_("  -o <file>                Place the output into <file>\n"), stdout);
  fputs (_("\
  -x <language>            Specify the language of the following input files\n\
3232
                           Permissible languages include: c c++ assembler none\n\
3233
                           'none' means revert to the default behavior of\n\
3234 3235 3236
                           guessing the language based on the file's extension\n\
"), stdout);

3237
  printf (_("\
3238 3239 3240
\nOptions starting with -g, -f, -m, -O, -W, or --param are automatically\n\
 passed on to the various sub-processes invoked by %s.  In order to pass\n\
 other options on to these processes the -W<letter> options must be used.\n\
3241
"), programname);
Nick Clifton committed
3242 3243 3244 3245 3246

  /* The rest of the options are displayed by invocations of the various
     sub-processes.  */
}

Kazu Hirata committed
3247
static void
3248
add_preprocessor_option (const char *option, int len)
Kazu Hirata committed
3249
{
3250
  n_preprocessor_options++;
Kazu Hirata committed
3251

3252
  if (! preprocessor_options)
3253
    preprocessor_options = XNEWVEC (char *, n_preprocessor_options);
3254
  else
3255 3256
    preprocessor_options = xrealloc (preprocessor_options,
				     n_preprocessor_options * sizeof (char *));
Kazu Hirata committed
3257

3258 3259
  preprocessor_options [n_preprocessor_options - 1] =
    save_string (option, len);
Nick Clifton committed
3260
}
Kazu Hirata committed
3261 3262

static void
3263
add_assembler_option (const char *option, int len)
3264 3265 3266 3267
{
  n_assembler_options++;

  if (! assembler_options)
3268
    assembler_options = XNEWVEC (char *, n_assembler_options);
3269
  else
3270 3271
    assembler_options = xrealloc (assembler_options,
				  n_assembler_options * sizeof (char *));
3272 3273

  assembler_options [n_assembler_options - 1] = save_string (option, len);
Nick Clifton committed
3274
}
Kazu Hirata committed
3275 3276

static void
3277
add_linker_option (const char *option, int len)
3278 3279 3280 3281
{
  n_linker_options++;

  if (! linker_options)
3282
    linker_options = XNEWVEC (char *, n_linker_options);
3283
  else
3284 3285
    linker_options = xrealloc (linker_options,
			       n_linker_options * sizeof (char *));
3286 3287

  linker_options [n_linker_options - 1] = save_string (option, len);
Nick Clifton committed
3288
}
Nick Clifton committed
3289

Richard Stallman committed
3290 3291 3292 3293
/* Create the vector `switches' and its contents.
   Store its length in `n_switches'.  */

static void
3294
process_command (int argc, const char **argv)
Richard Stallman committed
3295
{
3296
  int i;
3297 3298
  const char *temp;
  char *temp1;
Zack Weinberg committed
3299
  const char *spec_lang = 0;
Richard Stallman committed
3300
  int last_language_n_infiles;
3301
  int lang_n_infiles = 0;
3302 3303
#ifdef MODIFY_TARGET_NAME
  int is_modify_target_name;
3304
  unsigned int j;
3305
#endif
3306
  const char *tooldir_prefix;
Richard Stallman committed
3307

3308
  GET_ENVIRONMENT (gcc_exec_prefix, "GCC_EXEC_PREFIX");
3309

Richard Stallman committed
3310 3311
  n_switches = 0;
  n_infiles = 0;
3312
  added_libraries = 0;
3313

3314 3315
  /* Figure compiler version from version string.  */

Kazu Hirata committed
3316
  compiler_version = temp1 = xstrdup (version_string);
3317

3318
  for (; *temp1; ++temp1)
3319
    {
3320
      if (*temp1 == ' ')
3321
	{
3322
	  *temp1 = '\0';
3323 3324 3325
	  break;
	}
    }
Richard Stallman committed
3326

3327
  /* If there is a -V or -b option (or both), process it now, before
Diego Novillo committed
3328
     trying to interpret the rest of the command line.
3329 3330
     Use heuristic that all configuration names must have at least
     one dash '-'. This allows us to pass options starting with -b.  */
3331
  if (argc > 1 && argv[1][0] == '-'
Diego Novillo committed
3332
      && (argv[1][1] == 'V' ||
3333
	 ((argv[1][1] == 'b') && (NULL != strchr(argv[1] + 2,'-')))))
3334 3335 3336
    {
      const char *new_version = DEFAULT_TARGET_VERSION;
      const char *new_machine = DEFAULT_TARGET_MACHINE;
3337 3338
      const char *progname = argv[0];
      char **new_argv;
3339 3340
      char *new_argv0;
      int baselen;
3341

3342
      while (argc > 1 && argv[1][0] == '-'
3343 3344
	     && (argv[1][1] == 'V' ||
		((argv[1][1] == 'b') && ( NULL != strchr(argv[1] + 2,'-')))))
3345
	{
3346
	  char opt = argv[1][1];
3347
	  const char *arg;
3348
	  if (argv[1][2] != '\0')
3349
	    {
3350
	      arg = argv[1] + 2;
3351
	      argc -= 1;
3352
	      argv += 1;
3353 3354 3355
	    }
	  else if (argc > 2)
	    {
3356
	      arg = argv[2];
3357
	      argc -= 2;
3358
	      argv += 2;
3359 3360
	    }
	  else
3361
	    fatal ("'-%c' option must have argument", opt);
3362 3363 3364 3365 3366 3367
	  if (opt == 'V')
	    new_version = arg;
	  else
	    new_machine = arg;
	}

3368 3369
      for (baselen = strlen (progname); baselen > 0; baselen--)
	if (IS_DIR_SEPARATOR (progname[baselen-1]))
3370
	  break;
3371
      new_argv0 = xmemdup (progname, baselen,
3372 3373 3374 3375 3376 3377
			   baselen + concat_length (new_version, new_machine,
						    "-gcc-", NULL) + 1);
      strcpy (new_argv0 + baselen, new_machine);
      strcat (new_argv0, "-gcc-");
      strcat (new_argv0, new_version);

3378 3379
      new_argv = xmemdup (argv, (argc + 1) * sizeof (argv[0]),
			  (argc + 1) * sizeof (argv[0]));
3380 3381 3382
      new_argv[0] = new_argv0;

      execvp (new_argv0, new_argv);
3383
      fatal ("couldn't run '%s': %s", new_argv0, xstrerror (errno));
3384 3385
    }

Tom Tromey committed
3386 3387 3388
  /* Set up the default search paths.  If there is no GCC_EXEC_PREFIX,
     see if we can create it from the pathname specified in argv[0].  */

3389
  gcc_libexec_prefix = standard_libexec_prefix;
Tom Tromey committed
3390 3391 3392 3393 3394 3395
#ifndef VMS
  /* FIXME: make_relative_prefix doesn't yet work for VMS.  */
  if (!gcc_exec_prefix)
    {
      gcc_exec_prefix = make_relative_prefix (argv[0], standard_bindir_prefix,
					      standard_exec_prefix);
3396
      gcc_libexec_prefix = make_relative_prefix (argv[0],
3397 3398
						 standard_bindir_prefix,
						 standard_libexec_prefix);
Tom Tromey committed
3399
      if (gcc_exec_prefix)
3400
	putenv (concat ("GCC_EXEC_PREFIX=", gcc_exec_prefix, NULL));
Tom Tromey committed
3401
    }
3402
  else
3403 3404 3405 3406 3407 3408 3409 3410 3411
    {
      /* make_relative_prefix requires a program name, but
	 GCC_EXEC_PREFIX is typically a directory name with a trailing
	 / (which is ignored by make_relative_prefix), so append a
	 program name.  */
      char *tmp_prefix = concat (gcc_exec_prefix, "gcc", NULL);
      gcc_libexec_prefix = make_relative_prefix (tmp_prefix,
						 standard_exec_prefix,
						 standard_libexec_prefix);
3412 3413 3414 3415 3416

      /* The path is unrelocated, so fallback to the original setting.  */
      if (!gcc_libexec_prefix)
	gcc_libexec_prefix = standard_libexec_prefix;

3417 3418
      free (tmp_prefix);
    }
3419
#else
Tom Tromey committed
3420
#endif
3421 3422 3423
  /* From this point onward, gcc_exec_prefix is non-null if the toolchain
     is relocated. The toolchain was either relocated using GCC_EXEC_PREFIX
     or an automatically created GCC_EXEC_PREFIX from argv[0].  */
Richard Stallman committed
3424

3425
  if (gcc_exec_prefix)
Richard Stallman committed
3426
    {
3427
      int len = strlen (gcc_exec_prefix);
3428

3429
      if (len > (int) sizeof ("/lib/gcc/") - 1
3430
	  && (IS_DIR_SEPARATOR (gcc_exec_prefix[len-1])))
3431
	{
3432
	  temp = gcc_exec_prefix + len - sizeof ("/lib/gcc/") + 1;
3433
	  if (IS_DIR_SEPARATOR (*temp)
Kazu Hirata committed
3434
	      && strncmp (temp + 1, "lib", 3) == 0
3435
	      && IS_DIR_SEPARATOR (temp[4])
3436
	      && strncmp (temp + 5, "gcc", 3) == 0)
3437
	    len -= sizeof ("/lib/gcc/") - 1;
3438 3439 3440
	}

      set_std_prefix (gcc_exec_prefix, len);
3441
      add_prefix (&exec_prefixes, gcc_libexec_prefix, "GCC",
3442
		  PREFIX_PRIORITY_LAST, 0, 0);
3443
      add_prefix (&startfile_prefixes, gcc_exec_prefix, "GCC",
3444
		  PREFIX_PRIORITY_LAST, 0, 0);
Richard Stallman committed
3445 3446 3447 3448 3449
    }

  /* COMPILER_PATH and LIBRARY_PATH have values
     that are lists of directory names with colons.  */

3450
  GET_ENVIRONMENT (temp, "COMPILER_PATH");
Richard Stallman committed
3451 3452
  if (temp)
    {
3453
      const char *startp, *endp;
3454
      char *nstore = alloca (strlen (temp) + 3);
Richard Stallman committed
3455 3456 3457 3458

      startp = endp = temp;
      while (1)
	{
3459
	  if (*endp == PATH_SEPARATOR || *endp == 0)
Richard Stallman committed
3460
	    {
Kazu Hirata committed
3461
	      strncpy (nstore, startp, endp - startp);
Richard Stallman committed
3462
	      if (endp == startp)
3463
		strcpy (nstore, concat (".", dir_separator_str, NULL));
3464
	      else if (!IS_DIR_SEPARATOR (endp[-1]))
Richard Stallman committed
3465
		{
Kazu Hirata committed
3466 3467
		  nstore[endp - startp] = DIR_SEPARATOR;
		  nstore[endp - startp + 1] = 0;
Richard Stallman committed
3468 3469
		}
	      else
Kazu Hirata committed
3470
		nstore[endp - startp] = 0;
3471
	      add_prefix (&exec_prefixes, nstore, 0,
3472
			  PREFIX_PRIORITY_LAST, 0, 0);
3473
	      add_prefix (&include_prefixes, nstore, 0,
3474
			  PREFIX_PRIORITY_LAST, 0, 0);
Richard Stallman committed
3475 3476 3477 3478 3479 3480 3481 3482 3483
	      if (*endp == 0)
		break;
	      endp = startp = endp + 1;
	    }
	  else
	    endp++;
	}
    }

3484
  GET_ENVIRONMENT (temp, LIBRARY_PATH_ENV);
Michael Meissner committed
3485
  if (temp && *cross_compile == '0')
Richard Stallman committed
3486
    {
3487
      const char *startp, *endp;
3488
      char *nstore = alloca (strlen (temp) + 3);
Richard Stallman committed
3489 3490 3491 3492

      startp = endp = temp;
      while (1)
	{
3493
	  if (*endp == PATH_SEPARATOR || *endp == 0)
Richard Stallman committed
3494
	    {
Kazu Hirata committed
3495
	      strncpy (nstore, startp, endp - startp);
Richard Stallman committed
3496
	      if (endp == startp)
3497
		strcpy (nstore, concat (".", dir_separator_str, NULL));
3498
	      else if (!IS_DIR_SEPARATOR (endp[-1]))
Richard Stallman committed
3499
		{
Kazu Hirata committed
3500 3501
		  nstore[endp - startp] = DIR_SEPARATOR;
		  nstore[endp - startp + 1] = 0;
Richard Stallman committed
3502 3503
		}
	      else
Kazu Hirata committed
3504
		nstore[endp - startp] = 0;
3505
	      add_prefix (&startfile_prefixes, nstore, NULL,
3506
			  PREFIX_PRIORITY_LAST, 0, 1);
Richard Stallman committed
3507 3508 3509 3510 3511 3512 3513 3514 3515 3516
	      if (*endp == 0)
		break;
	      endp = startp = endp + 1;
	    }
	  else
	    endp++;
	}
    }

  /* Use LPATH like LIBRARY_PATH (for the CMU build program).  */
3517
  GET_ENVIRONMENT (temp, "LPATH");
Michael Meissner committed
3518
  if (temp && *cross_compile == '0')
Richard Stallman committed
3519
    {
3520
      const char *startp, *endp;
3521
      char *nstore = alloca (strlen (temp) + 3);
Richard Stallman committed
3522 3523 3524 3525

      startp = endp = temp;
      while (1)
	{
3526
	  if (*endp == PATH_SEPARATOR || *endp == 0)
Richard Stallman committed
3527
	    {
Kazu Hirata committed
3528
	      strncpy (nstore, startp, endp - startp);
Richard Stallman committed
3529
	      if (endp == startp)
3530
		strcpy (nstore, concat (".", dir_separator_str, NULL));
3531
	      else if (!IS_DIR_SEPARATOR (endp[-1]))
Richard Stallman committed
3532
		{
Kazu Hirata committed
3533 3534
		  nstore[endp - startp] = DIR_SEPARATOR;
		  nstore[endp - startp + 1] = 0;
Richard Stallman committed
3535 3536
		}
	      else
Kazu Hirata committed
3537
		nstore[endp - startp] = 0;
3538
	      add_prefix (&startfile_prefixes, nstore, NULL,
3539
			  PREFIX_PRIORITY_LAST, 0, 1);
Richard Stallman committed
3540 3541 3542 3543 3544 3545 3546 3547 3548
	      if (*endp == 0)
		break;
	      endp = startp = endp + 1;
	    }
	  else
	    endp++;
	}
    }

3549
  /* Convert new-style -- options to old-style.  */
3550
  translate_options (&argc, (const char *const **) &argv);
3551

3552
  /* Do language-specific adjustment/addition of flags.  */
3553
  lang_specific_driver (&argc, (const char *const **) &argv, &added_libraries);
3554

Richard Stallman committed
3555 3556 3557 3558 3559 3560 3561 3562
  /* Scan argv twice.  Here, the first time, just count how many switches
     there will be in their vector, and how many input files in theirs.
     Here we also parse the switches that cc itself uses (e.g. -v).  */

  for (i = 1; i < argc; i++)
    {
      if (! strcmp (argv[i], "-dumpspecs"))
	{
Michael Meissner committed
3563
	  struct spec_list *sl;
3564
	  init_spec ();
Michael Meissner committed
3565 3566
	  for (sl = specs; sl; sl = sl->next)
	    printf ("*%s:\n%s\n\n", sl->name, *(sl->ptr_spec));
Kazu Hirata committed
3567 3568
	  if (link_command_spec)
	    printf ("*link_command:\n%s\n\n", link_command_spec);
Richard Stallman committed
3569 3570 3571 3572
	  exit (0);
	}
      else if (! strcmp (argv[i], "-dumpversion"))
	{
3573
	  printf ("%s\n", spec_version);
Richard Stallman committed
3574 3575
	  exit (0);
	}
3576 3577 3578
      else if (! strcmp (argv[i], "-dumpmachine"))
	{
	  printf ("%s\n", spec_machine);
Kazu Hirata committed
3579
	  exit (0);
3580
	}
3581 3582 3583 3584
      else if (strcmp (argv[i], "-fversion") == 0)
	{
	  /* translate_options () has turned --version into -fversion.  */
	  printf (_("%s (GCC) %s\n"), programname, version_string);
3585
	  printf ("Copyright %s 2007 Free Software Foundation, Inc.\n",
3586
		  _("(C)"));
3587 3588 3589 3590 3591
	  fputs (_("This is free software; see the source for copying conditions.  There is NO\n\
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\n"),
		 stdout);
	  exit (0);
	}
Nick Clifton committed
3592 3593 3594 3595 3596 3597 3598 3599
      else if (strcmp (argv[i], "-fhelp") == 0)
	{
	  /* translate_options () has turned --help into -fhelp.  */
	  print_help_list = 1;

	  /* We will be passing a dummy file on to the sub-processes.  */
	  n_infiles++;
	  n_switches++;
Kazu Hirata committed
3600

3601 3602 3603
	  /* CPP driver cannot obtain switch from cc1_options.  */
	  if (is_cpp_driver)
	    add_preprocessor_option ("--help", 6);
Nick Clifton committed
3604 3605 3606
	  add_assembler_option ("--help", 6);
	  add_linker_option ("--help", 6);
	}
3607 3608 3609 3610 3611 3612 3613 3614 3615
      else if (strncmp (argv[i], "-fhelp=", 7) == 0)
	{
	  /* translate_options () has turned --help into -fhelp.  */
	  print_subprocess_help = 2;

	  /* We will be passing a dummy file on to the sub-processes.  */
	  n_infiles++;
	  n_switches++;
	}
3616
      else if (strcmp (argv[i], "-ftarget-help") == 0)
3617 3618
	{
	  /* translate_options() has turned --target-help into -ftarget-help.  */
3619
	  print_subprocess_help = 1;
3620

3621 3622 3623
	  /* We will be passing a dummy file on to the sub-processes.  */
	  n_infiles++;
	  n_switches++;
3624

3625 3626 3627
	  /* CPP driver cannot obtain switch from cc1_options.  */
	  if (is_cpp_driver)
	    add_preprocessor_option ("--target-help", 13);
3628 3629 3630
	  add_assembler_option ("--target-help", 13);
	  add_linker_option ("--target-help", 13);
	}
Richard Kenner committed
3631 3632 3633 3634 3635
      else if (! strcmp (argv[i], "-pass-exit-codes"))
	{
	  pass_exit_codes = 1;
	  n_switches++;
	}
3636 3637
      else if (! strcmp (argv[i], "-print-search-dirs"))
	print_search_dirs = 1;
3638
      else if (! strcmp (argv[i], "-print-libgcc-file-name"))
3639
	print_file_name = "libgcc.a";
3640
      else if (! strncmp (argv[i], "-print-file-name=", 17))
3641
	print_file_name = argv[i] + 17;
3642
      else if (! strncmp (argv[i], "-print-prog-name=", 17))
3643
	print_prog_name = argv[i] + 17;
Doug Evans committed
3644 3645 3646 3647
      else if (! strcmp (argv[i], "-print-multi-lib"))
	print_multi_lib = 1;
      else if (! strcmp (argv[i], "-print-multi-directory"))
	print_multi_directory = 1;
3648 3649
      else if (! strcmp (argv[i], "-print-multi-os-directory"))
	print_multi_os_directory = 1;
3650 3651
      else if (! strcmp (argv[i], "-print-sysroot-headers-suffix"))
	print_sysroot_headers_suffix = 1;
3652 3653 3654 3655 3656 3657 3658 3659 3660 3661
      else if (! strncmp (argv[i], "-Wa,", 4))
	{
	  int prev, j;
	  /* Pass the rest of this option to the assembler.  */

	  /* Split the argument at commas.  */
	  prev = 4;
	  for (j = 4; argv[i][j]; j++)
	    if (argv[i][j] == ',')
	      {
Nick Clifton committed
3662
		add_assembler_option (argv[i] + prev, j - prev);
3663 3664
		prev = j + 1;
	      }
Kazu Hirata committed
3665

3666
	  /* Record the part after the last comma.  */
Nick Clifton committed
3667
	  add_assembler_option (argv[i] + prev, j - prev);
3668
	}
3669 3670 3671 3672 3673 3674 3675 3676 3677 3678
      else if (! strncmp (argv[i], "-Wp,", 4))
	{
	  int prev, j;
	  /* Pass the rest of this option to the preprocessor.  */

	  /* Split the argument at commas.  */
	  prev = 4;
	  for (j = 4; argv[i][j]; j++)
	    if (argv[i][j] == ',')
	      {
Nick Clifton committed
3679
		add_preprocessor_option (argv[i] + prev, j - prev);
3680 3681
		prev = j + 1;
	      }
Kazu Hirata committed
3682

3683
	  /* Record the part after the last comma.  */
Nick Clifton committed
3684
	  add_preprocessor_option (argv[i] + prev, j - prev);
3685
	}
3686
      else if (argv[i][0] == '+' && argv[i][1] == 'e')
3687
	/* The +e options to the C++ front-end.  */
3688
	n_switches++;
3689
      else if (strncmp (argv[i], "-Wl,", 4) == 0)
3690 3691 3692 3693 3694 3695
	{
	  int j;
	  /* Split the argument at commas.  */
	  for (j = 3; argv[i][j]; j++)
	    n_infiles += (argv[i][j] == ',');
	}
3696 3697 3698
      else if (strcmp (argv[i], "-Xlinker") == 0)
	{
	  if (i + 1 == argc)
3699
	    fatal ("argument to '-Xlinker' is missing");
3700 3701 3702 3703

	  n_infiles++;
	  i++;
	}
3704 3705 3706
      else if (strcmp (argv[i], "-Xpreprocessor") == 0)
	{
	  if (i + 1 == argc)
3707
	    fatal ("argument to '-Xpreprocessor' is missing");
3708 3709 3710 3711 3712 3713

	  add_preprocessor_option (argv[i+1], strlen (argv[i+1]));
	}
      else if (strcmp (argv[i], "-Xassembler") == 0)
	{
	  if (i + 1 == argc)
3714
	    fatal ("argument to '-Xassembler' is missing");
3715 3716 3717

	  add_assembler_option (argv[i+1], strlen (argv[i+1]));
	}
3718 3719 3720
      else if (strcmp (argv[i], "-l") == 0)
	{
	  if (i + 1 == argc)
3721
	    fatal ("argument to '-l' is missing");
3722 3723 3724 3725

	  n_infiles++;
	  i++;
	}
3726 3727
      else if (strncmp (argv[i], "-l", 2) == 0)
	n_infiles++;
3728 3729 3730 3731 3732
      else if (strcmp (argv[i], "-save-temps") == 0)
	{
	  save_temps_flag = 1;
	  n_switches++;
	}
3733 3734 3735 3736 3737
      else if (strcmp (argv[i], "-combine") == 0)
	{
	  combine_flag = 1;
	  n_switches++;
	}
Michael Meissner committed
3738 3739
      else if (strcmp (argv[i], "-specs") == 0)
	{
3740
	  struct user_specs *user = XNEW (struct user_specs);
Michael Meissner committed
3741
	  if (++i >= argc)
3742
	    fatal ("argument to '-specs' is missing");
Michael Meissner committed
3743

Kazu Hirata committed
3744
	  user->next = (struct user_specs *) 0;
Michael Meissner committed
3745 3746 3747 3748 3749 3750 3751 3752 3753
	  user->filename = argv[i];
	  if (user_specs_tail)
	    user_specs_tail->next = user;
	  else
	    user_specs_head = user;
	  user_specs_tail = user;
	}
      else if (strncmp (argv[i], "-specs=", 7) == 0)
	{
3754
	  struct user_specs *user = XNEW (struct user_specs);
Michael Meissner committed
3755
	  if (strlen (argv[i]) == 7)
3756
	    fatal ("argument to '-specs=' is missing");
Michael Meissner committed
3757

Kazu Hirata committed
3758
	  user->next = (struct user_specs *) 0;
Kazu Hirata committed
3759
	  user->filename = argv[i] + 7;
Michael Meissner committed
3760 3761 3762 3763 3764 3765
	  if (user_specs_tail)
	    user_specs_tail->next = user;
	  else
	    user_specs_head = user;
	  user_specs_tail = user;
	}
3766 3767
      else if (strcmp (argv[i], "-time") == 0)
	report_times = 1;
3768 3769 3770 3771 3772 3773 3774
      else if (strcmp (argv[i], "-pipe") == 0)
	{
	  /* -pipe has to go into the switches array as well as
	     setting a flag.  */
	  use_pipes = 1;
	  n_switches++;
	}
3775 3776 3777 3778 3779 3780 3781 3782 3783
      else if (strcmp (argv[i], "-###") == 0)
	{
	  /* This is similar to -v except that there is no execution
	     of the commands and the echoed arguments are quoted.  It
	     is intended for use in shell scripts to capture the
	     driver-generated command line.  */
	  verbose_only_flag++;
	  verbose_flag++;
	}
3784
      else if (argv[i][0] == '-' && argv[i][1] != 0)
Richard Stallman committed
3785
	{
3786 3787
	  const char *p = &argv[i][1];
	  int c = *p;
Richard Stallman committed
3788 3789 3790 3791

	  switch (c)
	    {
	    case 'b':
3792 3793 3794 3795
	      if (NULL == strchr(argv[i] + 2, '-'))
		goto normal_switch;

	      /* Fall through.  */
3796
	    case 'V':
3797
	      fatal ("'-%c' must come at the start of the command line", c);
Richard Stallman committed
3798 3799 3800 3801
	      break;

	    case 'B':
	      {
Zack Weinberg committed
3802
		const char *value;
3803 3804
		int len;

Richard Stallman committed
3805
		if (p[1] == 0 && i + 1 == argc)
3806
		  fatal ("argument to '-B' is missing");
Richard Stallman committed
3807 3808 3809 3810
		if (p[1] == 0)
		  value = argv[++i];
		else
		  value = p + 1;
3811 3812 3813 3814

		len = strlen (value);

		/* Catch the case where the user has forgotten to append a
3815
		   directory separator to the path.  Note, they may be using
3816 3817 3818 3819 3820 3821
		   -B to add an executable name prefix, eg "i386-elf-", in
		   order to distinguish between multiple installations of
		   GCC in the same directory.  Hence we must check to see
		   if appending a directory separator actually makes a
		   valid directory name.  */
		if (! IS_DIR_SEPARATOR (value [len - 1])
3822
		    && is_directory (value, false))
3823
		  {
3824
		    char *tmp = XNEWVEC (char, len + 2);
3825 3826 3827 3828
		    strcpy (tmp, value);
		    tmp[len] = DIR_SEPARATOR;
		    tmp[++ len] = 0;
		    value = tmp;
3829
		  }
3830

3831
		add_prefix (&exec_prefixes, value, NULL,
3832
			    PREFIX_PRIORITY_B_OPT, 0, 0);
3833
		add_prefix (&startfile_prefixes, value, NULL,
3834
			    PREFIX_PRIORITY_B_OPT, 0, 0);
3835
		add_prefix (&include_prefixes, value, NULL,
3836
			    PREFIX_PRIORITY_B_OPT, 0, 0);
Kazu Hirata committed
3837
		n_switches++;
Richard Stallman committed
3838 3839 3840 3841 3842
	      }
	      break;

	    case 'v':	/* Print our subcommands and print versions.  */
	      n_switches++;
3843 3844 3845 3846 3847
	      /* If they do anything other than exactly `-v', don't set
		 verbose_flag; rather, continue on to give the error.  */
	      if (p[1] != 0)
		break;
	      verbose_flag++;
Richard Stallman committed
3848 3849
	      break;

3850
	    case 'S':
3851 3852
	    case 'c':
	      if (p[1] == 0)
Richard Stallman committed
3853
		{
3854
		  have_c = 1;
3855
		  n_switches++;
Richard Stallman committed
3856 3857
		  break;
		}
3858
	      goto normal_switch;
3859 3860

	    case 'o':
3861
	      have_o = 1;
3862
#if defined(HAVE_TARGET_EXECUTABLE_SUFFIX)
3863 3864 3865
	      if (! have_c)
		{
		  int skip;
Kazu Hirata committed
3866

3867 3868 3869 3870 3871 3872 3873 3874 3875 3876 3877 3878 3879 3880 3881
		  /* Forward scan, just in case -S or -c is specified
		     after -o.  */
		  int j = i + 1;
		  if (p[1] == 0)
		    ++j;
		  while (j < argc)
		    {
		      if (argv[j][0] == '-')
			{
			  if (SWITCH_CURTAILS_COMPILATION (argv[j][1])
			      && argv[j][2] == 0)
			    {
			      have_c = 1;
			      break;
			    }
3882
			  else if ((skip = SWITCH_TAKES_ARG (argv[j][1])))
3883
			    j += skip - (argv[j][2] != 0);
3884
			  else if ((skip = WORD_SWITCH_TAKES_ARG (argv[j] + 1)))
3885 3886 3887 3888 3889 3890
			    j += skip;
			}
		      j++;
		    }
		}
#endif
3891
#if defined(HAVE_TARGET_EXECUTABLE_SUFFIX) || defined(HAVE_TARGET_OBJECT_SUFFIX)
3892
	      if (p[1] == 0)
3893
		argv[i + 1] = convert_filename (argv[i + 1], ! have_c, 0);
3894
	      else
3895
		argv[i] = convert_filename (argv[i], ! have_c, 0);
3896
#endif
3897
	      goto normal_switch;
3898

Richard Stallman committed
3899
	    default:
3900
	    normal_switch:
3901 3902 3903 3904

#ifdef MODIFY_TARGET_NAME
	      is_modify_target_name = 0;

3905
	      for (j = 0; j < ARRAY_SIZE (modify_target); j++)
3906 3907
		if (! strcmp (argv[i], modify_target[j].sw))
		  {
3908 3909
		    char *new_name = xmalloc (strlen (modify_target[j].str)
					      + strlen (spec_machine));
3910 3911 3912 3913 3914 3915 3916 3917 3918 3919 3920 3921 3922 3923 3924 3925 3926 3927 3928 3929 3930 3931 3932 3933 3934 3935 3936
		    const char *p, *r;
		    char *q;
		    int made_addition = 0;

		    is_modify_target_name = 1;
		    for (p = spec_machine, q = new_name; *p != 0; )
		      {
			if (modify_target[j].add_del == DELETE
			    && (! strncmp (q, modify_target[j].str,
					   strlen (modify_target[j].str))))
			  p += strlen (modify_target[j].str);
			else if (modify_target[j].add_del == ADD
				 && ! made_addition && *p == '-')
			  {
			    for (r = modify_target[j].str; *r != 0; )
			      *q++ = *r++;
			    made_addition = 1;
			  }

			*q++ = *p++;
		      }

		    spec_machine = new_name;
		  }

	      if (is_modify_target_name)
		break;
3937
#endif
3938

Richard Stallman committed
3939 3940 3941 3942 3943 3944 3945 3946 3947
	      n_switches++;

	      if (SWITCH_TAKES_ARG (c) > (p[1] != 0))
		i += SWITCH_TAKES_ARG (c) - (p[1] != 0);
	      else if (WORD_SWITCH_TAKES_ARG (p))
		i += WORD_SWITCH_TAKES_ARG (p);
	    }
	}
      else
3948 3949 3950 3951
	{
	  n_infiles++;
	  lang_n_infiles++;
	}
Richard Stallman committed
3952 3953
    }

3954
  if (save_temps_flag && use_pipes)
3955 3956 3957 3958 3959 3960
    {
      /* -save-temps overrides -pipe, so that temp files are produced */
      if (save_temps_flag)
	error ("warning: -pipe ignored because -save-temps specified");
      use_pipes = 0;
    }
3961

3962 3963 3964 3965
  /* Set up the search paths.  We add directories that we expect to
     contain GNU Toolchain components before directories specified by
     the machine description so that we will find GNU components (like
     the GNU assembler) before those of the host system.  */ 
Richard Stallman committed
3966

3967 3968 3969 3970
  /* If we don't know where the toolchain has been installed, use the
     configured-in locations.  */
  if (!gcc_exec_prefix)
    {
3971
#ifndef OS2
3972 3973 3974 3975 3976 3977
      add_prefix (&exec_prefixes, standard_libexec_prefix, "GCC",
		  PREFIX_PRIORITY_LAST, 1, 0);
      add_prefix (&exec_prefixes, standard_libexec_prefix, "BINUTILS",
		  PREFIX_PRIORITY_LAST, 2, 0);
      add_prefix (&exec_prefixes, standard_exec_prefix, "BINUTILS",
		  PREFIX_PRIORITY_LAST, 2, 0);
3978
#endif
3979 3980 3981
      add_prefix (&startfile_prefixes, standard_exec_prefix, "BINUTILS",
		  PREFIX_PRIORITY_LAST, 1, 0);
    }
Richard Stallman committed
3982

3983 3984 3985 3986 3987 3988 3989 3990 3991 3992 3993 3994
  /* If not cross-compiling, search well-known system locations.  */
  if (*cross_compile == '0')
    {
#ifndef OS2
      add_prefix (&exec_prefixes, standard_exec_prefix_1, "BINUTILS",
		  PREFIX_PRIORITY_LAST, 2, 0);
      add_prefix (&exec_prefixes, standard_exec_prefix_2, "BINUTILS",
		  PREFIX_PRIORITY_LAST, 2, 0);
#endif
      add_prefix (&startfile_prefixes, standard_exec_prefix_2, "BINUTILS",
		  PREFIX_PRIORITY_LAST, 1, 0);
    }
Richard Stallman committed
3995

3996
  gcc_assert (!IS_ABSOLUTE_PATH (tooldir_base_prefix));
Kazu Hirata committed
3997
  tooldir_prefix = concat (tooldir_base_prefix, spec_machine,
3998
			   dir_separator_str, NULL);
3999

4000 4001 4002 4003 4004 4005
  /* Look for tools relative to the location from which the driver is
     running, or, if that is not available, the configured prefix.  */
  tooldir_prefix
    = concat (gcc_exec_prefix ? gcc_exec_prefix : standard_exec_prefix,
	      spec_machine, dir_separator_str,
	      spec_version, dir_separator_str, tooldir_prefix, NULL);
4006

Kazu Hirata committed
4007
  add_prefix (&exec_prefixes,
4008
	      concat (tooldir_prefix, "bin", dir_separator_str, NULL),
4009
	      "BINUTILS", PREFIX_PRIORITY_LAST, 0, 0);
4010
  add_prefix (&startfile_prefixes,
4011
	      concat (tooldir_prefix, "lib", dir_separator_str, NULL),
4012
	      "BINUTILS", PREFIX_PRIORITY_LAST, 0, 1);
4013

4014 4015 4016 4017 4018
#if defined(TARGET_SYSTEM_ROOT_RELOCATABLE) && !defined(VMS)
  /* If the normal TARGET_SYSTEM_ROOT is inside of $exec_prefix,
     then consider it to relocate with the rest of the GCC installation
     if GCC_EXEC_PREFIX is set.
     ``make_relative_prefix'' is not compiled for VMS, so don't call it.  */
4019 4020 4021 4022 4023 4024
  if (target_system_root && gcc_exec_prefix)
    {
      char *tmp_prefix = make_relative_prefix (argv[0],
					       standard_bindir_prefix,
					       target_system_root);
      if (tmp_prefix && access_check (tmp_prefix, F_OK) == 0)
4025 4026 4027 4028
	{
	  target_system_root = tmp_prefix;
	  target_system_root_changed = 1;
	}
4029
    }
4030
#endif
4031

4032 4033
  /* More prefixes are enabled in main, after we read the specs file
     and determine whether this is cross-compilation or not.  */
Richard Stallman committed
4034 4035 4036

  /* Then create the space for the vectors and scan again.  */

4037 4038
  switches = XNEWVEC (struct switchstr, n_switches + 1);
  infiles = XNEWVEC (struct infile, n_infiles + 1);
Richard Stallman committed
4039 4040 4041 4042 4043 4044 4045 4046 4047 4048
  n_switches = 0;
  n_infiles = 0;
  last_language_n_infiles = -1;

  /* This, time, copy the text of each switch and store a pointer
     to the copy in the vector of switches.
     Store all the infiles in their vector.  */

  for (i = 1; i < argc; i++)
    {
4049
      /* Just skip the switches that were handled by the preceding loop.  */
4050 4051 4052
#ifdef MODIFY_TARGET_NAME
      is_modify_target_name = 0;

4053
      for (j = 0; j < ARRAY_SIZE (modify_target); j++)
4054 4055 4056 4057 4058 4059 4060
	if (! strcmp (argv[i], modify_target[j].sw))
	  is_modify_target_name = 1;

      if (is_modify_target_name)
	;
      else
#endif
4061
      if (! strncmp (argv[i], "-Wa,", 4))
4062
	;
4063 4064
      else if (! strncmp (argv[i], "-Wp,", 4))
	;
Richard Kenner committed
4065 4066
      else if (! strcmp (argv[i], "-pass-exit-codes"))
	;
4067 4068
      else if (! strcmp (argv[i], "-print-search-dirs"))
	;
4069
      else if (! strcmp (argv[i], "-print-libgcc-file-name"))
4070
	;
4071 4072 4073 4074
      else if (! strncmp (argv[i], "-print-file-name=", 17))
	;
      else if (! strncmp (argv[i], "-print-prog-name=", 17))
	;
Doug Evans committed
4075 4076 4077 4078
      else if (! strcmp (argv[i], "-print-multi-lib"))
	;
      else if (! strcmp (argv[i], "-print-multi-directory"))
	;
4079 4080
      else if (! strcmp (argv[i], "-print-multi-os-directory"))
	;
4081 4082
      else if (! strcmp (argv[i], "-print-sysroot-headers-suffix"))
	;
4083 4084 4085 4086 4087
      else if (! strncmp (argv[i], "--sysroot=", strlen ("--sysroot=")))
	{
	  target_system_root = argv[i] + strlen ("--sysroot=");
	  target_system_root_changed = 1;
	}
4088 4089 4090
      else if (argv[i][0] == '+' && argv[i][1] == 'e')
	{
	  /* Compensate for the +e options to the C++ front-end;
4091
	     they're there simply for cfront call-compatibility.  We do
4092 4093 4094 4095 4096
	     some magic in default_compilers to pass them down properly.
	     Note we deliberately start at the `+' here, to avoid passing
	     -e0 or -e1 down into the linker.  */
	  switches[n_switches].part1 = &argv[i][0];
	  switches[n_switches].args = 0;
4097
	  switches[n_switches].live_cond = SWITCH_OK;
4098
	  switches[n_switches].validated = 0;
4099 4100
	  n_switches++;
	}
4101 4102
      else if (strncmp (argv[i], "-Wl,", 4) == 0)
	{
4103 4104 4105 4106 4107 4108
	  int prev, j;
	  /* Split the argument at commas.  */
	  prev = 4;
	  for (j = 4; argv[i][j]; j++)
	    if (argv[i][j] == ',')
	      {
4109
		infiles[n_infiles].language = "*";
4110 4111 4112 4113 4114
		infiles[n_infiles++].name
		  = save_string (argv[i] + prev, j - prev);
		prev = j + 1;
	      }
	  /* Record the part after the last comma.  */
4115
	  infiles[n_infiles].language = "*";
4116
	  infiles[n_infiles++].name = argv[i] + prev;
4117 4118 4119
	}
      else if (strcmp (argv[i], "-Xlinker") == 0)
	{
4120
	  infiles[n_infiles].language = "*";
4121 4122
	  infiles[n_infiles++].name = argv[++i];
	}
4123 4124
      /* Xassembler and Xpreprocessor were already handled in the first argv
	 scan, so all we need to do here is ignore them and their argument.  */
4125
      else if (strcmp (argv[i], "-Xassembler") == 0)
4126
	i++;
4127
      else if (strcmp (argv[i], "-Xpreprocessor") == 0)
4128
	i++;
4129 4130 4131 4132
      else if (strcmp (argv[i], "-l") == 0)
	{ /* POSIX allows separation of -l and the lib arg;
	     canonicalize by concatenating -l with its arg */
	  infiles[n_infiles].language = "*";
4133
	  infiles[n_infiles++].name = concat ("-l", argv[++i], NULL);
4134
	}
4135 4136
      else if (strncmp (argv[i], "-l", 2) == 0)
	{
4137
	  infiles[n_infiles].language = "*";
4138 4139
	  infiles[n_infiles++].name = argv[i];
	}
Michael Meissner committed
4140 4141 4142 4143
      else if (strcmp (argv[i], "-specs") == 0)
	i++;
      else if (strncmp (argv[i], "-specs=", 7) == 0)
	;
4144 4145
      else if (strcmp (argv[i], "-time") == 0)
	;
4146 4147
      else if (strcmp (argv[i], "-###") == 0)
	;
4148
      else if (argv[i][0] == '-' && argv[i][1] != 0)
Richard Stallman committed
4149
	{
Zack Weinberg committed
4150 4151
	  const char *p = &argv[i][1];
	  int c = *p;
Richard Stallman committed
4152 4153 4154 4155

	  if (c == 'x')
	    {
	      if (p[1] == 0 && i + 1 == argc)
4156
		fatal ("argument to '-x' is missing");
Richard Stallman committed
4157 4158 4159 4160 4161
	      if (p[1] == 0)
		spec_lang = argv[++i];
	      else
		spec_lang = p + 1;
	      if (! strcmp (spec_lang, "none"))
4162 4163 4164
		/* Suppress the warning if -xnone comes after the last input
		   file, because alternate command interfaces like g++ might
		   find it useful to place -xnone after each input file.  */
Richard Stallman committed
4165 4166 4167 4168 4169 4170 4171 4172
		spec_lang = 0;
	      else
		last_language_n_infiles = n_infiles;
	      continue;
	    }
	  switches[n_switches].part1 = p;
	  /* Deal with option arguments in separate argv elements.  */
	  if ((SWITCH_TAKES_ARG (c) > (p[1] != 0))
4173 4174 4175 4176
	      || WORD_SWITCH_TAKES_ARG (p))
	    {
	      int j = 0;
	      int n_args = WORD_SWITCH_TAKES_ARG (p);
Richard Stallman committed
4177

4178 4179 4180 4181 4182 4183
	      if (n_args == 0)
		{
		  /* Count only the option arguments in separate argv elements.  */
		  n_args = SWITCH_TAKES_ARG (c) - (p[1] != 0);
		}
	      if (i + n_args >= argc)
4184
		fatal ("argument to '-%s' is missing", p);
4185
	      switches[n_switches].args
4186
		= XNEWVEC (const char *, n_args + 1);
4187 4188 4189 4190
	      while (j < n_args)
		switches[n_switches].args[j++] = argv[++i];
	      /* Null-terminate the vector.  */
	      switches[n_switches].args[j] = 0;
Richard Stallman committed
4191
	    }
4192
	  else if (strchr (switches_need_spaces, c))
4193
	    {
4194 4195
	      /* On some systems, ld cannot handle some options without
		 a space.  So split the option from its argument.  */
4196
	      char *part1 = XNEWVEC (char, 2);
4197 4198
	      part1[0] = c;
	      part1[1] = '\0';
Kazu Hirata committed
4199

4200
	      switches[n_switches].part1 = part1;
4201
	      switches[n_switches].args = XNEWVEC (const char *, 2);
4202
	      switches[n_switches].args[0] = xstrdup (p+1);
4203 4204 4205
	      switches[n_switches].args[1] = 0;
	    }
	  else
Richard Stallman committed
4206
	    switches[n_switches].args = 0;
4207

4208
	  switches[n_switches].live_cond = SWITCH_OK;
4209
	  switches[n_switches].validated = 0;
4210
	  switches[n_switches].ordering = 0;
4211
	  /* These are always valid, since gcc.c itself understands them.  */
4212 4213
	  if (!strcmp (p, "save-temps")
	      || !strcmp (p, "static-libgcc")
4214 4215
	      || !strcmp (p, "shared-libgcc")
	      || !strcmp (p, "pipe"))
4216
	    switches[n_switches].validated = 1;
Kazu Hirata committed
4217 4218 4219
	  else
	    {
	      char ch = switches[n_switches].part1[0];
4220
	      if (ch == 'B')
Kazu Hirata committed
4221 4222
		switches[n_switches].validated = 1;
	    }
Richard Stallman committed
4223 4224 4225 4226
	  n_switches++;
	}
      else
	{
4227
#ifdef HAVE_TARGET_OBJECT_SUFFIX
4228
	  argv[i] = convert_filename (argv[i], 0, access (argv[i], F_OK));
4229 4230
#endif

4231
	  if (strcmp (argv[i], "-") != 0 && access (argv[i], F_OK) < 0)
4232 4233 4234 4235 4236 4237 4238 4239 4240
	    {
	      perror_with_name (argv[i]);
	      error_count++;
	    }
	  else
	    {
	      infiles[n_infiles].language = spec_lang;
	      infiles[n_infiles++].name = argv[i];
	    }
Richard Stallman committed
4241 4242 4243
	}
    }

4244
  if (n_infiles == last_language_n_infiles && spec_lang != 0)
4245
    error ("warning: '-x %s' after last input file has no effect", spec_lang);
Richard Stallman committed
4246

4247
  /* Ensure we only invoke each subprocess once.  */
4248
  if (print_subprocess_help || print_help_list)
4249 4250 4251
    {
      n_infiles = 1;

4252 4253
      /* Create a dummy input file, so that we can pass
	 the help option on to the various sub-processes.  */
4254 4255 4256 4257
      infiles[0].language = "c";
      infiles[0].name   = "help-dummy";
    }

Richard Stallman committed
4258 4259 4260
  switches[n_switches].part1 = 0;
  infiles[n_infiles].name = 0;
}
4261

4262
/* Store switches not filtered out by %<S in spec in COLLECT_GCC_OPTIONS
4263 4264 4265
   and place that in the environment.  */

static void
4266
set_collect_gcc_options (void)
4267 4268 4269 4270 4271 4272 4273 4274 4275 4276 4277 4278 4279 4280 4281 4282 4283 4284 4285 4286 4287 4288 4289 4290 4291 4292 4293 4294 4295 4296 4297 4298 4299 4300 4301 4302 4303 4304 4305 4306 4307 4308 4309 4310 4311 4312 4313 4314 4315
{
  int i;
  int first_time;

  /* Build COLLECT_GCC_OPTIONS to have all of the options specified to
     the compiler.  */
  obstack_grow (&collect_obstack, "COLLECT_GCC_OPTIONS=",
		sizeof ("COLLECT_GCC_OPTIONS=") - 1);

  first_time = TRUE;
  for (i = 0; (int) i < n_switches; i++)
    {
      const char *const *args;
      const char *p, *q;
      if (!first_time)
	obstack_grow (&collect_obstack, " ", 1);

      first_time = FALSE;

      /* Ignore elided switches.  */
      if (switches[i].live_cond == SWITCH_IGNORE)
	continue;

      obstack_grow (&collect_obstack, "'-", 2);
      q = switches[i].part1;
      while ((p = strchr (q, '\'')))
	{
	  obstack_grow (&collect_obstack, q, p - q);
	  obstack_grow (&collect_obstack, "'\\''", 4);
	  q = ++p;
	}
      obstack_grow (&collect_obstack, q, strlen (q));
      obstack_grow (&collect_obstack, "'", 1);

      for (args = switches[i].args; args && *args; args++)
	{
	  obstack_grow (&collect_obstack, " '", 2);
	  q = *args;
	  while ((p = strchr (q, '\'')))
	    {
	      obstack_grow (&collect_obstack, q, p - q);
	      obstack_grow (&collect_obstack, "'\\''", 4);
	      q = ++p;
	    }
	  obstack_grow (&collect_obstack, q, strlen (q));
	  obstack_grow (&collect_obstack, "'", 1);
	}
    }
  obstack_grow (&collect_obstack, "\0", 1);
4316
  putenv (XOBFINISH (&collect_obstack, char *));
4317
}
Richard Stallman committed
4318 4319 4320 4321 4322 4323 4324 4325 4326 4327

/* Process a spec string, accumulating and running commands.  */

/* These variables describe the input file name.
   input_file_number is the index on outfiles of this file,
   so that the output file name can be stored for later use by %o.
   input_basename is the start of the part of the input file
   sans all directory names, and basename_length is the number
   of characters starting there excluding the suffix .c or whatever.  */

4328
static const char *input_filename;
Richard Stallman committed
4329
static int input_file_number;
4330
size_t input_filename_length;
Richard Stallman committed
4331
static int basename_length;
4332
static int suffixed_basename_length;
4333 4334
static const char *input_basename;
static const char *input_suffix;
4335
#ifndef HOST_LACKS_INODE_NUMBERS
4336
static struct stat input_stat;
4337
#endif
4338
static int input_stat_set;
Richard Stallman committed
4339

4340 4341 4342
/* The compiler used to process the current input file.  */
static struct compiler *input_file_compiler;

Richard Stallman committed
4343 4344 4345 4346 4347 4348 4349 4350 4351 4352 4353 4354 4355 4356 4357 4358 4359 4360 4361
/* These are variables used within do_spec and do_spec_1.  */

/* Nonzero if an arg has been started and not yet terminated
   (with space, tab or newline).  */
static int arg_going;

/* Nonzero means %d or %g has been seen; the next arg to be terminated
   is a temporary file name.  */
static int delete_this_arg;

/* Nonzero means %w has been seen; the next arg to be terminated
   is the output file name of this compilation.  */
static int this_is_output_file;

/* Nonzero means %s has been seen; the next arg to be terminated
   is the name of a library file and we should try the standard
   search dirs for it.  */
static int this_is_library_file;

4362 4363 4364
/* Nonzero means that the input of this command is coming from a pipe.  */
static int input_from_pipe;

4365
/* Nonnull means substitute this for any suffix when outputting a switches
4366
   arguments.  */
4367 4368
static const char *suffix_subst;

Richard Stallman committed
4369 4370 4371
/* Process the spec SPEC and run the commands specified therein.
   Returns 0 if the spec is successfully processed; -1 if failed.  */

4372
int
4373
do_spec (const char *spec)
Richard Stallman committed
4374 4375 4376
{
  int value;

4377
  value = do_spec_2 (spec);
Richard Stallman committed
4378 4379 4380 4381 4382 4383 4384 4385

  /* Force out any unfinished command.
     If -pipe, this forces out the last command if it ended in `|'.  */
  if (value == 0)
    {
      if (argbuf_index > 0 && !strcmp (argbuf[argbuf_index - 1], "|"))
	argbuf_index--;

4386 4387
      set_collect_gcc_options ();

Richard Stallman committed
4388 4389 4390 4391 4392 4393 4394
      if (argbuf_index > 0)
	value = execute ();
    }

  return value;
}

4395
static int
4396
do_spec_2 (const char *spec)
4397
{
4398 4399 4400
  const char *string;
  int result;

4401 4402 4403 4404 4405 4406 4407 4408
  clear_args ();
  arg_going = 0;
  delete_this_arg = 0;
  this_is_output_file = 0;
  this_is_library_file = 0;
  input_from_pipe = 0;
  suffix_subst = NULL;

4409 4410 4411 4412 4413 4414
  result = do_spec_1 (spec, 0, NULL);

  /* End any pending argument.  */
  if (arg_going)
    {
      obstack_1grow (&obstack, 0);
4415
      string = XOBFINISH (&obstack, const char *);
4416 4417 4418 4419 4420 4421 4422 4423 4424
      if (this_is_library_file)
	string = find_file (string);
      store_arg (string, delete_this_arg, this_is_output_file);
      if (this_is_output_file)
	outfiles[input_file_number] = string;
      arg_going = 0;
    }

  return result;
4425 4426
}

4427 4428 4429 4430 4431

/* Process the given spec string and add any new options to the end
   of the switches/n_switches array.  */

static void
4432
do_option_spec (const char *name, const char *spec)
4433 4434 4435 4436 4437 4438 4439 4440 4441 4442 4443 4444 4445 4446 4447 4448 4449 4450 4451 4452 4453 4454 4455 4456 4457 4458 4459 4460 4461 4462 4463 4464 4465 4466 4467 4468 4469 4470 4471 4472 4473 4474 4475 4476 4477 4478 4479 4480
{
  unsigned int i, value_count, value_len;
  const char *p, *q, *value;
  char *tmp_spec, *tmp_spec_p;

  if (configure_default_options[0].name == NULL)
    return;

  for (i = 0; i < ARRAY_SIZE (configure_default_options); i++)
    if (strcmp (configure_default_options[i].name, name) == 0)
      break;
  if (i == ARRAY_SIZE (configure_default_options))
    return;

  value = configure_default_options[i].value;
  value_len = strlen (value);

  /* Compute the size of the final spec.  */
  value_count = 0;
  p = spec;
  while ((p = strstr (p, "%(VALUE)")) != NULL)
    {
      p ++;
      value_count ++;
    }

  /* Replace each %(VALUE) by the specified value.  */
  tmp_spec = alloca (strlen (spec) + 1
		     + value_count * (value_len - strlen ("%(VALUE)")));
  tmp_spec_p = tmp_spec;
  q = spec;
  while ((p = strstr (q, "%(VALUE)")) != NULL)
    {
      memcpy (tmp_spec_p, q, p - q);
      tmp_spec_p = tmp_spec_p + (p - q);
      memcpy (tmp_spec_p, value, value_len);
      tmp_spec_p += value_len;
      q = p + strlen ("%(VALUE)");
    }
  strcpy (tmp_spec_p, q);

  do_self_spec (tmp_spec);
}

/* Process the given spec string and add any new options to the end
   of the switches/n_switches array.  */

static void
4481
do_self_spec (const char *spec)
4482 4483 4484 4485 4486 4487 4488 4489 4490 4491 4492 4493 4494 4495 4496 4497 4498 4499 4500 4501
{
  do_spec_2 (spec);
  do_spec_1 (" ", 0, NULL);

  if (argbuf_index > 0)
    {
      int i, first;

      first = n_switches;
      n_switches += argbuf_index;
      switches = xrealloc (switches,
			   sizeof (struct switchstr) * (n_switches + 1));

      switches[n_switches] = switches[first];
      for (i = 0; i < argbuf_index; i++)
	{
	  struct switchstr *sw;

	  /* Each switch should start with '-'.  */
	  if (argbuf[i][0] != '-')
4502
	    fatal ("switch '%s' does not start with '-'", argbuf[i]);
4503 4504 4505 4506 4507 4508 4509 4510 4511 4512 4513

	  sw = &switches[i + first];
	  sw->part1 = &argbuf[i][1];
	  sw->args = 0;
	  sw->live_cond = SWITCH_OK;
	  sw->validated = 0;
	  sw->ordering = 0;
	}
    }
}

4514 4515 4516 4517 4518 4519 4520 4521 4522 4523 4524 4525
/* Callback for processing %D and %I specs.  */

struct spec_path_info {
  const char *option;
  const char *append;
  size_t append_len;
  bool omit_relative;
  bool separate_options;
};

static void *
spec_path (char *path, void *data)
4526
{
4527 4528 4529
  struct spec_path_info *info = data;
  size_t len = 0;
  char save = 0;
4530

4531 4532 4533 4534
  if (info->omit_relative && !IS_ABSOLUTE_PATH (path))
    return NULL;

  if (info->append_len != 0)
4535
    {
4536 4537
      len = strlen (path);
      memcpy (path + len, info->append, info->append_len + 1);
4538 4539
    }

4540 4541
  if (!is_directory (path, true))
    return NULL;
4542

4543 4544 4545 4546 4547
  do_spec_1 (info->option, 1, NULL);
  if (info->separate_options)
    do_spec_1 (" ", 0, NULL);

  if (info->append_len == 0)
4548
    {
4549 4550 4551 4552
      len = strlen (path);
      save = path[len - 1];
      if (IS_DIR_SEPARATOR (path[len - 1]))
	path[len - 1] = '\0';
4553
    }
4554 4555 4556 4557 4558 4559 4560 4561 4562

  do_spec_1 (path, 1, NULL);
  do_spec_1 (" ", 0, NULL);

  /* Must not damage the original path.  */
  if (info->append_len == 0)
    path[len - 1] = save;

  return NULL;
4563 4564
}

Richard Stallman committed
4565 4566 4567 4568 4569 4570 4571 4572 4573 4574 4575 4576 4577
/* Process the sub-spec SPEC as a portion of a larger spec.
   This is like processing a whole spec except that we do
   not initialize at the beginning and we do not supply a
   newline by default at the end.
   INSWITCH nonzero means don't process %-sequences in SPEC;
   in this case, % is treated as an ordinary character.
   This is used while substituting switches.
   INSWITCH nonzero also causes SPC not to terminate an argument.

   Value is zero unless a line was finished
   and the command on that line reported an error.  */

static int
4578
do_spec_1 (const char *spec, int inswitch, const char *soft_matched_part)
Richard Stallman committed
4579
{
4580 4581
  const char *p = spec;
  int c;
Richard Stallman committed
4582
  int i;
4583
  const char *string;
4584
  int value;
Richard Stallman committed
4585

4586
  while ((c = *p++))
Richard Stallman committed
4587 4588 4589 4590 4591 4592 4593 4594 4595 4596
    /* If substituting a switch, treat all chars like letters.
       Otherwise, NL, SPC, TAB and % are special.  */
    switch (inswitch ? 'a' : c)
      {
      case '\n':
	/* End of line: finish any pending argument,
	   then run the pending command if one has been started.  */
	if (arg_going)
	  {
	    obstack_1grow (&obstack, 0);
4597
	    string = XOBFINISH (&obstack, const char *);
Richard Stallman committed
4598 4599 4600 4601 4602 4603 4604 4605 4606 4607 4608 4609 4610
	    if (this_is_library_file)
	      string = find_file (string);
	    store_arg (string, delete_this_arg, this_is_output_file);
	    if (this_is_output_file)
	      outfiles[input_file_number] = string;
	  }
	arg_going = 0;

	if (argbuf_index > 0 && !strcmp (argbuf[argbuf_index - 1], "|"))
	  {
	    /* A `|' before the newline means use a pipe here,
	       but only if -pipe was specified.
	       Otherwise, execute now and don't pass the `|' as an arg.  */
4611
	    if (use_pipes)
Richard Stallman committed
4612
	      {
4613
		input_from_pipe = 1;
Richard Stallman committed
4614 4615 4616 4617 4618 4619
		break;
	      }
	    else
	      argbuf_index--;
	  }

4620 4621
	set_collect_gcc_options ();

Richard Stallman committed
4622 4623
	if (argbuf_index > 0)
	  {
4624
	    value = execute ();
Richard Stallman committed
4625 4626 4627 4628 4629 4630 4631 4632 4633
	    if (value)
	      return value;
	  }
	/* Reinitialize for a new command, and for a new argument.  */
	clear_args ();
	arg_going = 0;
	delete_this_arg = 0;
	this_is_output_file = 0;
	this_is_library_file = 0;
4634
	input_from_pipe = 0;
Richard Stallman committed
4635 4636 4637 4638 4639 4640 4641
	break;

      case '|':
	/* End any pending argument.  */
	if (arg_going)
	  {
	    obstack_1grow (&obstack, 0);
4642
	    string = XOBFINISH (&obstack, const char *);
Richard Stallman committed
4643 4644 4645 4646 4647 4648 4649 4650 4651 4652 4653 4654 4655 4656 4657 4658 4659 4660
	    if (this_is_library_file)
	      string = find_file (string);
	    store_arg (string, delete_this_arg, this_is_output_file);
	    if (this_is_output_file)
	      outfiles[input_file_number] = string;
	  }

	/* Use pipe */
	obstack_1grow (&obstack, c);
	arg_going = 1;
	break;

      case '\t':
      case ' ':
	/* Space or tab ends an argument if one is pending.  */
	if (arg_going)
	  {
	    obstack_1grow (&obstack, 0);
4661
	    string = XOBFINISH (&obstack, const char *);
Richard Stallman committed
4662 4663 4664 4665 4666 4667 4668 4669 4670 4671 4672 4673 4674 4675 4676 4677 4678
	    if (this_is_library_file)
	      string = find_file (string);
	    store_arg (string, delete_this_arg, this_is_output_file);
	    if (this_is_output_file)
	      outfiles[input_file_number] = string;
	  }
	/* Reinitialize for a new argument.  */
	arg_going = 0;
	delete_this_arg = 0;
	this_is_output_file = 0;
	this_is_library_file = 0;
	break;

      case '%':
	switch (c = *p++)
	  {
	  case 0:
4679
	    fatal ("spec '%s' invalid", spec);
Richard Stallman committed
4680 4681 4682 4683 4684 4685

	  case 'b':
	    obstack_grow (&obstack, input_basename, basename_length);
	    arg_going = 1;
	    break;

4686 4687 4688 4689 4690
	  case 'B':
	    obstack_grow (&obstack, input_basename, suffixed_basename_length);
	    arg_going = 1;
	    break;

Richard Stallman committed
4691 4692 4693 4694 4695
	  case 'd':
	    delete_this_arg = 2;
	    break;

	  /* Dump out the directories specified with LIBRARY_PATH,
4696 4697
	     followed by the absolute directories
	     that we search for startfiles.  */
Richard Stallman committed
4698
	  case 'D':
4699
	    {
4700
	      struct spec_path_info info;
4701

4702 4703
	      info.option = "-L";
	      info.append_len = 0;
4704
#ifdef RELATIVE_PREFIX_NOT_LINKDIR
4705 4706 4707 4708 4709 4710
	      /* Used on systems which record the specified -L dirs
		 and use them to search for dynamic linking.
		 Relative directories always come from -B,
		 and it is better not to use them for searching
		 at run time.  In particular, stage1 loses.  */
	      info.omit_relative = true;
4711
#else
4712
	      info.omit_relative = false;
4713
#endif
4714 4715 4716
	      info.separate_options = false;

	      for_each_path (&startfile_prefixes, true, 0, spec_path, &info);
4717
	    }
Richard Stallman committed
4718 4719 4720
	    break;

	  case 'e':
4721
	    /* %efoo means report an error with `foo' as error message
Richard Stallman committed
4722 4723
	       and don't execute any more commands for this file.  */
	    {
4724
	      const char *q = p;
Richard Stallman committed
4725
	      char *buf;
Kazu Hirata committed
4726 4727
	      while (*p != 0 && *p != '\n')
		p++;
4728
	      buf = alloca (p - q + 1);
Richard Stallman committed
4729 4730
	      strncpy (buf, q, p - q);
	      buf[p - q] = 0;
4731
	      error ("%s", buf);
Richard Stallman committed
4732 4733 4734
	      return -1;
	    }
	    break;
4735
	  case 'n':
4736
	    /* %nfoo means report a notice with `foo' on stderr.  */
4737 4738 4739 4740 4741
	    {
	      const char *q = p;
	      char *buf;
	      while (*p != 0 && *p != '\n')
		p++;
4742
	      buf = alloca (p - q + 1);
4743 4744 4745 4746 4747 4748 4749
	      strncpy (buf, q, p - q);
	      buf[p - q] = 0;
	      notice ("%s\n", buf);
	      if (*p)
		p++;
	    }
	    break;
Richard Stallman committed
4750

Kazu Hirata committed
4751 4752 4753 4754
	  case 'j':
	    {
	      struct stat st;

4755 4756 4757 4758
	      /* If save_temps_flag is off, and the HOST_BIT_BUCKET is
		 defined, and it is not a directory, and it is
		 writable, use it.  Otherwise, treat this like any
		 other temporary file.  */
Kazu Hirata committed
4759 4760 4761 4762 4763 4764 4765 4766 4767 4768 4769 4770

	      if ((!save_temps_flag)
		  && (stat (HOST_BIT_BUCKET, &st) == 0) && (!S_ISDIR (st.st_mode))
		  && (access (HOST_BIT_BUCKET, W_OK) == 0))
		{
		  obstack_grow (&obstack, HOST_BIT_BUCKET,
				strlen (HOST_BIT_BUCKET));
		  delete_this_arg = 0;
		  arg_going = 1;
		  break;
		}
	    }
4771 4772 4773 4774 4775 4776 4777 4778 4779
	    goto create_temp_file;
	  case '|':
	    if (use_pipes)
	      {
		obstack_1grow (&obstack, '-');
		delete_this_arg = 0;
		arg_going = 1;

		/* consume suffix */
4780
		while (*p == '.' || ISALNUM ((unsigned char) *p))
4781 4782 4783
		  p++;
		if (p[0] == '%' && p[1] == 'O')
		  p += 2;
4784

4785 4786 4787 4788 4789 4790 4791
		break;
	      }
	    goto create_temp_file;
	  case 'm':
	    if (use_pipes)
	      {
		/* consume suffix */
4792
		while (*p == '.' || ISALNUM ((unsigned char) *p))
4793 4794 4795
		  p++;
		if (p[0] == '%' && p[1] == 'O')
		  p += 2;
4796

4797 4798 4799
		break;
	      }
	    goto create_temp_file;
Richard Stallman committed
4800
	  case 'g':
Tom Wood committed
4801
	  case 'u':
4802
	  case 'U':
4803
	  create_temp_file:
Richard Stallman committed
4804
	      {
Tom Wood committed
4805
		struct temp_name *t;
4806
		int suffix_length;
4807
		const char *suffix = p;
4808
		char *saved_suffix = NULL;
4809

4810
		while (*p == '.' || ISALNUM ((unsigned char) *p))
4811 4812
		  p++;
		suffix_length = p - suffix;
4813 4814
		if (p[0] == '%' && p[1] == 'O')
		  {
4815
		    p += 2;
4816
		    /* We don't support extra suffix characters after %O.  */
4817
		    if (*p == '.' || ISALNUM ((unsigned char) *p))
4818
		      fatal ("spec '%s' has invalid '%%0%c'", spec, *p);
4819
		    if (suffix_length == 0)
4820
		      suffix = TARGET_OBJECT_SUFFIX;
4821 4822 4823
		    else
		      {
			saved_suffix
4824
			  = XNEWVEC (char, suffix_length
4825
				     + strlen (TARGET_OBJECT_SUFFIX));
4826 4827
			strncpy (saved_suffix, suffix, suffix_length);
			strcpy (saved_suffix + suffix_length,
4828
				TARGET_OBJECT_SUFFIX);
4829
		      }
4830
		    suffix_length += strlen (TARGET_OBJECT_SUFFIX);
4831
		  }
4832

4833 4834 4835 4836 4837 4838 4839
		/* If the input_filename has the same suffix specified
		   for the %g, %u, or %U, and -save-temps is specified,
		   we could end up using that file as an intermediate
		   thus clobbering the user's source file (.e.g.,
		   gcc -save-temps foo.s would clobber foo.s with the
		   output of cpp0).  So check for this condition and
		   generate a temp file as the intermediate.  */
4840

4841 4842 4843 4844 4845 4846
		if (save_temps_flag)
		  {
		    temp_filename_length = basename_length + suffix_length;
		    temp_filename = alloca (temp_filename_length + 1);
		    strncpy ((char *) temp_filename, input_basename, basename_length);
		    strncpy ((char *) temp_filename + basename_length, suffix,
4847
			     suffix_length);
4848 4849 4850
		    *((char *) temp_filename + temp_filename_length) = '\0';
		    if (strcmp (temp_filename, input_filename) != 0)
		      {
4851
#ifndef HOST_LACKS_INODE_NUMBERS
4852
			struct stat st_temp;
4853

4854 4855 4856 4857 4858 4859 4860
			/* Note, set_input() resets input_stat_set to 0.  */
			if (input_stat_set == 0)
			  {
			    input_stat_set = stat (input_filename, &input_stat);
			    if (input_stat_set >= 0)
			      input_stat_set = 1;
			  }
4861

4862 4863 4864 4865
			/* If we have the stat for the input_filename
			   and we can do the stat for the temp_filename
			   then the they could still refer to the same
			   file if st_dev/st_ino's are the same.  */
4866 4867 4868 4869
			if (input_stat_set != 1
			    || stat (temp_filename, &st_temp) < 0
			    || input_stat.st_dev != st_temp.st_dev
			    || input_stat.st_ino != st_temp.st_ino)
4870 4871 4872 4873 4874 4875 4876
#else
			/* Just compare canonical pathnames.  */
			char* input_realname = lrealpath (input_filename);
			char* temp_realname = lrealpath (temp_filename);
			bool files_differ = strcmp (input_realname, temp_realname);
			free (input_realname);
			free (temp_realname);
4877
			if (files_differ)
4878
#endif
4879
			  {
4880 4881 4882
			    temp_filename = save_string (temp_filename,
							 temp_filename_length + 1);
			    obstack_grow (&obstack, temp_filename,
4883
						    temp_filename_length);
4884
			    arg_going = 1;
4885
			    delete_this_arg = 0;
4886 4887 4888 4889
			    break;
			  }
		      }
		  }
Tom Wood committed
4890 4891 4892 4893

		/* See if we already have an association of %g/%u/%U and
		   suffix.  */
		for (t = temp_names; t; t = t->next)
4894 4895
		  if (t->length == suffix_length
		      && strncmp (t->suffix, suffix, suffix_length) == 0
4896
		      && t->unique == (c == 'u' || c == 'U' || c == 'j'))
Tom Wood committed
4897 4898
		    break;

4899 4900
		/* Make a new association if needed.  %u and %j
		   require one.  */
4901
		if (t == 0 || c == 'u' || c == 'j')
Tom Wood committed
4902 4903 4904
		  {
		    if (t == 0)
		      {
4905
			t = xmalloc (sizeof (struct temp_name));
Tom Wood committed
4906 4907 4908
			t->next = temp_names;
			temp_names = t;
		      }
4909
		    t->length = suffix_length;
4910 4911 4912 4913 4914 4915 4916
		    if (saved_suffix)
		      {
			t->suffix = saved_suffix;
			saved_suffix = NULL;
		      }
		    else
		      t->suffix = save_string (suffix, suffix_length);
4917
		    t->unique = (c == 'u' || c == 'U' || c == 'j');
4918
		    temp_filename = make_temp_file (t->suffix);
4919
		    temp_filename_length = strlen (temp_filename);
Tom Wood committed
4920 4921 4922 4923
		    t->filename = temp_filename;
		    t->filename_length = temp_filename_length;
		  }

4924 4925 4926
		if (saved_suffix)
		  free (saved_suffix);

Tom Wood committed
4927
		obstack_grow (&obstack, t->filename, t->filename_length);
4928
		delete_this_arg = 1;
Richard Stallman committed
4929 4930 4931 4932 4933
	      }
	    arg_going = 1;
	    break;

	  case 'i':
Geoffrey Keating committed
4934 4935 4936
	    if (combine_inputs)
	      {
		for (i = 0; (int) i < n_infiles; i++)
4937 4938 4939 4940 4941 4942
		  if ((!infiles[i].language) || (infiles[i].language[0] != '*'))
		    if (infiles[i].incompiler == input_file_compiler)
		      {
			store_arg (infiles[i].name, 0, 0);
			infiles[i].compiled = true;
		      }
Geoffrey Keating committed
4943 4944 4945 4946 4947 4948
	      }
	    else
	      {
		obstack_grow (&obstack, input_filename, input_filename_length);
		arg_going = 1;
	      }
Richard Stallman committed
4949 4950
	    break;

4951
	  case 'I':
4952
	    {
4953
	      struct spec_path_info info;
4954

4955 4956 4957 4958 4959 4960 4961 4962 4963
	      if (multilib_dir)
		{
		  do_spec_1 ("-imultilib", 1, NULL);
		  /* Make this a separate argument.  */
		  do_spec_1 (" ", 0, NULL);
		  do_spec_1 (multilib_dir, 1, NULL);
		  do_spec_1 (" ", 0, NULL);
		}

4964 4965
	      if (gcc_exec_prefix)
		{
4966
		  do_spec_1 ("-iprefix", 1, NULL);
4967
		  /* Make this a separate argument.  */
4968 4969 4970
		  do_spec_1 (" ", 0, NULL);
		  do_spec_1 (gcc_exec_prefix, 1, NULL);
		  do_spec_1 (" ", 0, NULL);
4971 4972
		}

4973 4974
	      if (target_system_root_changed ||
		  (target_system_root && target_sysroot_hdrs_suffix))
4975 4976 4977 4978 4979
		{
		  do_spec_1 ("-isysroot", 1, NULL);
		  /* Make this a separate argument.  */
		  do_spec_1 (" ", 0, NULL);
		  do_spec_1 (target_system_root, 1, NULL);
4980 4981
		  if (target_sysroot_hdrs_suffix)
		    do_spec_1 (target_sysroot_hdrs_suffix, 1, NULL);
4982 4983 4984
		  do_spec_1 (" ", 0, NULL);
		}

4985 4986 4987 4988 4989 4990 4991 4992
	      info.option = "-isystem";
	      info.append = "include";
	      info.append_len = strlen (info.append);
	      info.omit_relative = false;
	      info.separate_options = true;

	      for_each_path (&include_prefixes, false, info.append_len,
			     spec_path, &info);
4993 4994

	      info.append = "include-fixed";
4995 4996 4997
	      if (*sysroot_hdrs_suffix_spec)
		info.append = concat (info.append, dir_separator_str,
				      multilib_dir, NULL);
4998 4999 5000
	      info.append_len = strlen (info.append);
	      for_each_path (&include_prefixes, false, info.append_len,
			     spec_path, &info);
5001
	    }
5002 5003
	    break;

Richard Stallman committed
5004
	  case 'o':
5005 5006 5007
	    {
	      int max = n_infiles;
	      max += lang_specific_extra_outfiles;
5008

5009 5010 5011 5012 5013
	      for (i = 0; i < max; i++)
		if (outfiles[i])
		  store_arg (outfiles[i], 0, 0);
	      break;
	    }
Richard Stallman committed
5014

5015
	  case 'O':
5016
	    obstack_grow (&obstack, TARGET_OBJECT_SUFFIX, strlen (TARGET_OBJECT_SUFFIX));
5017 5018 5019
	    arg_going = 1;
	    break;

Richard Stallman committed
5020 5021 5022 5023
	  case 's':
	    this_is_library_file = 1;
	    break;

5024 5025 5026 5027
	  case 'V':
	    outfiles[input_file_number] = NULL;
	    break;

Richard Stallman committed
5028 5029 5030 5031 5032 5033
	  case 'w':
	    this_is_output_file = 1;
	    break;

	  case 'W':
	    {
5034
	      int cur_index = argbuf_index;
Richard Stallman committed
5035 5036
	      /* Handle the {...} following the %W.  */
	      if (*p != '{')
5037
		fatal ("spec '%s' has invalid '%%W%c", spec, *p);
Richard Stallman committed
5038 5039 5040
	      p = handle_braces (p + 1);
	      if (p == 0)
		return -1;
5041 5042 5043 5044
	      /* End any pending argument.  */
	      if (arg_going)
		{
		  obstack_1grow (&obstack, 0);
5045
		  string = XOBFINISH (&obstack, const char *);
5046 5047 5048 5049 5050 5051 5052
		  if (this_is_library_file)
		    string = find_file (string);
		  store_arg (string, delete_this_arg, this_is_output_file);
		  if (this_is_output_file)
		    outfiles[input_file_number] = string;
		  arg_going = 0;
		}
Richard Stallman committed
5053 5054
	      /* If any args were output, mark the last one for deletion
		 on failure.  */
5055
	      if (argbuf_index != cur_index)
Richard Stallman committed
5056 5057 5058 5059 5060 5061 5062
		record_temp_file (argbuf[argbuf_index - 1], 0, 1);
	      break;
	    }

	  /* %x{OPTION} records OPTION for %X to output.  */
	  case 'x':
	    {
5063
	      const char *p1 = p;
Richard Stallman committed
5064 5065 5066 5067
	      char *string;

	      /* Skip past the option value and make a copy.  */
	      if (*p != '{')
5068
		fatal ("spec '%s' has invalid '%%x%c'", spec, *p);
Richard Stallman committed
5069 5070 5071 5072 5073 5074 5075 5076 5077 5078 5079 5080 5081
	      while (*p++ != '}')
		;
	      string = save_string (p1 + 1, p - p1 - 2);

	      /* See if we already recorded this option.  */
	      for (i = 0; i < n_linker_options; i++)
		if (! strcmp (string, linker_options[i]))
		  {
		    free (string);
		    return 0;
		  }

	      /* This option is new; add it.  */
Nick Clifton committed
5082
	      add_linker_option (string, strlen (string));
Richard Stallman committed
5083 5084 5085
	    }
	    break;

5086
	  /* Dump out the options accumulated previously using %x.  */
Richard Stallman committed
5087 5088 5089
	  case 'X':
	    for (i = 0; i < n_linker_options; i++)
	      {
5090
		do_spec_1 (linker_options[i], 1, NULL);
Richard Stallman committed
5091
		/* Make each accumulated option a separate argument.  */
5092
		do_spec_1 (" ", 0, NULL);
Richard Stallman committed
5093 5094 5095
	      }
	    break;

5096 5097 5098 5099
	  /* Dump out the options accumulated previously using -Wa,.  */
	  case 'Y':
	    for (i = 0; i < n_assembler_options; i++)
	      {
5100
		do_spec_1 (assembler_options[i], 1, NULL);
5101
		/* Make each accumulated option a separate argument.  */
5102
		do_spec_1 (" ", 0, NULL);
5103 5104 5105
	      }
	    break;

5106 5107 5108 5109
	  /* Dump out the options accumulated previously using -Wp,.  */
	  case 'Z':
	    for (i = 0; i < n_preprocessor_options; i++)
	      {
5110
		do_spec_1 (preprocessor_options[i], 1, NULL);
5111
		/* Make each accumulated option a separate argument.  */
5112
		do_spec_1 (" ", 0, NULL);
5113 5114 5115
	      }
	    break;

5116
	    /* Here are digits and numbers that just process
Richard Stallman committed
5117 5118 5119
	       a certain constant string as a spec.  */

	  case '1':
5120
	    value = do_spec_1 (cc1_spec, 0, NULL);
5121 5122
	    if (value != 0)
	      return value;
Richard Stallman committed
5123 5124 5125
	    break;

	  case '2':
5126
	    value = do_spec_1 (cc1plus_spec, 0, NULL);
5127 5128
	    if (value != 0)
	      return value;
Richard Stallman committed
5129 5130 5131
	    break;

	  case 'a':
5132
	    value = do_spec_1 (asm_spec, 0, NULL);
5133 5134
	    if (value != 0)
	      return value;
Richard Stallman committed
5135 5136 5137
	    break;

	  case 'A':
5138
	    value = do_spec_1 (asm_final_spec, 0, NULL);
5139 5140
	    if (value != 0)
	      return value;
Richard Stallman committed
5141 5142 5143
	    break;

	  case 'C':
5144
	    {
5145
	      const char *const spec
5146 5147
		= (input_file_compiler->cpp_spec
		   ? input_file_compiler->cpp_spec
5148
		   : cpp_spec);
5149
	      value = do_spec_1 (spec, 0, NULL);
5150 5151 5152
	      if (value != 0)
		return value;
	    }
Richard Stallman committed
5153 5154 5155
	    break;

	  case 'E':
5156
	    value = do_spec_1 (endfile_spec, 0, NULL);
5157 5158
	    if (value != 0)
	      return value;
Richard Stallman committed
5159 5160 5161
	    break;

	  case 'l':
5162
	    value = do_spec_1 (link_spec, 0, NULL);
5163 5164
	    if (value != 0)
	      return value;
Richard Stallman committed
5165 5166 5167
	    break;

	  case 'L':
5168
	    value = do_spec_1 (lib_spec, 0, NULL);
5169 5170
	    if (value != 0)
	      return value;
Richard Stallman committed
5171 5172
	    break;

Jason Merrill committed
5173
	  case 'G':
5174
	    value = do_spec_1 (libgcc_spec, 0, NULL);
Jason Merrill committed
5175 5176 5177 5178
	    if (value != 0)
	      return value;
	    break;

5179 5180 5181 5182
	  case 'R':
	    /* We assume there is a directory
	       separator at the end of this string.  */
	    if (target_system_root)
5183 5184
	      {
	        obstack_grow (&obstack, target_system_root,
5185 5186
			      strlen (target_system_root));
		if (target_sysroot_suffix)
5187
		  obstack_grow (&obstack, target_sysroot_suffix,
5188 5189
				strlen (target_sysroot_suffix));
	      }
5190 5191
	    break;

Richard Stallman committed
5192
	  case 'S':
5193
	    value = do_spec_1 (startfile_spec, 0, NULL);
5194 5195
	    if (value != 0)
	      return value;
Richard Stallman committed
5196 5197 5198 5199 5200 5201 5202 5203 5204 5205
	    break;

	    /* Here we define characters other than letters and digits.  */

	  case '{':
	    p = handle_braces (p);
	    if (p == 0)
	      return -1;
	    break;

5206 5207 5208 5209 5210 5211
	  case ':':
	    p = handle_spec_function (p);
	    if (p == 0)
	      return -1;
	    break;

Richard Stallman committed
5212 5213 5214 5215
	  case '%':
	    obstack_1grow (&obstack, '%');
	    break;

5216 5217 5218
	  case '.':
	    {
	      unsigned len = 0;
5219

5220 5221 5222 5223 5224
	      while (p[len] && p[len] != ' ' && p[len] != '%')
		len++;
	      suffix_subst = save_string (p - 1, len + 1);
	      p += len;
	    }
5225
	   break;
5226

5227 5228 5229 5230 5231 5232 5233 5234 5235 5236 5237 5238 5239 5240 5241 5242 5243 5244 5245 5246 5247 5248 5249 5250 5251 5252
	   /* Henceforth ignore the option(s) matching the pattern
	      after the %<.  */
	  case '<':
	    {
	      unsigned len = 0;
	      int have_wildcard = 0;
	      int i;

	      while (p[len] && p[len] != ' ' && p[len] != '\t')
		len++;

	      if (p[len-1] == '*')
		have_wildcard = 1;

	      for (i = 0; i < n_switches; i++)
		if (!strncmp (switches[i].part1, p, len - have_wildcard)
		    && (have_wildcard || switches[i].part1[len] == '\0'))
		  {
		    switches[i].live_cond = SWITCH_IGNORE;
		    switches[i].validated = 1;
		  }

	      p += len;
	    }
	    break;

Richard Stallman committed
5253
	  case '*':
5254 5255
	    if (soft_matched_part)
	      {
5256 5257
		do_spec_1 (soft_matched_part, 1, NULL);
		do_spec_1 (" ", 0, NULL);
5258 5259 5260
	      }
	    else
	      /* Catch the case where a spec string contains something like
5261
		 '%{foo:%*}'.  i.e. there is no * in the pattern on the left
5262
		 hand side of the :.  */
5263
	      error ("spec failure: '%%*' has not been initialized by pattern match");
Richard Stallman committed
5264 5265 5266 5267
	    break;

	    /* Process a string found as the value of a spec given by name.
	       This feature allows individual machine descriptions
5268 5269 5270 5271
	       to add and use their own specs.
	       %[...] modifies -D options the way %P does;
	       %(...) uses the spec unmodified.  */
	  case '[':
5272
	    error ("warning: use of obsolete %%[ operator in specs");
Richard Stallman committed
5273 5274
	  case '(':
	    {
5275
	      const char *name = p;
Richard Stallman committed
5276 5277 5278 5279
	      struct spec_list *sl;
	      int len;

	      /* The string after the S/P is the name of a spec that is to be
Mike Stump committed
5280
		 processed.  */
5281
	      while (*p && *p != ')' && *p != ']')
Richard Stallman committed
5282 5283
		p++;

5284
	      /* See if it's in the list.  */
Richard Stallman committed
5285
	      for (len = p - name, sl = specs; sl; sl = sl->next)
Michael Meissner committed
5286
		if (sl->name_len == len && !strncmp (sl->name, name, len))
Richard Stallman committed
5287
		  {
Michael Meissner committed
5288
		    name = *(sl->ptr_spec);
5289
#ifdef DEBUG_SPECS
5290 5291
		    notice ("Processing spec %c%s%c, which is '%s'\n",
			    c, sl->name, (c == '(') ? ')' : ']', name);
5292
#endif
Richard Stallman committed
5293 5294 5295 5296 5297
		    break;
		  }

	      if (sl)
		{
5298 5299
		  if (c == '(')
		    {
5300
		      value = do_spec_1 (name, 0, NULL);
5301 5302 5303 5304 5305
		      if (value != 0)
			return value;
		    }
		  else
		    {
5306
		      char *x = alloca (strlen (name) * 2 + 1);
5307
		      char *buf = x;
5308
		      const char *y = name;
5309 5310 5311
		      int flag = 0;

		      /* Copy all of NAME into BUF, but put __ after
5312
			 every -D and at the end of each arg.  */
5313 5314 5315 5316 5317 5318 5319 5320 5321 5322 5323 5324
		      while (1)
			{
			  if (! strncmp (y, "-D", 2))
			    {
			      *x++ = '-';
			      *x++ = 'D';
			      *x++ = '_';
			      *x++ = '_';
			      y += 2;
			      flag = 1;
			      continue;
			    }
Kazu Hirata committed
5325 5326 5327
			  else if (flag
				   && (*y == ' ' || *y == '\t' || *y == '='
				       || *y == '}' || *y == 0))
5328 5329 5330 5331 5332
			    {
			      *x++ = '_';
			      *x++ = '_';
			      flag = 0;
			    }
Kazu Hirata committed
5333
			  if (*y == 0)
5334 5335 5336 5337 5338 5339
			    break;
			  else
			    *x++ = *y++;
			}
		      *x = 0;

5340
		      value = do_spec_1 (buf, 0, NULL);
5341 5342 5343
		      if (value != 0)
			return value;
		    }
Richard Stallman committed
5344
		}
5345

5346
	      /* Discard the closing paren or bracket.  */
5347 5348
	      if (*p)
		p++;
Richard Stallman committed
5349 5350 5351 5352
	    }
	    break;

	  default:
5353
	    error ("spec failure: unrecognized spec option '%c'", c);
5354
	    break;
Richard Stallman committed
5355 5356 5357 5358 5359 5360 5361
	  }
	break;

      case '\\':
	/* Backslash: treat next character as ordinary.  */
	c = *p++;

5362
	/* Fall through.  */
Richard Stallman committed
5363 5364 5365 5366 5367 5368
      default:
	/* Ordinary character: put it into the current argument.  */
	obstack_1grow (&obstack, c);
	arg_going = 1;
      }

5369 5370 5371 5372 5373
  /* End of string.  If we are processing a spec function, we need to
     end any pending argument.  */
  if (processing_spec_function && arg_going)
    {
      obstack_1grow (&obstack, 0);
5374
      string = XOBFINISH (&obstack, const char *);
5375 5376 5377 5378 5379 5380 5381 5382
      if (this_is_library_file)
        string = find_file (string);
      store_arg (string, delete_this_arg, this_is_output_file);
      if (this_is_output_file)
        outfiles[input_file_number] = string;
      arg_going = 0;
    }

Kazu Hirata committed
5383
  return 0;
Richard Stallman committed
5384 5385
}

5386 5387 5388
/* Look up a spec function.  */

static const struct spec_function *
5389
lookup_spec_function (const char *name)
5390 5391 5392
{
  const struct spec_function *sf;

5393 5394 5395
  for (sf = static_spec_functions; sf->name != NULL; sf++)
    if (strcmp (sf->name, name) == 0)
      return sf;
5396 5397 5398 5399 5400 5401 5402

  return NULL;
}

/* Evaluate a spec function.  */

static const char *
5403
eval_spec_function (const char *func, const char *args)
5404 5405 5406 5407 5408 5409 5410 5411 5412 5413 5414 5415 5416 5417 5418 5419 5420 5421 5422
{
  const struct spec_function *sf;
  const char *funcval;

  /* Saved spec processing context.  */
  int save_argbuf_index;
  int save_argbuf_length;
  const char **save_argbuf;

  int save_arg_going;
  int save_delete_this_arg;
  int save_this_is_output_file;
  int save_this_is_library_file;
  int save_input_from_pipe;
  const char *save_suffix_subst;


  sf = lookup_spec_function (func);
  if (sf == NULL)
5423
    fatal ("unknown spec function '%s'", func);
5424 5425 5426 5427 5428 5429 5430 5431 5432 5433 5434 5435 5436 5437 5438 5439 5440 5441

  /* Push the spec processing context.  */
  save_argbuf_index = argbuf_index;
  save_argbuf_length = argbuf_length;
  save_argbuf = argbuf;

  save_arg_going = arg_going;
  save_delete_this_arg = delete_this_arg;
  save_this_is_output_file = this_is_output_file;
  save_this_is_library_file = this_is_library_file;
  save_input_from_pipe = input_from_pipe;
  save_suffix_subst = suffix_subst;

  /* Create a new spec processing context, and build the function
     arguments.  */

  alloc_args ();
  if (do_spec_2 (args) < 0)
5442
    fatal ("error in args to spec function '%s'", func);
5443 5444 5445 5446 5447 5448 5449 5450 5451 5452 5453 5454 5455 5456 5457 5458 5459 5460 5461 5462 5463 5464 5465 5466 5467 5468 5469 5470 5471 5472 5473 5474

  /* argbuf_index is an index for the next argument to be inserted, and
     so contains the count of the args already inserted.  */

  funcval = (*sf->func) (argbuf_index, argbuf);

  /* Pop the spec processing context.  */
  argbuf_index = save_argbuf_index;
  argbuf_length = save_argbuf_length;
  free (argbuf);
  argbuf = save_argbuf;

  arg_going = save_arg_going;
  delete_this_arg = save_delete_this_arg;
  this_is_output_file = save_this_is_output_file;
  this_is_library_file = save_this_is_library_file;
  input_from_pipe = save_input_from_pipe;
  suffix_subst = save_suffix_subst;

  return funcval;
}

/* Handle a spec function call of the form:

   %:function(args)

   ARGS is processed as a spec in a separate context and split into an
   argument vector in the normal fashion.  The function returns a string
   containing a spec which we then process in the caller's context, or
   NULL if no processing is required.  */

static const char *
5475
handle_spec_function (const char *p)
5476 5477 5478 5479 5480 5481 5482 5483 5484 5485 5486 5487 5488 5489 5490 5491 5492 5493 5494 5495 5496 5497 5498 5499 5500 5501 5502 5503 5504 5505 5506 5507 5508 5509 5510 5511 5512 5513 5514 5515 5516 5517 5518 5519 5520 5521 5522 5523 5524 5525 5526 5527 5528 5529
{
  char *func, *args;
  const char *endp, *funcval;
  int count;

  processing_spec_function++;

  /* Get the function name.  */
  for (endp = p; *endp != '\0'; endp++)
    {
      if (*endp == '(')		/* ) */
        break;
      /* Only allow [A-Za-z0-9], -, and _ in function names.  */
      if (!ISALNUM (*endp) && !(*endp == '-' || *endp == '_'))
	fatal ("malformed spec function name");
    }
  if (*endp != '(')		/* ) */
    fatal ("no arguments for spec function");
  func = save_string (p, endp - p);
  p = ++endp;

  /* Get the arguments.  */
  for (count = 0; *endp != '\0'; endp++)
    {
      /* ( */
      if (*endp == ')')
	{
	  if (count == 0)
	    break;
	  count--;
	}
      else if (*endp == '(')	/* ) */
	count++;
    }
  /* ( */
  if (*endp != ')')
    fatal ("malformed spec function arguments");
  args = save_string (p, endp - p);
  p = ++endp;

  /* p now points to just past the end of the spec function expression.  */

  funcval = eval_spec_function (func, args);
  if (funcval != NULL && do_spec_1 (funcval, 0, NULL) < 0)
    p = NULL;

  free (func);
  free (args);

  processing_spec_function--;

  return p;
}

5530 5531 5532
/* Inline subroutine of handle_braces.  Returns true if the current
   input suffix matches the atom bracketed by ATOM and END_ATOM.  */
static inline bool
5533
input_suffix_matches (const char *atom, const char *end_atom)
5534 5535 5536 5537 5538
{
  return (input_suffix
	  && !strncmp (input_suffix, atom, end_atom - atom)
	  && input_suffix[end_atom - atom] == '\0');
}
Richard Stallman committed
5539

5540 5541 5542 5543 5544 5545 5546 5547 5548 5549 5550 5551 5552
/* Subroutine of handle_braces.  Returns true if the current
   input file's spec name matches the atom bracketed by ATOM and END_ATOM.  */
static bool
input_spec_matches (const char *atom, const char *end_atom)
{
  return (input_file_compiler
	  && input_file_compiler->suffix
	  && input_file_compiler->suffix[0] != '\0'
	  && !strncmp (input_file_compiler->suffix + 1, atom,
		       end_atom - atom)
	  && input_file_compiler->suffix[end_atom - atom + 1] == '\0');
}

Diego Novillo committed
5553
/* Subroutine of handle_braces.  Returns true if a switch
5554 5555
   matching the atom bracketed by ATOM and END_ATOM appeared on the
   command line.  */
Diego Novillo committed
5556
static bool
5557
switch_matches (const char *atom, const char *end_atom, int starred)
Richard Stallman committed
5558
{
5559 5560 5561
  int i;
  int len = end_atom - atom;
  int plen = starred ? len : -1;
Richard Stallman committed
5562

5563 5564 5565 5566 5567
  for (i = 0; i < n_switches; i++)
    if (!strncmp (switches[i].part1, atom, len)
	&& (starred || switches[i].part1[len] == '\0')
	&& check_live_switch (i, plen))
      return true;
5568

5569 5570
  return false;
}
Richard Stallman committed
5571

5572 5573 5574 5575
/* Inline subroutine of handle_braces.  Mark all of the switches which
   match ATOM (extends to END_ATOM; STARRED indicates whether there
   was a star after the atom) for later processing.  */
static inline void
5576
mark_matching_switches (const char *atom, const char *end_atom, int starred)
5577 5578 5579 5580 5581 5582 5583 5584 5585 5586 5587
{
  int i;
  int len = end_atom - atom;
  int plen = starred ? len : -1;

  for (i = 0; i < n_switches; i++)
    if (!strncmp (switches[i].part1, atom, len)
	&& (starred || switches[i].part1[len] == '\0')
	&& check_live_switch (i, plen))
      switches[i].ordering = 1;
}
5588

5589 5590 5591
/* Inline subroutine of handle_braces.  Process all the currently
   marked switches through give_switch, and clear the marks.  */
static inline void
5592
process_marked_switches (void)
5593 5594
{
  int i;
Richard Stallman committed
5595

5596 5597 5598 5599 5600 5601 5602
  for (i = 0; i < n_switches; i++)
    if (switches[i].ordering == 1)
      {
	switches[i].ordering = 0;
	give_switch (i, 0);
      }
}
Richard Stallman committed
5603

5604 5605 5606
/* Handle a %{ ... } construct.  P points just inside the leading {.
   Returns a pointer one past the end of the brace block, or 0
   if we call do_spec_1 and that returns -1.  */
Richard Stallman committed
5607

5608
static const char *
5609
handle_braces (const char *p)
5610 5611 5612
{
  const char *atom, *end_atom;
  const char *d_atom = NULL, *d_end_atom = NULL;
5613
  const char *orig = p;
5614

5615
  bool a_is_suffix;
5616
  bool a_is_spectype;
5617 5618 5619
  bool a_is_starred;
  bool a_is_negated;
  bool a_matched;
5620

5621 5622 5623 5624 5625 5626 5627 5628 5629
  bool a_must_be_last = false;
  bool ordered_set    = false;
  bool disjunct_set   = false;
  bool disj_matched   = false;
  bool disj_starred   = true;
  bool n_way_choice   = false;
  bool n_way_matched  = false;

#define SKIP_WHITE() do { while (*p == ' ' || *p == '\t') p++; } while (0)
5630

5631
  do
Richard Stallman committed
5632
    {
5633
      if (a_must_be_last)
5634
	goto invalid;
5635

5636
      /* Scan one "atom" (S in the description above of %{}, possibly
5637 5638 5639 5640 5641 5642
	 with '!', '.', '@', ',', or '*' modifiers).  */
      a_matched = false;
      a_is_suffix = false;
      a_is_starred = false;
      a_is_negated = false;
      a_is_spectype = false;
Kazu Hirata committed
5643

5644 5645 5646
      SKIP_WHITE();
      if (*p == '!')
	p++, a_is_negated = true;
Richard Stallman committed
5647

5648 5649 5650
      SKIP_WHITE();
      if (*p == '.')
	p++, a_is_suffix = true;
5651 5652
      else if (*p == ',')
	p++, a_is_spectype = true;
Richard Stallman committed
5653

5654 5655
      atom = p;
      while (ISIDNUM(*p) || *p == '-' || *p == '+' || *p == '='
5656
	     || *p == ',' || *p == '.' || *p == '@')
5657 5658
	p++;
      end_atom = p;
Richard Stallman committed
5659

5660 5661
      if (*p == '*')
	p++, a_is_starred = 1;
5662

5663
      SKIP_WHITE();
5664
      switch (*p)
5665
	{
5666
	case '&': case '}':
5667 5668 5669
	  /* Substitute the switch(es) indicated by the current atom.  */
	  ordered_set = true;
	  if (disjunct_set || n_way_choice || a_is_negated || a_is_suffix
5670
	      || a_is_spectype || atom == end_atom)
5671
	    goto invalid;
Richard Stallman committed
5672

5673 5674 5675 5676
	  mark_matching_switches (atom, end_atom, a_is_starred);

	  if (*p == '}')
	    process_marked_switches ();
5677 5678 5679
	  break;

	case '|': case ':':
5680 5681 5682 5683
	  /* Substitute some text if the current atom appears as a switch
	     or suffix.  */
	  disjunct_set = true;
	  if (ordered_set)
5684
	    goto invalid;
Richard Stallman committed
5685

5686
	  if (atom == end_atom)
Richard Stallman committed
5687
	    {
5688
	      if (!n_way_choice || disj_matched || *p == '|'
5689 5690
		  || a_is_negated || a_is_suffix || a_is_spectype 
		  || a_is_starred)
5691
		goto invalid;
5692 5693 5694 5695 5696 5697

	      /* An empty term may appear as the last choice of an
		 N-way choice set; it means "otherwise".  */
	      a_must_be_last = true;
	      disj_matched = !n_way_matched;
	      disj_starred = false;
Richard Stallman committed
5698
	    }
5699
	  else
Richard Stallman committed
5700
	    {
5701 5702 5703 5704 5705 5706 5707 5708 5709 5710 5711 5712 5713 5714 5715 5716 5717 5718 5719 5720 5721 5722 5723 5724
	      if ((a_is_suffix || a_is_spectype) && a_is_starred)
		goto invalid;
	      
	      if (!a_is_starred)
		disj_starred = false;

	      /* Don't bother testing this atom if we already have a
		 match.  */
	      if (!disj_matched && !n_way_matched)
		{
		  if (a_is_suffix)
		    a_matched = input_suffix_matches (atom, end_atom);
		  else if (a_is_spectype)
		    a_matched = input_spec_matches (atom, end_atom);
		  else
		    a_matched = switch_matches (atom, end_atom, a_is_starred);
		  
		  if (a_matched != a_is_negated)
		    {
		      disj_matched = true;
		      d_atom = atom;
		      d_end_atom = end_atom;
		    }
		}
Richard Stallman committed
5725 5726
	    }

5727
	  if (*p == ':')
Richard Stallman committed
5728
	    {
5729 5730 5731 5732 5733 5734
	      /* Found the body, that is, the text to substitute if the
		 current disjunction matches.  */
	      p = process_brace_body (p + 1, d_atom, d_end_atom, disj_starred,
				      disj_matched && !n_way_matched);
	      if (p == 0)
		return 0;
Richard Stallman committed
5735

5736 5737 5738
	      /* If we have an N-way choice, reset state for the next
		 disjunction.  */
	      if (*p == ';')
Richard Stallman committed
5739
		{
5740 5741 5742 5743 5744
		  n_way_choice = true;
		  n_way_matched |= disj_matched;
		  disj_matched = false;
		  disj_starred = true;
		  d_atom = d_end_atom = NULL;
Richard Stallman committed
5745 5746
		}
	    }
5747 5748 5749 5750
	  break;

	default:
	  goto invalid;
Richard Stallman committed
5751
	}
5752 5753
    }
  while (*p++ != '}');
Richard Stallman committed
5754

5755
  return p;
5756

5757
 invalid:
5758
  fatal ("braced spec '%s' is invalid at '%c'", orig, *p);
5759

5760 5761 5762 5763 5764 5765 5766 5767 5768 5769 5770 5771 5772 5773
#undef SKIP_WHITE
}

/* Subroutine of handle_braces.  Scan and process a brace substitution body
   (X in the description of %{} syntax).  P points one past the colon;
   ATOM and END_ATOM bracket the first atom which was found to be true
   (present) in the current disjunction; STARRED indicates whether all
   the atoms in the current disjunction were starred (for syntax validation);
   MATCHED indicates whether the disjunction matched or not, and therefore
   whether or not the body is to be processed through do_spec_1 or just
   skipped.  Returns a pointer to the closing } or ;, or 0 if do_spec_1
   returns -1.  */

static const char *
5774 5775
process_brace_body (const char *p, const char *atom, const char *end_atom,
		    int starred, int matched)
5776 5777 5778 5779 5780 5781 5782 5783 5784 5785 5786 5787 5788 5789
{
  const char *body, *end_body;
  unsigned int nesting_level;
  bool have_subst     = false;

  /* Locate the closing } or ;, honoring nested braces.
     Trim trailing whitespace.  */
  body = p;
  nesting_level = 1;
  for (;;)
    {
      if (*p == '{')
	nesting_level++;
      else if (*p == '}')
Richard Stallman committed
5790
	{
5791 5792
	  if (!--nesting_level)
	    break;
Richard Stallman committed
5793
	}
5794 5795 5796 5797 5798
      else if (*p == ';' && nesting_level == 1)
	break;
      else if (*p == '%' && p[1] == '*' && nesting_level == 1)
	have_subst = true;
      else if (*p == '\0')
5799
	goto invalid;
5800
      p++;
Richard Stallman committed
5801
    }
5802

5803 5804 5805
  end_body = p;
  while (end_body[-1] == ' ' || end_body[-1] == '\t')
    end_body--;
Richard Stallman committed
5806

5807
  if (have_subst && !starred)
5808
    goto invalid;
5809

5810
  if (matched)
5811
    {
5812 5813 5814 5815 5816 5817 5818 5819 5820 5821 5822 5823 5824 5825 5826 5827
      /* Copy the substitution body to permanent storage and execute it.
	 If have_subst is false, this is a simple matter of running the
	 body through do_spec_1...  */
      char *string = save_string (body, end_body - body);
      if (!have_subst)
	{
	  if (do_spec_1 (string, 0, NULL) < 0)
	    return 0;
	}
      else
	{
	  /* ... but if have_subst is true, we have to process the
	     body once for each matching switch, with %* set to the
	     variant part of the switch.  */
	  unsigned int hard_match_len = end_atom - atom;
	  int i;
5828

5829 5830 5831 5832 5833 5834 5835 5836 5837 5838 5839 5840
	  for (i = 0; i < n_switches; i++)
	    if (!strncmp (switches[i].part1, atom, hard_match_len)
		&& check_live_switch (i, hard_match_len))
	      {
		if (do_spec_1 (string, 0,
			       &switches[i].part1[hard_match_len]) < 0)
		  return 0;
		/* Pass any arguments this switch has.  */
		give_switch (i, 1);
		suffix_subst = NULL;
	      }
	}
5841 5842
    }

5843
  return p;
5844 5845

 invalid:
5846
  fatal ("braced spec body '%s' is invalid", body);
Richard Stallman committed
5847
}
5848

5849 5850 5851
/* Return 0 iff switch number SWITCHNUM is obsoleted by a later switch
   on the command line.  PREFIX_LENGTH is the length of XXX in an {XXX*}
   spec, or -1 if either exact match or %* is used.
5852 5853 5854 5855 5856 5857

   A -O switch is obsoleted by a later -O switch.  A -f, -m, or -W switch
   whose value does not begin with "no-" is obsoleted by the same value
   with the "no-", similarly for a switch with the "no-" prefix.  */

static int
5858
check_live_switch (int switchnum, int prefix_length)
5859
{
5860
  const char *name = switches[switchnum].part1;
5861 5862
  int i;

5863
  /* In the common case of {<at-most-one-letter>*}, a negating
5864 5865
     switch would always match, so ignore that case.  We will just
     send the conflicting switches to the compiler phase.  */
5866
  if (prefix_length >= 0 && prefix_length <= 1)
5867 5868 5869 5870 5871 5872 5873 5874 5875 5876 5877
    return 1;

  /* If we already processed this switch and determined if it was
     live or not, return our past determination.  */
  if (switches[switchnum].live_cond != 0)
    return switches[switchnum].live_cond > 0;

  /* Now search for duplicate in a manner that depends on the name.  */
  switch (*name)
    {
    case 'O':
Kazu Hirata committed
5878 5879 5880 5881 5882 5883 5884
      for (i = switchnum + 1; i < n_switches; i++)
	if (switches[i].part1[0] == 'O')
	  {
	    switches[switchnum].validated = 1;
	    switches[switchnum].live_cond = SWITCH_FALSE;
	    return 0;
	  }
5885
      break;
Richard Stallman committed
5886

5887
    case 'W':  case 'f':  case 'm':
5888
      if (! strncmp (name + 1, "no-", 3))
5889
	{
Mike Stump committed
5890
	  /* We have Xno-YYY, search for XYYY.  */
5891 5892 5893
	  for (i = switchnum + 1; i < n_switches; i++)
	    if (switches[i].part1[0] == name[0]
		&& ! strcmp (&switches[i].part1[1], &name[4]))
Kazu Hirata committed
5894 5895 5896 5897 5898
	      {
		switches[switchnum].validated = 1;
		switches[switchnum].live_cond = SWITCH_FALSE;
		return 0;
	      }
5899 5900 5901 5902 5903 5904 5905 5906 5907 5908
	}
      else
	{
	  /* We have XYYY, search for Xno-YYY.  */
	  for (i = switchnum + 1; i < n_switches; i++)
	    if (switches[i].part1[0] == name[0]
		&& switches[i].part1[1] == 'n'
		&& switches[i].part1[2] == 'o'
		&& switches[i].part1[3] == '-'
		&& !strcmp (&switches[i].part1[4], &name[1]))
Kazu Hirata committed
5909 5910 5911 5912 5913
	      {
		switches[switchnum].validated = 1;
		switches[switchnum].live_cond = SWITCH_FALSE;
		return 0;
	      }
5914 5915 5916 5917 5918
	}
      break;
    }

  /* Otherwise the switch is live.  */
5919
  switches[switchnum].live_cond = SWITCH_LIVE;
5920 5921 5922
  return 1;
}

Richard Stallman committed
5923 5924 5925 5926 5927 5928
/* Pass a switch to the current accumulating command
   in the same form that we received it.
   SWITCHNUM identifies the switch; it is an index into
   the vector of switches gcc received, which is `switches'.
   This cannot fail since it never finishes a command line.

5929
   If OMIT_FIRST_WORD is nonzero, then we omit .part1 of the argument.  */
Richard Stallman committed
5930 5931

static void
5932
give_switch (int switchnum, int omit_first_word)
Richard Stallman committed
5933
{
5934 5935 5936
  if (switches[switchnum].live_cond == SWITCH_IGNORE)
    return;

Richard Stallman committed
5937 5938
  if (!omit_first_word)
    {
5939 5940
      do_spec_1 ("-", 0, NULL);
      do_spec_1 (switches[switchnum].part1, 1, NULL);
Richard Stallman committed
5941
    }
5942

Richard Stallman committed
5943 5944
  if (switches[switchnum].args != 0)
    {
Zack Weinberg committed
5945
      const char **p;
Richard Stallman committed
5946 5947
      for (p = switches[switchnum].args; *p; p++)
	{
5948 5949
	  const char *arg = *p;

5950
	  do_spec_1 (" ", 0, NULL);
5951 5952 5953
	  if (suffix_subst)
	    {
	      unsigned length = strlen (arg);
5954
	      int dot = 0;
5955 5956 5957 5958 5959

	      while (length-- && !IS_DIR_SEPARATOR (arg[length]))
		if (arg[length] == '.')
		  {
		    ((char *)arg)[length] = 0;
5960
		    dot = 1;
5961 5962
		    break;
		  }
5963
	      do_spec_1 (arg, 1, NULL);
5964 5965 5966
	      if (dot)
		((char *)arg)[length] = '.';
	      do_spec_1 (suffix_subst, 1, NULL);
5967 5968
	    }
	  else
5969
	    do_spec_1 (arg, 1, NULL);
Richard Stallman committed
5970 5971
	}
    }
5972

5973
  do_spec_1 (" ", 0, NULL);
5974
  switches[switchnum].validated = 1;
Richard Stallman committed
5975 5976 5977 5978 5979 5980
}

/* Search for a file named NAME trying various prefixes including the
   user's -B prefix and some standard ones.
   Return the absolute file name found.  If nothing is found, return NAME.  */

5981
static const char *
5982
find_file (const char *name)
Richard Stallman committed
5983
{
5984
  char *newname = find_a_file (&startfile_prefixes, name, R_OK, true);
Richard Stallman committed
5985 5986 5987
  return newname ? newname : name;
}

5988
/* Determine whether a directory exists.  If LINKER, return 0 for
5989
   certain fixed names not needed by the linker.  */
Richard Stallman committed
5990 5991

static int
5992
is_directory (const char *path1, bool linker)
Richard Stallman committed
5993
{
5994 5995
  int len1;
  char *path;
Richard Stallman committed
5996 5997 5998
  char *cp;
  struct stat st;

5999 6000 6001 6002
  /* Ensure the string ends with "/.".  The resulting path will be a
     directory even if the given path is a symbolic link.  */
  len1 = strlen (path1);
  path = alloca (3 + len1);
6003
  memcpy (path, path1, len1);
6004
  cp = path + len1;
6005
  if (!IS_DIR_SEPARATOR (cp[-1]))
6006
    *cp++ = DIR_SEPARATOR;
Richard Stallman committed
6007 6008 6009 6010
  *cp++ = '.';
  *cp = '\0';

  /* Exclude directories that the linker is known to search.  */
6011
  if (linker
6012
      && IS_DIR_SEPARATOR (path[0])
6013
      && ((cp - path == 6
6014
	   && strncmp (path + 1, "lib", 3) == 0)
6015
	  || (cp - path == 10
6016 6017 6018
	      && strncmp (path + 1, "usr", 3) == 0
	      && IS_DIR_SEPARATOR (path[4])
	      && strncmp (path + 5, "lib", 3) == 0)))
Richard Stallman committed
6019 6020 6021 6022
    return 0;

  return (stat (path, &st) >= 0 && S_ISDIR (st.st_mode));
}
6023 6024 6025 6026

/* Set up the various global variables to indicate that we're processing
   the input file named FILENAME.  */

6027
void
6028
set_input (const char *filename)
6029
{
6030
  const char *p;
6031 6032 6033

  input_filename = filename;
  input_filename_length = strlen (input_filename);
Kazu Hirata committed
6034

6035
  input_basename = input_filename;
6036 6037 6038 6039 6040 6041
#ifdef HAVE_DOS_BASED_FILE_SYSTEM
  /* Skip drive name so 'x:foo' is handled properly.  */
  if (input_basename[1] == ':')
    input_basename += 2;
#endif
  for (p = input_basename; *p; p++)
6042 6043 6044 6045 6046 6047
    if (IS_DIR_SEPARATOR (*p))
      input_basename = p + 1;

  /* Find a suffix starting with the last period,
     and set basename_length to exclude that suffix.  */
  basename_length = strlen (input_basename);
6048
  suffixed_basename_length = basename_length;
6049
  p = input_basename + basename_length;
Kazu Hirata committed
6050 6051
  while (p != input_basename && *p != '.')
    --p;
6052 6053 6054 6055 6056 6057 6058
  if (*p == '.' && p != input_basename)
    {
      basename_length = p - input_basename;
      input_suffix = p + 1;
    }
  else
    input_suffix = "";
6059

6060 6061 6062 6063
  /* If a spec for 'g', 'u', or 'U' is seen with -save-temps then
     we will need to do a stat on the input_filename.  The
     INPUT_STAT_SET signals that the stat is needed.  */
  input_stat_set = 0;
6064
}
Richard Stallman committed
6065 6066 6067 6068

/* On fatal signals, delete all the temporary files.  */

static void
6069
fatal_error (int signum)
Richard Stallman committed
6070 6071 6072 6073 6074 6075 6076 6077 6078
{
  signal (signum, SIG_DFL);
  delete_failure_queue ();
  delete_temp_files ();
  /* Get the same signal again, this time not handled,
     so its normal effect occurs.  */
  kill (getpid (), signum);
}

6079
extern int main (int, char **);
6080

Richard Stallman committed
6081
int
6082
main (int argc, char **argv)
Richard Stallman committed
6083
{
6084
  size_t i;
Richard Stallman committed
6085 6086
  int value;
  int linker_was_run = 0;
6087
  int lang_n_infiles = 0;
6088
  int num_linker_inputs = 0;
Richard Stallman committed
6089 6090
  char *explicit_link_files;
  char *specs_file;
6091
  const char *p;
Michael Meissner committed
6092
  struct user_specs *uptr;
Richard Stallman committed
6093

6094
  p = argv[0] + strlen (argv[0]);
6095 6096
  while (p != argv[0] && !IS_DIR_SEPARATOR (p[-1]))
    --p;
6097
  programname = p;
Richard Stallman committed
6098

6099 6100
  xmalloc_set_program_name (programname);

6101 6102
  expandargv (&argc, &argv);

6103 6104
  prune_options (&argc, &argv);

6105
#ifdef GCC_DRIVER_HOST_INITIALIZATION
6106
  /* Perform host dependent initialization when needed.  */
6107 6108 6109
  GCC_DRIVER_HOST_INITIALIZATION;
#endif

6110
  /* Unlock the stdio streams.  */
6111
  unlock_std_streams ();
6112

6113
  gcc_init_libintl ();
6114

Richard Stallman committed
6115 6116
  if (signal (SIGINT, SIG_IGN) != SIG_IGN)
    signal (SIGINT, fatal_error);
6117
#ifdef SIGHUP
Richard Stallman committed
6118 6119
  if (signal (SIGHUP, SIG_IGN) != SIG_IGN)
    signal (SIGHUP, fatal_error);
6120
#endif
Richard Stallman committed
6121 6122 6123 6124 6125 6126
  if (signal (SIGTERM, SIG_IGN) != SIG_IGN)
    signal (SIGTERM, fatal_error);
#ifdef SIGPIPE
  if (signal (SIGPIPE, SIG_IGN) != SIG_IGN)
    signal (SIGPIPE, fatal_error);
#endif
6127
#ifdef SIGCHLD
Bruce Korb committed
6128 6129 6130
  /* We *MUST* set SIGCHLD to SIG_DFL so that the wait4() call will
     receive the signal.  A different setting is inheritable */
  signal (SIGCHLD, SIG_DFL);
6131
#endif
Richard Stallman committed
6132

6133 6134
  /* Allocate the argument vector.  */
  alloc_args ();
Richard Stallman committed
6135 6136 6137

  obstack_init (&obstack);

6138 6139
  /* Build multilib_select, et. al from the separate lines that make up each
     multilib selection.  */
6140
  {
Zack Weinberg committed
6141
    const char *const *q = multilib_raw;
6142
    int need_space;
6143 6144

    obstack_init (&multilib_obstack);
Mike Stump committed
6145
    while ((p = *q++) != (char *) 0)
6146 6147 6148
      obstack_grow (&multilib_obstack, p, strlen (p));

    obstack_1grow (&multilib_obstack, 0);
6149
    multilib_select = XOBFINISH (&multilib_obstack, const char *);
6150 6151 6152 6153 6154 6155

    q = multilib_matches_raw;
    while ((p = *q++) != (char *) 0)
      obstack_grow (&multilib_obstack, p, strlen (p));

    obstack_1grow (&multilib_obstack, 0);
6156
    multilib_matches = XOBFINISH (&multilib_obstack, const char *);
6157

6158 6159
    q = multilib_exclusions_raw;
    while ((p = *q++) != (char *) 0)
Kazu Hirata committed
6160
      obstack_grow (&multilib_obstack, p, strlen (p));
6161 6162

    obstack_1grow (&multilib_obstack, 0);
6163
    multilib_exclusions = XOBFINISH (&multilib_obstack, const char *);
Kazu Hirata committed
6164

6165
    need_space = FALSE;
6166
    for (i = 0; i < ARRAY_SIZE (multilib_defaults_raw); i++)
6167 6168 6169 6170 6171 6172 6173 6174 6175 6176
      {
	if (need_space)
	  obstack_1grow (&multilib_obstack, ' ');
	obstack_grow (&multilib_obstack,
		      multilib_defaults_raw[i],
		      strlen (multilib_defaults_raw[i]));
	need_space = TRUE;
      }

    obstack_1grow (&multilib_obstack, 0);
6177
    multilib_defaults = XOBFINISH (&multilib_obstack, const char *);
6178 6179
  }

6180
  /* Set up to remember the pathname of gcc and any options
6181 6182
     needed for collect.  We use argv[0] instead of programname because
     we need the complete pathname.  */
6183
  obstack_init (&collect_obstack);
Kazu Hirata committed
6184 6185
  obstack_grow (&collect_obstack, "COLLECT_GCC=", sizeof ("COLLECT_GCC=") - 1);
  obstack_grow (&collect_obstack, argv[0], strlen (argv[0]) + 1);
6186
  putenv (XOBFINISH (&collect_obstack, char *));
6187

6188 6189 6190 6191 6192
#ifdef INIT_ENVIRONMENT
  /* Set up any other necessary machine specific environment variables.  */
  putenv (INIT_ENVIRONMENT);
#endif

Richard Stallman committed
6193 6194 6195 6196
  /* Make a table of what switches there are (switches, n_switches).
     Make a table of specified input files (infiles, n_infiles).
     Decode switches that are handled locally.  */

6197
  process_command (argc, (const char **) argv);
Richard Stallman committed
6198 6199 6200 6201

  /* Initialize the vector of specs to just the default.
     This means one element containing 0s, as a terminator.  */

6202 6203
  compilers = xmalloc (sizeof default_compilers);
  memcpy (compilers, default_compilers, sizeof default_compilers);
Richard Stallman committed
6204 6205 6206 6207
  n_compilers = n_default_compilers;

  /* Read specs from a file if there is one.  */

6208
  machine_suffix = concat (spec_machine, dir_separator_str,
6209 6210
			   spec_version, dir_separator_str, NULL);
  just_machine_suffix = concat (spec_machine, dir_separator_str, NULL);
Richard Stallman committed
6211

6212
  specs_file = find_a_file (&startfile_prefixes, "specs", R_OK, true);
Richard Stallman committed
6213 6214
  /* Read the specs file unless it is a default one.  */
  if (specs_file != 0 && strcmp (specs_file, "specs"))
6215 6216 6217
    read_specs (specs_file, TRUE);
  else
    init_spec ();
Michael Meissner committed
6218

6219
  /* We need to check standard_exec_prefix/just_machine_suffix/specs
6220
     for any override of as, ld and libraries.  */
6221 6222
  specs_file = alloca (strlen (standard_exec_prefix)
		       + strlen (just_machine_suffix) + sizeof ("specs"));
6223 6224 6225 6226 6227 6228

  strcpy (specs_file, standard_exec_prefix);
  strcat (specs_file, just_machine_suffix);
  strcat (specs_file, "specs");
  if (access (specs_file, R_OK) == 0)
    read_specs (specs_file, TRUE);
Kazu Hirata committed
6229

6230 6231 6232 6233 6234 6235
  /* Process any configure-time defaults specified for the command line
     options, via OPTION_DEFAULT_SPECS.  */
  for (i = 0; i < ARRAY_SIZE (option_default_specs); i++)
    do_option_spec (option_default_specs[i].name,
		    option_default_specs[i].spec);

6236 6237 6238 6239 6240 6241
  /* Process DRIVER_SELF_SPECS, adding any new options to the end
     of the command line.  */

  for (i = 0; i < ARRAY_SIZE (driver_self_specs); i++)
    do_self_spec (driver_self_specs[i]);

6242 6243 6244
  /* If not cross-compiling, look for executables in the standard
     places.  */
  if (*cross_compile == '0')
6245
    {
6246 6247 6248
      if (*md_exec_prefix)
	{
	  add_prefix (&exec_prefixes, md_exec_prefix, "GCC",
6249
		      PREFIX_PRIORITY_LAST, 0, 0);
6250
	}
6251 6252
    }

6253
  /* Process sysroot_suffix_spec.  */
6254 6255 6256 6257
  if (*sysroot_suffix_spec != 0
      && do_spec_2 (sysroot_suffix_spec) == 0)
    {
      if (argbuf_index > 1)
6258
        error ("spec failure: more than one arg to SYSROOT_SUFFIX_SPEC");
6259 6260 6261 6262
      else if (argbuf_index == 1)
        target_sysroot_suffix = xstrdup (argbuf[argbuf_index -1]);
    }

6263 6264 6265 6266 6267 6268 6269 6270 6271
#ifdef HAVE_LD_SYSROOT
  /* Pass the --sysroot option to the linker, if it supports that.  If
     there is a sysroot_suffix_spec, it has already been processed by
     this point, so target_system_root really is the system root we
     should be using.  */
  if (target_system_root)
    {
      obstack_grow (&obstack, "%(sysroot_spec) ", strlen ("%(sysroot_spec) "));
      obstack_grow0 (&obstack, link_spec, strlen (link_spec));
6272
      set_spec ("link", XOBFINISH (&obstack, const char *));
6273 6274 6275
    }
#endif

6276
  /* Process sysroot_hdrs_suffix_spec.  */
6277 6278 6279 6280
  if (*sysroot_hdrs_suffix_spec != 0
      && do_spec_2 (sysroot_hdrs_suffix_spec) == 0)
    {
      if (argbuf_index > 1)
6281
        error ("spec failure: more than one arg to SYSROOT_HEADERS_SUFFIX_SPEC");
6282 6283 6284 6285
      else if (argbuf_index == 1)
        target_sysroot_hdrs_suffix = xstrdup (argbuf[argbuf_index -1]);
    }

6286 6287 6288 6289 6290 6291 6292 6293
  /* Look for startfiles in the standard places.  */
  if (*startfile_prefix_spec != 0
      && do_spec_2 (startfile_prefix_spec) == 0
      && do_spec_1 (" ", 0, NULL) == 0)
    {
      int ndx;
      for (ndx = 0; ndx < argbuf_index; ndx++)
	add_sysrooted_prefix (&startfile_prefixes, argbuf[ndx], "BINUTILS",
6294
			      PREFIX_PRIORITY_LAST, 0, 1);
6295 6296 6297 6298 6299
    }
  /* We should eventually get rid of all these and stick to
     startfile_prefix_spec exclusively.  */
  else if (*cross_compile == '0' || target_system_root)
    {
6300
      if (*md_startfile_prefix)
6301
	add_sysrooted_prefix (&startfile_prefixes, md_startfile_prefix,
6302
			      "GCC", PREFIX_PRIORITY_LAST, 0, 1);
6303

6304
      if (*md_startfile_prefix_1)
6305
	add_sysrooted_prefix (&startfile_prefixes, md_startfile_prefix_1,
6306
			      "GCC", PREFIX_PRIORITY_LAST, 0, 1);
6307

6308 6309 6310
      /* If standard_startfile_prefix is relative, base it on
	 standard_exec_prefix.  This lets us move the installed tree
	 as a unit.  If GCC_EXEC_PREFIX is defined, base
6311 6312 6313 6314
	 standard_startfile_prefix on that as well.

         If the prefix is relative, only search it for native compilers;
         otherwise we will search a directory containing host libraries.  */
6315
      if (IS_ABSOLUTE_PATH (standard_startfile_prefix))
6316 6317
	add_sysrooted_prefix (&startfile_prefixes,
			      standard_startfile_prefix, "BINUTILS",
6318
			      PREFIX_PRIORITY_LAST, 0, 1);
6319
      else if (*cross_compile == '0')
6320
	{
6321
	  add_prefix (&startfile_prefixes,
6322 6323 6324
		      concat (gcc_exec_prefix 
			      ? gcc_exec_prefix : standard_exec_prefix, 
			      machine_suffix, 
6325
			      standard_startfile_prefix, NULL),
6326
		      NULL, PREFIX_PRIORITY_LAST, 0, 1);
Kazu Hirata committed
6327
	}
6328

6329 6330
      /* Sysrooted prefixes are relocated because target_system_root is
	 also relocated by gcc_exec_prefix.  */
6331 6332 6333
      if (*standard_startfile_prefix_1)
 	add_sysrooted_prefix (&startfile_prefixes,
			      standard_startfile_prefix_1, "BINUTILS",
6334
			      PREFIX_PRIORITY_LAST, 0, 1);
6335 6336 6337
      if (*standard_startfile_prefix_2)
	add_sysrooted_prefix (&startfile_prefixes,
			      standard_startfile_prefix_2, "BINUTILS",
6338
			      PREFIX_PRIORITY_LAST, 0, 1);
6339
    }
6340

6341 6342 6343 6344
  /* Process any user specified specs in the order given on the command
     line.  */
  for (uptr = user_specs_head; uptr; uptr = uptr->next)
    {
6345
      char *filename = find_a_file (&startfile_prefixes, uptr->filename,
6346
				    R_OK, true);
6347 6348 6349
      read_specs (filename ? filename : uptr->filename, FALSE);
    }

6350 6351
  /* If we have a GCC_EXEC_PREFIX envvar, modify it for cpp's sake.  */
  if (gcc_exec_prefix)
6352 6353
    gcc_exec_prefix = concat (gcc_exec_prefix, spec_machine, dir_separator_str,
			      spec_version, dir_separator_str, NULL);
6354

Richard Stallman committed
6355 6356 6357 6358 6359
  /* Now we have the specs.
     Set the `valid' bits for switches that match anything in any spec.  */

  validate_all_switches ();

Doug Evans committed
6360 6361 6362 6363
  /* Now that we have the switches and the specs, set
     the subdirectory based on the options.  */
  set_multilib_dir ();

Richard Stallman committed
6364 6365
  /* Warn about any switches that no pass was interested in.  */

Kazu Hirata committed
6366
  for (i = 0; (int) i < n_switches; i++)
6367
    if (! switches[i].validated)
6368
      error ("unrecognized option '-%s'", switches[i].part1);
Richard Stallman committed
6369

6370 6371
  /* Obey some of the options.  */

6372 6373
  if (print_search_dirs)
    {
6374 6375 6376
      printf (_("install: %s%s\n"),
	      gcc_exec_prefix ? gcc_exec_prefix : standard_exec_prefix,
	      gcc_exec_prefix ? "" : machine_suffix);
6377 6378 6379 6380
      printf (_("programs: %s\n"),
	      build_search_list (&exec_prefixes, "", false, false));
      printf (_("libraries: %s\n"),
	      build_search_list (&startfile_prefixes, "", false, true));
6381
      return (0);
6382 6383
    }

6384
  if (print_file_name)
6385
    {
6386
      printf ("%s\n", find_file (print_file_name));
6387
      return (0);
6388 6389
    }

6390 6391
  if (print_prog_name)
    {
6392
      char *newname = find_a_file (&exec_prefixes, print_prog_name, X_OK, 0);
6393
      printf ("%s\n", (newname ? newname : print_prog_name));
6394
      return (0);
6395
    }
Richard Stallman committed
6396

Doug Evans committed
6397 6398 6399
  if (print_multi_lib)
    {
      print_multilib_info ();
6400
      return (0);
Doug Evans committed
6401 6402 6403 6404 6405 6406 6407 6408
    }

  if (print_multi_directory)
    {
      if (multilib_dir == NULL)
	printf (".\n");
      else
	printf ("%s\n", multilib_dir);
6409
      return (0);
Doug Evans committed
6410 6411
    }

6412 6413 6414 6415 6416 6417 6418 6419 6420
  if (print_multi_os_directory)
    {
      if (multilib_os_dir == NULL)
	printf (".\n");
      else
	printf ("%s\n", multilib_os_dir);
      return (0);
    }

6421 6422 6423 6424
  if (print_sysroot_headers_suffix)
    {
      if (*sysroot_hdrs_suffix_spec)
	{
6425 6426 6427
	  printf("%s\n", (target_sysroot_hdrs_suffix
			  ? target_sysroot_hdrs_suffix
			  : ""));
6428 6429 6430 6431 6432 6433 6434 6435
	  return (0);
	}
      else
	/* The error status indicates that only one set of fixed
	   headers should be built.  */
	fatal ("not configured with sysroot headers suffix");
    }

Nick Clifton committed
6436 6437 6438 6439 6440 6441
  if (print_help_list)
    {
      display_help ();

      if (! verbose_flag)
	{
6442
	  printf (_("\nFor bug reporting instructions, please see:\n"));
6443
	  printf ("%s.\n", bug_report_url);
Kazu Hirata committed
6444

6445
	  return (0);
Nick Clifton committed
6446 6447 6448 6449
	}

      /* We do not exit here.  Instead we have created a fake input file
	 called 'help-dummy' which needs to be compiled, and we pass this
6450
	 on the various sub-processes, along with the --help switch.  */
Nick Clifton committed
6451
    }
Kazu Hirata committed
6452

Richard Stallman committed
6453 6454
  if (verbose_flag)
    {
6455
      int n;
6456
      const char *thrmod;
6457

6458
      notice ("Target: %s\n", spec_machine);
6459 6460
      notice ("Configured with: %s\n", configuration_arguments);

6461 6462 6463 6464 6465 6466 6467
#ifdef THREAD_MODEL_SPEC
      /* We could have defined THREAD_MODEL_SPEC to "%*" by default,
	 but there's no point in doing all this processing just to get
	 thread_model back.  */
      obstack_init (&obstack);
      do_spec_1 (THREAD_MODEL_SPEC, 0, thread_model);
      obstack_1grow (&obstack, '\0');
6468
      thrmod = XOBFINISH (&obstack, const char *);
6469 6470 6471 6472 6473
#else
      thrmod = thread_model;
#endif

      notice ("Thread model: %s\n", thrmod);
6474

6475 6476 6477 6478 6479 6480 6481 6482 6483
      /* compiler_version is truncated at the first space when initialized
	 from version string, so truncate version_string at the first space
	 before comparing.  */
      for (n = 0; version_string[n]; n++)
	if (version_string[n] == ' ')
	  break;

      if (! strncmp (version_string, compiler_version, n)
	  && compiler_version[n] == 0)
6484
	notice ("gcc version %s\n", version_string);
6485
      else
6486 6487
	notice ("gcc driver version %s executing gcc version %s\n",
		version_string, compiler_version);
6488

Richard Stallman committed
6489
      if (n_infiles == 0)
6490
	return (0);
Richard Stallman committed
6491 6492
    }

6493
  if (n_infiles == added_libraries)
6494
    fatal ("no input files");
Richard Stallman committed
6495 6496 6497 6498

  /* Make a place to record the compiler output file names
     that correspond to the input files.  */

6499
  i = n_infiles;
Per Bothner committed
6500
  i += lang_specific_extra_outfiles;
6501
  outfiles = XCNEWVEC (const char *, i);
Richard Stallman committed
6502 6503 6504

  /* Record which files were specified explicitly as link input.  */

6505
  explicit_link_files = XCNEWVEC (char, n_infiles);
Richard Stallman committed
6506

6507 6508 6509
  if (combine_flag)
    combine_inputs = true;
  else
Diego Novillo committed
6510
    combine_inputs = false;
6511 6512

  for (i = 0; (int) i < n_infiles; i++)
Geoffrey Keating committed
6513
    {
6514
      const char *name = infiles[i].name;
6515 6516
      struct compiler *compiler = lookup_compiler (name,
						   strlen (name),
6517
						   infiles[i].language);
6518

6519 6520
      if (compiler && !(compiler->combinable))
	combine_inputs = false;
6521

6522 6523 6524 6525 6526 6527 6528 6529 6530 6531 6532 6533
      if (lang_n_infiles > 0 && compiler != input_file_compiler
	  && infiles[i].language && infiles[i].language[0] != '*')
	infiles[i].incompiler = compiler;
      else if (compiler)
	{
	  lang_n_infiles++;
	  input_file_compiler = compiler;
	  infiles[i].incompiler = compiler;
	}
      else
	{
	  /* Since there is no compiler for this input file, assume it is a
6534
	     linker file.  */
6535 6536 6537 6538 6539
	  explicit_link_files[i] = 1;
	  infiles[i].incompiler = NULL;
	}
      infiles[i].compiled = false;
      infiles[i].preprocessed = false;
Geoffrey Keating committed
6540
    }
Diego Novillo committed
6541

6542
  if (!combine_inputs && have_c && have_o && lang_n_infiles > 1)
6543
   fatal ("cannot specify -o with -c or -S with multiple files");
6544

6545 6546 6547 6548 6549 6550 6551 6552 6553 6554
  if (combine_flag && save_temps_flag)
    {
      bool save_combine_inputs = combine_inputs;
      /* Must do a separate pre-processing pass for C & Objective-C files, to
	 obtain individual .i files.  */

      combine_inputs = false;
      for (i = 0; (int) i < n_infiles; i++)
	{
	  int this_file_error = 0;
6555

6556 6557 6558 6559 6560 6561 6562 6563 6564 6565 6566 6567 6568 6569 6570 6571 6572 6573 6574 6575
	  input_file_number = i;
	  set_input (infiles[i].name);
	  if (infiles[i].incompiler
	      && (infiles[i].incompiler)->needs_preprocessing)
	    input_file_compiler = infiles[i].incompiler;
	  else
	    continue;

	  if (input_file_compiler)
	    {
	      if (input_file_compiler->spec[0] == '#')
		{
		  error ("%s: %s compiler not installed on this system",
			 input_filename, &input_file_compiler->spec[1]);
		  this_file_error = 1;
		}
	      else
		{
		  value = do_spec (input_file_compiler->spec);
		  infiles[i].preprocessed = true;
6576
		  if (!have_o_argbuf_index)
6577
		    fatal ("spec '%s' is invalid", input_file_compiler->spec);
6578 6579 6580 6581 6582
		  infiles[i].name = argbuf[have_o_argbuf_index];
		  infiles[i].incompiler
		    = lookup_compiler (infiles[i].name,
				       strlen (infiles[i].name),
				       infiles[i].language);
6583 6584

		  if (value < 0)
6585
		    this_file_error = 1;
6586 6587 6588 6589 6590 6591 6592
		}
	    }

	  if (this_file_error)
	    {
	      delete_failure_queue ();
	      error_count++;
6593
	      break;
6594 6595 6596 6597 6598 6599 6600
	    }
	  clear_failure_queue ();
	}
      combine_inputs = save_combine_inputs;
    }

  for (i = 0; (int) i < n_infiles; i++)
Richard Stallman committed
6601 6602 6603 6604 6605 6606
    {
      int this_file_error = 0;

      /* Tell do_spec what to substitute for %i.  */

      input_file_number = i;
6607
      set_input (infiles[i].name);
Richard Stallman committed
6608

6609 6610 6611
      if (infiles[i].compiled)
	continue;

Richard Stallman committed
6612 6613 6614 6615 6616 6617
      /* Use the same thing in %o, unless cp->spec says otherwise.  */

      outfiles[i] = input_filename;

      /* Figure out which compiler from the file's suffix.  */

Geoffrey Keating committed
6618 6619 6620 6621
      if (! combine_inputs)
	input_file_compiler
	  = lookup_compiler (infiles[i].name, input_filename_length,
			     infiles[i].language);
6622 6623
      else
	input_file_compiler = infiles[i].incompiler;
6624

6625
      if (input_file_compiler)
Richard Stallman committed
6626 6627 6628
	{
	  /* Ok, we found an applicable compiler.  Run its spec.  */

6629
	  if (input_file_compiler->spec[0] == '#')
6630 6631 6632 6633 6634 6635 6636 6637
	    {
	      error ("%s: %s compiler not installed on this system",
		     input_filename, &input_file_compiler->spec[1]);
	      this_file_error = 1;
	    }
	  else
	    {
	      value = do_spec (input_file_compiler->spec);
6638
	      infiles[i].compiled = true;
6639
	      if (value < 0)
6640
		this_file_error = 1;
6641
	    }
Richard Stallman committed
6642 6643 6644 6645 6646 6647 6648 6649 6650 6651 6652 6653 6654 6655 6656 6657 6658 6659 6660 6661
	}

      /* If this file's name does not contain a recognized suffix,
	 record it as explicit linker input.  */

      else
	explicit_link_files[i] = 1;

      /* Clear the delete-on-failure queue, deleting the files in it
	 if this compilation failed.  */

      if (this_file_error)
	{
	  delete_failure_queue ();
	  error_count++;
	}
      /* If this compilation succeeded, don't delete those files later.  */
      clear_failure_queue ();
    }

6662 6663
  /* Reset the input file name to the first compile/object file name, for use
     with %b in LINK_SPEC. We use the first input file that we can find
6664
     a compiler to compile it instead of using infiles.language since for
6665
     languages other than C we use aliases that we then lookup later.  */
6666
  if (n_infiles > 0)
6667 6668 6669 6670
    {
      int i;

      for (i = 0; i < n_infiles ; i++)
6671
	if (infiles[i].language && infiles[i].language[0] != '*')
6672 6673 6674 6675 6676
	  {
	    set_input (infiles[i].name);
	    break;
	  }
    }
6677

6678 6679 6680 6681 6682 6683 6684 6685
  if (error_count == 0)
    {
      /* Make sure INPUT_FILE_NUMBER points to first available open
	 slot.  */
      input_file_number = n_infiles;
      if (lang_specific_pre_link ())
	error_count++;
    }
6686

6687 6688 6689 6690 6691 6692
  /* Determine if there are any linker input files.  */
  num_linker_inputs = 0;
  for (i = 0; (int) i < n_infiles; i++)
    if (explicit_link_files[i] || outfiles[i] != NULL)
      num_linker_inputs++;

Richard Stallman committed
6693 6694
  /* Run ld to link all the compiler output files.  */

6695
  if (num_linker_inputs > 0 && error_count == 0 && print_subprocess_help < 2)
Richard Stallman committed
6696 6697
    {
      int tmp = execution_count;
6698

Kazu Hirata committed
6699
      /* We'll use ld if we can't find collect2.  */
Bob Manson committed
6700 6701
      if (! strcmp (linker_name_spec, "collect2"))
	{
6702
	  char *s = find_a_file (&exec_prefixes, "collect2", X_OK, false);
Bob Manson committed
6703 6704 6705
	  if (s == NULL)
	    linker_name_spec = "ld";
	}
6706 6707
      /* Rebuild the COMPILER_PATH and LIBRARY_PATH environment variables
	 for collect.  */
6708 6709
      putenv_from_prefixes (&exec_prefixes, "COMPILER_PATH", false);
      putenv_from_prefixes (&startfile_prefixes, LIBRARY_PATH_ENV, true);
6710

Richard Stallman committed
6711 6712 6713 6714 6715 6716 6717 6718 6719
      value = do_spec (link_command_spec);
      if (value < 0)
	error_count = 1;
      linker_was_run = (tmp != execution_count);
    }

  /* If options said don't run linker,
     complain about input files to be given to the linker.  */

6720
  if (! linker_was_run && error_count == 0)
Kazu Hirata committed
6721
    for (i = 0; (int) i < n_infiles; i++)
Richard Stallman committed
6722
      if (explicit_link_files[i])
6723
	error ("%s: linker input file unused because linking not done",
Richard Stallman committed
6724 6725 6726 6727 6728 6729 6730 6731
	       outfiles[i]);

  /* Delete some or all of the temporary files we made.  */

  if (error_count)
    delete_failure_queue ();
  delete_temp_files ();

Nick Clifton committed
6732 6733
  if (print_help_list)
    {
6734
      printf (("\nFor bug reporting instructions, please see:\n"));
6735
      printf ("%s\n", bug_report_url);
Nick Clifton committed
6736
    }
Kazu Hirata committed
6737

Richard Kenner committed
6738 6739 6740
  return (signal_count != 0 ? 2
	  : error_count > 0 ? (pass_exit_codes ? greatest_status : 1)
	  : 0);
Richard Stallman committed
6741 6742 6743
}

/* Find the proper compilation spec for the file name NAME,
6744
   whose length is LENGTH.  LANGUAGE is the specified language,
6745
   or 0 if this file is to be passed to the linker.  */
Richard Stallman committed
6746 6747

static struct compiler *
6748
lookup_compiler (const char *name, size_t length, const char *language)
Richard Stallman committed
6749 6750 6751
{
  struct compiler *cp;

6752
  /* If this was specified by the user to be a linker input, indicate that.  */
6753 6754 6755 6756
  if (language != 0 && language[0] == '*')
    return 0;

  /* Otherwise, look for the language, if one is spec'd.  */
Richard Stallman committed
6757 6758 6759
  if (language != 0)
    {
      for (cp = compilers + n_compilers - 1; cp >= compilers; cp--)
6760 6761 6762
	if (cp->suffix[0] == '@' && !strcmp (cp->suffix + 1, language))
	  return cp;

Richard Stallman committed
6763
      error ("language %s not recognized", language);
6764
      return 0;
Richard Stallman committed
6765 6766 6767 6768 6769
    }

  /* Look for a suffix.  */
  for (cp = compilers + n_compilers - 1; cp >= compilers; cp--)
    {
6770 6771
      if (/* The suffix `-' matches only the file name `-'.  */
	  (!strcmp (cp->suffix, "-") && !strcmp (name, "-"))
6772 6773 6774 6775 6776
	  || (strlen (cp->suffix) < length
	      /* See if the suffix matches the end of NAME.  */
	      && !strcmp (cp->suffix,
			  name + length - strlen (cp->suffix))
	 ))
6777
	break;
6778
    }
6779

6780
#if defined (OS2) ||defined (HAVE_DOS_BASED_FILE_SYSTEM)
6781
  /* Look again, but case-insensitively this time.  */
6782 6783 6784 6785 6786 6787 6788 6789 6790 6791 6792 6793 6794 6795 6796 6797 6798 6799 6800
  if (cp < compilers)
    for (cp = compilers + n_compilers - 1; cp >= compilers; cp--)
      {
	if (/* The suffix `-' matches only the file name `-'.  */
	    (!strcmp (cp->suffix, "-") && !strcmp (name, "-"))
	    || (strlen (cp->suffix) < length
		/* See if the suffix matches the end of NAME.  */
		&& ((!strcmp (cp->suffix,
			     name + length - strlen (cp->suffix))
		     || !strpbrk (cp->suffix, "ABCDEFGHIJKLMNOPQRSTUVWXYZ"))
		    && !strcasecmp (cp->suffix,
				    name + length - strlen (cp->suffix)))
	   ))
	  break;
      }
#endif

  if (cp >= compilers)
    {
6801 6802 6803
      if (cp->spec[0] != '@')
	/* A non-alias entry: return it.  */
	return cp;
Kazu Hirata committed
6804

6805 6806 6807
      /* An alias entry maps a suffix to a language.
	 Search for the language; pass 0 for NAME and LENGTH
	 to avoid infinite recursion if language not found.  */
6808
      return lookup_compiler (NULL, 0, cp->spec + 1);
Richard Stallman committed
6809 6810 6811 6812
    }
  return 0;
}

6813
static char *
6814
save_string (const char *s, int len)
Richard Stallman committed
6815
{
6816
  char *result = XNEWVEC (char, len + 1);
Richard Stallman committed
6817

6818
  memcpy (result, s, len);
Richard Stallman committed
6819 6820 6821 6822
  result[len] = 0;
  return result;
}

6823
void
6824
pfatal_with_name (const char *name)
Richard Stallman committed
6825
{
6826 6827 6828
  perror_with_name (name);
  delete_temp_files ();
  exit (1);
Richard Stallman committed
6829 6830 6831
}

static void
6832
perror_with_name (const char *name)
Richard Stallman committed
6833
{
6834
  error ("%s: %s", name, xstrerror (errno));
Richard Stallman committed
6835 6836
}

6837
/* Output an error message and exit.  */
Richard Stallman committed
6838 6839

void
6840
fancy_abort (const char *file, int line, const char *func)
Richard Stallman committed
6841
{
6842
  fatal_ice ("internal gcc abort in %s, at %s:%d", func, file, line);
Richard Stallman committed
6843 6844
}

6845
/* Output an error message and exit.  */
Richard Stallman committed
6846

6847
void
6848 6849 6850 6851 6852 6853 6854 6855 6856 6857 6858 6859 6860 6861 6862
fatal_ice (const char *cmsgid, ...)
{
  va_list ap;

  va_start (ap, cmsgid);

  fprintf (stderr, "%s: ", programname);
  vfprintf (stderr, _(cmsgid), ap);
  va_end (ap);
  fprintf (stderr, "\n");
  delete_temp_files ();
  exit (pass_exit_codes ? ICE_EXIT_CODE : 1);
}

void
6863
fatal (const char *cmsgid, ...)
Richard Stallman committed
6864
{
6865
  va_list ap;
6866

6867
  va_start (ap, cmsgid);
Richard Stallman committed
6868 6869

  fprintf (stderr, "%s: ", programname);
6870
  vfprintf (stderr, _(cmsgid), ap);
6871
  va_end (ap);
Richard Stallman committed
6872 6873 6874 6875 6876
  fprintf (stderr, "\n");
  delete_temp_files ();
  exit (1);
}

6877 6878 6879 6880 6881 6882
/* The argument is actually c-format, not gcc-internal-format,
   but because functions with identical names are used through
   the rest of the compiler with gcc-internal-format, we just
   need to hope all users of these functions use the common
   subset between c-format and gcc-internal-format.  */

6883
void
6884
error (const char *gmsgid, ...)
Richard Stallman committed
6885
{
6886
  va_list ap;
6887

6888
  va_start (ap, gmsgid);
Richard Stallman committed
6889
  fprintf (stderr, "%s: ", programname);
6890
  vfprintf (stderr, _(gmsgid), ap);
6891
  va_end (ap);
Richard Stallman committed
6892 6893 6894

  fprintf (stderr, "\n");
}
6895 6896

static void
6897
notice (const char *cmsgid, ...)
6898
{
6899
  va_list ap;
6900

6901 6902
  va_start (ap, cmsgid);
  vfprintf (stderr, _(cmsgid), ap);
6903
  va_end (ap);
6904
}
Richard Stallman committed
6905

6906
static inline void
6907
validate_switches_from_spec (const char *spec)
6908 6909 6910 6911 6912 6913 6914 6915 6916
{
  const char *p = spec;
  char c;
  while ((c = *p++))
    if (c == '%' && (*p == '{' || *p == '<' || (*p == 'W' && *++p == '{')))
      /* We have a switch spec.  */
      p = validate_switches (p + 1);
}

Richard Stallman committed
6917
static void
6918
validate_all_switches (void)
Richard Stallman committed
6919 6920
{
  struct compiler *comp;
6921
  struct spec_list *spec;
Richard Stallman committed
6922

6923
  for (comp = compilers; comp->spec; comp++)
6924
    validate_switches_from_spec (comp->spec);
Richard Stallman committed
6925

6926
  /* Look through the linked list of specs read from the specs file.  */
Kazu Hirata committed
6927
  for (spec = specs; spec; spec = spec->next)
6928
    validate_switches_from_spec (*spec->ptr_spec);
6929

6930
  validate_switches_from_spec (link_command_spec);
Richard Stallman committed
6931 6932 6933 6934 6935
}

/* Look at the switch-name that comes after START
   and mark as valid all supplied switches that match it.  */

6936
static const char *
6937
validate_switches (const char *start)
Richard Stallman committed
6938
{
6939
  const char *p = start;
6940 6941
  const char *atom;
  size_t len;
6942
  int i;
6943 6944
  bool suffix = false;
  bool starred = false;
6945

6946
#define SKIP_WHITE() do { while (*p == ' ' || *p == '\t') p++; } while (0)
6947

6948
next_member:
6949 6950
  SKIP_WHITE ();

Richard Stallman committed
6951
  if (*p == '!')
6952
    p++;
Richard Stallman committed
6953

6954
  SKIP_WHITE ();
6955
  if (*p == '.' || *p == ',')
6956
    suffix = true, p++;
Richard Stallman committed
6957

6958 6959
  atom = p;
  while (ISIDNUM (*p) || *p == '-' || *p == '+' || *p == '='
6960
	 || *p == ',' || *p == '.' || *p == '@')
Kazu Hirata committed
6961
    p++;
6962
  len = p - atom;
Richard Stallman committed
6963

6964 6965 6966 6967 6968 6969
  if (*p == '*')
    starred = true, p++;

  SKIP_WHITE ();

  if (!suffix)
Richard Stallman committed
6970 6971 6972
    {
      /* Mark all matching switches as valid.  */
      for (i = 0; i < n_switches; i++)
6973 6974
	if (!strncmp (switches[i].part1, atom, len)
	    && (starred || switches[i].part1[len] == 0))
6975
	  switches[i].validated = 1;
Richard Stallman committed
6976
    }
6977

6978 6979
  if (*p) p++;
  if (*p && (p[-1] == '|' || p[-1] == '&'))
6980 6981
    goto next_member;

6982
  if (*p && p[-1] == ':')
Richard Stallman committed
6983
    {
6984
      while (*p && *p != ';' && *p != '}')
Richard Stallman committed
6985
	{
6986 6987 6988 6989 6990 6991 6992 6993
	  if (*p == '%')
	    {
	      p++;
	      if (*p == '{' || *p == '<')
		p = validate_switches (p+1);
	      else if (p[0] == 'W' && p[1] == '{')
		p = validate_switches (p+2);
	    }
6994 6995
	  else
	    p++;
Richard Stallman committed
6996
	}
6997

6998 6999
      if (*p) p++;
      if (*p && p[-1] == ';')
7000
	goto next_member;
Richard Stallman committed
7001
    }
7002

7003 7004
  return p;
#undef SKIP_WHITE
Richard Stallman committed
7005
}
Doug Evans committed
7006

7007 7008 7009 7010 7011 7012 7013 7014 7015
struct mdswitchstr
{
  const char *str;
  int len;
};

static struct mdswitchstr *mdswitches;
static int n_mdswitches;

7016
/* Check whether a particular argument was used.  The first time we
Jeff Law committed
7017
   canonicalize the switches to keep only the ones we care about.  */
Doug Evans committed
7018 7019

static int
7020
used_arg (const char *p, int len)
Doug Evans committed
7021
{
7022 7023
  struct mswitchstr
  {
Zack Weinberg committed
7024 7025
    const char *str;
    const char *replace;
7026 7027 7028 7029 7030 7031 7032 7033 7034 7035 7036
    int len;
    int rep_len;
  };

  static struct mswitchstr *mswitches;
  static int n_mswitches;
  int i, j;

  if (!mswitches)
    {
      struct mswitchstr *matches;
Zack Weinberg committed
7037
      const char *q;
Michael Meissner committed
7038
      int cnt = 0;
7039

Kazu Hirata committed
7040 7041
      /* Break multilib_matches into the component strings of string
         and replacement string.  */
7042 7043
      for (q = multilib_matches; *q != '\0'; q++)
	if (*q == ';')
7044 7045
	  cnt++;

7046
      matches = alloca ((sizeof (struct mswitchstr)) * cnt);
7047 7048 7049 7050 7051 7052 7053 7054
      i = 0;
      q = multilib_matches;
      while (*q != '\0')
	{
	  matches[i].str = q;
	  while (*q != ' ')
	    {
	      if (*q == '\0')
7055 7056
		{
		invalid_matches:
7057
		  fatal ("multilib spec '%s' is invalid", multilib_matches);
7058
		}
7059 7060 7061
	      q++;
	    }
	  matches[i].len = q - matches[i].str;
Doug Evans committed
7062

7063 7064 7065 7066
	  matches[i].replace = ++q;
	  while (*q != ';' && *q != '\0')
	    {
	      if (*q == ' ')
7067
		goto invalid_matches;
7068 7069 7070 7071
	      q++;
	    }
	  matches[i].rep_len = q - matches[i].replace;
	  i++;
7072 7073
	  if (*q == ';')
	    q++;
7074
	}
Doug Evans committed
7075

7076 7077 7078 7079 7080
      /* Now build a list of the replacement string for switches that we care
	 about.  Make sure we allocate at least one entry.  This prevents
	 xmalloc from calling fatal, and prevents us from re-executing this
	 block of code.  */
      mswitches
7081
	= XNEWVEC (struct mswitchstr, n_mdswitches + (n_switches ? n_switches : 1));
7082
      for (i = 0; i < n_switches; i++)
7083 7084 7085 7086 7087 7088 7089 7090 7091 7092 7093 7094 7095 7096 7097
	if (switches[i].live_cond != SWITCH_IGNORE)
	  {
	    int xlen = strlen (switches[i].part1);
	    for (j = 0; j < cnt; j++)
	      if (xlen == matches[j].len
		  && ! strncmp (switches[i].part1, matches[j].str, xlen))
		{
		  mswitches[n_mswitches].str = matches[j].replace;
		  mswitches[n_mswitches].len = matches[j].rep_len;
		  mswitches[n_mswitches].replace = (char *) 0;
		  mswitches[n_mswitches].rep_len = 0;
		  n_mswitches++;
		  break;
		}
	  }
7098 7099 7100 7101 7102 7103 7104 7105 7106 7107 7108 7109 7110 7111 7112 7113 7114 7115 7116 7117 7118 7119 7120 7121 7122 7123 7124 7125 7126 7127 7128 7129 7130 7131 7132 7133 7134 7135 7136 7137 7138 7139 7140 7141 7142 7143 7144 7145 7146 7147 7148

      /* Add MULTILIB_DEFAULTS switches too, as long as they were not present
	 on the command line nor any options mutually incompatible with
	 them.  */
      for (i = 0; i < n_mdswitches; i++)
	{
	  const char *r;

	  for (q = multilib_options; *q != '\0'; q++)
	    {
	      while (*q == ' ')
		q++;

	      r = q;
	      while (strncmp (q, mdswitches[i].str, mdswitches[i].len) != 0
		     || strchr (" /", q[mdswitches[i].len]) == NULL)
		{
		  while (*q != ' ' && *q != '/' && *q != '\0')
		    q++;
		  if (*q != '/')
		    break;
		  q++;
		}

	      if (*q != ' ' && *q != '\0')
		{
		  while (*r != ' ' && *r != '\0')
		    {
		      q = r;
		      while (*q != ' ' && *q != '/' && *q != '\0')
			q++;

		      if (used_arg (r, q - r))
			break;

		      if (*q != '/')
			{
			  mswitches[n_mswitches].str = mdswitches[i].str;
			  mswitches[n_mswitches].len = mdswitches[i].len;
			  mswitches[n_mswitches].replace = (char *) 0;
			  mswitches[n_mswitches].rep_len = 0;
			  n_mswitches++;
			  break;
			}

		      r = q + 1;
		    }
		  break;
		}
	    }
	}
7149
    }
7150

7151 7152 7153
  for (i = 0; i < n_mswitches; i++)
    if (len == mswitches[i].len && ! strncmp (p, mswitches[i].str, len))
      return 1;
7154

7155 7156
  return 0;
}
7157 7158

static int
7159
default_arg (const char *p, int len)
7160
{
7161
  int i;
7162

7163 7164 7165
  for (i = 0; i < n_mdswitches; i++)
    if (len == mdswitches[i].len && ! strncmp (p, mdswitches[i].str, len))
      return 1;
7166 7167 7168 7169

  return 0;
}

7170 7171 7172 7173 7174 7175 7176 7177 7178 7179
/* Work out the subdirectory to use based on the options. The format of
   multilib_select is a list of elements. Each element is a subdirectory
   name followed by a list of options followed by a semicolon. The format
   of multilib_exclusions is the same, but without the preceding
   directory. First gcc will check the exclusions, if none of the options
   beginning with an exclamation point are present, and all of the other
   options are present, then we will ignore this completely. Passing
   that, gcc will consider each multilib_select in turn using the same
   rules for matching the options. If a match is found, that subdirectory
   will be used.  */
Doug Evans committed
7180 7181

static void
7182
set_multilib_dir (void)
Doug Evans committed
7183
{
Zack Weinberg committed
7184
  const char *p;
7185
  unsigned int this_path_len;
Zack Weinberg committed
7186
  const char *this_path, *this_arg;
7187
  const char *start, *end;
7188
  int not_arg;
7189 7190 7191 7192 7193 7194 7195 7196 7197 7198 7199 7200 7201 7202 7203 7204 7205 7206 7207
  int ok, ndfltok, first;

  n_mdswitches = 0;
  start = multilib_defaults;
  while (*start == ' ' || *start == '\t')
    start++;
  while (*start != '\0')
    {
      n_mdswitches++;
      while (*start != ' ' && *start != '\t' && *start != '\0')
	start++;
      while (*start == ' ' || *start == '\t')
        start++;
    }

  if (n_mdswitches)
    {
      int i = 0;

7208
      mdswitches = XNEWVEC (struct mdswitchstr, n_mdswitches);
7209 7210 7211 7212 7213 7214 7215
      for (start = multilib_defaults; *start != '\0'; start = end + 1)
	{
	  while (*start == ' ' || *start == '\t')
	    start++;

	  if (*start == '\0')
	    break;
7216

7217 7218 7219 7220 7221 7222
	  for (end = start + 1;
	       *end != ' ' && *end != '\t' && *end != '\0'; end++)
	    ;

	  obstack_grow (&multilib_obstack, start, end - start);
	  obstack_1grow (&multilib_obstack, 0);
7223
	  mdswitches[i].str = XOBFINISH (&multilib_obstack, const char *);
7224 7225 7226 7227 7228 7229
	  mdswitches[i++].len = end - start;

	  if (*end == '\0')
	    break;
	}
    }
Doug Evans committed
7230

7231 7232 7233 7234 7235
  p = multilib_exclusions;
  while (*p != '\0')
    {
      /* Ignore newlines.  */
      if (*p == '\n')
Kazu Hirata committed
7236 7237 7238 7239
	{
	  ++p;
	  continue;
	}
7240 7241 7242 7243

      /* Check the arguments.  */
      ok = 1;
      while (*p != ';')
Kazu Hirata committed
7244 7245
	{
	  if (*p == '\0')
7246 7247
	    {
	    invalid_exclusions:
7248
	      fatal ("multilib exclusions '%s' is invalid",
7249 7250
		     multilib_exclusions);
	    }
Kazu Hirata committed
7251 7252 7253 7254 7255 7256 7257 7258 7259 7260 7261

	  if (! ok)
	    {
	      ++p;
	      continue;
	    }

	  this_arg = p;
	  while (*p != ' ' && *p != ';')
	    {
	      if (*p == '\0')
7262
		goto invalid_exclusions;
Kazu Hirata committed
7263 7264 7265 7266 7267 7268 7269 7270 7271 7272
	      ++p;
	    }

	  if (*this_arg != '!')
	    not_arg = 0;
	  else
	    {
	      not_arg = 1;
	      ++this_arg;
	    }
Kazu Hirata committed
7273

7274 7275 7276 7277
	  ok = used_arg (this_arg, p - this_arg);
	  if (not_arg)
	    ok = ! ok;

Kazu Hirata committed
7278 7279 7280
	  if (*p == ' ')
	    ++p;
	}
7281 7282

      if (ok)
7283
	return;
7284 7285 7286 7287

      ++p;
    }

7288
  first = 1;
7289
  p = multilib_select;
Doug Evans committed
7290 7291 7292 7293 7294 7295 7296 7297 7298 7299 7300 7301 7302 7303
  while (*p != '\0')
    {
      /* Ignore newlines.  */
      if (*p == '\n')
	{
	  ++p;
	  continue;
	}

      /* Get the initial path.  */
      this_path = p;
      while (*p != ' ')
	{
	  if (*p == '\0')
7304 7305
	    {
	    invalid_select:
7306
	      fatal ("multilib select '%s' is invalid",
7307 7308
		     multilib_select);
	    }
Doug Evans committed
7309 7310 7311 7312 7313
	  ++p;
	}
      this_path_len = p - this_path;

      /* Check the arguments.  */
7314
      ok = 1;
7315
      ndfltok = 1;
Doug Evans committed
7316 7317 7318 7319
      ++p;
      while (*p != ';')
	{
	  if (*p == '\0')
7320
	    goto invalid_select;
Doug Evans committed
7321

7322
	  if (! ok)
Doug Evans committed
7323 7324 7325 7326 7327 7328 7329 7330 7331
	    {
	      ++p;
	      continue;
	    }

	  this_arg = p;
	  while (*p != ' ' && *p != ';')
	    {
	      if (*p == '\0')
7332
		goto invalid_select;
Doug Evans committed
7333 7334 7335
	      ++p;
	    }

7336 7337
	  if (*this_arg != '!')
	    not_arg = 0;
Doug Evans committed
7338
	  else
7339 7340 7341 7342 7343 7344 7345 7346 7347 7348 7349 7350
	    {
	      not_arg = 1;
	      ++this_arg;
	    }

	  /* If this is a default argument, we can just ignore it.
	     This is true even if this_arg begins with '!'.  Beginning
	     with '!' does not mean that this argument is necessarily
	     inappropriate for this library: it merely means that
	     there is a more specific library which uses this
	     argument.  If this argument is a default, we need not
	     consider that more specific library.  */
7351 7352 7353 7354 7355 7356 7357 7358 7359
	  ok = used_arg (this_arg, p - this_arg);
	  if (not_arg)
	    ok = ! ok;

	  if (! ok)
	    ndfltok = 0;

	  if (default_arg (this_arg, p - this_arg))
	    ok = 1;
Doug Evans committed
7360 7361 7362 7363 7364

	  if (*p == ' ')
	    ++p;
	}

7365
      if (ok && first)
Doug Evans committed
7366 7367 7368 7369
	{
	  if (this_path_len != 1
	      || this_path[0] != '.')
	    {
7370
	      char *new_multilib_dir = XNEWVEC (char, this_path_len + 1);
7371 7372
	      char *q;

7373 7374
	      strncpy (new_multilib_dir, this_path, this_path_len);
	      new_multilib_dir[this_path_len] = '\0';
7375 7376 7377
	      q = strchr (new_multilib_dir, ':');
	      if (q != NULL)
		*q = '\0';
7378
	      multilib_dir = new_multilib_dir;
Doug Evans committed
7379
	    }
7380 7381 7382 7383 7384 7385 7386 7387 7388
	  first = 0;
	}

      if (ndfltok)
	{
	  const char *q = this_path, *end = this_path + this_path_len;

	  while (q < end && *q != ':')
	    q++;
7389
	  if (q < end)
7390
	    {
7391
	      char *new_multilib_os_dir = XNEWVEC (char, end - q);
7392 7393
	      memcpy (new_multilib_os_dir, q + 1, end - q - 1);
	      new_multilib_os_dir[end - q - 1] = '\0';
7394 7395 7396
	      multilib_os_dir = new_multilib_os_dir;
	      break;
	    }
Doug Evans committed
7397 7398 7399
	}

      ++p;
Kazu Hirata committed
7400
    }
7401 7402 7403 7404 7405 7406 7407 7408 7409

  if (multilib_dir == NULL && multilib_os_dir != NULL
      && strcmp (multilib_os_dir, ".") == 0)
    {
      free ((char *) multilib_os_dir);
      multilib_os_dir = NULL;
    }
  else if (multilib_dir != NULL && multilib_os_dir == NULL)
    multilib_os_dir = multilib_dir;
Doug Evans committed
7410 7411 7412 7413 7414 7415 7416 7417 7418
}

/* Print out the multiple library subdirectory selection
   information.  This prints out a series of lines.  Each line looks
   like SUBDIRECTORY;@OPTION@OPTION, with as many options as is
   required.  Only the desired options are printed out, the negative
   matches.  The options are print without a leading dash.  There are
   no spaces to make it easy to use the information in the shell.
   Each subdirectory is printed only once.  This assumes the ordering
7419 7420
   generated by the genmultilib script. Also, we leave out ones that match
   the exclusions.  */
Doug Evans committed
7421 7422

static void
7423
print_multilib_info (void)
Doug Evans committed
7424
{
Zack Weinberg committed
7425 7426
  const char *p = multilib_select;
  const char *last_path = 0, *this_path;
7427
  int skip;
7428
  unsigned int last_path_len = 0;
Doug Evans committed
7429 7430 7431

  while (*p != '\0')
    {
7432
      skip = 0;
Doug Evans committed
7433 7434 7435 7436 7437 7438 7439 7440 7441 7442 7443 7444
      /* Ignore newlines.  */
      if (*p == '\n')
	{
	  ++p;
	  continue;
	}

      /* Get the initial path.  */
      this_path = p;
      while (*p != ' ')
	{
	  if (*p == '\0')
7445 7446
	    {
	    invalid_select:
7447
	      fatal ("multilib select '%s' is invalid", multilib_select);
7448
	    }
7449

Doug Evans committed
7450 7451 7452
	  ++p;
	}

7453 7454 7455 7456 7457 7458
      /* When --disable-multilib was used but target defines
	 MULTILIB_OSDIRNAMES, entries starting with .: are there just
	 to find multilib_os_dir, so skip them from output.  */
      if (this_path[0] == '.' && this_path[1] == ':')
	skip = 1;

7459 7460 7461
      /* Check for matches with the multilib_exclusions. We don't bother
         with the '!' in either list. If any of the exclusion rules match
         all of its options with the select rule, we skip it.  */
Kazu Hirata committed
7462 7463 7464
      {
	const char *e = multilib_exclusions;
	const char *this_arg;
7465

Kazu Hirata committed
7466 7467 7468 7469 7470 7471 7472 7473 7474
	while (*e != '\0')
	  {
	    int m = 1;
	    /* Ignore newlines.  */
	    if (*e == '\n')
	      {
		++e;
		continue;
	      }
7475

Kazu Hirata committed
7476 7477 7478 7479 7480
	    /* Check the arguments.  */
	    while (*e != ';')
	      {
		const char *q;
		int mp = 0;
7481

Kazu Hirata committed
7482
		if (*e == '\0')
7483 7484
		  {
		  invalid_exclusion:
7485
		    fatal ("multilib exclusion '%s' is invalid",
7486 7487
			   multilib_exclusions);
		  }
Kazu Hirata committed
7488

Kazu Hirata committed
7489 7490 7491 7492 7493
		if (! m)
		  {
		    ++e;
		    continue;
		  }
7494

Kazu Hirata committed
7495
		this_arg = e;
Kazu Hirata committed
7496

Kazu Hirata committed
7497 7498 7499
		while (*e != ' ' && *e != ';')
		  {
		    if (*e == '\0')
7500
		      goto invalid_exclusion;
Kazu Hirata committed
7501 7502
		    ++e;
		  }
7503

Kazu Hirata committed
7504 7505 7506 7507 7508
		q = p + 1;
		while (*q != ';')
		  {
		    const char *arg;
		    int len = e - this_arg;
7509

Kazu Hirata committed
7510
		    if (*q == '\0')
7511
		      goto invalid_select;
7512

Kazu Hirata committed
7513 7514 7515 7516 7517
		    arg = q;

		    while (*q != ' ' && *q != ';')
		      {
			if (*q == '\0')
7518
			  goto invalid_select;
7519
			++q;
Kazu Hirata committed
7520
		      }
7521

7522 7523 7524
		    if (! strncmp (arg, this_arg,
				   (len < q - arg) ? q - arg : len)
			|| default_arg (this_arg, e - this_arg))
Kazu Hirata committed
7525 7526 7527 7528
		      {
			mp = 1;
			break;
		      }
7529

Kazu Hirata committed
7530 7531 7532
		    if (*q == ' ')
		      ++q;
		  }
Kazu Hirata committed
7533

Kazu Hirata committed
7534 7535
		if (! mp)
		  m = 0;
7536

Kazu Hirata committed
7537 7538 7539 7540 7541 7542 7543 7544 7545 7546 7547 7548 7549 7550
		if (*e == ' ')
		  ++e;
	      }

	    if (m)
	      {
		skip = 1;
		break;
	      }

	    if (*e != '\0')
	      ++e;
	  }
      }
7551 7552

      if (! skip)
Kazu Hirata committed
7553 7554
	{
	  /* If this is a duplicate, skip it.  */
7555 7556
	  skip = (last_path != 0
		  && (unsigned int) (p - this_path) == last_path_len
Kazu Hirata committed
7557
		  && ! strncmp (last_path, this_path, last_path_len));
Doug Evans committed
7558

Kazu Hirata committed
7559 7560
	  last_path = this_path;
	  last_path_len = p - this_path;
7561
	}
Doug Evans committed
7562

7563 7564 7565 7566 7567
      /* If this directory requires any default arguments, we can skip
	 it.  We will already have printed a directory identical to
	 this one which does not require that default argument.  */
      if (! skip)
	{
Zack Weinberg committed
7568
	  const char *q;
7569 7570 7571 7572

	  q = p + 1;
	  while (*q != ';')
	    {
Zack Weinberg committed
7573
	      const char *arg;
7574 7575

	      if (*q == '\0')
7576
		goto invalid_select;
7577 7578 7579 7580 7581 7582 7583 7584 7585

	      if (*q == '!')
		arg = NULL;
	      else
		arg = q;

	      while (*q != ' ' && *q != ';')
		{
		  if (*q == '\0')
7586
		    goto invalid_select;
7587 7588 7589 7590 7591 7592 7593 7594 7595 7596 7597 7598 7599 7600 7601
		  ++q;
		}

	      if (arg != NULL
		  && default_arg (arg, q - arg))
		{
		  skip = 1;
		  break;
		}

	      if (*q == ' ')
		++q;
	    }
	}

Doug Evans committed
7602 7603
      if (! skip)
	{
Zack Weinberg committed
7604
	  const char *p1;
Doug Evans committed
7605

7606
	  for (p1 = last_path; p1 < p && *p1 != ':'; p1++)
Doug Evans committed
7607 7608 7609 7610 7611 7612 7613 7614 7615 7616
	    putchar (*p1);
	  putchar (';');
	}

      ++p;
      while (*p != ';')
	{
	  int use_arg;

	  if (*p == '\0')
7617
	    goto invalid_select;
Doug Evans committed
7618 7619 7620 7621 7622 7623 7624 7625 7626 7627 7628 7629 7630 7631 7632

	  if (skip)
	    {
	      ++p;
	      continue;
	    }

	  use_arg = *p != '!';

	  if (use_arg)
	    putchar ('@');

	  while (*p != ' ' && *p != ';')
	    {
	      if (*p == '\0')
7633
		goto invalid_select;
Doug Evans committed
7634 7635 7636 7637 7638 7639 7640 7641 7642 7643
	      if (use_arg)
		putchar (*p);
	      ++p;
	    }

	  if (*p == ' ')
	    ++p;
	}

      if (! skip)
7644
	{
7645
	  /* If there are extra options, print them now.  */
7646 7647 7648
	  if (multilib_extra && *multilib_extra)
	    {
	      int print_at = TRUE;
Zack Weinberg committed
7649
	      const char *q;
7650 7651 7652 7653 7654 7655 7656 7657 7658 7659 7660 7661 7662 7663

	      for (q = multilib_extra; *q != '\0'; q++)
		{
		  if (*q == ' ')
		    print_at = TRUE;
		  else
		    {
		      if (print_at)
			putchar ('@');
		      putchar (*q);
		      print_at = FALSE;
		    }
		}
	    }
Kazu Hirata committed
7664

7665 7666
	  putchar ('\n');
	}
Doug Evans committed
7667 7668 7669 7670

      ++p;
    }
}
7671

7672 7673 7674 7675 7676 7677 7678 7679 7680 7681 7682 7683 7684 7685 7686 7687 7688 7689 7690 7691 7692
/* getenv built-in spec function.

   Returns the value of the environment variable given by its first
   argument, concatenated with the second argument.  If the
   environment variable is not defined, a fatal error is issued.  */

static const char *
getenv_spec_function (int argc, const char **argv)
{
  char *value;

  if (argc != 2)
    return NULL;

  value = getenv (argv[0]);
  if (!value)
    fatal ("environment variable \"%s\" not defined", argv[0]);

  return concat (value, argv[1], NULL);
}

7693 7694 7695 7696 7697 7698 7699 7700 7701
/* if-exists built-in spec function.

   Checks to see if the file specified by the absolute pathname in
   ARGS exists.  Returns that pathname if found.

   The usual use for this function is to check for a library file
   (whose name has been expanded with %s).  */

static const char *
7702
if_exists_spec_function (int argc, const char **argv)
7703 7704
{
  /* Must have only one argument.  */
7705
  if (argc == 1 && IS_ABSOLUTE_PATH (argv[0]) && ! access (argv[0], R_OK))
7706 7707 7708 7709
    return argv[0];

  return NULL;
}
7710 7711 7712 7713 7714 7715 7716

/* if-exists-else built-in spec function.

   This is like if-exists, but takes an additional argument which
   is returned if the first argument does not exist.  */

static const char *
7717
if_exists_else_spec_function (int argc, const char **argv)
7718 7719 7720 7721 7722
{
  /* Must have exactly two arguments.  */
  if (argc != 2)
    return NULL;

7723
  if (IS_ABSOLUTE_PATH (argv[0]) && ! access (argv[0], R_OK))
7724 7725 7726 7727
    return argv[0];

  return argv[1];
}
7728 7729

/* replace-outfile built-in spec function.
Geoffrey Keating committed
7730 7731 7732

   This looks for the first argument in the outfiles array's name and
   replaces it with the second argument.  */
7733 7734 7735 7736 7737 7738 7739 7740

static const char *
replace_outfile_spec_function (int argc, const char **argv)
{
  int i;
  /* Must have exactly two arguments.  */
  if (argc != 2)
    abort ();
7741

7742 7743 7744 7745 7746 7747 7748 7749
  for (i = 0; i < n_infiles; i++)
    {
      if (outfiles[i] && !strcmp (outfiles[i], argv[0]))
	outfiles[i] = xstrdup (argv[1]);
    }
  return NULL;
}

7750
/* Given two version numbers, compares the two numbers.
Geoffrey Keating committed
7751 7752 7753 7754 7755 7756 7757 7758
   A version number must match the regular expression
   ([1-9][0-9]*|0)(\.([1-9][0-9]*|0))*
*/
static int
compare_version_strings (const char *v1, const char *v2)
{
  int rresult;
  regex_t r;
7759

Geoffrey Keating committed
7760 7761 7762 7763 7764 7765 7766 7767 7768 7769 7770 7771 7772 7773 7774 7775 7776 7777 7778 7779 7780 7781 7782 7783 7784 7785 7786 7787
  if (regcomp (&r, "^([1-9][0-9]*|0)(\\.([1-9][0-9]*|0))*$",
	       REG_EXTENDED | REG_NOSUB) != 0)
    abort ();
  rresult = regexec (&r, v1, 0, NULL, 0);
  if (rresult == REG_NOMATCH)
    fatal ("invalid version number `%s'", v1);
  else if (rresult != 0)
    abort ();
  rresult = regexec (&r, v2, 0, NULL, 0);
  if (rresult == REG_NOMATCH)
    fatal ("invalid version number `%s'", v2);
  else if (rresult != 0)
    abort ();

  return strverscmp (v1, v2);
}


/* version_compare built-in spec function.

   This takes an argument of the following form:

   <comparison-op> <arg1> [<arg2>] <switch> <result>

   and produces "result" if the comparison evaluates to true,
   and nothing if it doesn't.

   The supported <comparison-op> values are:
7788

Geoffrey Keating committed
7789 7790 7791 7792 7793 7794 7795 7796 7797 7798 7799 7800 7801 7802 7803 7804 7805 7806 7807 7808 7809 7810 7811 7812
   >=  true if switch is a later (or same) version than arg1
   !>  opposite of >=
   <   true if switch is an earlier version than arg1
   !<  opposite of <
   ><  true if switch is arg1 or later, and earlier than arg2
   <>  true if switch is earlier than arg1 or is arg2 or later

   If the switch is not present, the condition is false unless
   the first character of the <comparison-op> is '!'.

   For example,
   %:version-compare(>= 10.3 mmacosx-version-min= -lmx)
   adds -lmx if -mmacosx-version-min=10.3.9 was passed.  */

static const char *
version_compare_spec_function (int argc, const char **argv)
{
  int comp1, comp2;
  size_t switch_len;
  const char *switch_value = NULL;
  int nargs = 1, i;
  bool result;

  if (argc < 3)
7813
    fatal ("too few arguments to %%:version-compare");
Geoffrey Keating committed
7814 7815 7816 7817 7818
  if (argv[0][0] == '\0')
    abort ();
  if ((argv[0][1] == '<' || argv[0][1] == '>') && argv[0][0] != '!')
    nargs = 2;
  if (argc != nargs + 3)
7819
    fatal ("too many arguments to %%:version-compare");
Geoffrey Keating committed
7820 7821 7822 7823 7824 7825 7826 7827 7828 7829 7830 7831 7832 7833 7834 7835 7836 7837 7838 7839 7840 7841 7842 7843 7844 7845 7846 7847 7848 7849 7850 7851 7852 7853 7854 7855 7856 7857

  switch_len = strlen (argv[nargs + 1]);
  for (i = 0; i < n_switches; i++)
    if (!strncmp (switches[i].part1, argv[nargs + 1], switch_len)
	&& check_live_switch (i, switch_len))
      switch_value = switches[i].part1 + switch_len;

  if (switch_value == NULL)
    comp1 = comp2 = -1;
  else
    {
      comp1 = compare_version_strings (switch_value, argv[1]);
      if (nargs == 2)
	comp2 = compare_version_strings (switch_value, argv[2]);
      else
	comp2 = -1;  /* This value unused.  */
    }

  switch (argv[0][0] << 8 | argv[0][1])
    {
    case '>' << 8 | '=':
      result = comp1 >= 0;
      break;
    case '!' << 8 | '<':
      result = comp1 >= 0 || switch_value == NULL;
      break;
    case '<' << 8:
      result = comp1 < 0;
      break;
    case '!' << 8 | '>':
      result = comp1 < 0 || switch_value == NULL;
      break;
    case '>' << 8 | '<':
      result = comp1 >= 0 && comp2 < 0;
      break;
    case '<' << 8 | '>':
      result = comp1 < 0 || comp2 >= 0;
      break;
7858

Geoffrey Keating committed
7859
    default:
7860
      fatal ("unknown operator '%s' in %%:version-compare", argv[0]);
Geoffrey Keating committed
7861 7862 7863 7864 7865 7866
    }
  if (! result)
    return NULL;

  return argv[nargs + 2];
}
Diego Novillo committed
7867 7868 7869 7870 7871 7872 7873 7874 7875 7876 7877 7878 7879 7880 7881 7882 7883 7884 7885

/* %:include builtin spec function.  This differs from %include in that it
   can be nested inside a spec, and thus be conditionalized.  It takes
   one argument, the filename, and looks for it in the startfile path.
   The result is always NULL, i.e. an empty expansion.  */

static const char *
include_spec_function (int argc, const char **argv)
{
  char *file;

  if (argc != 1)
    abort ();

  file = find_a_file (&startfile_prefixes, argv[0], R_OK, 0);
  read_specs (file ? file : argv[0], FALSE);

  return NULL;
}