OpenCores
URL https://opencores.org/ocsvn/scarts/scarts/trunk

Subversion Repositories scarts

[/] [scarts/] [trunk/] [toolchain/] [scarts-gcc/] [gcc-4.1.1/] [gcc/] [gcc.c] - Blame information for rev 17

Go to most recent revision | Details | Compare with Previous | View Log

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

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.