X-Git-Url: https://gcc.gnu.org/git/?a=blobdiff_plain;f=gcc%2Fgcc.c;h=75d2f7eff2c136abf354e366dfdca720c21f1e38;hb=be163a70f5ae51299cf56773e9866faec985977c;hp=90da0f010d5b1c0250d5cce2cf56782f7ae71762;hpb=40f943dd9fb242ce4df8085b8427494586cd4de7;p=gcc.git diff --git a/gcc/gcc.c b/gcc/gcc.c index 90da0f010d5b..75d2f7eff2c1 100644 --- a/gcc/gcc.c +++ b/gcc/gcc.c @@ -1,5 +1,5 @@ /* Compiler driver program that can handle many languages. - Copyright (C) 1987, 89, 92-97, 1998 Free Software Foundation, Inc. + Copyright (C) 1987, 89, 92-98, 1999 Free Software Foundation, Inc. This file is part of GNU CC. @@ -32,63 +32,17 @@ Once it knows which kind of compilation to perform, the procedure for compilation is specified by a string called a "spec". */ #include "config.h" - -#ifdef __STDC__ -#include -#else -#include -#endif #include "system.h" #include -#include -#include "gansidecl.h" #include "obstack.h" - - -/* ??? Need to find a GCC header to put these in. */ -extern int pexecute PROTO ((const char *, char * const *, const char *, - const char *, char **, char **, int)); -extern int pwait PROTO ((int, int *, int)); -extern char *update_path PROTO((char *, char *)); -extern void set_std_prefix PROTO((char *, int)); -/* Flag arguments to pexecute. */ -#define PEXECUTE_FIRST 1 -#define PEXECUTE_LAST 2 -#define PEXECUTE_SEARCH 4 -#define PEXECUTE_VERBOSE 8 - -#ifndef WIFSIGNALED -#define WIFSIGNALED(S) (((S) & 0xff) != 0 && ((S) & 0xff) != 0x7f) -#endif -#ifndef WTERMSIG -#define WTERMSIG(S) ((S) & 0x7f) -#endif -#ifndef WIFEXITED -#define WIFEXITED(S) (((S) & 0xff) == 0) -#endif -#ifndef WEXITSTATUS -#define WEXITSTATUS(S) (((S) & 0xff00) >> 8) -#endif +#include "intl.h" +#include "prefix.h" #ifdef VMS #define exit __posix_exit #endif -#ifdef USG -#define vfork fork -#endif /* USG */ - -/* Test if something is a normal file. */ -#ifndef S_ISREG -#define S_ISREG(m) (((m) & S_IFMT) == S_IFREG) -#endif - -/* Test if something is a directory. */ -#ifndef S_ISDIR -#define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR) -#endif - /* By default there is no special suffix for executables. */ #ifdef EXECUTABLE_SUFFIX #define HAVE_EXECUTABLE_SUFFIX @@ -117,12 +71,10 @@ static char dir_separator_str[] = {DIR_SEPARATOR, 0}; #define obstack_chunk_alloc xmalloc #define obstack_chunk_free free -#ifndef GET_ENVIRONMENT -#define GET_ENVIRONMENT(ENV_VALUE,ENV_NAME) ENV_VALUE = getenv (ENV_NAME) +#ifndef GET_ENV_PATH_LIST +#define GET_ENV_PATH_LIST(VAR,NAME) do { (VAR) = getenv (NAME); } while (0) #endif -extern char *my_strerror PROTO((int)); - #ifndef HAVE_KILL #define kill(p,s) raise(s) #endif @@ -218,8 +170,8 @@ static struct compiler *lookup_compiler PROTO((char *, size_t, char *)); static char *build_search_list PROTO((struct path_prefix *, char *, int)); static void putenv_from_prefixes PROTO((struct path_prefix *, char *)); static char *find_a_file PROTO((struct path_prefix *, char *, int)); -static void add_prefix PROTO((struct path_prefix *, char *, char *, - int, int, int *)); +static void add_prefix PROTO((struct path_prefix *, const char *, + const char *, int, int, int *)); static char *skip_whitespace PROTO((char *)); static void record_temp_file PROTO((char *, int, int)); static void delete_if_ordinary PROTO((char *)); @@ -228,8 +180,7 @@ static void delete_failure_queue PROTO((void)); static void clear_failure_queue PROTO((void)); static int check_live_switch PROTO((int, int)); static char *handle_braces PROTO((char *)); -static char *save_string PROTO((char *, int)); -static char *concat PVPROTO((char *, ...)); +static char *save_string PROTO((const char *, int)); extern int do_spec PROTO((char *)); static int do_spec_1 PROTO((char *, int, char *)); static char *find_file PROTO((char *)); @@ -241,16 +192,18 @@ static int used_arg PROTO((char *, int)); static int default_arg PROTO((char *, int)); static void set_multilib_dir PROTO((void)); static void print_multilib_info PROTO((void)); -static void pfatal_with_name PROTO((char *)); +static void pfatal_with_name PROTO((char *)) ATTRIBUTE_NORETURN; static void perror_with_name PROTO((char *)); -static void pfatal_pexecute PROTO((char *, char *)); -static void fatal PVPROTO((char *, ...)); +static void pfatal_pexecute PROTO((char *, char *)) ATTRIBUTE_NORETURN; +static void fatal PVPROTO((char *, ...)) ATTRIBUTE_NORETURN; static void error PVPROTO((char *, ...)); +static void fatal PVPROTO((char *, ...)) + ATTRIBUTE_NORETURN ATTRIBUTE_PRINTF_1; +static void error PVPROTO((char *, ...)) ATTRIBUTE_PRINTF_1; +static void notice PVPROTO((char *, ...)); static void display_help PROTO((void)); -void fancy_abort (); -char *xmalloc (); -char *xrealloc (); +void fancy_abort PROTO((void)) ATTRIBUTE_NORETURN; #ifdef LANG_SPECIFIC_DRIVER /* Called before processing to change/add/remove arguments. */ @@ -281,12 +234,30 @@ or with constant text in a single argument. %b substitute the basename of the input file being processed. This is the substring up to (and not including) the last period and not including the directory. - %g substitute the temporary-file-name-base. This is a string chosen - once per compilation. Different temporary file names are made by - concatenation of constant strings on the end, as in `%g.s'. - %g also has the same effect of %d. - %u like %g, but make the temporary file name unique. - %U returns the last file name generated with %u. + %gSUFFIX + substitute a file name that has suffix SUFFIX and is chosen + once per compilation, and mark the argument a la %d. To reduce + exposure to denial-of-service attacks, the file name is now + chosen in a way that is hard to predict even when previously + chosen file names are known. For example, `%g.s ... %g.o ... %g.s' + might turn into `ccUVUUAU.s ccXYAXZ12.o ccUVUUAU.s'. SUFFIX matches + the regexp "[.A-Za-z]*" or the special string "%O", which is + treated exactly as if %O had been pre-processed. Previously, %g + was simply substituted with a file name chosen once per compilation, + without regard to any appended suffix (which was therefore treated + just like ordinary text), making such attacks more likely to succeed. + %uSUFFIX + like %g, but generates a new temporary file name even if %uSUFFIX + was already seen. + %USUFFIX + substitutes the last file name generated with %uSUFFIX, generating a + new one if there is no such last file name. In the absence of any + %uSUFFIX, this is just like %gSUFFIX, except they don't share + the same suffix "space", so `%g.s ... %U.s ... %g.s ... %U.s' + would involve the generation of two distinct file names, one + for each `%g.s' and another for each `%U.s'. Previously, %U was + simply substituted with a file name chosen for the previous %u, + without regard to any appended suffix. %d marks the argument containing or following the %d as a temporary file name, so that that file will be deleted if CC exits successfully. Unlike %g, this contributes no text to the argument. @@ -303,7 +274,13 @@ or with constant text in a single argument. Input files whose names have no recognized suffix are not compiled at all, but they are included among the output files, so they will be linked. - %O substitutes the suffix for object files. + %O substitutes the suffix for object files. Note that this is + handled specially when it immediately follows %g, %u, or %U, + because of the need for those to form complete file names. The + handling is such that %O is treated exactly as if it had already + been substituted, except that %g, %u, and %U do not currently + support additional SUFFIX characters following %O as they would + following, for example, `.o'. %p substitutes the standard macro predefinitions for the current target machine. Use this when running cpp. %P like %p, but puts `__' before and after the name of each macro. @@ -365,6 +342,7 @@ or with constant text in a single argument. %{S|P:X} substitutes X if either -S or -P was given to CC. This may be combined with ! and . as above binding stronger than the OR. %(Spec) processes a specification defined in a specs file as *Spec: + %[Spec] as above, but put __ around -D arguments The conditional text X in a %{S:X} or %{!S:X} construct may contain other nested % constructs or spaces, or even newlines. They are @@ -590,8 +568,10 @@ static struct compiler default_compilers[] = were not present when we built the driver, we will hit these copies and be given a more meaningful error than "file not used since linking is not done". */ - {".cc", {"#C++"}}, {".cxx", {"#C++"}}, {".cpp", {"#C++"}}, {".c++", {"#C++"}}, - {".C", {"#C++"}}, {".ads", {"#Ada"}}, {".adb", {"#Ada"}}, {".ada", {"#Ada"}}, + {".m", {"#Objective-C"}}, + {".cc", {"#C++"}}, {".cxx", {"#C++"}}, {".cpp", {"#C++"}}, + {".c++", {"#C++"}}, {".C", {"#C++"}}, + {".ads", {"#Ada"}}, {".adb", {"#Ada"}}, {".ada", {"#Ada"}}, {".f", {"#Fortran"}}, {".for", {"#Fortran"}}, {".F", {"#Fortran"}}, {".fpp", {"#Fortran"}}, {".p", {"#Pascal"}}, {".pas", {"#Pascal"}}, @@ -600,32 +580,34 @@ static struct compiler default_compilers[] = {"@c", { #if USE_CPPLIB - "%{E|M|MM:cpp -lang-c%{ansi:89} %{nostdinc*} %{C} %{v} %{A*} %{I*} %{P} %I\ + "%{E|M|MM:cpp -lang-c %{ansi:-std=c89} %{std*} %{nostdinc*}\ + %{C} %{v} %{A*} %{I*} %{P} %I\ %{C:%{!E:%eGNU C does not support -C without using -E}}\ %{M} %{MM} %{MD:-MD %b.d} %{MMD:-MMD %b.d} %{MG}\ -undef -D__GNUC__=%v1 -D__GNUC_MINOR__=%v2\ - %{ansi:-trigraphs -D__STRICT_ANSI__}\ - %{!undef:%{!ansi:%p} %P} %{trigraphs} \ + %{ansi|std=*:%{!std=gnu*:-trigraphs -D__STRICT_ANSI__}}\ + %{!undef:%{!ansi:%{!std=*:%p}%{std=gnu*:%p}} %P} %{trigraphs}\ %c %{Os:-D__OPTIMIZE_SIZE__} %{O*:%{!O0:-D__OPTIMIZE__}}\ %{traditional} %{ftraditional:-traditional}\ %{traditional-cpp:-traditional}\ + %{fleading-underscore} %{fno-leading-underscore}\ %{g*} %{W*} %{w} %{pedantic*} %{H} %{d*} %C %{D*} %{U*} %{i*} %Z\ %i %{E:%W{o*}}%{M:%W{o*}}%{MM:%W{o*}}\n}\ %{!E:%{!M:%{!MM:cc1 %i %1 \ - -lang-c%{ansi:89} %{nostdinc*} %{A*} %{I*} %I\ + %{std*} %{nostdinc*} %{A*} %{I*} %I\ %{!Q:-quiet} -dumpbase %b.c %{d*} %{m*} %{a*}\ %{MD:-MD %b.d} %{MMD:-MMD %b.d} %{MG}\ -undef -D__GNUC__=%v1 -D__GNUC_MINOR__=%v2\ - %{ansi:-trigraphs -D__STRICT_ANSI__}\ - %{!undef:%{!ansi:%p} %P} %{trigraphs} \ + %{ansi|std=*:%{!std=gnu*:-trigraphs -D__STRICT_ANSI__}}\ + %{!undef:%{!ansi:%{!std=*:%p}%{std=gnu*:%p}} %P} %{trigraphs}\ %c %{Os:-D__OPTIMIZE_SIZE__} %{O*:%{!O0:-D__OPTIMIZE__}}\ %{H} %C %{D*} %{U*} %{i*} %Z\ %{ftraditional:-traditional}\ %{traditional-cpp:-traditional}\ %{traditional} %{v:-version} %{pg:-p} %{p} %{f*}\ - %{aux-info*}\ - %{--help:--help} \ - %{g*} %{O*} %{W*} %{w} %{pedantic*} %{ansi} \ + %{aux-info*} %{Qn:-fno-ident}\ + %{--help:--help}\ + %{g*} %{O*} %{W*} %{w} %{pedantic*}\ %{pg:%{fomit-frame-pointer:%e-pg and -fomit-frame-pointer are incompatible}}\ %{S:%W{o*}%{!o*:-o %b.s}}%{!S:-o %{|!pipe:%g.s}} |\n\ %{!S:as %a %Y\ @@ -633,22 +615,24 @@ static struct compiler default_compilers[] = %{!pipe:%g.s} %A\n }}}}" }}, #else /* ! USE_CPPLIB */ - "cpp -lang-c%{ansi:89} %{nostdinc*} %{C} %{v} %{A*} %{I*} %{P} %I\ + "cpp -lang-c %{ansi:-std=c89} %{std*} %{nostdinc*}\ + %{C} %{v} %{A*} %{I*} %{P} %I\ %{C:%{!E:%eGNU C does not support -C without using -E}}\ %{M} %{MM} %{MD:-MD %b.d} %{MMD:-MMD %b.d} %{MG}\ -undef -D__GNUC__=%v1 -D__GNUC_MINOR__=%v2\ - %{ansi:-trigraphs -D__STRICT_ANSI__}\ - %{!undef:%{!ansi:%p} %P} %{trigraphs} \ + %{ansi|std=*:%{!std=gnu*:-trigraphs -D__STRICT_ANSI__}}\ + %{!undef:%{!ansi:%{!std=*:%p}%{std=gnu*:%p}} %P} %{trigraphs}\ %c %{Os:-D__OPTIMIZE_SIZE__} %{O*:%{!O0:-D__OPTIMIZE__}}\ %{traditional} %{ftraditional:-traditional}\ %{traditional-cpp:-traditional}\ + %{fleading-underscore} %{fno-leading-underscore}\ %{g*} %{W*} %{w} %{pedantic*} %{H} %{d*} %C %{D*} %{U*} %{i*} %Z\ %i %{!M:%{!MM:%{!E:%{!pipe:%g.i}}}}%{E:%W{o*}}%{M:%W{o*}}%{MM:%W{o*}} |\n", "%{!M:%{!MM:%{!E:cc1 %{!pipe:%g.i} %1 \ %{!Q:-quiet} -dumpbase %b.c %{d*} %{m*} %{a*}\ - %{g*} %{O*} %{W*} %{w} %{pedantic*} %{ansi} \ + %{g*} %{O*} %{W*} %{w} %{pedantic*} %{std*}\ %{traditional} %{v:-version} %{pg:-p} %{p} %{f*}\ - %{aux-info*}\ + %{aux-info*} %{Qn:-fno-ident}\ %{--help:--help} \ %{pg:%{fomit-frame-pointer:%e-pg and -fomit-frame-pointer are incompatible}}\ %{S:%W{o*}%{!o*:-o %b.s}}%{!S:-o %{|!pipe:%g.s}} |\n\ @@ -658,42 +642,20 @@ static struct compiler default_compilers[] = }}, #endif /* ! USE_CPPLIB */ {"-", - {"%{E:cpp -lang-c%{ansi:89} %{nostdinc*} %{C} %{v} %{A*} %{I*} %{P} %I\ + {"%{E:cpp -lang-c %{ansi:-std=c89} %{std*} %{nostdinc*}\ + %{C} %{v} %{A*} %{I*} %{P} %I\ %{C:%{!E:%eGNU C does not support -C without using -E}}\ %{M} %{MM} %{MD:-MD %b.d} %{MMD:-MMD %b.d} %{MG}\ -undef -D__GNUC__=%v1 -D__GNUC_MINOR__=%v2\ - %{ansi:-trigraphs -D__STRICT_ANSI__}\ - %{!undef:%{!ansi:%p} %P} %{trigraphs}\ + %{ansi|std=*:%{!std=gnu*:-trigraphs -D__STRICT_ANSI__}}\ + %{!undef:%{!ansi:%{!std=*:%p}%{std=gnu*:%p}} %P} %{trigraphs}\ %c %{Os:-D__OPTIMIZE_SIZE__} %{O*:%{!O0:-D__OPTIMIZE__}}\ %{traditional} %{ftraditional:-traditional}\ %{traditional-cpp:-traditional}\ + %{fleading-underscore} %{fno-leading-underscore}\ %{g*} %{W*} %{w} %{pedantic*} %{H} %{d*} %C %{D*} %{U*} %{i*} %Z\ %i %W{o*}}\ %{!E:%e-E required when input is from standard input}"}}, - {".m", {"@objective-c"}}, - {"@objective-c", - {"cpp -lang-objc %{nostdinc*} %{C} %{v} %{A*} %{I*} %{P} %I\ - %{C:%{!E:%eGNU C does not support -C without using -E}}\ - %{M} %{MM} %{MD:-MD %b.d} %{MMD:-MMD %b.d} %{MG}\ - -undef -D__OBJC__ -D__GNUC__=%v1 -D__GNUC_MINOR__=%v2\ - %{ansi:-trigraphs -D__STRICT_ANSI__}\ - %{!undef:%{!ansi:%p} %P} %{trigraphs}\ - %c %{Os:-D__OPTIMIZE_SIZE__} %{O*:%{!O0:-D__OPTIMIZE__}}\ - %{traditional} %{ftraditional:-traditional}\ - %{traditional-cpp:-traditional}\ - %{g*} %{W*} %{w} %{pedantic*} %{H} %{d*} %C %{D*} %{U*} %{i*} %Z\ - %i %{!M:%{!MM:%{!E:%{!pipe:%g.i}}}}%{E:%W{o*}}%{M:%W{o*}}%{MM:%W{o*}} |\n", - "%{!M:%{!MM:%{!E:cc1obj %{!pipe:%g.i} %1 \ - %{!Q:-quiet} -dumpbase %b.m %{d*} %{m*} %{a*}\ - %{g*} %{O*} %{W*} %{w} %{pedantic*} %{ansi} \ - %{traditional} %{v:-version} %{pg:-p} %{p} %{f*} \ - -lang-objc %{gen-decls} \ - %{aux-info*}\ - %{pg:%{fomit-frame-pointer:%e-pg and -fomit-frame-pointer are incompatible}}\ - %{S:%W{o*}%{!o*:-o %b.s}}%{!S:-o %{|!pipe:%g.s}} |\n\ - %{!S:as %a %Y\ - %{c:%W{o*}%{!o*:-o %w%b%O}}%{!c:-o %d%w%u%O}\ - %{!pipe:%g.s} %A\n }}}}"}}, {".h", {"@c-header"}}, {"@c-header", {"%{!E:%eCompilation of header file requested} \ @@ -701,19 +663,20 @@ static struct compiler default_compilers[] = %{C:%{!E:%eGNU C does not support -C without using -E}}\ %{M} %{MM} %{MD:-MD %b.d} %{MMD:-MMD %b.d} %{MG}\ -undef -D__GNUC__=%v1 -D__GNUC_MINOR__=%v2\ - %{ansi:-trigraphs -D__STRICT_ANSI__}\ - %{!undef:%{!ansi:%p} %P} %{trigraphs}\ + %{std=*:%{!std=gnu*:-trigraphs -D__STRICT_ANSI__}}\ + %{!undef:%{!std=*:%p}%{std=gnu*:%p} %P} %{trigraphs}\ %c %{Os:-D__OPTIMIZE_SIZE__} %{O*:%{!O0:-D__OPTIMIZE__}}\ %{traditional} %{ftraditional:-traditional}\ %{traditional-cpp:-traditional}\ + %{fleading-underscore} %{fno-leading-underscore}\ %{g*} %{W*} %{w} %{pedantic*} %{H} %{d*} %C %{D*} %{U*} %{i*} %Z\ %i %W{o*}"}}, {".i", {"@cpp-output"}}, {"@cpp-output", {"%{!M:%{!MM:%{!E:cc1 %i %1 %{!Q:-quiet} %{d*} %{m*} %{a*}\ - %{g*} %{O*} %{W*} %{w} %{pedantic*} %{ansi}\ + %{g*} %{O*} %{W*} %{w} %{pedantic*} %{std*}\ %{traditional} %{v:-version} %{pg:-p} %{p} %{f*}\ - %{aux-info*}\ + %{aux-info*} %{Qn:-fno-ident}\ %{pg:%{fomit-frame-pointer:%e-pg and -fomit-frame-pointer are incompatible}}\ %{S:%W{o*}%{!o*:-o %b.s}}%{!S:-o %{|!pipe:%g.s}} |\n\ %{!S:as %a %Y\ @@ -733,6 +696,7 @@ static struct compiler default_compilers[] = %c %{Os:-D__OPTIMIZE_SIZE__} %{O*:%{!O0:-D__OPTIMIZE__}}\ %{traditional} %{ftraditional:-traditional}\ %{traditional-cpp:-traditional}\ + %{fleading-underscore} %{fno-leading-underscore}\ %{g*} %{W*} %{w} %{pedantic*} %{H} %{d*} %C %{D*} %{U*} %{i*} %Z\ %i %{!M:%{!MM:%{!E:%{!pipe:%g.s}}}}%{E:%W{o*}}%{M:%W{o*}}%{MM:%W{o*}} |\n", "%{!M:%{!MM:%{!E:%{!S:as %a %Y\ @@ -833,6 +797,8 @@ struct option_map option_map[] = {"--ansi", "-ansi", 0}, {"--assemble", "-S", 0}, {"--assert", "-A", "a"}, + {"--classpath", "-fclasspath=", "aj"}, + {"--CLASSPATH", "-fCLASSPATH=", "aj"}, {"--comments", "-C", 0}, {"--compile", "-c", 0}, {"--debug", "-g", "oj"}, @@ -865,6 +831,7 @@ struct option_map option_map[] = {"--no-warnings", "-w", 0}, {"--optimize", "-O", "oj"}, {"--output", "-o", "a"}, + {"--output-class-directory", "-foutput-class-dir=", "ja"}, {"--pedantic", "-pedantic", 0}, {"--pedantic-errors", "-pedantic-errors", 0}, {"--pipe", "-pipe", 0}, @@ -885,6 +852,7 @@ struct option_map option_map[] = {"--silent", "-q", 0}, {"--specs", "-specs=", "aj"}, {"--static", "-static", 0}, + {"--std", "-std=", "aj"}, {"--symbolic", "-symbolic", 0}, {"--target", "-b", "a"}, {"--trace-includes", "-H", 0}, @@ -911,7 +879,7 @@ translate_options (argcp, argvp) int *argcp; char ***argvp; { - int i, j, k; + int i; int argc = *argcp; char **argv = *argvp; char **newv = (char **) xmalloc ((argc + 2) * 2 * sizeof (char *)); @@ -925,6 +893,7 @@ translate_options (argcp, argvp) /* Translate -- options. */ if (argv[i][0] == '-' && argv[i][1] == '-') { + size_t j; /* Find a mapping that applies to this option. */ for (j = 0; j < sizeof (option_map) / sizeof (option_map[0]); j++) { @@ -942,6 +911,7 @@ translate_options (argcp, argvp) if (arglen < optlen) { + size_t k; for (k = j + 1; k < sizeof (option_map) / sizeof (option_map[0]); k++) @@ -1064,7 +1034,7 @@ translate_options (argcp, argvp) } char * -my_strerror(e) +xstrerror(e) int e; { #ifdef HAVE_STRERROR @@ -1073,15 +1043,13 @@ my_strerror(e) #else - static char buffer[30]; if (!e) - return "cannot access"; + return "errno = 0"; if (e > 0 && e < sys_nerr) return sys_errlist[e]; - sprintf (buffer, "Unknown error %d", e); - return buffer; + return "errno = ?"; #endif } @@ -1110,7 +1078,8 @@ skip_whitespace (p) } /* Structure to keep track of the specs that have been defined so far. - These are accessed using %(specname) in a compiler or link spec. */ + These are accessed using %(specname) or %[specname] in a compiler + or link spec. */ struct spec_list { @@ -1155,7 +1124,16 @@ static struct spec_list static_specs[] = { }; #ifdef EXTRA_SPECS /* additional specs needed */ -static struct spec_list extra_specs[] = { EXTRA_SPECS }; +/* Structure to keep track of just the first two args of a spec_list. + That is all that the EXTRA_SPECS macro gives us. */ +struct spec_list_1 +{ + char *name; + char *ptr; +}; + +static struct spec_list_1 extra_specs_1[] = { EXTRA_SPECS }; +static struct spec_list * extra_specs = (struct spec_list *)0; #endif /* List of dynamically allocates specs that have been defined so far. */ @@ -1176,12 +1154,20 @@ init_spec () return; /* already initialized */ if (verbose_flag) - fprintf (stderr, "Using builtin specs.\n"); + notice ("Using builtin specs.\n"); #ifdef EXTRA_SPECS - for (i = (sizeof (extra_specs) / sizeof (extra_specs[0])) - 1; i >= 0; i--) + extra_specs = (struct spec_list *) + xmalloc (sizeof(struct spec_list) * + (sizeof(extra_specs_1)/sizeof(extra_specs_1[0]))); + bzero ((PTR) extra_specs, sizeof(struct spec_list) * + (sizeof(extra_specs_1)/sizeof(extra_specs_1[0]))); + + for (i = (sizeof(extra_specs_1) / sizeof(extra_specs_1[0])) - 1; i >= 0; i--) { sl = &extra_specs[i]; + sl->name = extra_specs_1[i].name; + sl->ptr = extra_specs_1[i].ptr; sl->next = next; sl->name_len = strlen (sl->name); sl->ptr_spec = &sl->ptr; @@ -1247,13 +1233,13 @@ set_spec (name, spec) } old_spec = *(sl->ptr_spec); - *(sl->ptr_spec) = ((spec[0] == '+' && ISSPACE (spec[1])) + *(sl->ptr_spec) = ((spec[0] == '+' && ISSPACE ((unsigned char)spec[1])) ? concat (old_spec, spec + 1, NULL_PTR) : save_string (spec, strlen (spec))); #ifdef DEBUG_SPECS if (verbose_flag) - fprintf (stderr, "Setting spec %s to '%s'\n\n", name, *(sl->ptr_spec)); + notice ("Setting spec %s to '%s'\n\n", name, *(sl->ptr_spec)); #endif /* Free the old spec */ @@ -1295,8 +1281,6 @@ static struct temp_name { int filename_length; /* strlen (filename). */ struct temp_name *next; } *temp_names; -#else -extern char *choose_temp_base PROTO((void)); #endif @@ -1453,7 +1437,7 @@ read_specs (filename, main_p) register char *p; if (verbose_flag) - fprintf (stderr, "Reading specs from %s\n", filename); + notice ("Reading specs from %s\n", filename); /* Open and stat the file. */ desc = open (filename, O_RDONLY, 0); @@ -1505,8 +1489,8 @@ read_specs (filename, main_p) p1++; if (*p1++ != '<' || p[-2] != '>') - fatal ("specs %%include syntax malformed after %d characters", - p1 - buffer + 1); + fatal ("specs %%include syntax malformed after %ld characters", + (long) (p1 - buffer + 1)); p[-2] = '\0'; new_filename = find_a_file (&startfile_prefixes, p1, R_OK); @@ -1523,15 +1507,15 @@ read_specs (filename, main_p) while (*p1 == ' ' || *p1 == '\t') p1++; if (*p1++ != '<' || p[-2] != '>') - fatal ("specs %%include syntax malformed after %d characters", - p1 - buffer + 1); + fatal ("specs %%include syntax malformed after %ld characters", + (long) (p1 - buffer + 1)); p[-2] = '\0'; new_filename = find_a_file (&startfile_prefixes, p1, R_OK); if (new_filename) read_specs (new_filename, FALSE); else if (verbose_flag) - fprintf (stderr, "Could not find specs file %s\n", p1); + notice ("Could not find specs file %s\n", p1); continue; } else if (!strncmp (p1, "%rename", sizeof "%rename" - 1) @@ -1546,35 +1530,35 @@ read_specs (filename, main_p) while (*p1 == ' ' || *p1 == '\t') p1++; - if (! ISALPHA (*p1)) - fatal ("specs %%rename syntax malformed after %d characters", - p1 - buffer); + if (! ISALPHA ((unsigned char)*p1)) + fatal ("specs %%rename syntax malformed after %ld characters", + (long) (p1 - buffer)); p2 = p1; - while (*p2 && !ISSPACE (*p2)) + while (*p2 && !ISSPACE ((unsigned char)*p2)) p2++; if (*p2 != ' ' && *p2 != '\t') - fatal ("specs %%rename syntax malformed after %d characters", - p2 - buffer); + fatal ("specs %%rename syntax malformed after %ld characters", + (long) (p2 - buffer)); name_len = p2 - p1; *p2++ = '\0'; while (*p2 == ' ' || *p2 == '\t') p2++; - if (! ISALPHA (*p2)) - fatal ("specs %%rename syntax malformed after %d characters", - p2 - buffer); + if (! ISALPHA ((unsigned char)*p2)) + fatal ("specs %%rename syntax malformed after %ld characters", + (long) (p2 - buffer)); /* Get new spec name */ p3 = p2; - while (*p3 && !ISSPACE (*p3)) + while (*p3 && !ISSPACE ((unsigned char)*p3)) p3++; if (p3 != p-1) - fatal ("specs %%rename syntax malformed after %d characters", - p3 - buffer); + fatal ("specs %%rename syntax malformed after %ld characters", + (long) (p3 - buffer)); *p3 = '\0'; for (sl = specs; sl; sl = sl->next) @@ -1589,9 +1573,9 @@ read_specs (filename, main_p) if (verbose_flag) { - fprintf (stderr, "rename spec %s to %s\n", p1, p2); + notice ("rename spec %s to %s\n", p1, p2); #ifdef DEBUG_SPECS - fprintf (stderr, "spec is '%s'\n\n", *(sl->ptr_spec)); + notice ("spec is '%s'\n\n", *(sl->ptr_spec)); #endif } @@ -1604,8 +1588,8 @@ read_specs (filename, main_p) continue; } else - fatal ("specs unknown %% command after %d characters", - p1 - buffer); + fatal ("specs unknown %% command after %ld characters", + (long) (p1 - buffer)); } /* Find the colon that should end the suffix. */ @@ -1615,7 +1599,8 @@ read_specs (filename, main_p) /* The colon shouldn't be missing. */ if (*p1 != ':') - fatal ("specs file malformed after %d characters", p1 - buffer); + fatal ("specs file malformed after %ld characters", + (long) (p1 - buffer)); /* Skip back over trailing whitespace. */ p2 = p1; @@ -1627,7 +1612,8 @@ read_specs (filename, main_p) /* Find the next line. */ p = skip_whitespace (p1 + 1); if (p[1] == 0) - fatal ("specs file malformed after %d characters", p - buffer); + fatal ("specs file malformed after %ld characters", + (long) (p - buffer)); p1 = p; /* Find next blank line or end of string. */ @@ -1864,7 +1850,7 @@ putenv (str) /* Add a new environment variable */ environ = (char **) xmalloc (sizeof (char *) * (num_envs+2)); *environ = str; - bcopy ((char *) old_environ, (char *) (environ + 1), + memcpy ((char *) (environ + 1), (char *) old_environ, sizeof (char *) * (num_envs+1)); #endif /* VMS */ @@ -1963,6 +1949,26 @@ find_a_file (pprefix, name, mode) struct prefix_list *pl; int len = pprefix->max_len + strlen (name) + strlen (file_suffix) + 1; +#ifdef DEFAULT_ASSEMBLER + if (! strcmp(name, "as") && access (DEFAULT_ASSEMBLER, mode) == 0) { + name = DEFAULT_ASSEMBLER; + len = strlen(name)+1; + temp = xmalloc (len); + strcpy (temp, name); + return temp; + } +#endif + +#ifdef DEFAULT_LINKER + if (! strcmp(name, "ld") && access (DEFAULT_LINKER, mode) == 0) { + name = DEFAULT_LINKER; + len = strlen(name)+1; + temp = xmalloc (len); + strcpy (temp, name); + return temp; + } +#endif + if (machine_suffix) len += strlen (machine_suffix); @@ -1975,7 +1981,7 @@ find_a_file (pprefix, name, mode) || (DIR_SEPARATOR == '\\' && name[1] == ':' && (name[2] == DIR_SEPARATOR || name[2] == '/'))) { - if (access (name, mode)) + if (access (name, mode) == 0) { strcpy (temp, name); return temp; @@ -2095,8 +2101,8 @@ find_a_file (pprefix, name, mode) static void add_prefix (pprefix, prefix, component, first, require_machine_suffix, warn) struct path_prefix *pprefix; - char *prefix; - char *component; + const char *prefix; + const char *component; int first; int require_machine_suffix; int *warn; @@ -2205,7 +2211,7 @@ execute () for (n_commands = 1, i = 0; i < argbuf_index; i++) if (strcmp (argbuf[i], "|") == 0) { /* each command. */ -#if defined (__MSDOS__) || (defined (_WIN32) && defined (__CYGWIN32_)) || defined (OS2) || defined (VMS) +#if defined (__MSDOS__) || defined (OS2) || defined (VMS) fatal ("-pipe not supported"); #endif argbuf[i] = 0; /* termination of command args. */ @@ -2242,7 +2248,7 @@ execute () } fflush (stderr); #ifdef DEBUG - fprintf (stderr, "\nGo ahead? (y or n) "); + notice ("\nGo ahead? (y or n) "); fflush (stderr); i = getchar (); if (i != '\n') @@ -2330,7 +2336,7 @@ execute () is a null-terminated vector containing the following arguments. The `live_cond' field is 1 if the switch is true in a conditional spec, -1 if false (overridden by a later switch), and is initialized to zero. - The `valid' field is nonzero if any spec has looked at this switch; + The `validated' field is nonzero if any spec has looked at this switch; if it remains zero at the end of the run, it must be meaningless. */ struct switchstr @@ -2338,7 +2344,7 @@ struct switchstr char *part1; char **args; int live_cond; - int valid; + int validated; }; static struct switchstr *switches; @@ -2451,6 +2457,7 @@ display_help () printf (" -save-temps Do not delete intermediate files\n"); printf (" -pipe Use pipes rather than intermediate files\n"); printf (" -specs= Override builtin specs with the contents of \n"); + printf (" -std= Assume that the input sources are for \n"); printf (" -B Add to the compiler's search paths\n"); printf (" -b Run gcc for target , if installed\n"); printf (" -V Run gcc version number , if installed\n"); @@ -2482,11 +2489,11 @@ add_preprocessor_option (option, len) if (! preprocessor_options) preprocessor_options - = (char **) xmalloc (n_preprocessor_options * sizeof (char **)); + = (char **) xmalloc (n_preprocessor_options * sizeof (char *)); else preprocessor_options = (char **) xrealloc (preprocessor_options, - n_preprocessor_options * sizeof (char **)); + n_preprocessor_options * sizeof (char *)); preprocessor_options [n_preprocessor_options - 1] = save_string (option, len); } @@ -2500,11 +2507,11 @@ add_assembler_option (option, len) if (! assembler_options) assembler_options - = (char **) xmalloc (n_assembler_options * sizeof (char **)); + = (char **) xmalloc (n_assembler_options * sizeof (char *)); else assembler_options = (char **) xrealloc (assembler_options, - n_assembler_options * sizeof (char **)); + n_assembler_options * sizeof (char *)); assembler_options [n_assembler_options - 1] = save_string (option, len); } @@ -2518,11 +2525,11 @@ add_linker_option (option, len) if (! linker_options) linker_options - = (char **) xmalloc (n_linker_options * sizeof (char **)); + = (char **) xmalloc (n_linker_options * sizeof (char *)); else linker_options = (char **) xrealloc (linker_options, - n_linker_options * sizeof (char **)); + n_linker_options * sizeof (char *)); linker_options [n_linker_options - 1] = save_string (option, len); } @@ -2543,7 +2550,7 @@ process_command (argc, argv) int have_o = 0; int lang_n_infiles = 0; - GET_ENVIRONMENT (gcc_exec_prefix, "GCC_EXEC_PREFIX"); + GET_ENV_PATH_LIST (gcc_exec_prefix, "GCC_EXEC_PREFIX"); n_switches = 0; n_infiles = 0; @@ -2566,7 +2573,7 @@ process_command (argc, argv) if (gcc_exec_prefix) { int len = strlen (gcc_exec_prefix); - if (len > sizeof ("/lib/gcc-lib/")-1 + if (len > (int) sizeof ("/lib/gcc-lib/")-1 && (gcc_exec_prefix[len-1] == '/' || gcc_exec_prefix[len-1] == DIR_SEPARATOR)) { @@ -2586,7 +2593,7 @@ process_command (argc, argv) /* COMPILER_PATH and LIBRARY_PATH have values that are lists of directory names with colons. */ - GET_ENVIRONMENT (temp, "COMPILER_PATH"); + GET_ENV_PATH_LIST (temp, "COMPILER_PATH"); if (temp) { char *startp, *endp; @@ -2620,7 +2627,7 @@ process_command (argc, argv) } } - GET_ENVIRONMENT (temp, "LIBRARY_PATH"); + GET_ENV_PATH_LIST (temp, "LIBRARY_PATH"); if (temp && *cross_compile == '0') { char *startp, *endp; @@ -2653,7 +2660,7 @@ process_command (argc, argv) } /* Use LPATH like LIBRARY_PATH (for the CMU build program). */ - GET_ENVIRONMENT (temp, "LPATH"); + GET_ENV_PATH_LIST (temp, "LPATH"); if (temp && *cross_compile == '0') { char *startp, *endp; @@ -3124,7 +3131,7 @@ process_command (argc, argv) switches[n_switches].part1 = "--help"; switches[n_switches].args = 0; switches[n_switches].live_cond = 0; - switches[n_switches].valid = 0; + switches[n_switches].validated = 0; n_switches++; } @@ -3139,7 +3146,7 @@ process_command (argc, argv) switches[n_switches].part1 = &argv[i][0]; switches[n_switches].args = 0; switches[n_switches].live_cond = 0; - switches[n_switches].valid = 0; + switches[n_switches].validated = 0; n_switches++; } else if (strncmp (argv[i], "-Wl,", 4) == 0) @@ -3238,15 +3245,15 @@ process_command (argc, argv) switches[n_switches].args = 0; switches[n_switches].live_cond = 0; - switches[n_switches].valid = 0; + switches[n_switches].validated = 0; /* This is always valid, since gcc.c itself understands it. */ if (!strcmp (p, "save-temps")) - switches[n_switches].valid = 1; + switches[n_switches].validated = 1; else { char ch = switches[n_switches].part1[0]; if (ch == 'V' || ch == 'b' || ch == 'B') - switches[n_switches].valid = 1; + switches[n_switches].validated = 1; } n_switches++; } @@ -3402,7 +3409,7 @@ do_spec_1 (spec, inswitch, soft_matched_part) if (i < n_switches) { input_from_pipe = 1; - switches[i].valid = 1; + switches[i].validated = 1; break; } else @@ -3588,7 +3595,7 @@ do_spec_1 (spec, inswitch, soft_matched_part) break; case 'e': - /* {...:%efoo} means report an error with `foo' as error message + /* %efoo means report an error with `foo' as error message and don't execute any more commands for this file. */ { char *q = p; @@ -3597,7 +3604,7 @@ do_spec_1 (spec, inswitch, soft_matched_part) buf = (char *) alloca (p - q + 1); strncpy (buf, q, p - q); buf[p - q] = 0; - error ("%s", buf); + error (buf); return -1; } break; @@ -3618,16 +3625,30 @@ do_spec_1 (spec, inswitch, soft_matched_part) That matters for the names of object files. In 2.4, do something about that. */ struct temp_name *t; + int suffix_length; char *suffix = p; - while (*p == '.' || ISALPHA (*p) - || (p[0] == '%' && p[1] == 'O')) - p++; + + if (p[0] == '%' && p[1] == 'O') + { + p += 2; + /* We don't support extra suffix characters after %O. */ + if (*p == '.' || ISALPHA ((unsigned char)*p)) + abort (); + suffix = OBJECT_SUFFIX; + suffix_length = strlen (OBJECT_SUFFIX); + } + else + { + while (*p == '.' || ISALPHA ((unsigned char)*p)) + p++; + suffix_length = p - suffix; + } /* See if we already have an association of %g/%u/%U and suffix. */ for (t = temp_names; t; t = t->next) - if (t->length == p - suffix - && strncmp (t->suffix, suffix, p - suffix) == 0 + if (t->length == suffix_length + && strncmp (t->suffix, suffix, suffix_length) == 0 && t->unique == (c != 'g')) break; @@ -3640,21 +3661,10 @@ do_spec_1 (spec, inswitch, soft_matched_part) t->next = temp_names; temp_names = t; } - if (strncmp (suffix, "%O", 2) == 0) - { - t->length = strlen(OBJECT_SUFFIX); - t->suffix = save_string (OBJECT_SUFFIX, - strlen(OBJECT_SUFFIX)); - t->unique = (c != 'g'); - temp_filename = make_temp_file (OBJECT_SUFFIX); - } - else - { - t->length = p - suffix; - t->suffix = save_string (suffix, p - suffix); - t->unique = (c != 'g'); - temp_filename = make_temp_file (suffix); - } + t->length = suffix_length; + t->suffix = save_string (suffix, suffix_length); + t->unique = (c != 'g'); + temp_filename = make_temp_file (t->suffix); temp_filename_length = strlen (temp_filename); t->filename = temp_filename; t->filename_length = temp_filename_length; @@ -3709,9 +3719,16 @@ do_spec_1 (spec, inswitch, soft_matched_part) break; case 'o': - for (i = 0; i < n_infiles; i++) - store_arg (outfiles[i], 0, 0); - break; + { + int max = n_infiles; +#ifdef LANG_SPECIFIC_DRIVER + max += lang_specific_extra_outfiles; +#endif + for (i = 0; i < max; i++) + if (outfiles[i]) + store_arg (outfiles[i], 0, 0); + break; + } case 'O': obstack_grow (&obstack, OBJECT_SUFFIX, strlen (OBJECT_SUFFIX)); @@ -3910,7 +3927,8 @@ do_spec_1 (spec, inswitch, soft_matched_part) *x++ = *y++; if (*y != '_' - || (*(y+1) != '_' && ! ISUPPER (*(y+1)))) + || (*(y+1) != '_' + && ! ISUPPER ((unsigned char)*(y+1)))) { /* Stick __ at front of macro name. */ *x++ = '_'; @@ -3952,7 +3970,8 @@ do_spec_1 (spec, inswitch, soft_matched_part) y += 2; if (*y != '_' - || (*(y+1) != '_' && ! ISUPPER (*(y+1)))) + || (*(y+1) != '_' + && ! ISUPPER ((unsigned char)*(y+1)))) { /* Stick -D__ at front of macro name. */ *x++ = '-'; @@ -4033,7 +4052,11 @@ do_spec_1 (spec, inswitch, soft_matched_part) /* Process a string found as the value of a spec given by name. This feature allows individual machine descriptions - to add and use their own specs. */ + to add and use their own specs. + %[...] modifies -D options the way %P does; + %(...) uses the spec unmodified. */ + case '[': + error ("Warning: use of obsolete %%[ operator in specs"); case '(': { char *name = p; @@ -4042,7 +4065,7 @@ do_spec_1 (spec, inswitch, soft_matched_part) /* The string after the S/P is the name of a spec that is to be processed. */ - while (*p && *p != ')') + while (*p && *p != ')' && *p != ']') p++; /* See if it's in the list */ @@ -4051,32 +4074,67 @@ do_spec_1 (spec, inswitch, soft_matched_part) { name = *(sl->ptr_spec); #ifdef DEBUG_SPECS - fprintf (stderr, "Processing spec %s, which is '%s'\n", - sl->name, name); + notice ("Processing spec %c%s%c, which is '%s'\n", + c, sl->name, (c == '(') ? ')' : ']', name); #endif break; } if (sl) { - value = do_spec_1 (name, 0, NULL_PTR); - if (value != 0) - return value; + if (c == '(') + { + value = do_spec_1 (name, 0, NULL_PTR); + if (value != 0) + return value; + } + else + { + char *x = (char *) alloca (strlen (name) * 2 + 1); + char *buf = x; + char *y = name; + int flag = 0; + + /* Copy all of NAME into BUF, but put __ after + every -D and at the end of each arg, */ + while (1) + { + if (! strncmp (y, "-D", 2)) + { + *x++ = '-'; + *x++ = 'D'; + *x++ = '_'; + *x++ = '_'; + y += 2; + flag = 1; + continue; + } + else if (flag && (*y == ' ' || *y == '\t' || *y == '=' + || *y == '}' || *y == 0)) + { + *x++ = '_'; + *x++ = '_'; + flag = 0; + } + if (*y == 0) + break; + else + *x++ = *y++; + } + *x = 0; + + value = do_spec_1 (buf, 0, NULL_PTR); + if (value != 0) + return value; + } } - /* Discard the closing paren. */ + /* Discard the closing paren or bracket. */ if (*p) p++; } break; - /* This used to be like %(, except that it modified -D options - the same way as %P. This has been obsoleted, as it was not - useful for obtaining correct ISO C semantics for defines. */ - case '[': - error ("use of obsolete %[ operator in specs"); - return -1; - case 'v': { int c1 = *p++; /* Select first or second version number. */ @@ -4215,7 +4273,7 @@ next_member: if (suffix) { int found = (input_suffix != 0 - && strlen (input_suffix) == p - filter + && (long) strlen (input_suffix) == (long)(p - filter) && strncmp (input_suffix, filter, p - filter) == 0); if (body[0] == '}') @@ -4378,7 +4436,7 @@ check_live_switch (switchnum, prefix_length) for (i = switchnum + 1; i < n_switches; i++) if (switches[i].part1[0] == 'O') { - switches[switchnum].valid = 1; + switches[switchnum].validated = 1; switches[switchnum].live_cond = -1; return 0; } @@ -4392,7 +4450,7 @@ check_live_switch (switchnum, prefix_length) if (switches[i].part1[0] == name[0] && ! strcmp (&switches[i].part1[1], &name[4])) { - switches[switchnum].valid = 1; + switches[switchnum].validated = 1; switches[switchnum].live_cond = -1; return 0; } @@ -4407,7 +4465,7 @@ check_live_switch (switchnum, prefix_length) && switches[i].part1[3] == '-' && !strcmp (&switches[i].part1[4], &name[1])) { - switches[switchnum].valid = 1; + switches[switchnum].validated = 1; switches[switchnum].live_cond = -1; return 0; } @@ -4455,7 +4513,7 @@ give_switch (switchnum, omit_first_word, include_blanks) } do_spec_1 (" ", 0, NULL_PTR); - switches[switchnum].valid = 1; + switches[switchnum].validated = 1; } /* Search for a file named NAME trying various prefixes including the @@ -4515,8 +4573,8 @@ is_directory (path1, path2, linker) /* Construct the path from the two parts. Ensure the string ends with "/.". The resulting path will be a directory even if the given path is a symbolic link. */ - bcopy (path1, path, len1); - bcopy (path2, path + len1, len2); + memcpy (path, path1, len1); + memcpy (path + len1, path2, len2); cp = path + len1 + len2; if (cp[-1] != '/' && cp[-1] != DIR_SEPARATOR) *cp++ = DIR_SEPARATOR; @@ -4569,6 +4627,12 @@ main (argc, argv) while (p != argv[0] && p[-1] != '/' && p[-1] != DIR_SEPARATOR) --p; programname = p; +#ifdef HAVE_LC_MESSAGES + setlocale (LC_MESSAGES, ""); +#endif + bindtextdomain (PACKAGE, localedir); + textdomain (PACKAGE); + if (signal (SIGINT, SIG_IGN) != SIG_IGN) signal (SIGINT, fatal_error); #ifdef SIGHUP @@ -4659,7 +4723,7 @@ main (argc, argv) sizeof ("COLLECT_GCC_OPTIONS=")-1); first_time = TRUE; - for (i = 0; i < n_switches; i++) + for (i = 0; (int)i < n_switches; i++) { char **args; char *p, *q; @@ -4830,8 +4894,8 @@ main (argc, argv) /* Warn about any switches that no pass was interested in. */ - for (i = 0; i < n_switches; i++) - if (! switches[i].valid) + for (i = 0; (int)i < n_switches; i++) + if (! switches[i].validated) error ("unrecognized option `-%s'", switches[i].part1); /* Obey some of the options. */ @@ -4902,10 +4966,10 @@ main (argc, argv) if (! strncmp (version_string, compiler_version, n) && compiler_version[n] == 0) - fprintf (stderr, "gcc version %s\n", version_string); + notice ("gcc version %s\n", version_string); else - fprintf (stderr, "gcc driver version %s executing gcc version %s\n", - version_string, compiler_version); + notice ("gcc driver version %s executing gcc version %s\n", + version_string, compiler_version); if (n_infiles == 0) exit (0); @@ -4922,14 +4986,14 @@ main (argc, argv) i += lang_specific_extra_outfiles; #endif outfiles = (char **) xmalloc (i * sizeof (char *)); - bzero ((char *) outfiles, n_infiles * sizeof (char *)); + bzero ((char *) outfiles, i * sizeof (char *)); /* Record which files were specified explicitly as link input. */ explicit_link_files = xmalloc (n_infiles); bzero (explicit_link_files, n_infiles); - for (i = 0; i < n_infiles; i++) + for (i = 0; (int)i < n_infiles; i++) { register struct compiler *cp = 0; int this_file_error = 0; @@ -5018,9 +5082,14 @@ main (argc, argv) } #ifdef LANG_SPECIFIC_DRIVER - if (error_count == 0 - && lang_specific_pre_link ()) - error_count++; + if (error_count == 0) + { + /* Make sure INPUT_FILE_NUMBER points to first available open + slot. */ + input_file_number = n_infiles; + if (lang_specific_pre_link ()) + error_count++; + } #endif /* Run ld to link all the compiler output files. */ @@ -5055,7 +5124,7 @@ main (argc, argv) complain about input files to be given to the linker. */ if (! linker_was_run && error_count == 0) - for (i = 0; i < n_infiles; i++) + for (i = 0; (int)i < n_infiles; i++) if (explicit_link_files[i]) error ("%s: linker input file unused since linking not done", outfiles[i]); @@ -5147,85 +5216,35 @@ lookup_compiler (name, length, language) return 0; } -char * +PTR xmalloc (size) - unsigned size; + size_t size; { - register char *value = (char *) malloc (size); + register PTR value = (PTR) malloc (size); if (value == 0) fatal ("virtual memory exhausted"); return value; } -char * -xrealloc (ptr, size) - char *ptr; - unsigned size; +PTR +xrealloc (old, size) + PTR old; + size_t size; { - register char *value = (char *) realloc (ptr, size); - if (value == 0) + register PTR ptr; + if (old) + ptr = (PTR) realloc (old, size); + else + ptr = (PTR) malloc (size); + if (ptr == 0) fatal ("virtual memory exhausted"); - return value; -} - -/* This function is based on the one in libiberty. */ - -static char * -concat VPROTO((char *first, ...)) -{ - register int length; - register char *newstr; - register char *end; - register char *arg; - va_list args; -#ifndef __STDC__ - char *first; -#endif - - /* First compute the size of the result and get sufficient memory. */ - - VA_START (args, first); -#ifndef __STDC__ - first = va_arg (args, char *); -#endif - - arg = first; - length = 0; - - while (arg != 0) - { - length += strlen (arg); - arg = va_arg (args, char *); - } - - newstr = (char *) xmalloc (length + 1); - va_end (args); - - /* Now copy the individual pieces to the result string. */ - - VA_START (args, first); -#ifndef __STDC__ - first = va_arg (args, char *); -#endif - - end = newstr; - arg = first; - while (arg != 0) - { - while (*arg) - *end++ = *arg++; - arg = va_arg (args, char *); - } - *end = '\000'; - va_end (args); - - return (newstr); + return ptr; } static char * save_string (s, len) - char *s; - int len; + const char *s; + int len; { register char *result = xmalloc (len + 1); @@ -5238,14 +5257,16 @@ static void pfatal_with_name (name) char *name; { - fatal ("%s: %s", name, my_strerror (errno)); + perror_with_name (name); + delete_temp_files (); + exit (1); } static void perror_with_name (name) char *name; { - error ("%s: %s", name, my_strerror (errno)); + error ("%s: %s", name, xstrerror (errno)); } static void @@ -5253,17 +5274,19 @@ pfatal_pexecute (errmsg_fmt, errmsg_arg) char *errmsg_fmt; char *errmsg_arg; { - int save_errno = errno; - if (errmsg_arg) { + int save_errno = errno; + /* Space for trailing '\0' is in %s. */ char *msg = xmalloc (strlen (errmsg_fmt) + strlen (errmsg_arg)); sprintf (msg, errmsg_fmt, errmsg_arg); errmsg_fmt = msg; + + errno = save_errno; } - fatal ("%s: %s", errmsg_fmt, my_strerror (save_errno)); + pfatal_with_name (errmsg_fmt); } /* More 'friendly' abort that prints the line and file. @@ -5278,21 +5301,21 @@ fancy_abort () /* Output an error message and exit */ static void -fatal VPROTO((char *format, ...)) +fatal VPROTO((char *msgid, ...)) { -#ifndef __STDC__ - char *format; +#ifndef ANSI_PROTOTYPES + char *msgid; #endif va_list ap; - VA_START (ap, format); + VA_START (ap, msgid); -#ifndef __STDC__ - format = va_arg (ap, char *); +#ifndef ANSI_PROTOTYPES + msgid = va_arg (ap, char *); #endif fprintf (stderr, "%s: ", programname); - vfprintf (stderr, format, ap); + vfprintf (stderr, _(msgid), ap); va_end (ap); fprintf (stderr, "\n"); delete_temp_files (); @@ -5300,25 +5323,44 @@ fatal VPROTO((char *format, ...)) } static void -error VPROTO((char *format, ...)) +error VPROTO((char *msgid, ...)) { -#ifndef __STDC__ - char *format; +#ifndef ANSI_PROTOTYPES + char *msgid; #endif va_list ap; - VA_START (ap, format); + VA_START (ap, msgid); -#ifndef __STDC__ - format = va_arg (ap, char *); +#ifndef ANSI_PROTOTYPES + msgid = va_arg (ap, char *); #endif fprintf (stderr, "%s: ", programname); - vfprintf (stderr, format, ap); + vfprintf (stderr, _(msgid), ap); va_end (ap); fprintf (stderr, "\n"); } + +static void +notice VPROTO((char *msgid, ...)) +{ +#ifndef ANSI_PROTOTYPES + char *msgid; +#endif + va_list ap; + + VA_START (ap, msgid); + +#ifndef ANSI_PROTOTYPES + msgid = va_arg (ap, char *); +#endif + + vfprintf (stderr, _(msgid), ap); + va_end (ap); +} + static void validate_all_switches () @@ -5390,7 +5432,7 @@ validate_switches (start) --p; for (i = 0; i < n_switches; i++) if (!strncmp (switches[i].part1, filter, p - filter)) - switches[i].valid = 1; + switches[i].validated = 1; } else { @@ -5399,7 +5441,7 @@ validate_switches (start) { if (!strncmp (switches[i].part1, filter, p - filter) && switches[i].part1[p - filter] == 0) - switches[i].valid = 1; + switches[i].validated = 1; } } }