Annotation of gcc/gcc.c, revision 1.1.1.3

1.1       root        1: /* Compiler driver program that can handle many languages.
                      2:    Copyright (C) 1987, 1989, 1992 Free Software Foundation, Inc.
                      3: 
                      4: This file is part of GNU CC.
                      5: 
                      6: GNU CC is free software; you can redistribute it and/or modify
                      7: it under the terms of the GNU General Public License as published by
                      8: the Free Software Foundation; either version 2, or (at your option)
                      9: any later version.
                     10: 
                     11: GNU CC is distributed in the hope that it will be useful,
                     12: but WITHOUT ANY WARRANTY; without even the implied warranty of
                     13: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
                     14: GNU General Public License for more details.
                     15: 
                     16: You should have received a copy of the GNU General Public License
                     17: along with GNU CC; see the file COPYING.  If not, write to
                     18: the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
                     19: 
                     20: This paragraph is here to try to keep Sun CC from dying.
                     21: The number of chars here seems crucial!!!!  */
                     22: 
                     23: /* This program is the user interface to the C compiler and possibly to
                     24: other compilers.  It is used because compilation is a complicated procedure
                     25: which involves running several programs and passing temporary files between
                     26: them, forwarding the users switches to those programs selectively,
                     27: and deleting the temporary files at the end.
                     28: 
                     29: CC recognizes how to compile each input file by suffixes in the file names.
                     30: Once it knows which kind of compilation to perform, the procedure for
                     31: compilation is specified by a string called a "spec".  */
                     32: 
                     33: #include <stdio.h>
                     34: #include <sys/types.h>
                     35: #include <ctype.h>
                     36: #include <signal.h>
                     37: #include <sys/stat.h>
1.1.1.3 ! root       38: #include <sys/file.h>   /* May get R_OK, etc. on some systems.  */
1.1       root       39: 
                     40: #include "config.h"
                     41: #include "obstack.h"
                     42: #include "gvarargs.h"
                     43: 
                     44: #ifndef R_OK
                     45: #define R_OK 4
                     46: #define W_OK 2
                     47: #define X_OK 1
                     48: #endif
                     49: 
1.1.1.3 ! root       50: #ifdef USG
1.1       root       51: #define vfork fork
                     52: #endif /* USG */
                     53: 
                     54: /* On MSDOS, write temp files in current dir
                     55:    because there's no place else we can expect to use.  */
                     56: #if __MSDOS__
                     57: #ifndef P_tmpdir
                     58: #define P_tmpdir "./"
                     59: #endif
                     60: #endif
                     61: 
                     62: /* Test if something is a normal file.  */
                     63: #ifndef S_ISREG
                     64: #define S_ISREG(m) (((m) & S_IFMT) == S_IFREG)
                     65: #endif
                     66: 
                     67: /* Test if something is a directory.  */
                     68: #ifndef S_ISDIR
                     69: #define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR)
                     70: #endif
                     71: 
                     72: /* By default there is no special suffix for executables.  */
                     73: #ifndef EXECUTABLE_SUFFIX
                     74: #define EXECUTABLE_SUFFIX ""
                     75: #endif
1.1.1.3 ! root       76: 
        !            77: /* By default, colon separates directories in a path.  */
        !            78: #ifndef PATH_SEPARATOR
        !            79: #define PATH_SEPARATOR ':'
1.1       root       80: #endif
                     81: 
                     82: #define obstack_chunk_alloc xmalloc
                     83: #define obstack_chunk_free free
                     84: 
                     85: extern void free ();
                     86: extern char *getenv ();
                     87: 
                     88: extern int errno, sys_nerr;
                     89: extern char *sys_errlist[];
                     90: 
                     91: extern int execv (), execvp ();
                     92: 
                     93: /* If a stage of compilation returns an exit status >= 1,
                     94:    compilation of that file ceases.  */
                     95: 
                     96: #define MIN_FATAL_STATUS 1
                     97: 
1.1.1.3 ! root       98: /* Flag saying to print the full filename of libgcc.a
        !            99:    as found through our usual search mechanism.  */
        !           100: 
        !           101: static int print_libgcc_file_name;
        !           102: 
1.1       root      103: /* Flag indicating whether we should print the command and arguments */
                    104: 
                    105: static int verbose_flag;
                    106: 
                    107: /* Nonzero means write "temp" files in source directory
                    108:    and use the source file's name in them, and don't delete them.  */
                    109: 
                    110: static int save_temps_flag;
                    111: 
                    112: /* The compiler version specified with -V */
                    113: 
                    114: static char *spec_version;
                    115: 
                    116: /* The target machine specified with -b.  */
                    117: 
                    118: static char *spec_machine = DEFAULT_TARGET_MACHINE;
                    119: 
1.1.1.2   root      120: /* Nonzero if cross-compiling.
                    121:    When -b is used, the value comes from the `specs' file.  */
                    122: 
                    123: #ifdef CROSS_COMPILE
                    124: static int cross_compile = 1;
                    125: #else
                    126: static int cross_compile = 0;
                    127: #endif
                    128: 
1.1       root      129: /* This is the obstack which we use to allocate many strings.  */
                    130: 
                    131: static struct obstack obstack;
                    132: 
1.1.1.2   root      133: /* This is the obstack to build an environment variable to pass to
1.1.1.3 ! root      134:    collect2 that describes all of the relevant switches of what to
1.1.1.2   root      135:    pass the compiler in building the list of pointers to constructors
                    136:    and destructors.  */
                    137: 
                    138: static struct obstack collect_obstack;
                    139: 
1.1       root      140: extern char *version_string;
                    141: 
                    142: static void set_spec ();
                    143: static struct compiler *lookup_compiler ();
                    144: static char *find_a_file ();
                    145: static void add_prefix ();
                    146: static char *skip_whitespace ();
                    147: static void record_temp_file ();
                    148: static char *handle_braces ();
                    149: static char *save_string ();
                    150: static char *concat ();
                    151: static int do_spec ();
                    152: static int do_spec_1 ();
                    153: static char *find_file ();
                    154: static int is_linker_dir ();
                    155: static void validate_switches ();
                    156: static void validate_all_switches ();
                    157: static void give_switch ();
                    158: static void pfatal_with_name ();
                    159: static void perror_with_name ();
                    160: static void perror_exec ();
                    161: static void fatal ();
                    162: static void error ();
                    163: void fancy_abort ();
                    164: char *xmalloc ();
                    165: char *xrealloc ();
                    166: 
                    167: /* Specs are strings containing lines, each of which (if not blank)
                    168: is made up of a program name, and arguments separated by spaces.
                    169: The program name must be exact and start from root, since no path
                    170: is searched and it is unreliable to depend on the current working directory.
                    171: Redirection of input or output is not supported; the subprograms must
                    172: accept filenames saying what files to read and write.
                    173: 
                    174: In addition, the specs can contain %-sequences to substitute variable text
                    175: or for conditional text.  Here is a table of all defined %-sequences.
                    176: Note that spaces are not generated automatically around the results of
                    177: expanding these sequences; therefore, you can concatenate them together
                    178: or with constant text in a single argument.
                    179: 
                    180:  %%    substitute one % into the program name or argument.
                    181:  %i     substitute the name of the input file being processed.
                    182:  %b     substitute the basename of the input file being processed.
                    183:        This is the substring up to (and not including) the last period
                    184:        and not including the directory.
                    185:  %g     substitute the temporary-file-name-base.  This is a string chosen
                    186:        once per compilation.  Different temporary file names are made by
                    187:        concatenation of constant strings on the end, as in `%g.s'.
                    188:        %g also has the same effect of %d.
                    189:  %d    marks the argument containing or following the %d as a
                    190:        temporary file name, so that that file will be deleted if CC exits
                    191:        successfully.  Unlike %g, this contributes no text to the argument.
                    192:  %w    marks the argument containing or following the %w as the
                    193:        "output file" of this compilation.  This puts the argument
                    194:        into the sequence of arguments that %o will substitute later.
                    195:  %W{...}
                    196:        like %{...} but mark last argument supplied within
                    197:        as a file to be deleted on failure.
                    198:  %o    substitutes the names of all the output files, with spaces
                    199:        automatically placed around them.  You should write spaces
                    200:        around the %o as well or the results are undefined.
                    201:        %o is for use in the specs for running the linker.
                    202:        Input files whose names have no recognized suffix are not compiled
                    203:        at all, but they are included among the output files, so they will
                    204:        be linked.
                    205:  %p    substitutes the standard macro predefinitions for the
                    206:        current target machine.  Use this when running cpp.
                    207:  %P    like %p, but puts `__' before and after the name of each macro.
                    208:        (Except macros that already have __.)
                    209:        This is for ANSI C.
1.1.1.3 ! root      210:  %I    Substitute a -iprefix option made from GCC_EXEC_PREFIX.
1.1       root      211:  %s     current argument is the name of a library or startup file of some sort.
                    212:         Search for that file in a standard list of directories
                    213:        and substitute the full name found.
                    214:  %eSTR  Print STR as an error message.  STR is terminated by a newline.
                    215:         Use this when inconsistent options are detected.
                    216:  %x{OPTION}    Accumulate an option for %X.
                    217:  %X    Output the accumulated linker options specified by compilations.
                    218:  %a     process ASM_SPEC as a spec.
                    219:         This allows config.h to specify part of the spec for running as.
                    220:  %A    process ASM_FINAL_SPEC as a spec.  A capital A is actually
                    221:        used here.  This can be used to run a post-processor after the
                    222:        assembler has done it's job.
                    223:  %D    Dump out a -L option for each directory in library_prefix,
                    224:        followed by a -L option for each directory in startfile_prefix.
                    225:  %l     process LINK_SPEC as a spec.
                    226:  %L     process LIB_SPEC as a spec.
                    227:  %S     process STARTFILE_SPEC as a spec.  A capital S is actually used here.
                    228:  %E     process ENDFILE_SPEC as a spec.  A capital E is actually used here.
                    229:  %c    process SIGNED_CHAR_SPEC as a spec.
                    230:  %C     process CPP_SPEC as a spec.  A capital C is actually used here.
                    231:  %1    process CC1_SPEC as a spec.
                    232:  %2    process CC1PLUS_SPEC as a spec.
                    233:  %*    substitute the variable part of a matched option.  (See below.)
                    234:        Note that each comma in the substituted string is replaced by
                    235:        a single space.
                    236:  %{S}   substitutes the -S switch, if that switch was given to CC.
                    237:        If that switch was not specified, this substitutes nothing.
                    238:        Here S is a metasyntactic variable.
                    239:  %{S*}  substitutes all the switches specified to CC whose names start
                    240:        with -S.  This is used for -o, -D, -I, etc; switches that take
                    241:        arguments.  CC considers `-o foo' as being one switch whose
                    242:        name starts with `o'.  %{o*} would substitute this text,
                    243:        including the space; thus, two arguments would be generated.
                    244:  %{S*:X} substitutes X if one or more switches whose names with -S are
                    245:        specified to CC.  Note that the tail part of the -S option
                    246:        (i.e. the part matched by the `*') will be substituted for each
1.1.1.3 ! root      247:        occurrence of %* within X.
1.1       root      248:  %{S:X} substitutes X, but only if the -S switch was given to CC.
                    249:  %{!S:X} substitutes X, but only if the -S switch was NOT given to CC.
                    250:  %{|S:X} like %{S:X}, but if no S switch, substitute `-'.
                    251:  %{|!S:X} like %{!S:X}, but if there is an S switch, substitute `-'.
                    252:  %{.S:X} substitutes X, but only if processing a file with suffix S.
                    253:  %{!.S:X} substitutes X, but only if NOT processing a file with suffix S.
1.1.1.2   root      254:  %(Spec) processes a specification defined in a specs file as *Spec:
                    255:  %[Spec] as above, but put __ around -D arguments
1.1       root      256: 
                    257: The conditional text X in a %{S:X} or %{!S:X} construct may contain
                    258: other nested % constructs or spaces, or even newlines.  They are
                    259: processed as usual, as described above.
                    260: 
                    261: The character | is used to indicate that a command should be piped to
                    262: the following command, but only if -pipe is specified.
                    263: 
                    264: Note that it is built into CC which switches take arguments and which
                    265: do not.  You might think it would be useful to generalize this to
                    266: allow each compiler's spec to say which switches take arguments.  But
                    267: this cannot be done in a consistent fashion.  CC cannot even decide
                    268: which input files have been specified without knowing which switches
                    269: take arguments, and it must know which input files to compile in order
                    270: to tell which compilers to run.
                    271: 
                    272: CC also knows implicitly that arguments starting in `-l' are to be
                    273: treated as compiler output files, and passed to the linker in their
                    274: proper position among the other output files.  */
                    275: 
                    276: /* Define the macros used for specs %a, %l, %L, %S, %c, %C, %1.  */
                    277: 
                    278: /* config.h can define ASM_SPEC to provide extra args to the assembler
                    279:    or extra switch-translations.  */
                    280: #ifndef ASM_SPEC
                    281: #define ASM_SPEC ""
                    282: #endif
                    283: 
                    284: /* config.h can define ASM_FINAL_SPEC to run a post processor after
                    285:    the assembler has run.  */
                    286: #ifndef ASM_FINAL_SPEC
                    287: #define ASM_FINAL_SPEC ""
                    288: #endif
                    289: 
                    290: /* config.h can define CPP_SPEC to provide extra args to the C preprocessor
                    291:    or extra switch-translations.  */
                    292: #ifndef CPP_SPEC
                    293: #define CPP_SPEC ""
                    294: #endif
                    295: 
                    296: /* config.h can define CC1_SPEC to provide extra args to cc1 and cc1plus
                    297:    or extra switch-translations.  */
                    298: #ifndef CC1_SPEC
                    299: #define CC1_SPEC ""
                    300: #endif
                    301: 
                    302: /* config.h can define CC1PLUS_SPEC to provide extra args to cc1plus
                    303:    or extra switch-translations.  */
                    304: #ifndef CC1PLUS_SPEC
                    305: #define CC1PLUS_SPEC ""
                    306: #endif
                    307: 
                    308: /* config.h can define LINK_SPEC to provide extra args to the linker
                    309:    or extra switch-translations.  */
                    310: #ifndef LINK_SPEC
                    311: #define LINK_SPEC ""
                    312: #endif
                    313: 
                    314: /* config.h can define LIB_SPEC to override the default libraries.  */
                    315: #ifndef LIB_SPEC
                    316: #define LIB_SPEC "%{g*:-lg} %{!p:%{!pg:-lc}}%{p:-lc_p}%{pg:-lc_p}"
                    317: #endif
                    318: 
                    319: /* config.h can define STARTFILE_SPEC to override the default crt0 files.  */
                    320: #ifndef STARTFILE_SPEC
                    321: #define STARTFILE_SPEC  \
                    322:   "%{pg:gcrt0.o%s}%{!pg:%{p:mcrt0.o%s}%{!p:crt0.o%s}}"
                    323: #endif
                    324: 
                    325: /* config.h can define SWITCHES_NEED_SPACES to control passing -o and -L.
                    326:    Make the string nonempty to require spaces there.  */
                    327: #ifndef SWITCHES_NEED_SPACES
                    328: #define SWITCHES_NEED_SPACES ""
                    329: #endif
                    330: 
                    331: /* config.h can define ENDFILE_SPEC to override the default crtn files.  */
                    332: #ifndef ENDFILE_SPEC
                    333: #define ENDFILE_SPEC ""
                    334: #endif
                    335: 
                    336: /* This spec is used for telling cpp whether char is signed or not.  */
                    337: #ifndef SIGNED_CHAR_SPEC
                    338: #define SIGNED_CHAR_SPEC  \
                    339:   (DEFAULT_SIGNED_CHAR ? "%{funsigned-char:-D__CHAR_UNSIGNED__}"       \
                    340:    : "%{!fsigned-char:-D__CHAR_UNSIGNED__}")
                    341: #endif
                    342: 
                    343: static char *cpp_spec = CPP_SPEC;
                    344: static char *cpp_predefines = CPP_PREDEFINES;
                    345: static char *cc1_spec = CC1_SPEC;
                    346: static char *cc1plus_spec = CC1PLUS_SPEC;
                    347: static char *signed_char_spec = SIGNED_CHAR_SPEC;
                    348: static char *asm_spec = ASM_SPEC;
                    349: static char *asm_final_spec = ASM_FINAL_SPEC;
                    350: static char *link_spec = LINK_SPEC;
                    351: static char *lib_spec = LIB_SPEC;
                    352: static char *endfile_spec = ENDFILE_SPEC;
                    353: static char *startfile_spec = STARTFILE_SPEC;
                    354: static char *switches_need_spaces = SWITCHES_NEED_SPACES;
                    355: 
                    356: /* This defines which switch letters take arguments.  */
                    357: 
                    358: #ifndef SWITCH_TAKES_ARG
                    359: #define SWITCH_TAKES_ARG(CHAR)      \
                    360:   ((CHAR) == 'D' || (CHAR) == 'U' || (CHAR) == 'o' \
                    361:    || (CHAR) == 'e' || (CHAR) == 'T' || (CHAR) == 'u' \
                    362:    || (CHAR) == 'I' || (CHAR) == 'm' \
                    363:    || (CHAR) == 'L' || (CHAR) == 'A')
                    364: #endif
                    365: 
                    366: /* This defines which multi-letter switches take arguments.  */
                    367: 
                    368: #ifndef WORD_SWITCH_TAKES_ARG
                    369: #define WORD_SWITCH_TAKES_ARG(STR)                     \
                    370:  (!strcmp (STR, "Tdata") || !strcmp (STR, "include")   \
1.1.1.2   root      371:   || !strcmp (STR, "imacros") || !strcmp (STR, "aux-info"))
1.1       root      372: #endif
                    373: 
                    374: /* Record the mapping from file suffixes for compilation specs.  */
                    375: 
                    376: struct compiler
                    377: {
                    378:   char *suffix;                        /* Use this compiler for input files
                    379:                                   whose names end in this suffix.  */
                    380:   char *spec;                  /* To use this compiler, pass this spec
                    381:                                   to do_spec.  */
                    382: };
                    383: 
                    384: /* Pointer to a vector of `struct compiler' that gives the spec for
                    385:    compiling a file, based on its suffix.
                    386:    A file that does not end in any of these suffixes will be passed
                    387:    unchanged to the loader and nothing else will be done to it.
                    388: 
                    389:    An entry containing two 0s is used to terminate the vector.
                    390: 
                    391:    If multiple entries match a file, the last matching one is used.  */
                    392: 
                    393: static struct compiler *compilers;
                    394: 
                    395: /* Number of entries in `compilers', not counting the null terminator.  */
                    396: 
                    397: static int n_compilers;
                    398: 
                    399: /* The default list of file name suffixes and their compilation specs.  */
                    400: 
                    401: static struct compiler default_compilers[] =
                    402: {
                    403:   {".c", "@c"},
                    404:   {"@c",
1.1.1.3 ! root      405:    "cpp -lang-c %{nostdinc*} %{C} %{v} %{A*} %{D*} %{U*} %{I*} %{i*} %{P} %I\
1.1       root      406:        %{C:%{!E:%eGNU C does not support -C without using -E}}\
                    407:        %{M} %{MM} %{MD:-MD %b.d} %{MMD:-MMD %b.d}\
                    408:         -undef -D__GNUC__=2 %{ansi:-trigraphs -$ -D__STRICT_ANSI__}\
                    409:        %{!undef:%{!ansi:%p} %P} %{trigraphs}\
                    410:         %c %{O*:-D__OPTIMIZE__} %{traditional} %{ftraditional:-traditional}\
                    411:         %{traditional-cpp:-traditional}\
                    412:        %{g*} %{W*} %{w} %{pedantic*} %{H} %{d*} %C\
1.1.1.2   root      413:         %i %{!M:%{!MM:%{!E:%{!pipe:%g.i}}}}%{E:%W{o*}}%{M:%W{o*}}%{MM:%W{o*}} |\n\
                    414:     %{!M:%{!MM:%{!E:cc1 %{!pipe:%g.i} %1 \
1.1       root      415:                   %{!Q:-quiet} -dumpbase %b.c %{d*} %{m*} %{a}\
                    416:                   %{g*} %{O*} %{W*} %{w} %{pedantic*} %{ansi} \
                    417:                   %{traditional} %{v:-version} %{pg:-p} %{p} %{f*}\
1.1.1.2   root      418:                   %{aux-info*}\
1.1       root      419:                   %{pg:%{fomit-frame-pointer:%e-pg and -fomit-frame-pointer are incompatible}}\
                    420:                   %{S:%W{o*}%{!o*:-o %b.s}}%{!S:-o %{|!pipe:%g.s}} |\n\
                    421:               %{!S:as %{R} %{j} %{J} %{h} %{d2} %a \
                    422:                      %{c:%W{o*}%{!o*:-o %w%b.o}}%{!c:-o %d%w%b.o}\
                    423:                       %{!pipe:%g.s} %A\n }}}}"},
                    424:   {"-",
1.1.1.3 ! root      425:    "%{E:cpp -lang-c %{nostdinc*} %{C} %{v} %{A*} %{D*} %{U*} %{I*} %{i*} %{P} %I\
1.1       root      426:        %{C:%{!E:%eGNU C does not support -C without using -E}}\
                    427:        %{M} %{MM} %{MD:-MD %b.d} %{MMD:-MMD %b.d}\
                    428:         -undef -D__GNUC__=2 %{ansi:-trigraphs -$ -D__STRICT_ANSI__}\
                    429:        %{!undef:%{!ansi:%p} %P} %{trigraphs}\
                    430:         %c %{O*:-D__OPTIMIZE__} %{traditional} %{ftraditional:-traditional}\
                    431:         %{traditional-cpp:-traditional}\
                    432:        %{g*} %{W*} %{w} %{pedantic*} %{H} %{d*} %C\
                    433:         %i %W{o*}}\
                    434:     %{!E:%e-E required when input is from standard input}"},
                    435:   {".m", "@objective-c"},
                    436:   {"@objective-c",
1.1.1.3 ! root      437:    "cpp -lang-objc %{nostdinc*} %{C} %{v} %{A*} %{D*} %{U*} %{I*} %{i*} %{P} %I\
1.1       root      438:        %{C:%{!E:%eGNU C does not support -C without using -E}}\
                    439:        %{M} %{MM} %{MD:-MD %b.d} %{MMD:-MMD %b.d}\
                    440:         -undef -D__OBJC__ -D__GNUC__=2 %{ansi:-trigraphs -$ -D__STRICT_ANSI__}\
                    441:        %{!undef:%{!ansi:%p} %P} %{trigraphs}\
                    442:         %c %{O*:-D__OPTIMIZE__} %{traditional} %{ftraditional:-traditional}\
                    443:         %{traditional-cpp:-traditional}\
                    444:        %{g*} %{W*} %{w} %{pedantic*} %{H} %{d*} %C\
1.1.1.2   root      445:         %i %{!M:%{!MM:%{!E:%{!pipe:%g.i}}}}%{E:%W{o*}}%{M:%W{o*}}%{MM:%W{o*}} |\n\
                    446:     %{!M:%{!MM:%{!E:cc1obj %{!pipe:%g.i} %1 \
1.1       root      447:                   %{!Q:-quiet} -dumpbase %b.m %{d*} %{m*} %{a}\
                    448:                   %{g*} %{O*} %{W*} %{w} %{pedantic*} %{ansi} \
                    449:                   %{traditional} %{v:-version} %{pg:-p} %{p} %{f*} \
                    450:                   -lang-objc %{gen-decls} \
1.1.1.2   root      451:                   %{aux-info*}\
1.1       root      452:                   %{pg:%{fomit-frame-pointer:%e-pg and -fomit-frame-pointer are incompatible}}\
                    453:                   %{S:%W{o*}%{!o*:-o %b.s}}%{!S:-o %{|!pipe:%g.s}} |\n\
                    454:               %{!S:as %{R} %{j} %{J} %{h} %{d2} %a \
                    455:                      %{c:%W{o*}%{!o*:-o %w%b.o}}%{!c:-o %d%w%b.o}\
                    456:                       %{!pipe:%g.s} %A\n }}}}"},
                    457:   {".h", "@c-header"},
                    458:   {"@c-header",
                    459:    "%{!E:%eCompilation of header file requested} \
1.1.1.3 ! root      460:     cpp %{nostdinc*} %{C} %{v} %{A*} %{D*} %{U*} %{I*} %{i*} %{P} %I\
1.1       root      461:        %{C:%{!E:%eGNU C does not support -C without using -E}}\
                    462:         %{M} %{MM} %{MD:-MD %b.d} %{MMD:-MMD %b.d} \
                    463:         -undef -D__GNUC__=2 %{ansi:-trigraphs -$ -D__STRICT_ANSI__}\
                    464:        %{!undef:%{!ansi:%p} %P} %{trigraphs}\
                    465:         %c %{O*:-D__OPTIMIZE__} %{traditional} %{ftraditional:-traditional}\
                    466:         %{traditional-cpp:-traditional}\
                    467:        %{g*} %{W*} %{w} %{pedantic*} %{H} %{d*} %C\
                    468:         %i %W{o*}"},
                    469:   {".cc", "@c++"},
                    470:   {".cxx", "@c++"},
                    471:   {".C", "@c++"},
                    472:   {"@c++",
1.1.1.3 ! root      473:    "cpp -lang-c++ %{nostdinc*} %{C} %{v} %{A*} %{D*} %{U*} %{I*} %{i*} %{P} %I\
1.1       root      474:        %{C:%{!E:%eGNU C++ does not support -C without using -E}}\
                    475:        %{M} %{MM} %{MD:-MD %b.d} %{MMD:-MMD %b.d} \
                    476:        -undef -D__GNUC__=2 -D__GNUG__=2 -D__cplusplus \
                    477:        %{ansi:-trigraphs -$ -D__STRICT_ANSI__} %{!undef:%{!ansi:%p} %P}\
                    478:         %c %{O*:-D__OPTIMIZE__} %{traditional} %{ftraditional:-traditional}\
                    479:         %{traditional-cpp:-traditional} %{trigraphs}\
                    480:        %{g*} %{W*} %{w} %{pedantic*} %{H} %{d*} %C\
1.1.1.2   root      481:         %i %{!M:%{!MM:%{!E:%{!pipe:%g.i}}}}%{E:%W{o*}}%{M:%W{o*}}%{MM:%W{o*}} |\n\
                    482:     %{!M:%{!MM:%{!E:cc1plus %{!pipe:%g.i} %1 %2\
1.1       root      483:                   %{!Q:-quiet} -dumpbase %b.cc %{d*} %{m*} %{a}\
                    484:                   %{g*} %{O*} %{W*} %{w} %{pedantic*} %{ansi} %{traditional}\
                    485:                   %{v:-version} %{pg:-p} %{p} %{f*}\
1.1.1.2   root      486:                   %{aux-info*}\
1.1       root      487:                   %{pg:%{fomit-frame-pointer:%e-pg and -fomit-frame-pointer are incompatible}}\
                    488:                   %{S:%W{o*}%{!o*:-o %b.s}}%{!S:-o %{|!pipe:%g.s}} |\n\
                    489:               %{!S:as %{R} %{j} %{J} %{h} %{d2} %a \
                    490:                      %{c:%W{o*}%{!o*:-o %w%b.o}}%{!c:-o %d%w%b.o}\
                    491:                       %{!pipe:%g.s} %A\n }}}}"},
                    492:   {".i", "@cpp-output"},
                    493:   {"@cpp-output",
                    494:    "cc1 %i %1 %{!Q:-quiet} %{d*} %{m*} %{a}\
                    495:        %{g*} %{O*} %{W*} %{w} %{pedantic*} %{ansi} %{traditional}\
                    496:        %{v:-version} %{pg:-p} %{p} %{f*}\
1.1.1.2   root      497:        %{aux-info*}\
1.1       root      498:        %{pg:%{fomit-frame-pointer:%e-pg and -fomit-frame-pointer are incompatible}}\
                    499:        %{S:%W{o*}%{!o*:-o %b.s}}%{!S:-o %{|!pipe:%g.s}} |\n\
                    500:     %{!S:as %{R} %{j} %{J} %{h} %{d2} %a \
                    501:             %{c:%W{o*}%{!o*:-o %w%b.o}}%{!c:-o %d%w%b.o} %{!pipe:%g.s} %A\n }"},
                    502:   {".ii", "@c++-cpp-output"},
                    503:   {"@c++-cpp-output",
                    504:    "cc1plus %i %1 %2 %{!Q:-quiet} %{d*} %{m*} %{a}\
                    505:            %{g*} %{O*} %{W*} %{w} %{pedantic*} %{ansi} %{traditional}\
                    506:            %{v:-version} %{pg:-p} %{p} %{f*}\
1.1.1.2   root      507:            %{aux-info*}\
1.1       root      508:            %{pg:%{fomit-frame-pointer:%e-pg and -fomit-frame-pointer are incompatible}}\
                    509:            %{S:%W{o*}%{!o*:-o %b.s}}%{!S:-o %{|!pipe:%g.s}} |\n\
                    510:        %{!S:as %{R} %{j} %{J} %{h} %{d2} %a \
                    511:               %{c:%W{o*}%{!o*:-o %w%b.o}}%{!c:-o %d%w%b.o}\
                    512:               %{!pipe:%g.s} %A\n }"},
                    513:   {".s", "@assembler"},
                    514:   {"@assembler",
                    515:    "%{!S:as %{R} %{j} %{J} %{h} %{d2} %a \
                    516:             %{c:%W{o*}%{!o*:-o %w%b.o}}%{!c:-o %d%w%b.o} %i %A\n }"},
                    517:   {".S", "@assembler-with-cpp"},
                    518:   {"@assembler-with-cpp",
1.1.1.3 ! root      519:    "cpp -lang-asm %{nostdinc*} %{C} %{v} %{A*} %{D*} %{U*} %{I*} %{i*} %{P} %I\
1.1       root      520:        %{C:%{!E:%eGNU C does not support -C without using -E}}\
                    521:        %{M} %{MM} %{MD:-MD %b.d} %{MMD:-MMD %b.d} %{trigraphs} \
                    522:         -undef -$ %{!undef:%p %P} -D__ASSEMBLER__ \
                    523:         %c %{O*:-D__OPTIMIZE__} %{traditional} %{ftraditional:-traditional}\
                    524:         %{traditional-cpp:-traditional}\
                    525:        %{g*} %{W*} %{w} %{pedantic*} %{H} %{d*} %C\
                    526:         %i %{!M:%{!MM:%{!E:%{!pipe:%g.s}}}}%{E:%W{o*}}%{M:%W{o*}}%{MM:%W{o*}} |\n\
                    527:     %{!M:%{!MM:%{!E:%{!S:as %{R} %{j} %{J} %{h} %{d2} %a \
                    528:                     %{c:%W{o*}%{!o*:-o %w%b.o}}%{!c:-o %d%w%b.o}\
                    529:                    %{!pipe:%g.s} %A\n }}}}"},
                    530:   /* Mark end of table */
                    531:   {0, 0}
                    532: };
                    533: 
                    534: /* Number of elements in default_compilers, not counting the terminator.  */
                    535: 
                    536: static int n_default_compilers
                    537:   = (sizeof default_compilers / sizeof (struct compiler)) - 1;
                    538: 
                    539: /* Here is the spec for running the linker, after compiling all files.  */
                    540: 
                    541: #ifdef LINK_LIBGCC_SPECIAL
