Annotation of gcc/gcc.c, revision 1.1.1.4

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

unix.superglobalmegacorp.com

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