1.1.1.3 ! root      542: /* Have gcc do the search for libgcc.a.  */
        !           543: /* -u* was put back because both BSD and SysV seem to support it.  */
1.1       root      544: static char *link_command_spec = "\
1.1.1.3 ! root      545: %{!c:%{!M:%{!MM:%{!E:%{!S:ld %l %X %{o*} %{A} %{d} %{e*} %{m} %{N} %{n} \
        !           546:                        %{r} %{s} %{T*} %{t} %{u*} %{x} %{z}\
1.1       root      547:                        %{!A:%{!nostdlib:%S}} \
                    548:                        %{L*} %D %o %{!nostdlib:libgcc.a%s %L libgcc.a%s %{!A:%E}}\n }}}}}";
                    549: #else
1.1.1.3 ! root      550: /* Use -L and have the linker do the search for -lgcc.  */
1.1       root      551: static char *link_command_spec = "\
1.1.1.3 ! root      552: %{!c:%{!M:%{!MM:%{!E:%{!S:ld %l %X %{o*} %{A} %{d} %{e*} %{m} %{N} %{n} \
        !           553:                        %{r} %{s} %{T*} %{t} %{u*} %{x} %{z}\
1.1       root      554:                        %{!A:%{!nostdlib:%S}} \
                    555:                        %{L*} %D %o %{!nostdlib:-lgcc %L -lgcc %{!A:%E}}\n }}}}}";
                    556: #endif
                    557: 
                    558: /* A vector of options to give to the linker.
1.1.1.3 ! root      559:    These options are accumulated by %x
1.1       root      560:    and substituted into the linker command with %X.  */
                    561: static int n_linker_options;
                    562: static char **linker_options;
                    563: 
                    564: /* Read compilation specs from a file named FILENAME,
                    565:    replacing the default ones.
                    566: 
                    567:    A suffix which starts with `*' is a definition for
                    568:    one of the machine-specific sub-specs.  The "suffix" should be
                    569:    *asm, *cc1, *cpp, *link, *startfile, *signed_char, etc.
                    570:    The corresponding spec is stored in asm_spec, etc.,
                    571:    rather than in the `compilers' vector.
                    572: 
                    573:    Anything invalid in the file is a fatal error.  */
                    574: 
                    575: static void
                    576: read_specs (filename)
                    577:      char *filename;
                    578: {
                    579:   int desc;
                    580:   struct stat statbuf;
                    581:   char *buffer;
                    582:   register char *p;
                    583: 
                    584:   if (verbose_flag)
                    585:     fprintf (stderr, "Reading specs from %s\n", filename);
                    586: 
                    587:   /* Open and stat the file.  */
                    588:   desc = open (filename, 0, 0);
                    589:   if (desc < 0)
                    590:     pfatal_with_name (filename);
                    591:   if (stat (filename, &statbuf) < 0)
                    592:     pfatal_with_name (filename);
                    593: 
                    594:   /* Read contents of file into BUFFER.  */
                    595:   buffer = xmalloc (statbuf.st_size + 1);
                    596:   read (desc, buffer, statbuf.st_size);
                    597:   buffer[statbuf.st_size] = 0;
                    598:   close (desc);
                    599: 
                    600:   /* Scan BUFFER for specs, putting them in the vector.  */
                    601:   p = buffer;
                    602:   while (1)
                    603:     {
                    604:       char *suffix;
                    605:       char *spec;
                    606:       char *in, *out, *p1, *p2;
                    607: 
                    608:       /* Advance P in BUFFER to the next nonblank nocomment line.  */
                    609:       p = skip_whitespace (p);
                    610:       if (*p == 0)
                    611:        break;
                    612: 
                    613:       /* Find the colon that should end the suffix.  */
                    614:       p1 = p;
                    615:       while (*p1 && *p1 != ':' && *p1 != '\n') p1++;
                    616:       /* The colon shouldn't be missing.  */
                    617:       if (*p1 != ':')
                    618:        fatal ("specs file malformed after %d characters", p1 - buffer);
                    619:       /* Skip back over trailing whitespace.  */
                    620:       p2 = p1;
                    621:       while (p2 > buffer && (p2[-1] == ' ' || p2[-1] == '\t')) p2--;
                    622:       /* Copy the suffix to a string.  */
                    623:       suffix = save_string (p, p2 - p);
                    624:       /* Find the next line.  */
                    625:       p = skip_whitespace (p1 + 1);
                    626:       if (p[1] == 0)
                    627:        fatal ("specs file malformed after %d characters", p - buffer);
                    628:       p1 = p;
                    629:       /* Find next blank line.  */
                    630:       while (*p1 && !(*p1 == '\n' && p1[1] == '\n')) p1++;
                    631:       /* Specs end at the blank line and do not include the newline.  */
                    632:       spec = save_string (p, p1 - p);
                    633:       p = p1;
                    634: 
                    635:       /* Delete backslash-newline sequences from the spec.  */
                    636:       in = spec;
                    637:       out = spec;
                    638:       while (*in != 0)
                    639:        {
                    640:          if (in[0] == '\\' && in[1] == '\n')
                    641:            in += 2;
                    642:          else if (in[0] == '#')
                    643:            {
                    644:              while (*in && *in != '\n') in++;
                    645:            }
                    646:          else
                    647:            *out++ = *in++;
                    648:        }
                    649:       *out = 0;
                    650: 
                    651:       if (suffix[0] == '*')
                    652:        {
                    653:          if (! strcmp (suffix, "*link_command"))
                    654:            link_command_spec = spec;
                    655:          else
                    656:            set_spec (suffix + 1, spec);
                    657:        }
                    658:       else
                    659:        {
                    660:          /* Add this pair to the vector.  */
                    661:          compilers
                    662:            = ((struct compiler *)
                    663:               xrealloc (compilers, (n_compilers + 2) * sizeof (struct compiler)));
                    664:          compilers[n_compilers].suffix = suffix;
                    665:          compilers[n_compilers].spec = spec;
                    666:          n_compilers++;
                    667:        }
                    668: 
                    669:       if (*suffix == 0)
                    670:        link_command_spec = spec;
                    671:     }
                    672: 
                    673:   if (link_command_spec == 0)
                    674:     fatal ("spec file has no spec for linking");
                    675: }
                    676: 
                    677: static char *
                    678: skip_whitespace (p)
                    679:      char *p;
                    680: {
                    681:   while (1)
                    682:     {
                    683:       /* A fully-blank line is a delimiter in the SPEC file and shouldn't
                    684:         be considered whitespace.  */
                    685:       if (p[0] == '\n' && p[1] == '\n' && p[2] == '\n')
                    686:        return p + 1;
                    687:       else if (*p == '\n' || *p == ' ' || *p == '\t')
                    688:        p++;
                    689:       else if (*p == '#')
                    690:        {
                    691:          while (*p != '\n') p++;
                    692:          p++;
                    693:        }
                    694:       else
                    695:        break;
                    696:     }
                    697: 
                    698:   return p;
                    699: }
                    700: 
                    701: /* Structure to keep track of the specs that have been defined so far.  These
1.1.1.2   root      702:    are accessed using %(specname) or %[specname] in a compiler or link spec. */
1.1       root      703: 
                    704: struct spec_list
                    705: {
                    706:   char *name;                 /* Name of the spec. */
                    707:   char *spec;                 /* The spec itself. */
                    708:   struct spec_list *next;     /* Next spec in linked list. */
                    709: };
                    710: 
                    711: /* List of specs that have been defined so far. */
                    712: 
                    713: static struct spec_list *specs = (struct spec_list *) 0;
                    714: 
                    715: /* Change the value of spec NAME to SPEC.  If SPEC is empty, then the spec is
                    716:    removed; If the spec starts with a + then SPEC is added to the end of the
                    717:    current spec. */
                    718: 
                    719: static void
                    720: set_spec (name, spec)
                    721:      char *name;
                    722:      char *spec;
                    723: {
                    724:   struct spec_list *sl;
                    725:   char *old_spec;
                    726: 
                    727:   /* See if the spec already exists */
                    728:   for (sl = specs; sl; sl = sl->next)
                    729:     if (strcmp (sl->name, name) == 0)
                    730:       break;
                    731: 
                    732:   if (!sl)
                    733:     {
                    734:       /* Not found - make it */
                    735:       sl = (struct spec_list *) xmalloc (sizeof (struct spec_list));
                    736:       sl->name = save_string (name, strlen (name));
                    737:       sl->spec = save_string ("", 0);
                    738:       sl->next = specs;
                    739:       specs = sl;
                    740:     }
                    741: 
                    742:   old_spec = sl->spec;
                    743:   if (name && spec[0] == '+' && isspace (spec[1]))
1.1.1.3 ! root      744:     sl->spec = concat (old_spec, spec + 1, "");
1.1       root      745:   else
                    746:     sl->spec = save_string (spec, strlen (spec));
                    747: 
                    748:   if (! strcmp (name, "asm"))
                    749:     asm_spec = sl->spec;
                    750:   else if (! strcmp (name, "asm_final"))
                    751:     asm_final_spec = sl->spec;
                    752:   else if (! strcmp (name, "cc1"))
                    753:     cc1_spec = sl->spec;
                    754:   else if (! strcmp (name, "cc1plus"))
                    755:     cc1plus_spec = sl->spec;
                    756:   else if (! strcmp (name, "cpp"))
                    757:     cpp_spec = sl->spec;
                    758:   else if (! strcmp (name, "endfile"))
                    759:     endfile_spec = sl->spec;
                    760:   else if (! strcmp (name, "lib"))
                    761:     lib_spec = sl->spec;
                    762:   else if (! strcmp (name, "link"))
                    763:     link_spec = sl->spec;
                    764:   else if (! strcmp (name, "predefines"))
                    765:     cpp_predefines = sl->spec;
                    766:   else if (! strcmp (name, "signed_char"))
                    767:     signed_char_spec = sl->spec;
                    768:   else if (! strcmp (name, "startfile"))
                    769:     startfile_spec = sl->spec;
                    770:   else if (! strcmp (name, "switches_need_spaces"))
                    771:     switches_need_spaces = sl->spec;
1.1.1.2   root      772:   else if (! strcmp (name, "cross_compile"))
                    773:     cross_compile = atoi (sl->spec);
1.1       root      774:   /* Free the old spec */
                    775:   if (old_spec)
                    776:     free (old_spec);
                    777: }
                    778: 
                    779: /* Accumulate a command (program name and args), and run it.  */
                    780: 
                    781: /* Vector of pointers to arguments in the current line of specifications.  */
                    782: 
                    783: static char **argbuf;
                    784: 
                    785: /* Number of elements allocated in argbuf.  */
                    786: 
                    787: static int argbuf_length;
                    788: 
                    789: /* Number of elements in argbuf currently in use (containing args).  */
                    790: 
                    791: static int argbuf_index;
                    792: 
                    793: /* Number of commands executed so far.  */
                    794: 
                    795: static int execution_count;
                    796: 
                    797: /* Name with which this program was invoked.  */
                    798: 
                    799: static char *programname;
                    800: 
                    801: /* Structures to keep track of prefixes to try when looking for files. */
                    802: 
                    803: struct prefix_list
                    804: {
                    805:   char *prefix;               /* String to prepend to the path. */
                    806:   struct prefix_list *next;   /* Next in linked list. */
                    807:   int require_machine_suffix; /* Don't use without machine_suffix.  */
                    808:   int *used_flag_ptr;        /* 1 if a file was found with this prefix.  */
                    809: };
                    810: 
                    811: struct path_prefix
                    812: {
                    813:   struct prefix_list *plist;  /* List of prefixes to try */
                    814:   int max_len;                /* Max length of a prefix in PLIST */
                    815:   char *name;                 /* Name of this list (used in config stuff) */
                    816: };
                    817: 
                    818: /* List of prefixes to try when looking for executables. */
                    819: 
                    820: static struct path_prefix exec_prefix = { 0, 0, "exec" };
                    821: 
                    822: /* List of prefixes to try when looking for startup (crt0) files. */
                    823: 
                    824: static struct path_prefix startfile_prefix = { 0, 0, "startfile" };
                    825: 
                    826: /* List of prefixes to try when looking for libraries. */
                    827: 
                    828: static struct path_prefix library_prefix = { 0, 0, "libraryfile" };
                    829: 
                    830: /* Suffix to attach to directories searched for commands.  */
                    831: 
                    832: static char *machine_suffix = 0;
                    833: 
1.1.1.3 ! root      834: /* Adjusted value of GCC_EXEC_PREFIX envvar.  */
        !           835: 
        !           836: static char *gcc_exec_prefix;
        !           837: 
1.1       root      838: /* Default prefixes to attach to command names.  */
                    839: 
                    840: #ifdef CROSS_COMPILE  /* Don't use these prefixes for a cross compiler.  */
                    841: #undef MD_EXEC_PREFIX
                    842: #undef MD_STARTFILE_PREFIX
1.1.1.3 ! root      843: #undef MD_STARTFILE_PREFIX_1
1.1       root      844: #endif
                    845: 
                    846: #ifndef STANDARD_EXEC_PREFIX
1.1.1.2   root      847: #define STANDARD_EXEC_PREFIX "/usr/local/lib/gcc-lib/"
1.1       root      848: #endif /* !defined STANDARD_EXEC_PREFIX */
                    849: 
                    850: static char *standard_exec_prefix = STANDARD_EXEC_PREFIX;
                    851: static char *standard_exec_prefix_1 = "/usr/lib/gcc/";
                    852: #ifdef MD_EXEC_PREFIX
                    853: static char *md_exec_prefix = MD_EXEC_PREFIX;
                    854: #endif
                    855: 
                    856: #ifndef STANDARD_STARTFILE_PREFIX
                    857: #define STANDARD_STARTFILE_PREFIX "/usr/local/lib/"
                    858: #endif /* !defined STANDARD_STARTFILE_PREFIX */
                    859: 
                    860: #ifdef MD_STARTFILE_PREFIX
                    861: static char *md_startfile_prefix = MD_STARTFILE_PREFIX;
                    862: #endif
1.1.1.3 ! root      863: #ifdef MD_STARTFILE_PREFIX_1
        !           864: static char *md_startfile_prefix_1 = MD_STARTFILE_PREFIX_1;
        !           865: #endif
1.1       root      866: static char *standard_startfile_prefix = STANDARD_STARTFILE_PREFIX;
                    867: static char *standard_startfile_prefix_1 = "/lib/";
                    868: static char *standard_startfile_prefix_2 = "/usr/lib/";
                    869: 
                    870: /* Clear out the vector of arguments (after a command is executed).  */
                    871: 
                    872: static void
                    873: clear_args ()
                    874: {
                    875:   argbuf_index = 0;
                    876: }
                    877: 
                    878: /* Add one argument to the vector at the end.
                    879:    This is done when a space is seen or at the end of the line.
                    880:    If DELETE_ALWAYS is nonzero, the arg is a filename
                    881:     and the file should be deleted eventually.
                    882:    If DELETE_FAILURE is nonzero, the arg is a filename
                    883:     and the file should be deleted if this compilation fails.  */
                    884: 
                    885: static void
                    886: store_arg (arg, delete_always, delete_failure)
                    887:      char *arg;
                    888:      int delete_always, delete_failure;
                    889: {
                    890:   if (argbuf_index + 1 == argbuf_length)
                    891:     {
                    892:       argbuf = (char **) xrealloc (argbuf, (argbuf_length *= 2) * sizeof (char *));
                    893:     }
                    894: 
                    895:   argbuf[argbuf_index++] = arg;
                    896:   argbuf[argbuf_index] = 0;
                    897: 
                    898:   if (delete_always || delete_failure)
                    899:     record_temp_file (arg, delete_always, delete_failure);
                    900: }
                    901: 
                    902: /* Record the names of temporary files we tell compilers to write,
                    903:    and delete them at the end of the run.  */
                    904: 
                    905: /* This is the common prefix we use to make temp file names.
                    906:    It is chosen once for each run of this program.
                    907:    It is substituted into a spec by %g.
                    908:    Thus, all temp file names contain this prefix.
                    909:    In practice, all temp file names start with this prefix.
                    910: 
                    911:    This prefix comes from the envvar TMPDIR if it is defined;
                    912:    otherwise, from the P_tmpdir macro if that is defined;
                    913:    otherwise, in /usr/tmp or /tmp.  */
                    914: 
                    915: static char *temp_filename;
                    916: 
                    917: /* Length of the prefix.  */
                    918: 
                    919: static int temp_filename_length;
                    920: 
                    921: /* Define the list of temporary files to delete.  */
                    922: 
                    923: struct temp_file
                    924: {
                    925:   char *name;
                    926:   struct temp_file *next;
                    927: };
                    928: 
                    929: /* Queue of files to delete on success or failure of compilation.  */
                    930: static struct temp_file *always_delete_queue;
                    931: /* Queue of files to delete on failure of compilation.  */
                    932: static struct temp_file *failure_delete_queue;
                    933: 
                    934: /* Record FILENAME as a file to be deleted automatically.
                    935:    ALWAYS_DELETE nonzero means delete it if all compilation succeeds;
                    936:    otherwise delete it in any case.
                    937:    FAIL_DELETE nonzero means delete it if a compilation step fails;
                    938:    otherwise delete it in any case.  */
                    939: 
                    940: static void
                    941: record_temp_file (filename, always_delete, fail_delete)
                    942:      char *filename;
                    943:      int always_delete;
                    944:      int fail_delete;
                    945: {
                    946:   register char *name;
                    947:   name = xmalloc (strlen (filename) + 1);
                    948:   strcpy (name, filename);
                    949: 
                    950:   if (always_delete)
                    951:     {
                    952:       register struct temp_file *temp;
                    953:       for (temp = always_delete_queue; temp; temp = temp->next)
                    954:        if (! strcmp (name, temp->name))
                    955:          goto already1;
                    956:       temp = (struct temp_file *) xmalloc (sizeof (struct temp_file));
                    957:       temp->next = always_delete_queue;
                    958:       temp->name = name;
                    959:       always_delete_queue = temp;
                    960:     already1:;
                    961:     }
                    962: 
                    963:   if (fail_delete)
                    964:     {
                    965:       register struct temp_file *temp;
                    966:       for (temp = failure_delete_queue; temp; temp = temp->next)
                    967:        if (! strcmp (name, temp->name))
                    968:          goto already2;
                    969:       temp = (struct temp_file *) xmalloc (sizeof (struct temp_file));
                    970:       temp->next = failure_delete_queue;
                    971:       temp->name = name;
                    972:       failure_delete_queue = temp;
                    973:     already2:;
                    974:     }
                    975: }
                    976: 
                    977: /* Delete all the temporary files whose names we previously recorded.  */
                    978: 
                    979: static void
                    980: delete_temp_files ()
                    981: {
                    982:   register struct temp_file *temp;
                    983: 
                    984:   for (temp = always_delete_queue; temp; temp = temp->next)
                    985:     {
                    986: #ifdef DEBUG
                    987:       int i;
                    988:       printf ("Delete %s? (y or n) ", temp->name);
                    989:       fflush (stdout);
                    990:       i = getchar ();
                    991:       if (i != '\n')
                    992:        while (getchar () != '\n') ;
                    993:       if (i == 'y' || i == 'Y')
                    994: #endif /* DEBUG */
                    995:        {
                    996:          struct stat st;
                    997:          if (stat (temp->name, &st) >= 0)
                    998:            {
                    999:              /* Delete only ordinary files.  */
                   1000:              if (S_ISREG (st.st_mode))
                   1001:                if (unlink (temp->name) < 0)
                   1002:                  if (verbose_flag)
                   1003:                    perror_with_name (temp->name);
                   1004:            }
                   1005:        }
                   1006:     }
                   1007: 
                   1008:   always_delete_queue = 0;
                   1009: }
                   1010: 
                   1011: /* Delete all the files to be deleted on error.  */
                   1012: 
                   1013: static void
                   1014: delete_failure_queue ()
                   1015: {
                   1016:   register struct temp_file *temp;
                   1017: 
                   1018:   for (temp = failure_delete_queue; temp; temp = temp->next)
                   1019:     {
                   1020: #ifdef DEBUG
                   1021:       int i;
                   1022:       printf ("Delete %s? (y or n) ", temp->name);
                   1023:       fflush (stdout);
                   1024:       i = getchar ();
                   1025:       if (i != '\n')
                   1026:        while (getchar () != '\n') ;
                   1027:       if (i == 'y' || i == 'Y')
                   1028: #endif /* DEBUG */
                   1029:        {
                   1030:          if (unlink (temp->name) < 0)
                   1031:            if (verbose_flag)
                   1032:              perror_with_name (temp->name);
                   1033:        }
                   1034:     }
                   1035: }
                   1036: 
                   1037: static void
                   1038: clear_failure_queue ()
                   1039: {
                   1040:   failure_delete_queue = 0;
                   1041: }
                   1042: 
                   1043: /* Compute a string to use as the base of all temporary file names.
                   1044:    It is substituted for %g.  */
                   1045: 
                   1046: static void
                   1047: choose_temp_base ()
                   1048: {
                   1049:   char *base = getenv ("TMPDIR");
                   1050:   int len;
                   1051: 
                   1052:   if (base == (char *)0)
                   1053:     {
                   1054: #ifdef P_tmpdir
                   1055:       if (access (P_tmpdir, R_OK | W_OK) == 0)
                   1056:        base = P_tmpdir;
                   1057: #endif
                   1058:       if (base == (char *)0)
                   1059:        {
                   1060:          if (access ("/usr/tmp", R_OK | W_OK) == 0)
                   1061:            base = "/usr/tmp/";
                   1062:          else
                   1063:            base = "/tmp/";
                   1064:        }
                   1065:     }
                   1066: 
                   1067:   len = strlen (base);
                   1068:   temp_filename = xmalloc (len + sizeof("/ccXXXXXX"));
                   1069:   strcpy (temp_filename, base);
                   1070:   if (len > 0 && temp_filename[len-1] != '/')
                   1071:     temp_filename[len++] = '/';
                   1072:   strcpy (temp_filename + len, "ccXXXXXX");
                   1073: 
                   1074:   mktemp (temp_filename);
                   1075:   temp_filename_length = strlen (temp_filename);
                   1076: }
                   1077: 
1.1.1.2   root     1078: 
                   1079: /* Routine to add variables to the environment.  We do this to pass
                   1080:    the pathname of the gcc driver, and the directories search to the
                   1081:    collect2 program, which is being run as ld.  This way, we can be
                   1082:    sure of executing the right compiler when collect2 wants to build
                   1083:    constructors and destructors.  Since the environment variables we
                   1084:    use come from an obstack, we don't have to worry about allocating
                   1085:    space for them.  */
                   1086: 
                   1087: #ifndef HAVE_PUTENV
                   1088: 
                   1089: putenv (str)
                   1090:      char *str;
                   1091: {
                   1092: #ifndef VMS                    /* nor about VMS */
                   1093: 
                   1094:   extern char **environ;
                   1095:   char **old_environ = environ;
                   1096:   char **envp;
                   1097:   int num_envs = 0;
                   1098:   int name_len = 1;
                   1099:   int str_len = strlen (str);
                   1100:   char *p = str;
                   1101:   int ch;
                   1102: 
                   1103:   while ((ch = *p++) != '\0' && ch != '=')
                   1104:     name_len++;
                   1105: 
                   1106:   if (!ch)
                   1107:     abort ();
                   1108: 
                   1109:   /* Search for replacing an existing environment variable, and
                   1110:      count the number of total environment variables.  */
                   1111:   for (envp = old_environ; *envp; envp++)
                   1112:     {
                   1113:       num_envs++;
                   1114:       if (!strncmp (str, *envp, name_len))
                   1115:        {
                   1116:          *envp = str;
                   1117:          return;
                   1118:        }
                   1119:     }
                   1120: 
                   1121:   /* Add a new environment variable */
                   1122:   environ = (char **) xmalloc (sizeof (char *) * (num_envs+2));
                   1123:   *environ = str;
                   1124:   bcopy (old_environ, environ+1, sizeof (char *) * (num_envs+1));
                   1125: 
                   1126: #endif /* VMS */
                   1127: }
                   1128: 
                   1129: #endif /* HAVE_PUTENV */
                   1130: 
                   1131: 
                   1132: /* Rebuild the COMPILER_PATH and LIBRARY_PATH environment variables for collect.  */
                   1133: 
                   1134: static void
                   1135: putenv_from_prefixes (paths, env_var)
                   1136:      struct path_prefix *paths;
                   1137:      char *env_var;
                   1138: {
                   1139:   int suffix_len = (machine_suffix) ? strlen (machine_suffix) : 0;
                   1140:   int first_time = TRUE;
                   1141:   struct prefix_list *pprefix;
                   1142: 
                   1143:   obstack_grow (&collect_obstack, env_var, strlen (env_var));
                   1144: 
                   1145:   for (pprefix = paths->plist; pprefix != 0; pprefix = pprefix->next)
                   1146:     {
                   1147:       int len = strlen (pprefix->prefix);
                   1148: 
                   1149:       if (machine_suffix)
                   1150:        {
                   1151:          if (!first_time)
                   1152:            obstack_grow (&collect_obstack, ":", 1);
                   1153:            
                   1154:          first_time = FALSE;
                   1155:          obstack_grow (&collect_obstack, pprefix->prefix, len);
                   1156:          obstack_grow (&collect_obstack, machine_suffix, suffix_len);
                   1157:        }
                   1158: 
                   1159:       if (!pprefix->require_machine_suffix)
                   1160:        {
                   1161:          if (!first_time)
                   1162:            obstack_grow (&collect_obstack, ":", 1);
                   1163: 
                   1164:          first_time = FALSE;
                   1165:          obstack_grow (&collect_obstack, pprefix->prefix, len);
                   1166:        }
                   1167:     }
                   1168:   obstack_grow (&collect_obstack, "\0", 1);
                   1169:   putenv (obstack_finish (&collect_obstack));
                   1170: }
                   1171: 
                   1172: 
1.1       root     1173: /* Search for NAME using the prefix list PREFIXES.  MODE is passed to
                   1174:    access to check permissions.
                   1175:    Return 0 if not found, otherwise return its name, allocated with malloc. */
                   1176: 
                   1177: static char *
                   1178: find_a_file (pprefix, name, mode)
                   1179:      struct path_prefix *pprefix;
                   1180:      char *name;
                   1181:      int mode;
                   1182: {
                   1183:   char *temp;
1.1.1.2   root     1184:   char *file_suffix = ((mode & X_OK) != 0 ? EXECUTABLE_SUFFIX : "");
1.1       root     1185:   struct prefix_list *pl;
                   1186:   int len = pprefix->max_len + strlen (name) + strlen (file_suffix) + 1;
                   1187: 
                   1188:   if (machine_suffix)
                   1189:     len += strlen (machine_suffix);
                   1190: 
                   1191:   temp = xmalloc (len);
                   1192: 
                   1193:   /* Determine the filename to execute (special case for absolute paths).  */
                   1194: 
                   1195:   if (*name == '/')
                   1196:     {
                   1197:       if (access (name, mode))
                   1198:        {
                   1199:          strcpy (temp, name);
                   1200:          return temp;
                   1201:        }
                   1202:     }
                   1203:   else
                   1204:     for (pl = pprefix->plist; pl; pl = pl->next)
                   1205:       {
                   1206:        if (machine_suffix)
                   1207:          {
                   1208:            strcpy (temp, pl->prefix);
                   1209:            strcat (temp, machine_suffix);
                   1210:            strcat (temp, name);
                   1211:            if (access (temp, mode) == 0)
                   1212:              {
                   1213:                if (pl->used_flag_ptr != 0)
                   1214:                  *pl->used_flag_ptr = 1;
                   1215:                return temp;
                   1216:              }
                   1217:            /* Some systems have a suffix for executable files.
                   1218:               So try appending that.  */
                   1219:            if (file_suffix[0] != 0)
                   1220:              {
                   1221:                strcat (temp, file_suffix);
                   1222:                if (access (temp, mode) == 0)
                   1223:                  {
                   1224:                    if (pl->used_flag_ptr != 0)
                   1225:                      *pl->used_flag_ptr = 1;
                   1226:                    return temp;
                   1227:                  }
                   1228:              }
                   1229:          }
                   1230:        /* Certain prefixes can't be used without the machine suffix
                   1231:           when the machine or version is explicitly specified.  */
1.1.1.2   root     1232:        if (!pl->require_machine_suffix)
1.1       root     1233:          {
                   1234:            strcpy (temp, pl->prefix);
                   1235:            strcat (temp, name);
                   1236:            if (access (temp, mode) == 0)
                   1237:              {
                   1238:                if (pl->used_flag_ptr != 0)
                   1239:                  *pl->used_flag_ptr = 1;
                   1240:                return temp;
                   1241:              }
                   1242:            /* Some systems have a suffix for executable files.
                   1243:               So try appending that.  */
                   1244:            if (file_suffix[0] != 0)
                   1245:              {
                   1246:                strcat (temp, file_suffix);
                   1247:                if (access (temp, mode) == 0)
                   1248:                  {
                   1249:                    if (pl->used_flag_ptr != 0)
                   1250:                      *pl->used_flag_ptr = 1;
                   1251:                    return temp;
                   1252:                  }
                   1253:              }
                   1254:          }
                   1255:       }
                   1256: 
                   1257:   free (temp);
                   1258:   return 0;
                   1259: }
                   1260: 
                   1261: /* Add an entry for PREFIX in PLIST.  If FIRST is set, it goes
                   1262:    at the start of the list, otherwise it goes at the end.
                   1263: 
                   1264:    If WARN is nonzero, we will warn if no file is found
                   1265:    through this prefix.  WARN should point to an int
                   1266:    which will be set to 1 if this entry is used.  */
                   1267: 
                   1268: static void
                   1269: add_prefix (pprefix, prefix, first, require_machine_suffix, warn)
                   1270:      struct path_prefix *pprefix;
                   1271:      char *prefix;
                   1272:      int first;
                   1273:      int require_machine_suffix;
                   1274:      int *warn;
                   1275: {
                   1276:   struct prefix_list *pl, **prev;
                   1277:   int len;
                   1278: 
                   1279:   if (!first && pprefix->plist)
                   1280:     {
                   1281:       for (pl = pprefix->plist; pl->next; pl = pl->next)
                   1282:        ;
                   1283:       prev = &pl->next;
                   1284:     }
                   1285:   else
                   1286:     prev = &pprefix->plist;
                   1287: 
                   1288:   /* Keep track of the longest prefix */
                   1289: 
                   1290:   len = strlen (prefix);
                   1291:   if (len > pprefix->max_len)
                   1292:     pprefix->max_len = len;
                   1293: 
                   1294:   pl = (struct prefix_list *) xmalloc (sizeof (struct prefix_list));
                   1295:   pl->prefix = save_string (prefix, len);
                   1296:   pl->require_machine_suffix = require_machine_suffix;
                   1297:   pl->used_flag_ptr = warn;
                   1298:   if (warn)
                   1299:     *warn = 0;
                   1300: 
                   1301:   if (*prev)
                   1302:     pl->next = *prev;
                   1303:   else
                   1304:     pl->next = (struct prefix_list *) 0;
                   1305:   *prev = pl;
                   1306: }
                   1307: 
                   1308: /* Print warnings for any prefixes in the list PPREFIX that were not used.  */
                   1309: 
                   1310: static void
                   1311: unused_prefix_warnings (pprefix)
                   1312:      struct path_prefix *pprefix;
                   1313: {
                   1314:   struct prefix_list *pl = pprefix->plist;
                   1315: 
                   1316:   while (pl)
                   1317:     {
                   1318:       if (pl->used_flag_ptr != 0 && !*pl->used_flag_ptr)
                   1319:        {
                   1320:          error ("file path prefix `%s' never used",
                   1321:                 pl->prefix);
                   1322:          /* Prevent duplicate warnings.  */
                   1323:          *pl->used_flag_ptr = 1;
                   1324:        }
                   1325:       pl = pl->next;
                   1326:     }
                   1327: }
                   1328: 
                   1329: /* Get rid of all prefixes built up so far in *PLISTP. */
                   1330: 
                   1331: static void
                   1332: free_path_prefix (pprefix)
                   1333:      struct path_prefix *pprefix;
                   1334: {
                   1335:   struct prefix_list *pl = pprefix->plist;
                   1336:   struct prefix_list *temp;
                   1337: 
                   1338:   while (pl)
                   1339:     {
                   1340:       temp = pl;
                   1341:       pl = pl->next;
                   1342:       free (temp->prefix);
                   1343:       free ((char *) temp);
                   1344:     }
                   1345:   pprefix->plist = (struct prefix_list *) 0;
                   1346: }
                   1347: 
                   1348: /* stdin file number.  */
                   1349: #define STDIN_FILE_NO 0
                   1350: 
                   1351: /* stdout file number.  */
                   1352: #define STDOUT_FILE_NO 1
                   1353: 
                   1354: /* value of `pipe': port index for reading.  */
                   1355: #define READ_PORT 0
                   1356: 
                   1357: /* value of `pipe': port index for writing.  */
                   1358: #define WRITE_PORT 1
                   1359: 
                   1360: /* Pipe waiting from last process, to be used as input for the next one.
                   1361:    Value is STDIN_FILE_NO if no pipe is waiting
                   1362:    (i.e. the next command is the first of a group).  */
                   1363: 
                   1364: static int last_pipe_input;
                   1365: 
                   1366: /* Fork one piped subcommand.  FUNC is the system call to use
                   1367:    (either execv or execvp).  ARGV is the arg vector to use.
                   1368:    NOT_LAST is nonzero if this is not the last subcommand
                   1369:    (i.e. its output should be piped to the next one.)  */
                   1370: 
1.1.1.3 ! root     1371: #ifndef OS2
1.1       root     1372: #ifdef __MSDOS__
                   1373: 
                   1374: /* Declare these to avoid compilation error.  They won't be called.  */
                   1375: int execv(const char *a, const char **b){}
                   1376: int execvp(const char *a, const char **b){}
                   1377: 
                   1378: static int
1.1.1.3 ! root     1379: pexecute (search_flag, program, argv, not_last)
        !          1380:      int search_flag;
1.1       root     1381:      char *program;
                   1382:      char *argv[];
                   1383:      int not_last;
                   1384: {
                   1385:   char *scmd;
                   1386:   FILE *argfile;
                   1387:   int i;
                   1388: 
1.1.1.3 ! root     1389:   scmd = (char *)malloc (strlen (program) + strlen (temp_filename) + 6);
        !          1390:   sprintf (scmd, "%s @%s.gp", program, temp_filename);
        !          1391:   argfile = fopen (scmd+strlen (program) + 2, "w");
1.1       root     1392:   if (argfile == 0)
1.1.1.3 ! root     1393:     pfatal_with_name (scmd + strlen (program) + 2);
1.1       root     1394: 
                   1395:   for (i=1; argv[i]; i++)
1.1.1.3 ! root     1396:   {
        !          1397:     char *cp;
        !          1398:     for (cp = argv[i]; *cp; cp++)
        !          1399:       {
        !          1400:        if (*cp == '"' || *cp == '\'' || *cp == '\\' || isspace (*cp))
        !          1401:          fputc ('\\', argfile);
        !          1402:        fputc (*cp, argfile);
        !          1403:       }
        !          1404:     fputc ('\n', argfile);
        !          1405:   }
        !          1406:   fclose (argfile);
1.1       root     1407: 
1.1.1.3 ! root     1408:   i = system (scmd);
1.1       root     1409: 
1.1.1.3 ! root     1410:   remove (scmd + strlen (program) + 2);
1.1       root     1411:   return i << 8;
                   1412: }
                   1413: 
                   1414: #else /* not __MSDOS__ */
                   1415: 
                   1416: static int
1.1.1.3 ! root     1417: pexecute (search_flag, program, argv, not_last)
        !          1418:      int search_flag;
1.1       root     1419:      char *program;
                   1420:      char *argv[];
                   1421:      int not_last;
                   1422: {
1.1.1.3 ! root     1423:   int (*func)() = (search_flag ? execv : execvp);
1.1       root     1424:   int pid;
                   1425:   int pdes[2];
                   1426:   int input_desc = last_pipe_input;
                   1427:   int output_desc = STDOUT_FILE_NO;
                   1428:   int retries, sleep_interval;
                   1429: 
                   1430:   /* If this isn't the last process, make a pipe for its output,
                   1431:      and record it as waiting to be the input to the next process.  */
                   1432: 
                   1433:   if (not_last)
                   1434:     {
                   1435:       if (pipe (pdes) < 0)
                   1436:        pfatal_with_name ("pipe");
                   1437:       output_desc = pdes[WRITE_PORT];
                   1438:       last_pipe_input = pdes[READ_PORT];
                   1439:     }
                   1440:   else
                   1441:     last_pipe_input = STDIN_FILE_NO;
                   1442: 
                   1443:   /* Fork a subprocess; wait and retry if it fails.  */
                   1444:   sleep_interval = 1;
                   1445:   for (retries = 0; retries < 4; retries++)
                   1446:     {
                   1447:       pid = vfork ();
                   1448:       if (pid >= 0)
                   1449:        break;
                   1450:       sleep (sleep_interval);
                   1451:       sleep_interval *= 2;
                   1452:     }
                   1453: 
                   1454:   switch (pid)
                   1455:     {
                   1456:     case -1:
                   1457: #ifdef vfork
                   1458:       pfatal_with_name ("fork");
                   1459: #else
                   1460:       pfatal_with_name ("vfork");
                   1461: #endif
                   1462:       /* NOTREACHED */
                   1463:       return 0;
                   1464: 
                   1465:     case 0: /* child */
                   1466:       /* Move the input and output pipes into place, if nec.  */
                   1467:       if (input_desc != STDIN_FILE_NO)
                   1468:        {
                   1469:          close (STDIN_FILE_NO);
                   1470:          dup (input_desc);
                   1471:          close (input_desc);
                   1472:        }
                   1473:       if (output_desc != STDOUT_FILE_NO)
                   1474:        {
                   1475:          close (STDOUT_FILE_NO);
                   1476:          dup (output_desc);
                   1477:          close (output_desc);
                   1478:        }
                   1479: 
                   1480:       /* Close the parent's descs that aren't wanted here.  */
                   1481:       if (last_pipe_input != STDIN_FILE_NO)
                   1482:        close (last_pipe_input);
                   1483: 
                   1484:       /* Exec the program.  */
                   1485:       (*func) (program, argv);
                   1486:       perror_exec (program);
                   1487:       exit (-1);
                   1488:       /* NOTREACHED */
                   1489:       return 0;
                   1490: 
                   1491:     default:
                   1492:       /* In the parent, after forking.
                   1493:         Close the descriptors that we made for this child.  */
                   1494:       if (input_desc != STDIN_FILE_NO)
                   1495:        close (input_desc);
                   1496:       if (output_desc != STDOUT_FILE_NO)
                   1497:        close (output_desc);
                   1498: 
                   1499:       /* Return child's process number.  */
                   1500:       return pid;
                   1501:     }
                   1502: }
                   1503: 
                   1504: #endif /* not __MSDOS__ */
1.1.1.3 ! root     1505: #else /* not OS2 */
        !          1506: 
        !          1507: static int
        !          1508: pexecute (search_flag, program, argv, not_last)
        !          1509:      int search_flag;
        !          1510:      char *program;
        !          1511:      char *argv[];
        !          1512:      int not_last;
        !          1513: {
        !          1514:   return (search_flag ? spawnv : spawnvp) (1, program, argv);
        !          1515: }
        !          1516: #endif /* not OS2 */
1.1       root     1517: 
                   1518: /* Execute the command specified by the arguments on the current line of spec.
                   1519:    When using pipes, this includes several piped-together commands
                   1520:    with `|' between them.
                   1521: 
                   1522:    Return 0 if successful, -1 if failed.  */
                   1523: 
                   1524: static int
                   1525: execute ()
                   1526: {
                   1527:   int i;
                   1528:   int n_commands;              /* # of command.  */
                   1529:   char *string;
                   1530:   struct command
                   1531:     {
                   1532:       char *prog;              /* program name.  */
                   1533:       char **argv;             /* vector of args.  */
                   1534:       int pid;                 /* pid of process for this command.  */
                   1535:     };
                   1536: 
                   1537:   struct command *commands;    /* each command buffer with above info.  */
                   1538: 
                   1539:   /* Count # of piped commands.  */
                   1540:   for (n_commands = 1, i = 0; i < argbuf_index; i++)
                   1541:     if (strcmp (argbuf[i], "|") == 0)
                   1542:       n_commands++;
                   1543: 
                   1544:   /* Get storage for each command.  */
                   1545:   commands
                   1546:     = (struct command *) alloca (n_commands * sizeof (struct command));
                   1547: 
                   1548:   /* Split argbuf into its separate piped processes,
                   1549:      and record info about each one.
                   1550:      Also search for the programs that are to be run.  */
                   1551: 
                   1552:   commands[0].prog = argbuf[0]; /* first command.  */
                   1553:   commands[0].argv = &argbuf[0];
                   1554:   string = find_a_file (&exec_prefix, commands[0].prog, X_OK);
                   1555:   if (string)
                   1556:     commands[0].argv[0] = string;
                   1557: 
                   1558:   for (n_commands = 1, i = 0; i < argbuf_index; i++)
                   1559:     if (strcmp (argbuf[i], "|") == 0)
                   1560:       {                                /* each command.  */
                   1561: #ifdef __MSDOS__
                   1562:         fatal ("-pipe not supported under MS-DOS");
                   1563: #endif
                   1564:        argbuf[i] = 0;  /* termination of command args.  */
                   1565:        commands[n_commands].prog = argbuf[i + 1];
                   1566:        commands[n_commands].argv = &argbuf[i + 1];
                   1567:        string = find_a_file (&exec_prefix, commands[n_commands].prog, X_OK);
                   1568:        if (string)
                   1569:          commands[n_commands].argv[0] = string;
                   1570:        n_commands++;
                   1571:       }
                   1572: 
                   1573:   argbuf[argbuf_index] = 0;
                   1574: 
                   1575:   /* If -v, print what we are about to do, and maybe query.  */
                   1576: 
                   1577:   if (verbose_flag)
                   1578:     {
                   1579:       /* Print each piped command as a separate line.  */
                   1580:       for (i = 0; i < n_commands ; i++)
                   1581:        {
                   1582:          char **j;
                   1583: 
                   1584:          for (j = commands[i].argv; *j; j++)
                   1585:            fprintf (stderr, " %s", *j);
                   1586: 
                   1587:          /* Print a pipe symbol after all but the last command.  */
                   1588:          if (i + 1 != n_commands)
                   1589:            fprintf (stderr, " |");
                   1590:          fprintf (stderr, "\n");
                   1591:        }
                   1592:       fflush (stderr);
                   1593: #ifdef DEBUG
                   1594:       fprintf (stderr, "\nGo ahead? (y or n) ");
                   1595:       fflush (stderr);
                   1596:       i = getchar ();
                   1597:       if (i != '\n')
                   1598:        while (getchar () != '\n') ;
                   1599:       if (i != 'y' && i != 'Y')
                   1600:        return 0;
                   1601: #endif /* DEBUG */
                   1602:     }
                   1603: 
                   1604:   /* Run each piped subprocess.  */
                   1605: 
                   1606:   last_pipe_input = STDIN_FILE_NO;
                   1607:   for (i = 0; i < n_commands; i++)
                   1608:     {
                   1609:       char *string = commands[i].argv[0];
                   1610: 
1.1.1.3 ! root     1611:       commands[i].pid = pexecute (string != commands[i].prog,
1.1       root     1612:                                  string, commands[i].argv,
                   1613:                                  i + 1 < n_commands);
                   1614: 
                   1615:       if (string != commands[i].prog)
                   1616:        free (string);
                   1617:     }
                   1618: 
                   1619:   execution_count++;
                   1620: 
                   1621:   /* Wait for all the subprocesses to finish.
                   1622:      We don't care what order they finish in;
                   1623:      we know that N_COMMANDS waits will get them all.  */
                   1624: 
                   1625:   {
                   1626:     int ret_code = 0;
                   1627: 
                   1628:     for (i = 0; i < n_commands; i++)
                   1629:       {
                   1630:        int status;
                   1631:        int pid;
                   1632:        char *prog;
                   1633: 
                   1634: #ifdef __MSDOS__
                   1635:         status = pid = commands[i].pid;
                   1636: #else
                   1637:        pid = wait (&status);
                   1638: #endif
                   1639:        if (pid < 0)
                   1640:          abort ();
                   1641: 
                   1642:        if (status != 0)
                   1643:          {
                   1644:            int j;
                   1645:            for (j = 0; j < n_commands; j++)
                   1646:              if (commands[j].pid == pid)
                   1647:                prog = commands[j].prog;
                   1648: 
                   1649:            if ((status & 0x7F) != 0)
                   1650:              fatal ("Internal compiler error: program %s got fatal signal %d",
                   1651:                     prog, (status & 0x7F));
                   1652:            if (((status & 0xFF00) >> 8) >= MIN_FATAL_STATUS)
                   1653:              ret_code = -1;
                   1654:          }
                   1655:       }
                   1656:     return ret_code;
                   1657:   }
                   1658: }
                   1659: 
                   1660: /* Find all the switches given to us
                   1661:    and make a vector describing them.
                   1662:    The elements of the vector are strings, one per switch given.
                   1663:    If a switch uses following arguments, then the `part1' field
                   1664:    is the switch itself and the `args' field
                   1665:    is a null-terminated vector containing the following arguments.
                   1666:    The `valid' field is nonzero if any spec has looked at this switch;
                   1667:    if it remains zero at the end of the run, it must be meaningless.  */
                   1668: 
                   1669: struct switchstr
                   1670: {
                   1671:   char *part1;
                   1672:   char **args;
                   1673:   int valid;
                   1674: };
                   1675: 
                   1676: static struct switchstr *switches;
                   1677: 
                   1678: static int n_switches;
                   1679: 
                   1680: struct infile
                   1681: {
                   1682:   char *name;
                   1683:   char *language;
                   1684: };
                   1685: 
                   1686: /* Also a vector of input files specified.  */
                   1687: 
                   1688: static struct infile *infiles;
                   1689: 
                   1690: static int n_infiles;
                   1691: 
                   1692: /* And a vector of corresponding output files is made up later.  */
                   1693: 
                   1694: static char **outfiles;
                   1695: 
                   1696: /* Create the vector `switches' and its contents.
                   1697:    Store its length in `n_switches'.  */
                   1698: 
                   1699: static void
                   1700: process_command (argc, argv)
                   1701:      int argc;
                   1702:      char **argv;
                   1703: {
                   1704:   register int i;
                   1705:   char *temp;
                   1706:   char *spec_lang = 0;
                   1707:   int last_language_n_infiles;
                   1708: 
1.1.1.3 ! root     1709:   gcc_exec_prefix = getenv ("GCC_EXEC_PREFIX");
        !          1710: 
1.1       root     1711:   n_switches = 0;
                   1712:   n_infiles = 0;
                   1713:   spec_version = version_string;
                   1714: 
                   1715:   /* Set up the default search paths.  */
                   1716: 
1.1.1.3 ! root     1717:   if (gcc_exec_prefix)
1.1       root     1718:     {
1.1.1.3 ! root     1719:       add_prefix (&exec_prefix, gcc_exec_prefix, 0, 0, 0);
        !          1720:       add_prefix (&startfile_prefix, gcc_exec_prefix, 0, 0, 0);
1.1       root     1721:     }
                   1722: 
                   1723:   /* COMPILER_PATH and LIBRARY_PATH have values
                   1724:      that are lists of directory names with colons.  */
                   1725: 
                   1726:   temp = getenv ("COMPILER_PATH");
                   1727:   if (temp)
                   1728:     {
                   1729:       char *startp, *endp;
                   1730:       char *nstore = (char *) alloca (strlen (temp) + 3);
                   1731: 
                   1732:       startp = endp = temp;
                   1733:       while (1)
                   1734:        {
1.1.1.3 ! root     1735:          if (*endp == PATH_SEPARATOR || *endp == 0)
1.1       root     1736:            {
                   1737:              strncpy (nstore, startp, endp-startp);
                   1738:              if (endp == startp)
                   1739:                {
                   1740:                  strcpy (nstore, "./");
                   1741:                }
                   1742:              else if (endp[-1] != '/')
                   1743:                {
                   1744:                  nstore[endp-startp] = '/';
                   1745:                  nstore[endp-startp+1] = 0;
                   1746:                }
                   1747:              else
                   1748:                nstore[endp-startp] = 0;
                   1749:              add_prefix (&exec_prefix, nstore, 0, 0, 0);
                   1750:              if (*endp == 0)
                   1751:                break;
                   1752:              endp = startp = endp + 1;
                   1753:            }
                   1754:          else
                   1755:            endp++;
                   1756:        }
                   1757:     }
                   1758: 
                   1759:   temp = getenv ("LIBRARY_PATH");
                   1760:   if (temp)
                   1761:     {
                   1762:       char *startp, *endp;
                   1763:       char *nstore = (char *) alloca (strlen (temp) + 3);
                   1764: 
                   1765:       startp = endp = temp;
                   1766:       while (1)
                   1767:        {
1.1.1.3 ! root     1768:          if (*endp == PATH_SEPARATOR || *endp == 0)
1.1       root     1769:            {
                   1770:              strncpy (nstore, startp, endp-startp);
                   1771:              if (endp == startp)
                   1772:                {
                   1773:                  strcpy (nstore, "./");
                   1774:                }
                   1775:              else if (endp[-1] != '/')
                   1776:                {
                   1777:                  nstore[endp-startp] = '/';
                   1778:                  nstore[endp-startp+1] = 0;
                   1779:                }
                   1780:              else
                   1781:                nstore[endp-startp] = 0;
                   1782:              add_prefix (&startfile_prefix, nstore, 0, 0, 0);
                   1783:              /* Make separate list of dirs that came from LIBRARY_PATH.  */
                   1784:              add_prefix (&library_prefix, nstore, 0, 0, 0);
                   1785:              if (*endp == 0)
                   1786:                break;
                   1787:              endp = startp = endp + 1;
                   1788:            }
                   1789:          else
                   1790:            endp++;
                   1791:        }
                   1792:     }
                   1793: 
                   1794:   /* Use LPATH like LIBRARY_PATH (for the CMU build program).  */
                   1795:   temp = getenv ("LPATH");
                   1796:   if (temp)
                   1797:     {
                   1798:       char *startp, *endp;
                   1799:       char *nstore = (char *) alloca (strlen (temp) + 3);
                   1800: 
                   1801:       startp = endp = temp;
                   1802:       while (1)
                   1803:        {
1.1.1.3 ! root     1804:          if (*endp == PATH_SEPARATOR || *endp == 0)
1.1       root     1805:            {
                   1806:              strncpy (nstore, startp, endp-startp);
                   1807:              if (endp == startp)
                   1808:                {
                   1809:                  strcpy (nstore, "./");
                   1810:                }
                   1811:              else if (endp[-1] != '/')
                   1812:                {
                   1813:                  nstore[endp-startp] = '/';
                   1814:                  nstore[endp-startp+1] = 0;
                   1815:                }
                   1816:              else
                   1817:                nstore[endp-startp] = 0;
                   1818:              add_prefix (&startfile_prefix, nstore, 0, 0, 0);
                   1819:              /* Make separate list of dirs that came from LIBRARY_PATH.  */
                   1820:              add_prefix (&library_prefix, nstore, 0, 0, 0);
                   1821:              if (*endp == 0)
                   1822:                break;
                   1823:              endp = startp = endp + 1;
                   1824:            }
                   1825:          else
                   1826:            endp++;
                   1827:        }
                   1828:     }
                   1829: 
                   1830:   /* Scan argv twice.  Here, the first time, just count how many switches
                   1831:      there will be in their vector, and how many input files in theirs.
                   1832:      Here we also parse the switches that cc itself uses (e.g. -v).  */
                   1833: 
                   1834:   for (i = 1; i < argc; i++)
                   1835:     {
                   1836:       if (! strcmp (argv[i], "-dumpspecs"))
                   1837:        {
                   1838:          printf ("*asm:\n%s\n\n", asm_spec);
                   1839:          printf ("*asm_final:\n%s\n\n", asm_final_spec);
                   1840:          printf ("*cpp:\n%s\n\n", cpp_spec);
                   1841:          printf ("*cc1:\n%s\n\n", cc1_spec);
                   1842:          printf ("*cc1plus:\n%s\n\n", cc1plus_spec);
                   1843:          printf ("*endfile:\n%s\n\n", endfile_spec);
                   1844:          printf ("*link:\n%s\n\n", link_spec);
                   1845:          printf ("*lib:\n%s\n\n", lib_spec);
                   1846:          printf ("*startfile:\n%s\n\n", startfile_spec);
                   1847:          printf ("*switches_need_spaces:\n%s\n\n", switches_need_spaces);
                   1848:          printf ("*signed_char:\n%s\n\n", signed_char_spec);
                   1849:          printf ("*predefines:\n%s\n\n", cpp_predefines);
1.1.1.2   root     1850:          printf ("*cross_compile:\n%d\n\n", cross_compile);
1.1       root     1851: 
                   1852:          exit (0);
                   1853:        }
                   1854:       else if (! strcmp (argv[i], "-dumpversion"))
                   1855:        {
                   1856:          printf ("%s\n", version_string);
                   1857:          exit (0);
                   1858:        }
1.1.1.3 ! root     1859:       else if (! strcmp (argv[i], "-print-libgcc-file-name"))
        !          1860:        {
        !          1861:          print_libgcc_file_name = 1;
        !          1862:        }
1.1       root     1863:       else if (! strcmp (argv[i], "-Xlinker"))
                   1864:        {
                   1865:          /* Pass the argument of this option to the linker when we link.  */
                   1866: 
                   1867:          if (i + 1 == argc)
                   1868:            fatal ("argument to `-Xlinker' is missing");
                   1869: 
                   1870:          n_linker_options++;
                   1871:          if (!linker_options)
                   1872:            linker_options
                   1873:              = (char **) xmalloc (n_linker_options * sizeof (char **));
                   1874:          else
                   1875:            linker_options
                   1876:              = (char **) xrealloc (linker_options,
                   1877:                                    n_linker_options * sizeof (char **));
                   1878: 
                   1879:          linker_options[n_linker_options - 1] = argv[++i];
                   1880:        }
                   1881:       else if (argv[i][0] == '-' && argv[i][1] != 0 && argv[i][1] != 'l')
                   1882:        {
                   1883:          register char *p = &argv[i][1];
                   1884:          register int c = *p;
                   1885: 
                   1886:          switch (c)
                   1887:            {
                   1888:            case 'b':
                   1889:              if (p[1] == 0 && i + 1 == argc)
                   1890:                fatal ("argument to `-b' is missing");
                   1891:              if (p[1] == 0)
                   1892:                spec_machine = argv[++i];
                   1893:              else
                   1894:                spec_machine = p + 1;
                   1895:              break;
                   1896: 
                   1897:            case 'B':
                   1898:              {
                   1899:                int *temp = (int *) xmalloc (sizeof (int));
                   1900:                char *value;
                   1901:                if (p[1] == 0 && i + 1 == argc)
                   1902:                  fatal ("argument to `-B' is missing");
                   1903:                if (p[1] == 0)
                   1904:                  value = argv[++i];
                   1905:                else
                   1906:                  value = p + 1;
                   1907:                add_prefix (&exec_prefix, value, 1, 0, temp);
                   1908:                add_prefix (&startfile_prefix, value, 1, 0, temp);
                   1909:              }
                   1910:              break;
                   1911: 
                   1912:            case 'v':   /* Print our subcommands and print versions.  */
                   1913:              verbose_flag++;
                   1914:              n_switches++;
                   1915:              break;
                   1916: 
                   1917:            case 'V':
                   1918:              if (p[1] == 0 && i + 1 == argc)
                   1919:                fatal ("argument to `-V' is missing");
                   1920:              if (p[1] == 0)
                   1921:                spec_version = argv[++i];
                   1922:              else
                   1923:                spec_version = p + 1;
                   1924:              break;
                   1925: 
                   1926:            case 's':
                   1927:              if (!strcmp (p, "save-temps"))
                   1928:                {
                   1929:                  save_temps_flag = 1;
1.1.1.3 ! root     1930:                  n_switches++;
1.1       root     1931:                  break;
                   1932:                }
                   1933:            default:
                   1934:              n_switches++;
                   1935: 
                   1936:              if (SWITCH_TAKES_ARG (c) > (p[1] != 0))
                   1937:                i += SWITCH_TAKES_ARG (c) - (p[1] != 0);
                   1938:              else if (WORD_SWITCH_TAKES_ARG (p))
                   1939:                i += WORD_SWITCH_TAKES_ARG (p);
                   1940:            }
                   1941:        }
                   1942:       else
                   1943:        n_infiles++;
                   1944:     }
                   1945: 
                   1946:   /* Set up the search paths before we go looking for config files.  */
                   1947: 
                   1948:   /* These come before the md prefixes so that we will find gcc's subcommands
                   1949:      (such as cpp) rather than those of the host system.  */
                   1950:   add_prefix (&exec_prefix, standard_exec_prefix, 0, 1, 0);
                   1951:   add_prefix (&exec_prefix, standard_exec_prefix_1, 0, 1, 0);
                   1952: 
                   1953:   add_prefix (&startfile_prefix, standard_exec_prefix, 0, 1, 0);
                   1954:   add_prefix (&startfile_prefix, standard_exec_prefix_1, 0, 1, 0);
                   1955: 
1.1.1.2   root     1956:   /* More prefixes are enabled in main, after we read the specs file
                   1957:      and determine whether this is cross-compilation or not.  */
1.1       root     1958: 
                   1959: 
                   1960:   /* Then create the space for the vectors and scan again.  */
                   1961: 
                   1962:   switches = ((struct switchstr *)
                   1963:              xmalloc ((n_switches + 1) * sizeof (struct switchstr)));
                   1964:   infiles = (struct infile *) xmalloc ((n_infiles + 1) * sizeof (struct infile));
                   1965:   n_switches = 0;
                   1966:   n_infiles = 0;
                   1967:   last_language_n_infiles = -1;
                   1968: 
                   1969:   /* This, time, copy the text of each switch and store a pointer
                   1970:      to the copy in the vector of switches.
                   1971:      Store all the infiles in their vector.  */
                   1972: 
                   1973:   for (i = 1; i < argc; i++)
                   1974:     {
                   1975:       if (!strcmp (argv[i], "-Xlinker"))
                   1976:        i++;
1.1.1.3 ! root     1977:       else if (! strcmp (argv[i], "-print-libgcc-file-name"))
        !          1978:        i++;
1.1       root     1979:       else if (argv[i][0] == '-' && argv[i][1] != 0 && argv[i][1] != 'l')
                   1980:        {
                   1981:          register char *p = &argv[i][1];
                   1982:          register int c = *p;
                   1983: 
                   1984:          if (c == 'B' || c == 'b' || c == 'V')
                   1985:            {
                   1986:              /* Skip a separate arg, if any.  */
                   1987:              if (p[1] == 0)
                   1988:                i++;
                   1989:              continue;
                   1990:            }
                   1991:          if (c == 'x')
                   1992:            {
                   1993:              if (p[1] == 0 && i + 1 == argc)
                   1994:                fatal ("argument to `-x' is missing");
                   1995:              if (p[1] == 0)
                   1996:                spec_lang = argv[++i];
                   1997:              else
                   1998:                spec_lang = p + 1;
                   1999:              if (! strcmp (spec_lang, "none"))
                   2000:                /* Suppress the warning if -xnone comes after the last input file,
                   2001:                   because alternate command interfaces like g++ might find it
                   2002:                   useful to place -xnone after each input file.  */
                   2003:                spec_lang = 0;
                   2004:              else
                   2005:                last_language_n_infiles = n_infiles;
                   2006:              continue;
                   2007:            }
                   2008:          switches[n_switches].part1 = p;
                   2009:          /* Deal with option arguments in separate argv elements.  */
                   2010:          if ((SWITCH_TAKES_ARG (c) > (p[1] != 0))
                   2011:              || WORD_SWITCH_TAKES_ARG (p)) {
                   2012:            int j = 0;
                   2013:            int n_args = WORD_SWITCH_TAKES_ARG (p);
                   2014: 
                   2015:            if (n_args == 0) {
                   2016:              /* Count only the option arguments in separate argv elements.  */
                   2017:              n_args = SWITCH_TAKES_ARG (c) - (p[1] != 0);
                   2018:            }
                   2019:            switches[n_switches].args
                   2020:              = (char **) xmalloc ((n_args + 1) * sizeof (char *));
                   2021:            while (j < n_args)
                   2022:              switches[n_switches].args[j++] = argv[++i];
                   2023:            /* Null-terminate the vector.  */
                   2024:            switches[n_switches].args[j] = 0;
                   2025:          } else if (*switches_need_spaces != 0 && (c == 'o' || c == 'L')) {
                   2026:            /* On some systems, ld cannot handle -o or -L without space.
                   2027:               So split the -o or -L from its argument.  */
                   2028:            switches[n_switches].part1 = (c == 'o' ? "o" : "L");
                   2029:            switches[n_switches].args = (char **) xmalloc (2 * sizeof (char *));
                   2030:            switches[n_switches].args[0] = xmalloc (strlen (p));
                   2031:            strcpy (switches[n_switches].args[0], &p[1]);
                   2032:            switches[n_switches].args[1] = 0;
                   2033:          } else
                   2034:            switches[n_switches].args = 0;
                   2035:          switches[n_switches].valid = 0;
                   2036:          /* This is always valid, since gcc.c itself understands it.  */
                   2037:          if (!strcmp (p, "save-temps"))
                   2038:            switches[n_switches].valid = 1;
                   2039:          n_switches++;
                   2040:        }
                   2041:       else
                   2042:        {
                   2043:          infiles[n_infiles].language = spec_lang;
                   2044:          infiles[n_infiles++].name = argv[i];
                   2045:        }
                   2046:     }
                   2047: 
                   2048:   if (n_infiles == last_language_n_infiles)
                   2049:     error ("Warning: `-x %s' after last input file has no effect", spec_lang);
                   2050: 
                   2051:   switches[n_switches].part1 = 0;
                   2052:   infiles[n_infiles].name = 0;
1.1.1.3 ! root     2053: 
        !          2054:   /* If we have a GCC_EXEC_PREFIX envvar, modify it for cpp's sake.  */
        !          2055:   if (gcc_exec_prefix)
        !          2056:     {
        !          2057:       temp = (char *) xmalloc (strlen (gcc_exec_prefix) + strlen (spec_version)
        !          2058:                               + strlen (spec_machine) + 3);
        !          2059:       strcpy (temp, gcc_exec_prefix);
        !          2060:       strcat (temp, spec_machine);
        !          2061:       strcat (temp, "/");
        !          2062:       strcat (temp, spec_version);
        !          2063:       strcat (temp, "/");
        !          2064:       gcc_exec_prefix = temp;
        !          2065:     }
1.1       root     2066: }
                   2067: 
                   2068: /* Process a spec string, accumulating and running commands.  */
                   2069: 
                   2070: /* These variables describe the input file name.
                   2071:    input_file_number is the index on outfiles of this file,
                   2072:    so that the output file name can be stored for later use by %o.
                   2073:    input_basename is the start of the part of the input file
                   2074:    sans all directory names, and basename_length is the number
                   2075:    of characters starting there excluding the suffix .c or whatever.  */
                   2076: 
                   2077: static char *input_filename;
                   2078: static int input_file_number;
                   2079: static int input_filename_length;
                   2080: static int basename_length;
                   2081: static char *input_basename;
                   2082: static char *input_suffix;
                   2083: 
                   2084: /* These are variables used within do_spec and do_spec_1.  */
                   2085: 
                   2086: /* Nonzero if an arg has been started and not yet terminated
                   2087:    (with space, tab or newline).  */
                   2088: static int arg_going;
                   2089: 
                   2090: /* Nonzero means %d or %g has been seen; the next arg to be terminated
                   2091:    is a temporary file name.  */
                   2092: static int delete_this_arg;
                   2093: 
                   2094: /* Nonzero means %w has been seen; the next arg to be terminated
                   2095:    is the output file name of this compilation.  */
                   2096: static int this_is_output_file;
                   2097: 
                   2098: /* Nonzero means %s has been seen; the next arg to be terminated
                   2099:    is the name of a library file and we should try the standard
                   2100:    search dirs for it.  */
                   2101: static int this_is_library_file;
                   2102: 
                   2103: /* Process the spec SPEC and run the commands specified therein.
                   2104:    Returns 0 if the spec is successfully processed; -1 if failed.  */
                   2105: 
                   2106: static int
                   2107: do_spec (spec)
                   2108:      char *spec;
                   2109: {
                   2110:   int value;
                   2111: 
                   2112:   clear_args ();
                   2113:   arg_going = 0;
                   2114:   delete_this_arg = 0;
                   2115:   this_is_output_file = 0;
                   2116:   this_is_library_file = 0;
                   2117: 
                   2118:   value = do_spec_1 (spec, 0, NULL);
                   2119: 
                   2120:   /* Force out any unfinished command.
                   2121:      If -pipe, this forces out the last command if it ended in `|'.  */
                   2122:   if (value == 0)
                   2123:     {
                   2124:       if (argbuf_index > 0 && !strcmp (argbuf[argbuf_index - 1], "|"))
                   2125:        argbuf_index--;
                   2126: 
                   2127:       if (argbuf_index > 0)
                   2128:        value = execute ();
                   2129:     }
                   2130: 
                   2131:   return value;
                   2132: }
                   2133: 
                   2134: /* Process the sub-spec SPEC as a portion of a larger spec.
                   2135:    This is like processing a whole spec except that we do
                   2136:    not initialize at the beginning and we do not supply a
                   2137:    newline by default at the end.
                   2138:    INSWITCH nonzero means don't process %-sequences in SPEC;
                   2139:    in this case, % is treated as an ordinary character.
                   2140:    This is used while substituting switches.
                   2141:    INSWITCH nonzero also causes SPC not to terminate an argument.
                   2142: 
                   2143:    Value is zero unless a line was finished
                   2144:    and the command on that line reported an error.  */
                   2145: 
                   2146: static int
                   2147: do_spec_1 (spec, inswitch, soft_matched_part)
                   2148:      char *spec;
                   2149:      int inswitch;
                   2150:      char *soft_matched_part;
                   2151: {
                   2152:   register char *p = spec;
                   2153:   register int c;
                   2154:   int i;
                   2155:   char *string;
                   2156: 
                   2157:   while (c = *p++)
                   2158:     /* If substituting a switch, treat all chars like letters.
                   2159:        Otherwise, NL, SPC, TAB and % are special.  */
                   2160:     switch (inswitch ? 'a' : c)
                   2161:       {
                   2162:       case '\n':
                   2163:        /* End of line: finish any pending argument,
                   2164:           then run the pending command if one has been started.  */
                   2165:        if (arg_going)
                   2166:          {
                   2167:            obstack_1grow (&obstack, 0);
                   2168:            string = obstack_finish (&obstack);
                   2169:            if (this_is_library_file)
                   2170:              string = find_file (string);
                   2171:            store_arg (string, delete_this_arg, this_is_output_file);
                   2172:            if (this_is_output_file)
                   2173:              outfiles[input_file_number] = string;
                   2174:          }
                   2175:        arg_going = 0;
                   2176: 
                   2177:        if (argbuf_index > 0 && !strcmp (argbuf[argbuf_index - 1], "|"))
                   2178:          {
                   2179:            int i;
                   2180:            for (i = 0; i < n_switches; i++)
                   2181:              if (!strcmp (switches[i].part1, "pipe"))
                   2182:                break;
                   2183: 
                   2184:            /* A `|' before the newline means use a pipe here,
                   2185:               but only if -pipe was specified.
                   2186:               Otherwise, execute now and don't pass the `|' as an arg.  */
                   2187:            if (i < n_switches)
                   2188:              {
                   2189:                switches[i].valid = 1;
                   2190:                break;
                   2191:              }
                   2192:            else
                   2193:              argbuf_index--;
                   2194:          }
                   2195: 
                   2196:        if (argbuf_index > 0)
                   2197:          {
                   2198:            int value = execute ();
                   2199:            if (value)
                   2200:              return value;
                   2201:          }
                   2202:        /* Reinitialize for a new command, and for a new argument.  */
                   2203:        clear_args ();
                   2204:        arg_going = 0;
                   2205:        delete_this_arg = 0;
                   2206:        this_is_output_file = 0;
                   2207:        this_is_library_file = 0;
                   2208:        break;
                   2209: 
                   2210:       case '|':
                   2211:        /* End any pending argument.  */
                   2212:        if (arg_going)
                   2213:          {
                   2214:            obstack_1grow (&obstack, 0);
                   2215:            string = obstack_finish (&obstack);
                   2216:            if (this_is_library_file)
                   2217:              string = find_file (string);
                   2218:            store_arg (string, delete_this_arg, this_is_output_file);
                   2219:            if (this_is_output_file)
                   2220:              outfiles[input_file_number] = string;
                   2221:          }
                   2222: 
                   2223:        /* Use pipe */
                   2224:        obstack_1grow (&obstack, c);
                   2225:        arg_going = 1;
                   2226:        break;
                   2227: 
                   2228:       case '\t':
                   2229:       case ' ':
                   2230:        /* Space or tab ends an argument if one is pending.  */
                   2231:        if (arg_going)
                   2232:          {
                   2233:            obstack_1grow (&obstack, 0);
                   2234:            string = obstack_finish (&obstack);
                   2235:            if (this_is_library_file)
                   2236:              string = find_file (string);
                   2237:            store_arg (string, delete_this_arg, this_is_output_file);
                   2238:            if (this_is_output_file)
                   2239:              outfiles[input_file_number] = string;
                   2240:          }
                   2241:        /* Reinitialize for a new argument.  */
                   2242:        arg_going = 0;
                   2243:        delete_this_arg = 0;
                   2244:        this_is_output_file = 0;
                   2245:        this_is_library_file = 0;
                   2246:        break;
                   2247: 
                   2248:       case '%':
                   2249:        switch (c = *p++)
                   2250:          {
                   2251:          case 0:
                   2252:            fatal ("Invalid specification!  Bug in cc.");
                   2253: 
                   2254:          case 'b':
                   2255:            obstack_grow (&obstack, input_basename, basename_length);
                   2256:            arg_going = 1;
                   2257:            break;
                   2258: 
                   2259:          case 'd':
                   2260:            delete_this_arg = 2;
                   2261:            break;
                   2262: 
                   2263:          /* Dump out the directories specified with LIBRARY_PATH,
                   2264:             followed by the absolute directories
                   2265:             that we search for startfiles.  */
                   2266:          case 'D':
                   2267:            for (i = 0; i < 2; i++)
                   2268:              {
                   2269:                struct prefix_list *pl
                   2270:                  = (i == 0 ? library_prefix.plist : startfile_prefix.plist);
1.1.1.3 ! root     2271:                int bufsize = 100;
        !          2272:                char *buffer = (char *) xmalloc (bufsize);
        !          2273:                int idx;
        !          2274: 
1.1       root     2275:                for (; pl; pl = pl->next)
                   2276:                  {
                   2277: #ifdef RELATIVE_PREFIX_NOT_LINKDIR
                   2278:                    /* Used on systems which record the specified -L dirs
                   2279:                       and use them to search for dynamic linking.  */
                   2280:                    /* Relative directories always come from -B,
                   2281:                       and it is better not to use them for searching
                   2282:                       at run time.  In particular, stage1 loses  */
                   2283:                    if (pl->prefix[0] != '/')
                   2284:                      continue;
                   2285: #endif
                   2286:                    if (machine_suffix)
                   2287:                      {
                   2288:                        if (is_linker_dir (pl->prefix, machine_suffix))
                   2289:                          {
                   2290:                            do_spec_1 ("-L", 0, 0);
                   2291: #ifdef SPACE_AFTER_L_OPTION
                   2292:                            do_spec_1 (" ", 0, 0);
                   2293: #endif
                   2294:                            do_spec_1 (pl->prefix, 1, 0);
1.1.1.3 ! root     2295:                            /* Remove slash from machine_suffix.  */
        !          2296:                            if (strlen (machine_suffix) >= bufsize)
        !          2297:                              bufsize = strlen (machine_suffix) * 2 + 1;
        !          2298:                            buffer = (char *) xrealloc (buffer, bufsize);
        !          2299:                            strcpy (buffer, machine_suffix);
        !          2300:                            idx = strlen (buffer);
        !          2301:                            if (buffer[idx - 1] == '/')
        !          2302:                              buffer[idx - 1] = 0;
        !          2303:                            do_spec_1 (buffer, 1, 0);
1.1       root     2304:                            /* Make this a separate argument.  */
                   2305:                            do_spec_1 (" ", 0, 0);
                   2306:                          }
                   2307:                      }
1.1.1.2   root     2308:                    if (!pl->require_machine_suffix)
1.1       root     2309:                      {
                   2310:                        if (is_linker_dir (pl->prefix, ""))
                   2311:                          {
                   2312:                            do_spec_1 ("-L", 0, 0);
                   2313: #ifdef SPACE_AFTER_L_OPTION
                   2314:                            do_spec_1 (" ", 0, 0);
                   2315: #endif
1.1.1.3 ! root     2316:                            /* Remove slash from pl->prefix.  */
        !          2317:                            if (strlen (pl->prefix) >= bufsize)
        !          2318:                              bufsize = strlen (pl->prefix) * 2 + 1;
        !          2319:                            buffer = (char *) xrealloc (buffer, bufsize);
        !          2320:                            strcpy (buffer, pl->prefix);
        !          2321:                            idx = strlen (buffer);
        !          2322:                            if (buffer[idx - 1] == '/')
        !          2323:                              buffer[idx - 1] = 0;
        !          2324:                            do_spec_1 (buffer, 1, 0);
1.1       root     2325:                            /* Make this a separate argument.  */
                   2326:                            do_spec_1 (" ", 0, 0);
                   2327:                          }
                   2328:                      }
                   2329:                  }
1.1.1.3 ! root     2330:                free (buffer);
1.1       root     2331:              }
                   2332:            break;
                   2333: 
                   2334:          case 'e':
                   2335:            /* {...:%efoo} means report an error with `foo' as error message
                   2336:               and don't execute any more commands for this file.  */
                   2337:            {
                   2338:              char *q = p;
                   2339:              char *buf;
                   2340:              while (*p != 0 && *p != '\n') p++;
                   2341:              buf = (char *) alloca (p - q + 1);
                   2342:              strncpy (buf, q, p - q);
                   2343:              buf[p - q] = 0;
                   2344:              error ("%s", buf);
                   2345:              return -1;
                   2346:            }
                   2347:            break;
                   2348: 
                   2349:          case 'g':
                   2350:            if (save_temps_flag)
                   2351:              obstack_grow (&obstack, input_basename, basename_length);
                   2352:            else
                   2353:              {
                   2354:                obstack_grow (&obstack, temp_filename, temp_filename_length);
                   2355:                delete_this_arg = 1;
                   2356:              }
                   2357:            arg_going = 1;
                   2358:            break;
                   2359: 
                   2360:          case 'i':
                   2361:            obstack_grow (&obstack, input_filename, input_filename_length);
                   2362:            arg_going = 1;
                   2363:            break;
                   2364: 
1.1.1.3 ! root     2365:          case 'I':
        !          2366:            if (gcc_exec_prefix)
        !          2367:              {
        !          2368:                do_spec_1 ("-imacros", 1, 0);
        !          2369:                /* Make this a separate argument.  */
        !          2370:                do_spec_1 (" ", 0, 0);
        !          2371:                do_spec_1 (gcc_exec_prefix, 1, 0);
        !          2372:                do_spec_1 (" ", 0, 0);
        !          2373:              }
        !          2374:            break;
        !          2375: 
1.1       root     2376:          case 'o':
                   2377:            {
                   2378:              register int f;
                   2379:              for (f = 0; f < n_infiles; f++)
                   2380:                store_arg (outfiles[f], 0, 0);
                   2381:            }
                   2382:            break;
                   2383: 
                   2384:          case 's':
                   2385:            this_is_library_file = 1;
                   2386:            break;
                   2387: 
                   2388:          case 'w':
                   2389:            this_is_output_file = 1;
                   2390:            break;
                   2391: 
                   2392:          case 'W':
                   2393:            {
                   2394:              int index = argbuf_index;
                   2395:              /* Handle the {...} following the %W.  */
                   2396:              if (*p != '{')
                   2397:                abort ();
                   2398:              p = handle_braces (p + 1);
                   2399:              if (p == 0)
                   2400:                return -1;
                   2401:              /* If any args were output, mark the last one for deletion
                   2402:                 on failure.  */
                   2403:              if (argbuf_index != index)
                   2404:                record_temp_file (argbuf[argbuf_index - 1], 0, 1);
                   2405:              break;
                   2406:            }
                   2407: 
                   2408:          /* %x{OPTION} records OPTION for %X to output.  */
                   2409:          case 'x':
                   2410:            {
                   2411:              char *p1 = p;
                   2412:              char *string;
                   2413: 
                   2414:              /* Skip past the option value and make a copy.  */
                   2415:              if (*p != '{')
                   2416:                abort ();
                   2417:              while (*p++ != '}')
                   2418:                ;
                   2419:              string = save_string (p1 + 1, p - p1 - 2);
                   2420: 
                   2421:              /* See if we already recorded this option.  */
                   2422:              for (i = 0; i < n_linker_options; i++)
                   2423:                if (! strcmp (string, linker_options[i]))
                   2424:                  {
                   2425:                    free (string);
                   2426:                    return 0;
                   2427:                  }
                   2428: 
                   2429:              /* This option is new; add it.  */
                   2430:              n_linker_options++;
                   2431:              if (!linker_options)
                   2432:                linker_options
                   2433:                  = (char **) xmalloc (n_linker_options * sizeof (char **));
                   2434:              else
                   2435:                linker_options
                   2436:                  = (char **) xrealloc (linker_options,
                   2437:                                        n_linker_options * sizeof (char **));
                   2438: 
                   2439:              linker_options[n_linker_options - 1] = string;
                   2440:            }
                   2441:            break;
                   2442: 
                   2443:          /* Dump out the options accumulated previously using %x.  */
                   2444:          case 'X':
                   2445:            for (i = 0; i < n_linker_options; i++)
                   2446:              {
                   2447:                do_spec_1 (linker_options[i], 1, NULL);
                   2448:                /* Make each accumulated option a separate argument.  */
                   2449:                do_spec_1 (" ", 0, NULL);
                   2450:              }
                   2451:            break;
                   2452: 
                   2453:            /* Here are digits and numbers that just process
                   2454:               a certain constant string as a spec.  */
                   2455: 
                   2456:          case '1':
                   2457:            do_spec_1 (cc1_spec, 0, NULL);
                   2458:            break;
                   2459: 
                   2460:          case '2':
                   2461:            do_spec_1 (cc1plus_spec, 0, NULL);
                   2462:            break;
                   2463: 
                   2464:          case 'a':
                   2465:            do_spec_1 (asm_spec, 0, NULL);
                   2466:            break;
                   2467: 
                   2468:          case 'A':
                   2469:            do_spec_1 (asm_final_spec, 0, NULL);
                   2470:            break;
                   2471: 
                   2472:          case 'c':
                   2473:            do_spec_1 (signed_char_spec, 0, NULL);
                   2474:            break;
                   2475: 
                   2476:          case 'C':
                   2477:            do_spec_1 (cpp_spec, 0, NULL);
                   2478:            break;
                   2479: 
                   2480:          case 'E':
                   2481:            do_spec_1 (endfile_spec, 0, NULL);
                   2482:            break;
                   2483: 
                   2484:          case 'l':
                   2485:            do_spec_1 (link_spec, 0, NULL);
                   2486:            break;
                   2487: 
                   2488:          case 'L':
                   2489:            do_spec_1 (lib_spec, 0, NULL);
                   2490:            break;
                   2491: 
                   2492:          case 'p':
                   2493:            {
                   2494:              char *x = (char *) alloca (strlen (cpp_predefines) + 1);
                   2495:              char *buf = x;
                   2496:              char *y;
                   2497: 
                   2498:              /* Copy all of the -D options in CPP_PREDEFINES into BUF.  */
                   2499:              y = cpp_predefines;
                   2500:              while (*y != 0)
                   2501:                {
                   2502:                  if (! strncmp (y, "-D", 2))
                   2503:                    /* Copy the whole option.  */
                   2504:                    while (*y && *y != ' ' && *y != '\t')
                   2505:                      *x++ = *y++;
                   2506:                  else if (*y == ' ' || *y == '\t')
                   2507:                    /* Copy whitespace to the result.  */
                   2508:                    *x++ = *y++;
                   2509:                  /* Don't copy other options.  */
                   2510:                  else
                   2511:                    y++;
                   2512:                }
                   2513: 
                   2514:              *x = 0;
                   2515: 
                   2516:              do_spec_1 (buf, 0, NULL);
                   2517:            }
                   2518:            break;
                   2519: 
                   2520:          case 'P':
                   2521:            {
                   2522:              char *x = (char *) alloca (strlen (cpp_predefines) * 4 + 1);
                   2523:              char *buf = x;
                   2524:              char *y;
                   2525: 
                   2526:              /* Copy all of CPP_PREDEFINES into BUF,
                   2527:                 but put __ after every -D and at the end of each arg.  */
                   2528:              y = cpp_predefines;
                   2529:              while (*y != 0)
                   2530:                {
                   2531:                  if (! strncmp (y, "-D", 2))
                   2532:                    {
                   2533:                      int flag = 0;
                   2534: 
                   2535:                      *x++ = *y++;
                   2536:                      *x++ = *y++;
                   2537: 
                   2538:                      if (strncmp (y, "__", 2))
                   2539:                        {
                   2540:                          /* Stick __ at front of macro name.  */
                   2541:                          *x++ = '_';
                   2542:                          *x++ = '_';
                   2543:                          /* Arrange to stick __ at the end as well.  */
                   2544:                          flag = 1;
                   2545:                        }
                   2546: 
                   2547:                      /* Copy the macro name.  */
                   2548:                      while (*y && *y != '=' && *y != ' ' && *y != '\t')
                   2549:                        *x++ = *y++;
                   2550: 
                   2551:                      if (flag)
                   2552:                        {
                   2553:                          *x++ = '_';
                   2554:                          *x++ = '_';
                   2555:                        }
                   2556: 
                   2557:                      /* Copy the value given, if any.  */
                   2558:                      while (*y && *y != ' ' && *y != '\t')
                   2559:                        *x++ = *y++;
                   2560:                    }
                   2561:                  else if (*y == ' ' || *y == '\t')
                   2562:                    /* Copy whitespace to the result.  */
                   2563:                    *x++ = *y++;
                   2564:                  /* Don't copy -A options  */
                   2565:                  else
                   2566:                    y++;
                   2567:                }
                   2568:              *x++ = ' ';
                   2569: 
                   2570:              /* Copy all of CPP_PREDEFINES into BUF,
                   2571:                 but put __ after every -D.  */
                   2572:              y = cpp_predefines;
                   2573:              while (*y != 0)
                   2574:                {
                   2575:                  if (! strncmp (y, "-D", 2))
                   2576:                    {
                   2577:                      *x++ = *y++;
                   2578:                      *x++ = *y++;
                   2579: 
                   2580:                      if (strncmp (y, "__", 2))
                   2581:                        {
                   2582:                          /* Stick __ at front of macro name.  */
                   2583:                          *x++ = '_';
                   2584:                          *x++ = '_';
                   2585:                        }
                   2586: 
                   2587:                      /* Copy the macro name.  */
                   2588:                      while (*y && *y != '=' && *y != ' ' && *y != '\t')
                   2589:                        *x++ = *y++;
                   2590: 
                   2591:                      /* Copy the value given, if any.  */
                   2592:                      while (*y && *y != ' ' && *y != '\t')
                   2593:                        *x++ = *y++;
                   2594:                    }
                   2595:                  else if (*y == ' ' || *y == '\t')
                   2596:                    /* Copy whitespace to the result.  */
                   2597:                    *x++ = *y++;
                   2598:                  /* Don't copy -A options  */
                   2599:                  else
                   2600:                    y++;
                   2601:                }
                   2602:              *x++ = ' ';
                   2603: 
                   2604:              /* Copy all of the -A options in CPP_PREDEFINES into BUF.  */
                   2605:              y = cpp_predefines;
                   2606:              while (*y != 0)
                   2607:                {
                   2608:                  if (! strncmp (y, "-A", 2))
                   2609:                    /* Copy the whole option.  */
                   2610:                    while (*y && *y != ' ' && *y != '\t')
                   2611:                      *x++ = *y++;
                   2612:                  else if (*y == ' ' || *y == '\t')
                   2613:                    /* Copy whitespace to the result.  */
                   2614:                    *x++ = *y++;
                   2615:                  /* Don't copy other options.  */
                   2616:                  else
                   2617:                    y++;
                   2618:                }
                   2619: 
                   2620:              *x = 0;
                   2621: 
                   2622:              do_spec_1 (buf, 0, NULL);
                   2623:            }
                   2624:            break;
                   2625: 
                   2626:          case 'S':
                   2627:            do_spec_1 (startfile_spec, 0, NULL);
                   2628:            break;
                   2629: 
                   2630:            /* Here we define characters other than letters and digits.  */
                   2631: 
                   2632:          case '{':
                   2633:            p = handle_braces (p);
                   2634:            if (p == 0)
                   2635:              return -1;
                   2636:            break;
                   2637: 
                   2638:          case '%':
                   2639:            obstack_1grow (&obstack, '%');
                   2640:            break;
                   2641: 
                   2642:          case '*':
                   2643:            do_spec_1 (soft_matched_part, 1, NULL);
                   2644:            do_spec_1 (" ", 0, NULL);
                   2645:            break;
                   2646: 
                   2647:            /* Process a string found as the value of a spec given by name.
                   2648:               This feature allows individual machine descriptions
                   2649:               to add and use their own specs.
                   2650:               %[...] modifies -D options the way %P does;
                   2651:               %(...) uses the spec unmodified.  */
                   2652:          case '(':
                   2653:          case '[':
                   2654:            {
                   2655:              char *name = p;
                   2656:              struct spec_list *sl;
                   2657:              int len;
                   2658: 
                   2659:              /* The string after the S/P is the name of a spec that is to be
                   2660:                 processed. */
                   2661:              while (*p && *p != ')' && *p != ']')
                   2662:                p++;
                   2663: 
                   2664:              /* See if it's in the list */
                   2665:              for (len = p - name, sl = specs; sl; sl = sl->next)
                   2666:                if (strncmp (sl->name, name, len) == 0 && !sl->name[len])
                   2667:                  {
                   2668:                    name = sl->spec;
                   2669:                    break;
                   2670:                  }
                   2671: 
                   2672:              if (sl)
                   2673:                {
                   2674:                  if (c == '(')
                   2675:                    do_spec_1 (name, 0, NULL);
                   2676:                  else
                   2677:                    {
                   2678:                      char *x = (char *) alloca (strlen (name) * 2 + 1);
                   2679:                      char *buf = x;
                   2680:                      char *y = name;
                   2681: 
                   2682:                      /* Copy all of NAME into BUF, but put __ after
                   2683:                         every -D and at the end of each arg,  */
                   2684:                      while (1)
                   2685:                        {
                   2686:                          if (! strncmp (y, "-D", 2))
                   2687:                            {
                   2688:                              *x++ = '-';
                   2689:                              *x++ = 'D';
                   2690:                              *x++ = '_';
                   2691:                              *x++ = '_';
                   2692:                              y += 2;
                   2693:                            }
                   2694:                          else if (*y == ' ' || *y == 0)
                   2695:                            {
                   2696:                              *x++ = '_';
                   2697:                              *x++ = '_';
                   2698:                              if (*y == 0)
                   2699:                                break;
                   2700:                              else
                   2701:                                *x++ = *y++;
                   2702:                            }
                   2703:                          else
                   2704:                            *x++ = *y++;
                   2705:                        }
                   2706:                      *x = 0;
                   2707: 
                   2708:                      do_spec_1 (buf, 0, NULL);
                   2709:                    }
                   2710:                }
1.1.1.2   root     2711: 
                   2712:              /* Discard the closing paren or bracket.  */
                   2713:              if (*p)
                   2714:                p++;
1.1       root     2715:            }
                   2716:            break;
                   2717: 
                   2718:          default:
                   2719:            abort ();
                   2720:          }
                   2721:        break;
                   2722: 
                   2723:       case '\\':
                   2724:        /* Backslash: treat next character as ordinary.  */
                   2725:        c = *p++;
                   2726: 
                   2727:        /* fall through */
                   2728:       default:
                   2729:        /* Ordinary character: put it into the current argument.  */
                   2730:        obstack_1grow (&obstack, c);
                   2731:        arg_going = 1;
                   2732:       }
                   2733: 
                   2734:   return 0;            /* End of string */
                   2735: }
                   2736: 
                   2737: /* Return 0 if we call do_spec_1 and that returns -1.  */
                   2738: 
                   2739: static char *
                   2740: handle_braces (p)
                   2741:      register char *p;
                   2742: {
                   2743:   register char *q;
                   2744:   char *filter;
                   2745:   int pipe = 0;
                   2746:   int negate = 0;
                   2747:   int suffix = 0;
                   2748: 
                   2749:   if (*p == '|')
                   2750:     /* A `|' after the open-brace means,
                   2751:        if the test fails, output a single minus sign rather than nothing.
                   2752:        This is used in %{|!pipe:...}.  */
                   2753:     pipe = 1, ++p;
                   2754: 
                   2755:   if (*p == '!')
                   2756:     /* A `!' after the open-brace negates the condition:
                   2757:        succeed if the specified switch is not present.  */
                   2758:     negate = 1, ++p;
                   2759: 
                   2760:   if (*p == '.')
                   2761:     /* A `.' after the open-brace means test against the current suffix.  */
                   2762:     {
                   2763:       if (pipe)
                   2764:        abort ();
                   2765: 
                   2766:       suffix = 1;
                   2767:       ++p;
                   2768:     }
                   2769: 
                   2770:   filter = p;
                   2771:   while (*p != ':' && *p != '}') p++;
                   2772:   if (*p != '}')
                   2773:     {
                   2774:       register int count = 1;
                   2775:       q = p + 1;
                   2776:       while (count > 0)
                   2777:        {
                   2778:          if (*q == '{')
                   2779:            count++;
                   2780:          else if (*q == '}')
                   2781:            count--;
                   2782:          else if (*q == 0)
                   2783:            abort ();
                   2784:          q++;
                   2785:        }
                   2786:     }
                   2787:   else
                   2788:     q = p + 1;
                   2789: 
                   2790:   if (suffix)
                   2791:     {
                   2792:       int found = (input_suffix != 0
1.1.1.2   root     2793:                   && strlen (input_suffix) == p - filter
1.1       root     2794:                   && strncmp (input_suffix, filter, p - filter) == 0);
                   2795: 
                   2796:       if (p[0] == '}')
                   2797:        abort ();
                   2798: 
                   2799:       if (negate != found
                   2800:          && do_spec_1 (save_string (p + 1, q - p - 2), 0, NULL) < 0)
                   2801:        return 0;
                   2802: 
                   2803:       return q;
                   2804:     }
                   2805:   else if (p[-1] == '*' && p[0] == '}')
                   2806:     {
                   2807:       /* Substitute all matching switches as separate args.  */
                   2808:       register int i;
                   2809:       --p;
                   2810:       for (i = 0; i < n_switches; i++)
                   2811:        if (!strncmp (switches[i].part1, filter, p - filter))
                   2812:          give_switch (i, 0);
                   2813:     }
                   2814:   else
                   2815:     {
                   2816:       /* Test for presence of the specified switch.  */
                   2817:       register int i;
                   2818:       int present = 0;
                   2819: 
                   2820:       /* If name specified ends in *, as in {x*:...},
                   2821:         check for %* and handle that case.  */
                   2822:       if (p[-1] == '*' && !negate)
                   2823:        {
                   2824:          int substitution;
                   2825:          char *r = p;
                   2826: 
                   2827:          /* First see whether we have %*.  */
                   2828:          substitution = 0;
1.1.1.2   root     2829:          while (r < q)
1.1       root     2830:            {
                   2831:              if (*r == '%' && r[1] == '*')
                   2832:                substitution = 1;
                   2833:              r++;
                   2834:            }
                   2835:          /* If we do, handle that case.  */
                   2836:          if (substitution)
                   2837:            {
                   2838:              /* Substitute all matching switches as separate args.
                   2839:                 But do this by substituting for %*
                   2840:                 in the text that follows the colon.  */
                   2841: 
                   2842:              unsigned hard_match_len = p - filter - 1;
                   2843:              char *string = save_string (p + 1, q - p - 2);
                   2844: 
                   2845:              for (i = 0; i < n_switches; i++)
                   2846:                if (!strncmp (switches[i].part1, filter, hard_match_len))
                   2847:                  {
                   2848:                    do_spec_1 (string, 0, &switches[i].part1[hard_match_len]);
                   2849:                    /* Pass any arguments this switch has.  */
                   2850:                    give_switch (i, 1);
                   2851:                  }
                   2852: 
                   2853:              return q;
                   2854:            }
                   2855:        }
                   2856: 
                   2857:       /* If name specified ends in *, as in {x*:...},
                   2858:         check for presence of any switch name starting with x.  */
                   2859:       if (p[-1] == '*')
                   2860:        {
                   2861:          for (i = 0; i < n_switches; i++)
                   2862:            {
                   2863:              unsigned hard_match_len = p - filter - 1;
                   2864: 
                   2865:              if (!strncmp (switches[i].part1, filter, hard_match_len))
                   2866:                {
                   2867:                  switches[i].valid = 1;
                   2868:                  present = 1;
                   2869:                }
                   2870:            }
                   2871:        }
                   2872:       /* Otherwise, check for presence of exact name specified.  */
                   2873:       else
                   2874:        {
                   2875:          for (i = 0; i < n_switches; i++)
                   2876:            {
                   2877:              if (!strncmp (switches[i].part1, filter, p - filter)
                   2878:                  && switches[i].part1[p - filter] == 0)
                   2879:                {
                   2880:                  switches[i].valid = 1;
                   2881:                  present = 1;
                   2882:                  break;
                   2883:                }
                   2884:            }
                   2885:        }
                   2886: 
                   2887:       /* If it is as desired (present for %{s...}, absent for %{-s...})
                   2888:         then substitute either the switch or the specified
                   2889:         conditional text.  */
                   2890:       if (present != negate)
                   2891:        {
                   2892:          if (*p == '}')
                   2893:            {
                   2894:              give_switch (i, 0);
                   2895:            }
                   2896:          else
                   2897:            {
                   2898:              if (do_spec_1 (save_string (p + 1, q - p - 2), 0, NULL) < 0)
                   2899:                return 0;
                   2900:            }
                   2901:        }
                   2902:       else if (pipe)
                   2903:        {
                   2904:          /* Here if a %{|...} conditional fails: output a minus sign,
                   2905:             which means "standard output" or "standard input".  */
                   2906:          do_spec_1 ("-", 0, NULL);
                   2907:        }
                   2908:     }
                   2909: 
                   2910:   return q;
                   2911: }
                   2912: 
                   2913: /* Pass a switch to the current accumulating command
                   2914:    in the same form that we received it.
                   2915:    SWITCHNUM identifies the switch; it is an index into
                   2916:    the vector of switches gcc received, which is `switches'.
                   2917:    This cannot fail since it never finishes a command line.
                   2918: 
                   2919:    If OMIT_FIRST_WORD is nonzero, then we omit .part1 of the argument.  */
                   2920: 
                   2921: static void
                   2922: give_switch (switchnum, omit_first_word)
                   2923:      int switchnum;
                   2924:      int omit_first_word;
                   2925: {
                   2926:   if (!omit_first_word)
                   2927:     {
                   2928:       do_spec_1 ("-", 0, NULL);
                   2929:       do_spec_1 (switches[switchnum].part1, 1, NULL);
                   2930:     }
                   2931:   do_spec_1 (" ", 0, NULL);
                   2932:   if (switches[switchnum].args != 0)
                   2933:     {
                   2934:       char **p;
                   2935:       for (p = switches[switchnum].args; *p; p++)
                   2936:        {
                   2937:          do_spec_1 (*p, 1, NULL);
                   2938:          do_spec_1 (" ", 0, NULL);
                   2939:        }
                   2940:     }
                   2941:   switches[switchnum].valid = 1;
                   2942: }
                   2943: 
                   2944: /* Search for a file named NAME trying various prefixes including the
                   2945:    user's -B prefix and some standard ones.
                   2946:    Return the absolute file name found.  If nothing is found, return NAME.  */
                   2947: 
                   2948: static char *
                   2949: find_file (name)
                   2950:      char *name;
                   2951: {
                   2952:   char *newname;
                   2953: 
                   2954:   newname = find_a_file (&startfile_prefix, name, R_OK);
                   2955:   return newname ? newname : name;
                   2956: }
                   2957: 
                   2958: /* Determine whether a -L option is relevant.  Not required for certain
                   2959:    fixed names and for directories that don't exist.  */
                   2960: 
                   2961: static int
                   2962: is_linker_dir (path1, path2)
                   2963:      char *path1;
                   2964:      char *path2;
                   2965: {
                   2966:   int len1 = strlen (path1);
                   2967:   int len2 = strlen (path2);
                   2968:   char *path = (char *) alloca (3 + len1 + len2);
                   2969:   char *cp;
                   2970:   struct stat st;
                   2971: 
                   2972:   /* Construct the path from the two parts.  Ensure the string ends with "/.".
                   2973:      The resulting path will be a directory even if the given path is a
                   2974:      symbolic link.  */
                   2975:   bcopy (path1, path, len1);
                   2976:   bcopy (path2, path + len1, len2);
                   2977:   cp = path + len1 + len2;
                   2978:   if (cp[-1] != '/')
                   2979:     *cp++ = '/';
                   2980:   *cp++ = '.';
                   2981:   *cp = '\0';
                   2982: 
                   2983:   /* Exclude directories that the linker is known to search.  */
                   2984:   if ((cp - path == 6 && strcmp (path, "/lib/.") == 0)
                   2985:       || (cp - path == 10 && strcmp (path, "/usr/lib/.") == 0))
                   2986:     return 0;
                   2987: 
                   2988:   return (stat (path, &st) >= 0 && S_ISDIR (st.st_mode));
                   2989: }
                   2990: 
                   2991: /* On fatal signals, delete all the temporary files.  */
                   2992: 
                   2993: static void
                   2994: fatal_error (signum)
                   2995:      int signum;
                   2996: {
                   2997:   signal (signum, SIG_DFL);
                   2998:   delete_failure_queue ();
                   2999:   delete_temp_files ();
                   3000:   /* Get the same signal again, this time not handled,
                   3001:      so its normal effect occurs.  */
                   3002:   kill (getpid (), signum);
                   3003: }
                   3004: 
                   3005: int
                   3006: main (argc, argv)
                   3007:      int argc;
                   3008:      char **argv;
                   3009: {
                   3010:   register int i;
                   3011:   int value;
                   3012:   int error_count = 0;
                   3013:   int linker_was_run = 0;
                   3014:   char *explicit_link_files;
                   3015:   char *specs_file;
                   3016: 
                   3017:   programname = argv[0];
                   3018: 
                   3019:   if (signal (SIGINT, SIG_IGN) != SIG_IGN)
                   3020:     signal (SIGINT, fatal_error);
                   3021:   if (signal (SIGHUP, SIG_IGN) != SIG_IGN)
                   3022:     signal (SIGHUP, fatal_error);
                   3023:   if (signal (SIGTERM, SIG_IGN) != SIG_IGN)
                   3024:     signal (SIGTERM, fatal_error);
                   3025: #ifdef SIGPIPE
                   3026:   if (signal (SIGPIPE, SIG_IGN) != SIG_IGN)
                   3027:     signal (SIGPIPE, fatal_error);
                   3028: #endif
                   3029: 
                   3030:   argbuf_length = 10;
                   3031:   argbuf = (char **) xmalloc (argbuf_length * sizeof (char *));
                   3032: 
                   3033:   obstack_init (&obstack);
                   3034: 
1.1.1.2   root     3035:   /* Set up to remember the pathname of gcc and any options
                   3036:      needed for collect.  */
                   3037:   obstack_init (&collect_obstack);
                   3038:   obstack_grow (&collect_obstack, "COLLECT_GCC=", sizeof ("COLLECT_GCC=")-1);
                   3039:   obstack_grow (&collect_obstack, programname, strlen (programname)+1);
                   3040:   putenv (obstack_finish (&collect_obstack));
                   3041: 
1.1       root     3042:   /* Choose directory for temp files.  */
                   3043: 
                   3044:   choose_temp_base ();
                   3045: 
                   3046:   /* Make a table of what switches there are (switches, n_switches).
                   3047:      Make a table of specified input files (infiles, n_infiles).
                   3048:      Decode switches that are handled locally.  */
                   3049: 
                   3050:   process_command (argc, argv);
                   3051: 
                   3052:   /* Initialize the vector of specs to just the default.
                   3053:      This means one element containing 0s, as a terminator.  */
                   3054: 
                   3055:   compilers = (struct compiler *) xmalloc (sizeof default_compilers);
                   3056:   bcopy (default_compilers, compilers, sizeof default_compilers);
                   3057:   n_compilers = n_default_compilers;
                   3058: 
                   3059:   /* Read specs from a file if there is one.  */
                   3060: 
                   3061:   machine_suffix = concat (spec_machine, "/", concat (spec_version, "/", ""));
                   3062: 
                   3063:   specs_file = find_a_file (&startfile_prefix, "specs", R_OK);
                   3064:   /* Read the specs file unless it is a default one.  */
                   3065:   if (specs_file != 0 && strcmp (specs_file, "specs"))
                   3066:     read_specs (specs_file);
                   3067: 
1.1.1.2   root     3068:   /* If not cross-compiling, look for startfiles in the standard places.  */
                   3069:   /* The fact that these are done here, after reading the specs file,
                   3070:      means that it cannot be found in these directories.
                   3071:      But that's okay.  It should never be there anyway.  */
                   3072:   if (!cross_compile)
                   3073:     {
                   3074: #ifdef MD_EXEC_PREFIX
                   3075:       add_prefix (&exec_prefix, md_exec_prefix, 0, 0, 0);
                   3076:       add_prefix (&startfile_prefix, md_exec_prefix, 0, 0, 0);
                   3077: #endif
                   3078: 
                   3079: #ifdef MD_STARTFILE_PREFIX
                   3080:       add_prefix (&startfile_prefix, md_startfile_prefix, 0, 0, 0);
                   3081: #endif
                   3082: 
1.1.1.3 ! root     3083: #ifdef MD_STARTFILE_PREFIX_1
        !          3084:       add_prefix (&startfile_prefix, md_startfile_prefix_1, 0, 0, 0);
        !          3085: #endif
        !          3086: 
1.1.1.2   root     3087:       add_prefix (&startfile_prefix, standard_startfile_prefix, 0, 0, 0);
                   3088:       add_prefix (&startfile_prefix, standard_startfile_prefix_1, 0, 0, 0);
                   3089:       add_prefix (&startfile_prefix, standard_startfile_prefix_2, 0, 0, 0);
                   3090: #if 0 /* Can cause surprises, and one can use -B./ instead.  */
                   3091:       add_prefix (&startfile_prefix, "./", 0, 1, 0);
                   3092: #endif
                   3093:     }
                   3094: 
1.1       root     3095:   /* Now we have the specs.
                   3096:      Set the `valid' bits for switches that match anything in any spec.  */
                   3097: 
                   3098:   validate_all_switches ();
                   3099: 
                   3100:   /* Warn about any switches that no pass was interested in.  */
                   3101: 
                   3102:   for (i = 0; i < n_switches; i++)
                   3103:     if (! switches[i].valid)
                   3104:       error ("unrecognized option `-%s'", switches[i].part1);
                   3105: 
1.1.1.3 ! root     3106:   if (print_libgcc_file_name)
        !          3107:     {
        !          3108:       printf ("%s\n", find_file ("libgcc.a"));
        !          3109:       exit (0);
        !          3110:     }
        !          3111: 
1.1       root     3112:   /* Obey some of the options.  */
                   3113: 
                   3114:   if (verbose_flag)
                   3115:     {
                   3116:       fprintf (stderr, "gcc version %s\n", version_string);
                   3117:       if (n_infiles == 0)
                   3118:        exit (0);
                   3119:     }
                   3120: 
                   3121:   if (n_infiles == 0)
                   3122:     fatal ("No input files specified.");
                   3123: 
                   3124:   /* Make a place to record the compiler output file names
                   3125:      that correspond to the input files.  */
                   3126: 
                   3127:   outfiles = (char **) xmalloc (n_infiles * sizeof (char *));
                   3128:   bzero (outfiles, n_infiles * sizeof (char *));
                   3129: 
                   3130:   /* Record which files were specified explicitly as link input.  */
                   3131: 
                   3132:   explicit_link_files = xmalloc (n_infiles);
                   3133:   bzero (explicit_link_files, n_infiles);
                   3134: 
                   3135:   for (i = 0; i < n_infiles; i++)
                   3136:     {
                   3137:       register struct compiler *cp = 0;
                   3138:       int this_file_error = 0;
                   3139: 
                   3140:       /* Tell do_spec what to substitute for %i.  */
                   3141: 
                   3142:       input_filename = infiles[i].name;
                   3143:       input_filename_length = strlen (input_filename);
                   3144:       input_file_number = i;
                   3145: 
                   3146:       /* Use the same thing in %o, unless cp->spec says otherwise.  */
                   3147: 
                   3148:       outfiles[i] = input_filename;
                   3149: 
                   3150:       /* Figure out which compiler from the file's suffix.  */
                   3151: 
                   3152:       cp = lookup_compiler (infiles[i].name, input_filename_length,
                   3153:                            infiles[i].language);
                   3154: 
                   3155:       if (cp)
                   3156:        {
                   3157:          /* Ok, we found an applicable compiler.  Run its spec.  */
                   3158:          /* First say how much of input_filename to substitute for %b  */
                   3159:          register char *p;
                   3160: 
                   3161:          input_basename = input_filename;
                   3162:          for (p = input_filename; *p; p++)
                   3163:            if (*p == '/')
                   3164:              input_basename = p + 1;
                   3165: 
                   3166:          /* Find a suffix starting with the last period,
                   3167:             and set basename_length to exclude that suffix.  */
                   3168:          basename_length = strlen (input_basename);
                   3169:          p = input_basename + basename_length;
                   3170:          while (p != input_basename && *p != '.') --p;
                   3171:          if (*p == '.' && p != input_basename)
                   3172:            {
                   3173:              basename_length = p - input_basename;
                   3174:              input_suffix = p + 1;
                   3175:            }
                   3176:          else
                   3177:            input_suffix = "";
                   3178: 
                   3179:          value = do_spec (cp->spec);
                   3180:          if (value < 0)
                   3181:            this_file_error = 1;
                   3182:        }
                   3183: 
                   3184:       /* If this file's name does not contain a recognized suffix,
                   3185:         record it as explicit linker input.  */
                   3186: 
                   3187:       else
                   3188:        explicit_link_files[i] = 1;
                   3189: 
                   3190:       /* Clear the delete-on-failure queue, deleting the files in it
                   3191:         if this compilation failed.  */
                   3192: 
                   3193:       if (this_file_error)
                   3194:        {
                   3195:          delete_failure_queue ();
                   3196:          error_count++;
                   3197:        }
                   3198:       /* If this compilation succeeded, don't delete those files later.  */
                   3199:       clear_failure_queue ();
                   3200:     }
                   3201: 
                   3202:   /* Run ld to link all the compiler output files.  */
                   3203: 
                   3204:   if (error_count == 0)
                   3205:     {
                   3206:       int tmp = execution_count;
1.1.1.2   root     3207:       int i;
                   3208:       int first_time;
                   3209: 
                   3210:       /* Rebuild the COMPILER_PATH and LIBRARY_PATH environment variables
                   3211:         for collect.  */
                   3212:       putenv_from_prefixes (&exec_prefix, "COMPILER_PATH=");
                   3213:       putenv_from_prefixes (&startfile_prefix, "LIBRARY_PATH=");
                   3214: 
                   3215:       /* Build COLLECT_GCC_OPTIONS to have all of the options specified to
                   3216:         the compiler.  */
                   3217:       obstack_grow (&collect_obstack, "COLLECT_GCC_OPTIONS=",
                   3218:                    sizeof ("COLLECT_GCC_OPTIONS=")-1);
                   3219: 
                   3220:       first_time = TRUE;
                   3221:       for (i = 0; i < n_switches; i++)
                   3222:        {
                   3223:          char **args;
                   3224:          if (!first_time)
                   3225:            obstack_grow (&collect_obstack, " ", 1);
                   3226: 
                   3227:          first_time = FALSE;
                   3228:          obstack_grow (&collect_obstack, "-", 1);
                   3229:          obstack_grow (&collect_obstack, switches[i].part1,
                   3230:                        strlen (switches[i].part1));
                   3231: 
                   3232:          for (args = switches[i].args; args && *args; args++)
                   3233:            {
                   3234:              obstack_grow (&collect_obstack, " ", 1);
                   3235:              obstack_grow (&collect_obstack, *args, strlen (*args));
                   3236:            }
                   3237:        }
                   3238:       obstack_grow (&collect_obstack, "\0", 1);
                   3239:       putenv (obstack_finish (&collect_obstack));
                   3240: 
1.1       root     3241:       value = do_spec (link_command_spec);
                   3242:       if (value < 0)
                   3243:        error_count = 1;
                   3244:       linker_was_run = (tmp != execution_count);
                   3245:     }
                   3246: 
                   3247:   /* Warn if a -B option was specified but the prefix was never used.  */
                   3248:   unused_prefix_warnings (&exec_prefix);
                   3249:   unused_prefix_warnings (&startfile_prefix);
                   3250: 
                   3251:   /* If options said don't run linker,
                   3252:      complain about input files to be given to the linker.  */
                   3253: 
                   3254:   if (! linker_was_run && error_count == 0)
                   3255:     for (i = 0; i < n_infiles; i++)
                   3256:       if (explicit_link_files[i])
                   3257:        error ("%s: linker input file unused since linking not done",
                   3258:               outfiles[i]);
                   3259: 
                   3260:   /* Delete some or all of the temporary files we made.  */
                   3261: 
                   3262:   if (error_count)
                   3263:     delete_failure_queue ();
                   3264:   delete_temp_files ();
                   3265: 
                   3266:   exit (error_count);
                   3267:   /* NOTREACHED */
                   3268:   return 0;
                   3269: }
                   3270: 
                   3271: /* Find the proper compilation spec for the file name NAME,
                   3272:    whose length is LENGTH.  LANGUAGE is the specified language,
                   3273:    or 0 if none specified.  */
                   3274: 
                   3275: static struct compiler *
                   3276: lookup_compiler (name, length, language)
                   3277:      char *name;
                   3278:      int length;
                   3279:      char *language;
                   3280: {
                   3281:   struct compiler *cp;
                   3282: 
                   3283:   /* Look for the language, if one is spec'd.  */
                   3284:   if (language != 0)
                   3285:     {
                   3286:       for (cp = compilers + n_compilers - 1; cp >= compilers; cp--)
                   3287:        {
                   3288:          if (language != 0)
                   3289:            {
                   3290:              if (cp->suffix[0] == '@'
                   3291:                  && !strcmp (cp->suffix + 1, language))
                   3292:                return cp;
                   3293:            }
                   3294:        }
                   3295:       error ("language %s not recognized", language);
                   3296:     }
                   3297: 
                   3298:   /* Look for a suffix.  */
                   3299:   for (cp = compilers + n_compilers - 1; cp >= compilers; cp--)
                   3300:     {
                   3301:       if (strlen (cp->suffix) < length
                   3302:               /* See if the suffix matches the end of NAME.  */
                   3303:               && !strcmp (cp->suffix,
                   3304:                           name + length - strlen (cp->suffix))
                   3305:               /* The suffix `-' matches only the file name `-'.  */
                   3306:               && !(!strcmp (cp->suffix, "-") && length != 1))
                   3307:        {
                   3308:          if (cp->spec[0] == '@')
                   3309:            {
                   3310:              struct compiler *new;
                   3311:              /* An alias entry maps a suffix to a language.
                   3312:                 Search for the language; pass 0 for NAME and LENGTH
                   3313:                 to avoid infinite recursion if language not found.
                   3314:                 Construct the new compiler spec.  */
                   3315:              language = cp->spec + 1;
                   3316:              new = (struct compiler *) xmalloc (sizeof (struct compiler));
                   3317:              new->suffix = cp->suffix;
                   3318:              new->spec = lookup_compiler (0, 0, language)->spec;
                   3319:              return new;
                   3320:            }
                   3321:          /* A non-alias entry: return it.  */
                   3322:          return cp;
                   3323:        }
                   3324:     }
                   3325: 
                   3326:   return 0;
                   3327: }
                   3328: 
                   3329: char *
                   3330: xmalloc (size)
                   3331:      unsigned size;
                   3332: {
                   3333:   register char *value = (char *) malloc (size);
                   3334:   if (value == 0)
                   3335:     fatal ("virtual memory exhausted");
                   3336:   return value;
                   3337: }
                   3338: 
                   3339: char *
                   3340: xrealloc (ptr, size)
                   3341:      char *ptr;
                   3342:      unsigned size;
                   3343: {
                   3344:   register char *value = (char *) realloc (ptr, size);
                   3345:   if (value == 0)
                   3346:     fatal ("virtual memory exhausted");
                   3347:   return value;
                   3348: }
                   3349: 
                   3350: /* Return a newly-allocated string whose contents concatenate those of s1, s2, s3.  */
                   3351: 
                   3352: static char *
                   3353: concat (s1, s2, s3)
                   3354:      char *s1, *s2, *s3;
                   3355: {
                   3356:   int len1 = strlen (s1), len2 = strlen (s2), len3 = strlen (s3);
                   3357:   char *result = xmalloc (len1 + len2 + len3 + 1);
                   3358: 
                   3359:   strcpy (result, s1);
                   3360:   strcpy (result + len1, s2);
                   3361:   strcpy (result + len1 + len2, s3);
                   3362:   *(result + len1 + len2 + len3) = 0;
                   3363: 
                   3364:   return result;
                   3365: }
                   3366: 
                   3367: static char *
                   3368: save_string (s, len)
                   3369:      char *s;
                   3370:      int len;
                   3371: {
                   3372:   register char *result = xmalloc (len + 1);
                   3373: 
                   3374:   bcopy (s, result, len);
                   3375:   result[len] = 0;
                   3376:   return result;
                   3377: }
                   3378: 
                   3379: static void
                   3380: pfatal_with_name (name)
                   3381:      char *name;
                   3382: {
                   3383:   char *s;
                   3384: 
                   3385:   if (errno < sys_nerr)
                   3386:     s = concat ("%s: ", sys_errlist[errno], "");
                   3387:   else
                   3388:     s = "cannot open %s";
                   3389:   fatal (s, name);
                   3390: }
                   3391: 
                   3392: static void
                   3393: perror_with_name (name)
                   3394:      char *name;
                   3395: {
                   3396:   char *s;
                   3397: 
                   3398:   if (errno < sys_nerr)
                   3399:     s = concat ("%s: ", sys_errlist[errno], "");
                   3400:   else
                   3401:     s = "cannot open %s";
                   3402:   error (s, name);
                   3403: }
                   3404: 
                   3405: static void
                   3406: perror_exec (name)
                   3407:      char *name;
                   3408: {
                   3409:   char *s;
                   3410: 
                   3411:   if (errno < sys_nerr)
                   3412:     s = concat ("installation problem, cannot exec %s: ",
                   3413:                sys_errlist[errno], "");
                   3414:   else
                   3415:     s = "installation problem, cannot exec %s";
                   3416:   error (s, name);
                   3417: }
                   3418: 
                   3419: /* More 'friendly' abort that prints the line and file.
                   3420:    config.h can #define abort fancy_abort if you like that sort of thing.  */
                   3421: 
                   3422: void
                   3423: fancy_abort ()
                   3424: {
                   3425:   fatal ("Internal gcc abort.");
                   3426: }
                   3427: 
                   3428: #ifdef HAVE_VPRINTF
                   3429: 
                   3430: /* Output an error message and exit */
                   3431: 
                   3432: static void
                   3433: fatal (va_alist)
                   3434:      va_dcl
                   3435: {
                   3436:   va_list ap;
                   3437:   char *format;
                   3438: 
                   3439:   va_start (ap);
                   3440:   format = va_arg (ap, char *);
                   3441:   fprintf (stderr, "%s: ", programname);
                   3442:   vfprintf (stderr, format, ap);
                   3443:   va_end (ap);
                   3444:   fprintf (stderr, "\n");
                   3445:   delete_temp_files ();
                   3446:   exit (1);
                   3447: }
                   3448: 
                   3449: static void
                   3450: error (va_alist)
                   3451:      va_dcl
                   3452: {
                   3453:   va_list ap;
                   3454:   char *format;
                   3455: 
                   3456:   va_start (ap);
                   3457:   format = va_arg (ap, char *);
                   3458:   fprintf (stderr, "%s: ", programname);
                   3459:   vfprintf (stderr, format, ap);
                   3460:   va_end (ap);
                   3461: 
                   3462:   fprintf (stderr, "\n");
                   3463: }
                   3464: 
                   3465: #else /* not HAVE_VPRINTF */
                   3466: 
                   3467: static void
                   3468: fatal (msg, arg1, arg2)
                   3469:      char *msg, *arg1, *arg2;
                   3470: {
                   3471:   error (msg, arg1, arg2);
                   3472:   delete_temp_files ();
                   3473:   exit (1);
                   3474: }
                   3475: 
                   3476: static void
                   3477: error (msg, arg1, arg2)
                   3478:      char *msg, *arg1, *arg2;
                   3479: {
                   3480:   fprintf (stderr, "%s: ", programname);
                   3481:   fprintf (stderr, msg, arg1, arg2);
                   3482:   fprintf (stderr, "\n");
                   3483: }
                   3484: 
                   3485: #endif /* not HAVE_VPRINTF */
                   3486: 
                   3487: 
                   3488: static void
                   3489: validate_all_switches ()
                   3490: {
                   3491:   struct compiler *comp;
                   3492:   register char *p;
                   3493:   register char c;
1.1.1.2   root     3494:   struct spec_list *spec;
1.1       root     3495: 
                   3496:   for (comp = compilers; comp->spec; comp++)
                   3497:     {
                   3498:       p = comp->spec;
                   3499:       while (c = *p++)
                   3500:        if (c == '%' && *p == '{')
                   3501:          /* We have a switch spec.  */
                   3502:          validate_switches (p + 1);
                   3503:     }
                   3504: 
1.1.1.2   root     3505:   /* look through the linked list of extra specs read from the specs file */
                   3506:   for (spec = specs ; spec ; spec = spec->next)
                   3507:     {
                   3508:       p = spec->spec;
                   3509:       while (c = *p++)
                   3510:        if (c == '%' && *p == '{')
                   3511:          /* We have a switch spec.  */
                   3512:          validate_switches (p + 1);
                   3513:     }
                   3514: 
1.1       root     3515:   p = link_command_spec;
                   3516:   while (c = *p++)
                   3517:     if (c == '%' && *p == '{')
                   3518:       /* We have a switch spec.  */
                   3519:       validate_switches (p + 1);
                   3520: 
                   3521:   /* Now notice switches mentioned in the machine-specific specs.  */
                   3522: 
                   3523:   p = asm_spec;
                   3524:   while (c = *p++)
                   3525:     if (c == '%' && *p == '{')
                   3526:       /* We have a switch spec.  */
                   3527:       validate_switches (p + 1);
                   3528: 
                   3529:   p = asm_final_spec;
                   3530:   while (c = *p++)
                   3531:     if (c == '%' && *p == '{')
                   3532:       /* We have a switch spec.  */
                   3533:       validate_switches (p + 1);
                   3534: 
                   3535:   p = cpp_spec;
                   3536:   while (c = *p++)
                   3537:     if (c == '%' && *p == '{')
                   3538:       /* We have a switch spec.  */
                   3539:       validate_switches (p + 1);
                   3540: 
                   3541:   p = signed_char_spec;
                   3542:   while (c = *p++)
                   3543:     if (c == '%' && *p == '{')
                   3544:       /* We have a switch spec.  */
                   3545:       validate_switches (p + 1);
                   3546: 
                   3547:   p = cc1_spec;
                   3548:   while (c = *p++)
                   3549:     if (c == '%' && *p == '{')
                   3550:       /* We have a switch spec.  */
                   3551:       validate_switches (p + 1);
                   3552: 
                   3553:   p = cc1plus_spec;
                   3554:   while (c = *p++)
                   3555:     if (c == '%' && *p == '{')
                   3556:       /* We have a switch spec.  */
                   3557:       validate_switches (p + 1);
                   3558: 
                   3559:   p = link_spec;
                   3560:   while (c = *p++)
                   3561:     if (c == '%' && *p == '{')
                   3562:       /* We have a switch spec.  */
                   3563:       validate_switches (p + 1);
                   3564: 
                   3565:   p = lib_spec;
                   3566:   while (c = *p++)
                   3567:     if (c == '%' && *p == '{')
                   3568:       /* We have a switch spec.  */
                   3569:       validate_switches (p + 1);
                   3570: 
                   3571:   p = startfile_spec;
                   3572:   while (c = *p++)
                   3573:     if (c == '%' && *p == '{')
                   3574:       /* We have a switch spec.  */
                   3575:       validate_switches (p + 1);
                   3576: }
                   3577: 
                   3578: /* Look at the switch-name that comes after START
                   3579:    and mark as valid all supplied switches that match it.  */
                   3580: 
                   3581: static void
                   3582: validate_switches (start)
                   3583:      char *start;
                   3584: {
                   3585:   register char *p = start;
                   3586:   char *filter;
                   3587:   register int i;
                   3588:   int suffix = 0;
                   3589: 
                   3590:   if (*p == '|')
                   3591:     ++p;
                   3592: 
                   3593:   if (*p == '!')
                   3594:     ++p;
                   3595: 
                   3596:   if (*p == '.')
                   3597:     suffix = 1, ++p;
                   3598: 
                   3599:   filter = p;
                   3600:   while (*p != ':' && *p != '}') p++;
                   3601: 
                   3602:   if (suffix)
                   3603:     ;
                   3604:   else if (p[-1] == '*')
                   3605:     {
                   3606:       /* Mark all matching switches as valid.  */
                   3607:       --p;
                   3608:       for (i = 0; i < n_switches; i++)
                   3609:        if (!strncmp (switches[i].part1, filter, p - filter))
                   3610:          switches[i].valid = 1;
                   3611:     }
                   3612:   else
                   3613:     {
                   3614:       /* Mark an exact matching switch as valid.  */
                   3615:       for (i = 0; i < n_switches; i++)
                   3616:        {
                   3617:          if (!strncmp (switches[i].part1, filter, p - filter)
                   3618:              && switches[i].part1[p - filter] == 0)
                   3619:            switches[i].valid = 1;
                   3620:        }
                   3621:     }
                   3622: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.