summaryrefslogtreecommitdiffstats
path: root/contrib/gcc/gcc.c
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/gcc/gcc.c')
-rw-r--r--contrib/gcc/gcc.c2166
1 files changed, 893 insertions, 1273 deletions
diff --git a/contrib/gcc/gcc.c b/contrib/gcc/gcc.c
index 0b5ee4b..2800d91 100644
--- a/contrib/gcc/gcc.c
+++ b/contrib/gcc/gcc.c
@@ -1,5 +1,6 @@
/* Compiler driver program that can handle many languages.
Copyright (C) 1987, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
+ 1999, 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation,
Inc.
@@ -17,12 +18,14 @@ for more details.
You should have received a copy of the GNU General Public License
along with GCC; see the file COPYING. If not, write to the Free
-Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
-02110-1301, USA.
+Software Foundation, 59 Temple Place - Suite 330, Boston, MA
+02111-1307, USA.
This paragraph is here to try to keep Sun CC from dying.
The number of chars here seems crucial!!!! */
+/* $FreeBSD$ */
+
/* This program is the user interface to the C compiler and possibly to
other compilers. It is used because compilation is a complicated procedure
which involves running several programs and passing temporary files between
@@ -59,7 +62,7 @@ compilation is specified by a string called a "spec". */
4. If the argument takes an argument, e.g., `--baz argument1',
modify either DEFAULT_SWITCH_TAKES_ARG or
- DEFAULT_WORD_SWITCH_TAKES_ARG in gcc.h. Omit the first `-'
+ DEFAULT_WORD_SWITCH_TAKES_ARG in this file. Omit the first `-'
from `--baz'.
5. Document the option in this file's display_help(). If the
@@ -80,13 +83,18 @@ compilation is specified by a string called a "spec". */
#if ! defined( SIGCHLD ) && defined( SIGCLD )
# define SIGCHLD SIGCLD
#endif
-#include "xregex.h"
#include "obstack.h"
#include "intl.h"
#include "prefix.h"
#include "gcc.h"
#include "flags.h"
-#include "opts.h"
+
+#ifdef HAVE_SYS_RESOURCE_H
+#include <sys/resource.h>
+#endif
+#if defined (HAVE_DECL_GETRUSAGE) && !HAVE_DECL_GETRUSAGE
+extern int getrusage (int, struct rusage *);
+#endif
/* By default there is no special suffix for target executables. */
/* FIXME: when autoconf is fixed, remove the host check - dj */
@@ -214,10 +222,6 @@ static const char *target_sysroot_hdrs_suffix = 0;
static int save_temps_flag;
-/* Nonzero means pass multiple source files to the compiler at one time. */
-
-static int combine_flag = 0;
-
/* Nonzero means use pipes to communicate between subprocesses.
Overridden by either of the above two flags. */
@@ -278,9 +282,14 @@ static struct obstack obstack;
static struct obstack collect_obstack;
+/* These structs are used to collect resource usage information for
+ subprocesses. */
+#ifdef HAVE_GETRUSAGE
+static struct rusage rus, prus;
+#endif
+
/* Forward declaration for prototypes. */
struct path_prefix;
-struct prefix_list;
static void init_spec (void);
static void store_arg (const char *, int, int);
@@ -288,16 +297,14 @@ static char *load_specs (const char *);
static void read_specs (const char *, int);
static void set_spec (const char *, const char *);
static struct compiler *lookup_compiler (const char *, size_t, const char *);
-static char *build_search_list (const struct path_prefix *, const char *,
- bool, bool);
-static void putenv_from_prefixes (const struct path_prefix *, const char *,
- bool);
+static char *build_search_list (struct path_prefix *, const char *, int);
+static void putenv_from_prefixes (struct path_prefix *, const char *);
static int access_check (const char *, int);
-static char *find_a_file (const struct path_prefix *, const char *, int, bool);
+static char *find_a_file (struct path_prefix *, const char *, int, int);
static void add_prefix (struct path_prefix *, const char *, const char *,
- int, int, int);
+ int, int, int *, int);
static void add_sysrooted_prefix (struct path_prefix *, const char *,
- const char *, int, int, int);
+ const char *, int, int, int *, int);
static void translate_options (int *, const char *const **);
static char *skip_whitespace (char *);
static void delete_if_ordinary (const char *);
@@ -321,7 +328,7 @@ static int do_spec_2 (const char *);
static void do_option_spec (const char *, const char *);
static void do_self_spec (const char *);
static const char *find_file (const char *);
-static int is_directory (const char *, bool);
+static int is_directory (const char *, const char *, int);
static const char *validate_switches (const char *);
static void validate_all_switches (void);
static inline void validate_switches_from_spec (const char *);
@@ -331,7 +338,7 @@ static int default_arg (const char *, int);
static void set_multilib_dir (void);
static void print_multilib_info (void);
static void perror_with_name (const char *);
-static void fatal_ice (const char *, ...) ATTRIBUTE_PRINTF_1 ATTRIBUTE_NORETURN;
+static void pfatal_pexecute (const char *, const char *) ATTRIBUTE_NORETURN;
static void notice (const char *, ...) ATTRIBUTE_PRINTF_1;
static void display_help (void);
static void add_preprocessor_option (const char *, int);
@@ -342,7 +349,7 @@ static int execute (void);
static void alloc_args (void);
static void clear_args (void);
static void fatal_error (int);
-#if defined(ENABLE_SHARED_LIBGCC) && !defined(REAL_LIBGCC_SPEC)
+#ifdef ENABLE_SHARED_LIBGCC
static void init_gcc_specs (struct obstack *, const char *, const char *,
const char *);
#endif
@@ -352,9 +359,6 @@ static const char *convert_filename (const char *, int, int);
static const char *if_exists_spec_function (int, const char **);
static const char *if_exists_else_spec_function (int, const char **);
-static const char *replace_outfile_spec_function (int, const char **);
-static const char *version_compare_spec_function (int, const char **);
-static const char *include_spec_function (int, const char **);
/* The Specs Language
@@ -384,7 +388,7 @@ or with constant text in a single argument.
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 "[.0-9A-Za-z]*%O"; "%O" is treated exactly as if it
+ the regexp "[.A-Za-z]*%O"; "%O" is treated exactly as if it
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
@@ -443,8 +447,8 @@ or with constant text in a single argument.
SUFFIX characters following %O as they would following, for
example, `.o'.
%I Substitute any of -iprefix (made from GCC_EXEC_PREFIX), -isysroot
- (made from TARGET_SYSTEM_ROOT), -isystem (made from COMPILER_PATH
- and -B options) and -imultilib as necessary.
+ (made from TARGET_SYSTEM_ROOT), and -isystem (made from COMPILER_PATH
+ and -B options) as necessary.
%s current argument is the name of a library or startup file of some sort.
Search for that file in a standard list of directories
and substitute the full name found.
@@ -465,8 +469,8 @@ or with constant text in a single argument.
%l process LINK_SPEC as a spec.
%L process LIB_SPEC as a spec.
%G process LIBGCC_SPEC as a spec.
- %R Output the concatenation of target_system_root and
- target_sysroot_suffix.
+ %M output multilib_dir with directory separators replaced with "_";
+ if multilib_dir is not set or is ".", output "".
%S process STARTFILE_SPEC as a spec. A capital S is actually used here.
%E process ENDFILE_SPEC as a spec. A capital E is actually used here.
%C process CPP_SPEC as a spec.
@@ -595,26 +599,10 @@ proper position among the other output files. */
#define LIB_SPEC "%{!shared:%{g*:-lg} %{!p:%{!pg:-lc}}%{p:-lc_p}%{pg:-lc_p}}"
#endif
-/* mudflap specs */
-#ifndef MFWRAP_SPEC
-/* XXX: valid only for GNU ld */
-/* XXX: should exactly match hooks provided by libmudflap.a */
-#define MFWRAP_SPEC " %{static: %{fmudflap|fmudflapth: \
- --wrap=malloc --wrap=free --wrap=calloc --wrap=realloc\
- --wrap=mmap --wrap=munmap --wrap=alloca\
-} %{fmudflapth: --wrap=pthread_create\
-}} %{fmudflap|fmudflapth: --wrap=main}"
-#endif
-#ifndef MFLIB_SPEC
-#define MFLIB_SPEC "%{fmudflap|fmudflapth: -export-dynamic}"
-#endif
-
/* config.h can define LIBGCC_SPEC to override how and when libgcc.a is
included. */
#ifndef LIBGCC_SPEC
-#if defined(REAL_LIBGCC_SPEC)
-#define LIBGCC_SPEC REAL_LIBGCC_SPEC
-#elif defined(LINK_LIBGCC_SPECIAL_1)
+#if defined(LINK_LIBGCC_SPECIAL) || defined(LINK_LIBGCC_SPECIAL_1)
/* Have gcc do the search for libgcc.a. */
#define LIBGCC_SPEC "libgcc.a%s"
#else
@@ -674,14 +662,6 @@ proper position among the other output files. */
#define LINK_GCC_C_SEQUENCE_SPEC "%G %L %G"
#endif
-#ifndef LINK_SSP_SPEC
-#ifdef TARGET_LIBC_PROVIDES_SSP
-#define LINK_SSP_SPEC "%{fstack-protector:}"
-#else
-#define LINK_SSP_SPEC "%{fstack-protector|fstack-protector-all:-lssp_nonshared -lssp}"
-#endif
-#endif
-
#ifndef LINK_PIE_SPEC
#ifdef HAVE_LD_PIE
#define LINK_PIE_SPEC "%{pie:-pie} "
@@ -701,26 +681,25 @@ proper position among the other output files. */
%{!fsyntax-only:%{!c:%{!M:%{!MM:%{!E:%{!S:\
%(linker) %l " LINK_PIE_SPEC "%X %{o*} %{A} %{d} %{e*} %{m} %{N} %{n} %{r}\
%{s} %{t} %{u*} %{x} %{z} %{Z} %{!A:%{!nostdlib:%{!nostartfiles:%S}}}\
- %{static:} %{L*} %(mfwrap) %(link_libgcc) %o\
- %{fopenmp:%:include(libgomp.spec)%(link_gomp)} %(mflib)\
- %{fprofile-arcs|fprofile-generate|coverage:-lgcov}\
- %{!nostdlib:%{!nodefaultlibs:%(link_ssp) %(link_gcc_c_sequence)}}\
+ %{static:} %{L*} %(link_libgcc) %o %{fprofile-arcs|fprofile-generate:-lgcov}\
+ %{!nostdlib:%{!nodefaultlibs:%(link_gcc_c_sequence)}}\
%{!A:%{!nostdlib:%{!nostartfiles:%E}}} %{T*} }}}}}}"
#endif
#ifndef LINK_LIBGCC_SPEC
-/* Generate -L options for startfile prefix list. */
-# define LINK_LIBGCC_SPEC "%D"
+# ifdef LINK_LIBGCC_SPECIAL
+/* Don't generate -L options for startfile prefix list. */
+# define LINK_LIBGCC_SPEC ""
+# else
+/* Do generate them. */
+# define LINK_LIBGCC_SPEC "%D"
+# endif
#endif
#ifndef STARTFILE_PREFIX_SPEC
# define STARTFILE_PREFIX_SPEC ""
#endif
-#ifndef SYSROOT_SPEC
-# define SYSROOT_SPEC "--sysroot=%R"
-#endif
-
#ifndef SYSROOT_SUFFIX_SPEC
# define SYSROOT_SUFFIX_SPEC ""
#endif
@@ -734,14 +713,10 @@ static const char *cpp_spec = CPP_SPEC;
static const char *cc1_spec = CC1_SPEC;
static const char *cc1plus_spec = CC1PLUS_SPEC;
static const char *link_gcc_c_sequence_spec = LINK_GCC_C_SEQUENCE_SPEC;
-static const char *link_ssp_spec = LINK_SSP_SPEC;
static const char *asm_spec = ASM_SPEC;
static const char *asm_final_spec = ASM_FINAL_SPEC;
static const char *link_spec = LINK_SPEC;
static const char *lib_spec = LIB_SPEC;
-static const char *mfwrap_spec = MFWRAP_SPEC;
-static const char *mflib_spec = MFLIB_SPEC;
-static const char *link_gomp_spec = "";
static const char *libgcc_spec = LIBGCC_SPEC;
static const char *endfile_spec = ENDFILE_SPEC;
static const char *startfile_spec = STARTFILE_SPEC;
@@ -750,7 +725,6 @@ static const char *linker_name_spec = LINKER_NAME;
static const char *link_command_spec = LINK_COMMAND_SPEC;
static const char *link_libgcc_spec = LINK_LIBGCC_SPEC;
static const char *startfile_prefix_spec = STARTFILE_PREFIX_SPEC;
-static const char *sysroot_spec = SYSROOT_SPEC;
static const char *sysroot_suffix_spec = SYSROOT_SUFFIX_SPEC;
static const char *sysroot_hdrs_suffix_spec = SYSROOT_HEADERS_SUFFIX_SPEC;
@@ -771,14 +745,12 @@ static const char *trad_capable_cpp =
file that happens to exist is up-to-date. */
static const char *cpp_unique_options =
"%{C|CC:%{!E:%eGCC does not support -C or -CC without -E}}\
- %{!Q:-quiet} %{nostdinc*} %{C} %{CC} %{v} %{I*&F*} %{P} %I\
+ %{!Q:-quiet} %{nostdinc*} %{C} %{CC} %{v} %{I*} %{P} %I\
%{MD:-MD %{!o:%b.d}%{o*:%.d%*}}\
%{MMD:-MMD %{!o:%b.d}%{o*:%.d%*}}\
%{M} %{MM} %{MF*} %{MG} %{MP} %{MQ*} %{MT*}\
%{!E:%{!M:%{!MM:%{MD|MMD:%{o*:-MQ %*}}}}}\
%{remap} %{g3:-dD} %{H} %C %{D*&U*&A*} %{i*} %Z %i\
- %{fmudflap:-D_MUDFLAP -include mf-runtime.h}\
- %{fmudflapth:-D_MUDFLAP -D_MUDFLAPTH -include mf-runtime.h}\
%{E|M|MM:%W{o*}}";
/* This contains cpp options which are common with cc1_options and are passed
@@ -789,7 +761,7 @@ static const char *cpp_unique_options =
static const char *cpp_options =
"%(cpp_unique_options) %1 %{m*} %{std*&ansi&trigraphs} %{W*&pedantic*} %{w}\
%{f*} %{g*:%{!g0:%{!fno-working-directory:-fworking-directory}}} %{O*}\
- %{undef} %{save-temps:-fpch-preprocess}";
+ %{undef}";
/* This contains cpp options which are not passed when the preprocessor
output will be used by another program. */
@@ -805,9 +777,7 @@ static const char *cc1_options =
%{Qn:-fno-ident} %{--help:--help}\
%{--target-help:--target-help}\
%{!fsyntax-only:%{S:%W{o*}%{!o*:-o %b.s}}}\
- %{fsyntax-only:-o %j} %{-param*}\
- %{fmudflap|fmudflapth:-fno-builtin -fno-merge-constants}\
- %{coverage:-fprofile-arcs -ftest-coverage}";
+ %{fsyntax-only:-o %j} %{-param*}";
static const char *asm_options =
"%a %Y %{c:%W{o*}%{!o*:-o %w%b%O}}%{!c:-o %d%w%u%O}";
@@ -840,15 +810,7 @@ static const char *const multilib_defaults_raw[] = MULTILIB_DEFAULTS;
#define DRIVER_SELF_SPECS ""
#endif
-/* Adding -fopenmp should imply pthreads. This is particularly important
- for targets that use different start files and suchlike. */
-#ifndef GOMP_SELF_SPECS
-#define GOMP_SELF_SPECS "%{fopenmp: -pthread}"
-#endif
-
-static const char *const driver_self_specs[] = {
- DRIVER_SELF_SPECS, GOMP_SELF_SPECS
-};
+static const char *const driver_self_specs[] = { DRIVER_SELF_SPECS };
#ifndef OPTION_DEFAULT_SPECS
#define OPTION_DEFAULT_SPECS { "", "" }
@@ -902,10 +864,6 @@ struct compiler
const char *cpp_spec; /* If non-NULL, substitute this spec
for `%C', rather than the usual
cpp_spec. */
- const int combinable; /* If nonzero, compiler can deal with
- multiple source files at once (IMA). */
- const int needs_preprocessing; /* If nonzero, source files need to
- be run through a preprocessor. */
};
/* Pointer to a vector of `struct compiler' that gives the spec for
@@ -931,25 +889,19 @@ static const 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". */
- {".m", "#Objective-C", 0, 0, 0}, {".mi", "#Objective-C", 0, 0, 0},
- {".mm", "#Objective-C++", 0, 0, 0}, {".M", "#Objective-C++", 0, 0, 0},
- {".mii", "#Objective-C++", 0, 0, 0},
- {".cc", "#C++", 0, 0, 0}, {".cxx", "#C++", 0, 0, 0},
- {".cpp", "#C++", 0, 0, 0}, {".cp", "#C++", 0, 0, 0},
- {".c++", "#C++", 0, 0, 0}, {".C", "#C++", 0, 0, 0},
- {".CPP", "#C++", 0, 0, 0}, {".ii", "#C++", 0, 0, 0},
- {".ads", "#Ada", 0, 0, 0}, {".adb", "#Ada", 0, 0, 0},
- {".f", "#Fortran", 0, 0, 0}, {".for", "#Fortran", 0, 0, 0},
- {".fpp", "#Fortran", 0, 0, 0}, {".F", "#Fortran", 0, 0, 0},
- {".FOR", "#Fortran", 0, 0, 0}, {".FPP", "#Fortran", 0, 0, 0},
- {".f90", "#Fortran", 0, 0, 0}, {".f95", "#Fortran", 0, 0, 0},
- {".F90", "#Fortran", 0, 0, 0}, {".F95", "#Fortran", 0, 0, 0},
- {".r", "#Ratfor", 0, 0, 0},
- {".p", "#Pascal", 0, 0, 0}, {".pas", "#Pascal", 0, 0, 0},
- {".java", "#Java", 0, 0, 0}, {".class", "#Java", 0, 0, 0},
- {".zip", "#Java", 0, 0, 0}, {".jar", "#Java", 0, 0, 0},
+ {".m", "#Objective-C", 0}, {".mi", "#Objective-C", 0},
+ {".cc", "#C++", 0}, {".cxx", "#C++", 0}, {".cpp", "#C++", 0},
+ {".cp", "#C++", 0}, {".c++", "#C++", 0}, {".C", "#C++", 0},
+ {".CPP", "#C++", 0}, {".ii", "#C++", 0},
+ {".ads", "#Ada", 0}, {".adb", "#Ada", 0},
+ {".f", "#Fortran", 0}, {".for", "#Fortran", 0}, {".fpp", "#Fortran", 0},
+ {".F", "#Fortran", 0}, {".FOR", "#Fortran", 0}, {".FPP", "#Fortran", 0},
+ {".r", "#Ratfor", 0},
+ {".p", "#Pascal", 0}, {".pas", "#Pascal", 0},
+ {".java", "#Java", 0}, {".class", "#Java", 0},
+ {".zip", "#Java", 0}, {".jar", "#Java", 0},
/* Next come the entries for C. */
- {".c", "@c", 0, 1, 1},
+ {".c", "@c", 0},
{"@c",
/* cc1 has an integrated ISO C preprocessor. We should invoke the
external preprocessor if -save-temps is given. */
@@ -957,24 +909,17 @@ static const struct compiler default_compilers[] =
%{!E:%{!M:%{!MM:\
%{traditional|ftraditional:\
%eGNU C no longer supports -traditional without -E}\
- %{!combine:\
%{save-temps|traditional-cpp|no-integrated-cpp:%(trad_capable_cpp) \
%(cpp_options) -o %{save-temps:%b.i} %{!save-temps:%g.i} \n\
cc1 -fpreprocessed %{save-temps:%b.i} %{!save-temps:%g.i} \
%(cc1_options)}\
%{!save-temps:%{!traditional-cpp:%{!no-integrated-cpp:\
cc1 %(cpp_unique_options) %(cc1_options)}}}\
- %{!fsyntax-only:%(invoke_as)}} \
- %{combine:\
- %{save-temps|traditional-cpp|no-integrated-cpp:%(trad_capable_cpp) \
- %(cpp_options) -o %{save-temps:%b.i} %{!save-temps:%g.i}}\
- %{!save-temps:%{!traditional-cpp:%{!no-integrated-cpp:\
- cc1 %(cpp_unique_options) %(cc1_options)}}\
- %{!fsyntax-only:%(invoke_as)}}}}}}", 0, 1, 1},
+ %{!fsyntax-only:%(invoke_as)}}}}", 0},
{"-",
"%{!E:%e-E or -x required when input is from standard input}\
- %(trad_capable_cpp) %(cpp_options) %(cpp_debug_options)", 0, 0, 0},
- {".h", "@c-header", 0, 0, 0},
+ %(trad_capable_cpp) %(cpp_options) %(cpp_debug_options)", 0},
+ {".h", "@c-header", 0},
{"@c-header",
/* cc1 has an integrated ISO C preprocessor. We should invoke the
external preprocessor if -save-temps is given. */
@@ -989,14 +934,14 @@ static const struct compiler default_compilers[] =
%{!save-temps:%{!traditional-cpp:%{!no-integrated-cpp:\
cc1 %(cpp_unique_options) %(cc1_options)\
-o %g.s %{!o*:--output-pch=%i.gch}\
- %W{o*:--output-pch=%*}%V}}}}}}", 0, 0, 0},
- {".i", "@cpp-output", 0, 1, 0},
+ %W{o*:--output-pch=%*}%V}}}}}}", 0},
+ {".i", "@cpp-output", 0},
{"@cpp-output",
- "%{!M:%{!MM:%{!E:cc1 -fpreprocessed %i %(cc1_options) %{!fsyntax-only:%(invoke_as)}}}}", 0, 1, 0},
- {".s", "@assembler", 0, 1, 0},
+ "%{!M:%{!MM:%{!E:cc1 -fpreprocessed %i %(cc1_options) %{!fsyntax-only:%(invoke_as)}}}}", 0},
+ {".s", "@assembler", 0},
{"@assembler",
- "%{!M:%{!MM:%{!E:%{!S:as %(asm_debug) %(asm_options) %i %A }}}}", 0, 1, 0},
- {".S", "@assembler-with-cpp", 0, 1, 0},
+ "%{!M:%{!MM:%{!E:%{!S:as %(asm_debug) %(asm_options) %i %A }}}}", 0},
+ {".S", "@assembler-with-cpp", 0},
{"@assembler-with-cpp",
#ifdef AS_NEEDS_DASH_FOR_PIPED_INPUT
"%(trad_capable_cpp) -lang-asm %(cpp_options)\
@@ -1009,11 +954,11 @@ static const struct compiler default_compilers[] =
%{!M:%{!MM:%{!E:%{!S:-o %|.s |\n\
as %(asm_debug) %(asm_options) %m.s %A }}}}"
#endif
- , 0, 1, 0},
+ , 0},
#include "specs.h"
/* Mark end of table. */
- {0, 0, 0, 0, 0}
+ {0, 0, 0}
};
/* Number of elements in default_compilers, not counting the terminator. */
@@ -1067,7 +1012,6 @@ static const struct option_map option_map[] =
{"--classpath", "-fclasspath=", "aj"},
{"--bootclasspath", "-fbootclasspath=", "aj"},
{"--CLASSPATH", "-fclasspath=", "aj"},
- {"--combine", "-combine", 0},
{"--comments", "-C", 0},
{"--comments-in-macros", "-CC", 0},
{"--compile", "-c", 0},
@@ -1076,14 +1020,11 @@ static const struct option_map option_map[] =
{"--dependencies", "-M", 0},
{"--dump", "-d", "a"},
{"--dumpbase", "-dumpbase", "a"},
- {"--encoding", "-fencoding=", "aj"},
{"--entry", "-e", 0},
{"--extra-warnings", "-W", 0},
- {"--extdirs", "-fextdirs=", "aj"},
{"--for-assembler", "-Wa", "a"},
{"--for-linker", "-Xlinker", "a"},
{"--force-link", "-u", "a"},
- {"--coverage", "-coverage", 0},
{"--imacros", "-imacros", "a"},
{"--include", "-include", "a"},
{"--include-barrier", "-I-", 0},
@@ -1107,7 +1048,6 @@ static const struct option_map option_map[] =
{"--output", "-o", "a"},
{"--output-class-directory", "-foutput-class-dir=", "ja"},
{"--param", "--param", "a"},
- {"--pass-exit-codes", "-pass-exit-codes", 0},
{"--pedantic", "-pedantic", 0},
{"--pedantic-errors", "-pedantic-errors", 0},
{"--pie", "-pie", 0},
@@ -1133,7 +1073,6 @@ static const struct option_map option_map[] =
{"--static", "-static", 0},
{"--std", "-std=", "aj"},
{"--symbolic", "-symbolic", 0},
- {"--sysroot", "--sysroot=", "aj"},
{"--time", "-time", 0},
{"--trace-includes", "-H", 0},
{"--traditional", "-traditional", 0},
@@ -1281,7 +1220,7 @@ translate_options (int *argcp, const char *const **argvp)
else if (strchr (arginfo, '*') != 0)
{
- error ("incomplete '%s' option", option_map[j].name);
+ error ("incomplete `%s' option", option_map[j].name);
break;
}
@@ -1292,7 +1231,7 @@ translate_options (int *argcp, const char *const **argvp)
{
if (i + 1 == argc)
{
- error ("missing argument to '%s' option",
+ error ("missing argument to `%s' option",
option_map[j].name);
break;
}
@@ -1305,7 +1244,7 @@ translate_options (int *argcp, const char *const **argvp)
else if (strchr (arginfo, 'o') == 0)
{
if (arg != 0)
- error ("extraneous argument to '%s' option",
+ error ("extraneous argument to `%s' option",
option_map[j].name);
arg = 0;
}
@@ -1404,6 +1343,7 @@ struct prefix_list
struct prefix_list *next; /* Next in linked list. */
int require_machine_suffix; /* Don't use without machine_suffix. */
/* 2 means try both machine_suffix and just_machine_suffix. */
+ int *used_flag_ptr; /* 1 if a file was found with this prefix. */
int priority; /* Sort key - priority within list. */
int os_multilib; /* 1 if OS multilib scheme should be used,
0 for GCC multilib scheme. */
@@ -1448,13 +1388,6 @@ static const char *gcc_libexec_prefix;
/* Default prefixes to attach to command names. */
-#ifndef STANDARD_STARTFILE_PREFIX_1
-#define STANDARD_STARTFILE_PREFIX_1 "/lib/"
-#endif
-#ifndef STANDARD_STARTFILE_PREFIX_2
-#define STANDARD_STARTFILE_PREFIX_2 "/usr/lib/"
-#endif
-
#ifdef CROSS_COMPILE /* Don't use these prefixes for a cross compiler. */
#undef MD_EXEC_PREFIX
#undef MD_STARTFILE_PREFIX
@@ -1480,15 +1413,15 @@ static const char *md_exec_prefix = MD_EXEC_PREFIX;
static const char *md_startfile_prefix = MD_STARTFILE_PREFIX;
static const char *md_startfile_prefix_1 = MD_STARTFILE_PREFIX_1;
static const char *const standard_startfile_prefix = STANDARD_STARTFILE_PREFIX;
-static const char *const standard_startfile_prefix_1
- = STANDARD_STARTFILE_PREFIX_1;
-static const char *const standard_startfile_prefix_2
- = STANDARD_STARTFILE_PREFIX_2;
+static const char *const standard_startfile_prefix_1 = "/lib/";
+static const char *const standard_startfile_prefix_2 = "/usr/lib/";
static const char *const tooldir_base_prefix = TOOLDIR_BASE_PREFIX;
static const char *tooldir_prefix;
+#ifndef FREEBSD_NATIVE
static const char *const standard_bindir_prefix = STANDARD_BINDIR_PREFIX;
+#endif /* not FREEBSD_NATIVE */
static const char *standard_libexec_prefix = STANDARD_LIBEXEC_PREFIX;
@@ -1541,13 +1474,9 @@ static struct spec_list static_specs[] =
INIT_STATIC_SPEC ("cc1_options", &cc1_options),
INIT_STATIC_SPEC ("cc1plus", &cc1plus_spec),
INIT_STATIC_SPEC ("link_gcc_c_sequence", &link_gcc_c_sequence_spec),
- INIT_STATIC_SPEC ("link_ssp", &link_ssp_spec),
INIT_STATIC_SPEC ("endfile", &endfile_spec),
INIT_STATIC_SPEC ("link", &link_spec),
INIT_STATIC_SPEC ("lib", &lib_spec),
- INIT_STATIC_SPEC ("mfwrap", &mfwrap_spec),
- INIT_STATIC_SPEC ("mflib", &mflib_spec),
- INIT_STATIC_SPEC ("link_gomp", &link_gomp_spec),
INIT_STATIC_SPEC ("libgcc", &libgcc_spec),
INIT_STATIC_SPEC ("startfile", &startfile_spec),
INIT_STATIC_SPEC ("switches_need_spaces", &switches_need_spaces),
@@ -1565,7 +1494,6 @@ static struct spec_list static_specs[] =
INIT_STATIC_SPEC ("md_startfile_prefix", &md_startfile_prefix),
INIT_STATIC_SPEC ("md_startfile_prefix_1", &md_startfile_prefix_1),
INIT_STATIC_SPEC ("startfile_prefix_spec", &startfile_prefix_spec),
- INIT_STATIC_SPEC ("sysroot_spec", &sysroot_spec),
INIT_STATIC_SPEC ("sysroot_suffix_spec", &sysroot_suffix_spec),
INIT_STATIC_SPEC ("sysroot_hdrs_suffix_spec", &sysroot_hdrs_suffix_spec),
};
@@ -1593,12 +1521,6 @@ static const struct spec_function static_spec_functions[] =
{
{ "if-exists", if_exists_spec_function },
{ "if-exists-else", if_exists_else_spec_function },
- { "replace-outfile", replace_outfile_spec_function },
- { "version-compare", version_compare_spec_function },
- { "include", include_spec_function },
-#ifdef EXTRA_SPEC_FUNCTIONS
- EXTRA_SPEC_FUNCTIONS
-#endif
{ 0, 0 }
};
@@ -1607,42 +1529,32 @@ static int processing_spec_function;
/* Add appropriate libgcc specs to OBSTACK, taking into account
various permutations of -shared-libgcc, -shared, and such. */
-#if defined(ENABLE_SHARED_LIBGCC) && !defined(REAL_LIBGCC_SPEC)
-
-#ifndef USE_LD_AS_NEEDED
-#define USE_LD_AS_NEEDED 0
-#endif
-
+#ifdef ENABLE_SHARED_LIBGCC
static void
init_gcc_specs (struct obstack *obstack, const char *shared_name,
const char *static_name, const char *eh_name)
{
char *buf;
- buf = concat ("%{static|static-libgcc:", static_name, " ", eh_name, "}"
- "%{!static:%{!static-libgcc:"
-#if USE_LD_AS_NEEDED
- "%{!shared-libgcc:",
- static_name, " --as-needed ", shared_name, " --no-as-needed"
- "}"
- "%{shared-libgcc:",
- shared_name, "%{!shared: ", static_name, "}"
- "}"
+ buf = concat ("%{static|static-libgcc:", static_name, " ", eh_name,
+ "}%{!static:%{!static-libgcc:",
+#ifdef HAVE_LD_AS_NEEDED
+ "%{!shared-libgcc:", static_name,
+ " --as-needed ", shared_name, " --no-as-needed}"
+ "%{shared-libgcc:", shared_name, "%{!shared: ", static_name,
+ "}",
#else
- "%{!shared:"
- "%{!shared-libgcc:", static_name, " ", eh_name, "}"
- "%{shared-libgcc:", shared_name, " ", static_name, "}"
- "}"
+ "%{!shared:%{!shared-libgcc:", static_name, " ",
+ eh_name, "}%{shared-libgcc:", shared_name, " ",
+ static_name, "}}%{shared:",
#ifdef LINK_EH_SPEC
- "%{shared:"
- "%{shared-libgcc:", shared_name, "}"
- "%{!shared-libgcc:", static_name, "}"
- "}"
+ "%{shared-libgcc:", shared_name,
+ "}%{!shared-libgcc:", static_name, "}",
#else
- "%{shared:", shared_name, "}"
+ shared_name,
#endif
#endif
- "}}", NULL);
+ "}}}", NULL);
obstack_grow (obstack, buf, strlen (buf));
free (buf);
@@ -1691,7 +1603,7 @@ init_spec (void)
next = sl;
}
-#if defined(ENABLE_SHARED_LIBGCC) && !defined(REAL_LIBGCC_SPEC)
+#ifdef ENABLE_SHARED_LIBGCC
/* ??? If neither -shared-libgcc nor --static-libgcc was
seen, then we should be making an educated guess. Some proposed
heuristics for ELF include:
@@ -1730,7 +1642,11 @@ init_spec (void)
if (in_sep && *p == '-' && strncmp (p, "-lgcc", 5) == 0)
{
init_gcc_specs (&obstack,
+#ifdef NO_SHARED_LIBGCC_MULTILIB
"-lgcc_s"
+#else
+ "-lgcc_s%M"
+#endif
#ifdef USE_LIBUNWIND_EXCEPTIONS
" -lunwind"
#endif
@@ -1754,7 +1670,12 @@ init_spec (void)
/* Ug. We don't know shared library extensions. Hope that
systems that use this form don't do shared libraries. */
init_gcc_specs (&obstack,
- "-lgcc_s",
+#ifdef NO_SHARED_LIBGCC_MULTILIB
+ "-lgcc_s"
+#else
+ "-lgcc_s%M"
+#endif
+ ,
"libgcc.a%s",
"libgcc_eh.a%s"
#ifdef USE_LIBUNWIND_EXCEPTIONS
@@ -1773,7 +1694,7 @@ init_spec (void)
}
obstack_1grow (&obstack, '\0');
- libgcc_spec = XOBFINISH (&obstack, const char *);
+ libgcc_spec = obstack_finish (&obstack);
}
#endif
#ifdef USE_AS_TRADITIONAL_FORMAT
@@ -1782,14 +1703,14 @@ init_spec (void)
static const char tf[] = "--traditional-format ";
obstack_grow (&obstack, tf, sizeof(tf) - 1);
obstack_grow0 (&obstack, asm_spec, strlen (asm_spec));
- asm_spec = XOBFINISH (&obstack, const char *);
+ asm_spec = obstack_finish (&obstack);
}
#endif
#ifdef LINK_EH_SPEC
/* Prepend LINK_EH_SPEC to whatever link_spec we had before. */
obstack_grow (&obstack, LINK_EH_SPEC, sizeof(LINK_EH_SPEC) - 1);
obstack_grow0 (&obstack, link_spec, strlen (link_spec));
- link_spec = XOBFINISH (&obstack, const char *);
+ link_spec = obstack_finish (&obstack);
#endif
specs = sl;
@@ -1828,7 +1749,7 @@ set_spec (const char *name, const char *spec)
if (!sl)
{
/* Not found - make it. */
- sl = XNEW (struct spec_list);
+ sl = xmalloc (sizeof (struct spec_list));
sl->name = xstrdup (name);
sl->name_len = name_len;
sl->ptr_spec = &sl->ptr;
@@ -1869,17 +1790,6 @@ static int argbuf_length;
static int argbuf_index;
-/* Position in the argbuf array containing the name of the output file
- (the value associated with the "-o" flag). */
-
-static int have_o_argbuf_index = 0;
-
-/* Were the options -c or -S passed. */
-static int have_c = 0;
-
-/* Was the option -o passed. */
-static int have_o = 0;
-
/* This is the list of suffixes and codes (%g/%u/%U/%j) and the associated
temp file. If the HOST_BIT_BUCKET is used for %j, no entry is made for
it here. */
@@ -1911,7 +1821,7 @@ static void
alloc_args (void)
{
argbuf_length = 10;
- argbuf = XNEWVEC (const char *, argbuf_length);
+ argbuf = xmalloc (argbuf_length * sizeof (const char *));
}
/* Clear out the vector of arguments (after a command is executed). */
@@ -1938,8 +1848,6 @@ store_arg (const char *arg, int delete_always, int delete_failure)
argbuf[argbuf_index++] = arg;
argbuf[argbuf_index] = 0;
- if (strcmp (arg, "-o") == 0)
- have_o_argbuf_index = argbuf_index;
if (delete_always || delete_failure)
record_temp_file (arg, delete_always, delete_failure);
}
@@ -1970,14 +1878,14 @@ load_specs (const char *filename)
pfatal_with_name (filename);
/* Read contents of file into BUFFER. */
- buffer = XNEWVEC (char, statbuf.st_size + 1);
+ buffer = xmalloc ((unsigned) statbuf.st_size + 1);
readlen = read (desc, buffer, (unsigned) statbuf.st_size);
if (readlen < 0)
pfatal_with_name (filename);
buffer[readlen] = 0;
close (desc);
- specs = XNEWVEC (char, readlen + 1);
+ specs = xmalloc (readlen + 1);
specs_p = specs;
for (buffer_p = buffer; buffer_p && *buffer_p; buffer_p++)
{
@@ -2060,7 +1968,7 @@ read_specs (const char *filename, int main_p)
(long) (p1 - buffer + 1));
p[-2] = '\0';
- new_filename = find_a_file (&startfile_prefixes, p1, R_OK, true);
+ new_filename = find_a_file (&startfile_prefixes, p1, R_OK, 0);
read_specs (new_filename ? new_filename : p1, FALSE);
continue;
}
@@ -2079,7 +1987,7 @@ read_specs (const char *filename, int main_p)
(long) (p1 - buffer + 1));
p[-2] = '\0';
- new_filename = find_a_file (&startfile_prefixes, p1, R_OK, true);
+ new_filename = find_a_file (&startfile_prefixes, p1, R_OK, 0);
if (new_filename)
read_specs (new_filename, FALSE);
else if (verbose_flag)
@@ -2293,7 +2201,7 @@ record_temp_file (const char *filename, int always_delete, int fail_delete)
if (! strcmp (name, temp->name))
goto already1;
- temp = XNEW (struct temp_file);
+ temp = xmalloc (sizeof (struct temp_file));
temp->next = always_delete_queue;
temp->name = name;
always_delete_queue = temp;
@@ -2308,7 +2216,7 @@ record_temp_file (const char *filename, int always_delete, int fail_delete)
if (! strcmp (name, temp->name))
goto already2;
- temp = XNEW (struct temp_file);
+ temp = xmalloc (sizeof (struct temp_file));
temp->next = failure_delete_queue;
temp->name = name;
failure_delete_queue = temp;
@@ -2319,17 +2227,6 @@ record_temp_file (const char *filename, int always_delete, int fail_delete)
/* Delete all the temporary files whose names we previously recorded. */
-#ifndef DELETE_IF_ORDINARY
-#define DELETE_IF_ORDINARY(NAME,ST,VERBOSE_FLAG) \
-do \
- { \
- if (stat (NAME, &ST) >= 0 && S_ISREG (ST.st_mode)) \
- if (unlink (NAME) < 0) \
- if (VERBOSE_FLAG) \
- perror_with_name (NAME); \
- } while (0)
-#endif
-
static void
delete_if_ordinary (const char *name)
{
@@ -2346,7 +2243,10 @@ delete_if_ordinary (const char *name)
if (i == 'y' || i == 'Y')
#endif /* DEBUG */
- DELETE_IF_ORDINARY (name, st, verbose_flag);
+ if (stat (name, &st) >= 0 && S_ISREG (st.st_mode))
+ if (unlink (name) < 0)
+ if (verbose_flag)
+ perror_with_name (name);
}
static void
@@ -2376,226 +2276,76 @@ clear_failure_queue (void)
failure_delete_queue = 0;
}
-/* Call CALLBACK for each path in PATHS, breaking out early if CALLBACK
- returns non-NULL.
- If DO_MULTI is true iterate over the paths twice, first with multilib
- suffix then without, otherwise iterate over the paths once without
- adding a multilib suffix. When DO_MULTI is true, some attempt is made
- to avoid visiting the same path twice, but we could do better. For
- instance, /usr/lib/../lib is considered different from /usr/lib.
- At least EXTRA_SPACE chars past the end of the path passed to
- CALLBACK are available for use by the callback.
- CALLBACK_INFO allows extra parameters to be passed to CALLBACK.
-
- Returns the value returned by CALLBACK. */
-
-static void *
-for_each_path (const struct path_prefix *paths,
- bool do_multi,
- size_t extra_space,
- void *(*callback) (char *, void *),
- void *callback_info)
+/* Build a list of search directories from PATHS.
+ PREFIX is a string to prepend to the list.
+ If CHECK_DIR_P is nonzero we ensure the directory exists.
+ This is used mostly by putenv_from_prefixes so we use `collect_obstack'.
+ It is also used by the --print-search-dirs flag. */
+
+static char *
+build_search_list (struct path_prefix *paths, const char *prefix,
+ int check_dir_p)
{
- struct prefix_list *pl;
- const char *multi_dir = NULL;
- const char *multi_os_dir = NULL;
- const char *multi_suffix;
- const char *just_multi_suffix;
- char *path = NULL;
- void *ret = NULL;
- bool skip_multi_dir = false;
- bool skip_multi_os_dir = false;
-
- multi_suffix = machine_suffix;
- just_multi_suffix = just_machine_suffix;
- if (do_multi && multilib_dir && strcmp (multilib_dir, ".") != 0)
- {
- multi_dir = concat (multilib_dir, dir_separator_str, NULL);
- multi_suffix = concat (multi_suffix, multi_dir, NULL);
- just_multi_suffix = concat (just_multi_suffix, multi_dir, NULL);
- }
- if (do_multi && multilib_os_dir && strcmp (multilib_os_dir, ".") != 0)
- multi_os_dir = concat (multilib_os_dir, dir_separator_str, NULL);
+ int suffix_len = (machine_suffix) ? strlen (machine_suffix) : 0;
+ int just_suffix_len
+ = (just_machine_suffix) ? strlen (just_machine_suffix) : 0;
+ int first_time = TRUE;
+ struct prefix_list *pprefix;
- while (1)
+ obstack_grow (&collect_obstack, prefix, strlen (prefix));
+ obstack_1grow (&collect_obstack, '=');
+
+ for (pprefix = paths->plist; pprefix != 0; pprefix = pprefix->next)
{
- size_t multi_dir_len = 0;
- size_t multi_os_dir_len = 0;
- size_t suffix_len;
- size_t just_suffix_len;
- size_t len;
-
- if (multi_dir)
- multi_dir_len = strlen (multi_dir);
- if (multi_os_dir)
- multi_os_dir_len = strlen (multi_os_dir);
- suffix_len = strlen (multi_suffix);
- just_suffix_len = strlen (just_multi_suffix);
-
- if (path == NULL)
- {
- len = paths->max_len + extra_space + 1;
- if (suffix_len > multi_os_dir_len)
- len += suffix_len;
- else
- len += multi_os_dir_len;
- path = XNEWVEC (char, len);
- }
+ int len = strlen (pprefix->prefix);
- for (pl = paths->plist; pl != 0; pl = pl->next)
+ if (machine_suffix
+ && (! check_dir_p
+ || is_directory (pprefix->prefix, machine_suffix, 0)))
{
- len = strlen (pl->prefix);
- memcpy (path, pl->prefix, len);
-
- /* Look first in MACHINE/VERSION subdirectory. */
- if (!skip_multi_dir)
- {
- memcpy (path + len, multi_suffix, suffix_len + 1);
- ret = callback (path, callback_info);
- if (ret)
- break;
- }
-
- /* Some paths are tried with just the machine (ie. target)
- subdir. This is used for finding as, ld, etc. */
- if (!skip_multi_dir
- && pl->require_machine_suffix == 2)
- {
- memcpy (path + len, just_multi_suffix, just_suffix_len + 1);
- ret = callback (path, callback_info);
- if (ret)
- break;
- }
-
- /* Now try the base path. */
- if (!pl->require_machine_suffix
- && !(pl->os_multilib ? skip_multi_os_dir : skip_multi_dir))
- {
- const char *this_multi;
- size_t this_multi_len;
-
- if (pl->os_multilib)
- {
- this_multi = multi_os_dir;
- this_multi_len = multi_os_dir_len;
- }
- else
- {
- this_multi = multi_dir;
- this_multi_len = multi_dir_len;
- }
-
- if (this_multi_len)
- memcpy (path + len, this_multi, this_multi_len + 1);
- else
- path[len] = '\0';
+ if (!first_time)
+ obstack_1grow (&collect_obstack, PATH_SEPARATOR);
- ret = callback (path, callback_info);
- if (ret)
- break;
- }
+ first_time = FALSE;
+ obstack_grow (&collect_obstack, pprefix->prefix, len);
+ obstack_grow (&collect_obstack, machine_suffix, suffix_len);
}
- if (pl)
- break;
- if (multi_dir == NULL && multi_os_dir == NULL)
- break;
-
- /* Run through the paths again, this time without multilibs.
- Don't repeat any we have already seen. */
- if (multi_dir)
+ if (just_machine_suffix
+ && pprefix->require_machine_suffix == 2
+ && (! check_dir_p
+ || is_directory (pprefix->prefix, just_machine_suffix, 0)))
{
- free ((char *) multi_dir);
- multi_dir = NULL;
- free ((char *) multi_suffix);
- multi_suffix = machine_suffix;
- free ((char *) just_multi_suffix);
- just_multi_suffix = just_machine_suffix;
+ if (! first_time)
+ obstack_1grow (&collect_obstack, PATH_SEPARATOR);
+
+ first_time = FALSE;
+ obstack_grow (&collect_obstack, pprefix->prefix, len);
+ obstack_grow (&collect_obstack, just_machine_suffix,
+ just_suffix_len);
}
- else
- skip_multi_dir = true;
- if (multi_os_dir)
+
+ if (! pprefix->require_machine_suffix)
{
- free ((char *) multi_os_dir);
- multi_os_dir = NULL;
- }
- else
- skip_multi_os_dir = true;
- }
+ if (! first_time)
+ obstack_1grow (&collect_obstack, PATH_SEPARATOR);
- if (multi_dir)
- {
- free ((char *) multi_dir);
- free ((char *) multi_suffix);
- free ((char *) just_multi_suffix);
+ first_time = FALSE;
+ obstack_grow (&collect_obstack, pprefix->prefix, len);
+ }
}
- if (multi_os_dir)
- free ((char *) multi_os_dir);
- if (ret != path)
- free (path);
- return ret;
-}
-
-/* Callback for build_search_list. Adds path to obstack being built. */
-
-struct add_to_obstack_info {
- struct obstack *ob;
- bool check_dir;
- bool first_time;
-};
-
-static void *
-add_to_obstack (char *path, void *data)
-{
- struct add_to_obstack_info *info = data;
-
- if (info->check_dir && !is_directory (path, false))
- return NULL;
-
- if (!info->first_time)
- obstack_1grow (info->ob, PATH_SEPARATOR);
-
- obstack_grow (info->ob, path, strlen (path));
-
- info->first_time = false;
- return NULL;
-}
-
-/* Build a list of search directories from PATHS.
- PREFIX is a string to prepend to the list.
- If CHECK_DIR_P is true we ensure the directory exists.
- If DO_MULTI is true, multilib paths are output first, then
- non-multilib paths.
- This is used mostly by putenv_from_prefixes so we use `collect_obstack'.
- It is also used by the --print-search-dirs flag. */
-
-static char *
-build_search_list (const struct path_prefix *paths, const char *prefix,
- bool check_dir, bool do_multi)
-{
- struct add_to_obstack_info info;
-
- info.ob = &collect_obstack;
- info.check_dir = check_dir;
- info.first_time = true;
-
- obstack_grow (&collect_obstack, prefix, strlen (prefix));
- obstack_1grow (&collect_obstack, '=');
-
- for_each_path (paths, do_multi, 0, add_to_obstack, &info);
obstack_1grow (&collect_obstack, '\0');
- return XOBFINISH (&collect_obstack, char *);
+ return obstack_finish (&collect_obstack);
}
/* Rebuild the COMPILER_PATH and LIBRARY_PATH environment variables
for collect. */
static void
-putenv_from_prefixes (const struct path_prefix *paths, const char *env_var,
- bool do_multi)
+putenv_from_prefixes (struct path_prefix *paths, const char *env_var)
{
- putenv (build_search_list (paths, env_var, true, do_multi));
+ putenv (build_search_list (paths, env_var, 1));
}
/* Check whether NAME can be accessed in MODE. This is like access,
@@ -2616,53 +2366,20 @@ access_check (const char *name, int mode)
return access (name, mode);
}
-/* Callback for find_a_file. Appends the file name to the directory
- path. If the resulting file exists in the right mode, return the
- full pathname to the file. */
-
-struct file_at_path_info {
- const char *name;
- const char *suffix;
- int name_len;
- int suffix_len;
- int mode;
-};
-
-static void *
-file_at_path (char *path, void *data)
-{
- struct file_at_path_info *info = data;
- size_t len = strlen (path);
-
- memcpy (path + len, info->name, info->name_len);
- len += info->name_len;
-
- /* Some systems have a suffix for executable files.
- So try appending that first. */
- if (info->suffix_len)
- {
- memcpy (path + len, info->suffix, info->suffix_len + 1);
- if (access_check (path, info->mode) == 0)
- return path;
- }
-
- path[len] = '\0';
- if (access_check (path, info->mode) == 0)
- return path;
-
- return NULL;
-}
-
/* Search for NAME using the prefix list PREFIXES. MODE is passed to
- access to check permissions. If DO_MULTI is true, search multilib
- paths then non-multilib paths, otherwise do not search multilib paths.
+ access to check permissions.
Return 0 if not found, otherwise return its name, allocated with malloc. */
static char *
-find_a_file (const struct path_prefix *pprefix, const char *name, int mode,
- bool do_multi)
+find_a_file (struct path_prefix *pprefix, const char *name, int mode,
+ int multilib)
{
- struct file_at_path_info info;
+ char *temp;
+ const char *const file_suffix =
+ ((mode & X_OK) != 0 ? HOST_EXECUTABLE_SUFFIX : "");
+ struct prefix_list *pl;
+ int len = pprefix->max_len + strlen (name) + strlen (file_suffix) + 1;
+ const char *multilib_name, *multilib_os_name;
#ifdef DEFAULT_ASSEMBLER
if (! strcmp (name, "as") && access (DEFAULT_ASSEMBLER, mode) == 0)
@@ -2674,24 +2391,136 @@ find_a_file (const struct path_prefix *pprefix, const char *name, int mode,
return xstrdup (DEFAULT_LINKER);
#endif
+ if (machine_suffix)
+ len += strlen (machine_suffix);
+
+ multilib_name = name;
+ multilib_os_name = name;
+ if (multilib && multilib_os_dir)
+ {
+ int len1 = multilib_dir ? strlen (multilib_dir) + 1 : 0;
+ int len2 = strlen (multilib_os_dir) + 1;
+
+ len += len1 > len2 ? len1 : len2;
+ if (multilib_dir)
+ multilib_name = ACONCAT ((multilib_dir, dir_separator_str, name,
+ NULL));
+ if (strcmp (multilib_os_dir, ".") != 0)
+ multilib_os_name = ACONCAT ((multilib_os_dir, dir_separator_str, name,
+ NULL));
+ }
+
+ temp = xmalloc (len);
+
/* Determine the filename to execute (special case for absolute paths). */
if (IS_ABSOLUTE_PATH (name))
{
if (access (name, mode) == 0)
- return xstrdup (name);
-
- return NULL;
+ {
+ strcpy (temp, name);
+ return temp;
+ }
}
+ else
+ for (pl = pprefix->plist; pl; pl = pl->next)
+ {
+ const char *this_name
+ = pl->os_multilib ? multilib_os_name : multilib_name;
+
+ if (machine_suffix)
+ {
+ /* Some systems have a suffix for executable files.
+ So try appending that first. */
+ if (file_suffix[0] != 0)
+ {
+ strcpy (temp, pl->prefix);
+ strcat (temp, machine_suffix);
+ strcat (temp, multilib_name);
+ strcat (temp, file_suffix);
+ if (access_check (temp, mode) == 0)
+ {
+ if (pl->used_flag_ptr != 0)
+ *pl->used_flag_ptr = 1;
+ return temp;
+ }
+ }
+
+ /* Now try just the multilib_name. */
+ strcpy (temp, pl->prefix);
+ strcat (temp, machine_suffix);
+ strcat (temp, multilib_name);
+ if (access_check (temp, mode) == 0)
+ {
+ if (pl->used_flag_ptr != 0)
+ *pl->used_flag_ptr = 1;
+ return temp;
+ }
+ }
+
+ /* Certain prefixes are tried with just the machine type,
+ not the version. This is used for finding as, ld, etc. */
+ if (just_machine_suffix && pl->require_machine_suffix == 2)
+ {
+ /* Some systems have a suffix for executable files.
+ So try appending that first. */
+ if (file_suffix[0] != 0)
+ {
+ strcpy (temp, pl->prefix);
+ strcat (temp, just_machine_suffix);
+ strcat (temp, multilib_name);
+ strcat (temp, file_suffix);
+ if (access_check (temp, mode) == 0)
+ {
+ if (pl->used_flag_ptr != 0)
+ *pl->used_flag_ptr = 1;
+ return temp;
+ }
+ }
+
+ strcpy (temp, pl->prefix);
+ strcat (temp, just_machine_suffix);
+ strcat (temp, multilib_name);
+ if (access_check (temp, mode) == 0)
+ {
+ if (pl->used_flag_ptr != 0)
+ *pl->used_flag_ptr = 1;
+ return temp;
+ }
+ }
+
+ /* Certain prefixes can't be used without the machine suffix
+ when the machine or version is explicitly specified. */
+ if (! pl->require_machine_suffix)
+ {
+ /* Some systems have a suffix for executable files.
+ So try appending that first. */
+ if (file_suffix[0] != 0)
+ {
+ strcpy (temp, pl->prefix);
+ strcat (temp, this_name);
+ strcat (temp, file_suffix);
+ if (access_check (temp, mode) == 0)
+ {
+ if (pl->used_flag_ptr != 0)
+ *pl->used_flag_ptr = 1;
+ return temp;
+ }
+ }
- info.name = name;
- info.suffix = (mode & X_OK) != 0 ? HOST_EXECUTABLE_SUFFIX : "";
- info.name_len = strlen (info.name);
- info.suffix_len = strlen (info.suffix);
- info.mode = mode;
+ strcpy (temp, pl->prefix);
+ strcat (temp, this_name);
+ if (access_check (temp, mode) == 0)
+ {
+ if (pl->used_flag_ptr != 0)
+ *pl->used_flag_ptr = 1;
+ return temp;
+ }
+ }
+ }
- return for_each_path (pprefix, do_multi, info.name_len + info.suffix_len,
- file_at_path, &info);
+ free (temp);
+ return 0;
}
/* Ranking of prefixes in the sort list. -B prefixes are put before
@@ -2720,7 +2549,7 @@ enum path_prefix_priority
static void
add_prefix (struct path_prefix *pprefix, const char *prefix,
const char *component, /* enum prefix_priority */ int priority,
- int require_machine_suffix, int os_multilib)
+ int require_machine_suffix, int *warn, int os_multilib)
{
struct prefix_list *pl, **prev;
int len;
@@ -2737,11 +2566,14 @@ add_prefix (struct path_prefix *pprefix, const char *prefix,
if (len > pprefix->max_len)
pprefix->max_len = len;
- pl = XNEW (struct prefix_list);
+ pl = xmalloc (sizeof (struct prefix_list));
pl->prefix = prefix;
pl->require_machine_suffix = require_machine_suffix;
+ pl->used_flag_ptr = warn;
pl->priority = priority;
pl->os_multilib = os_multilib;
+ if (warn)
+ *warn = 0;
/* Insert after PREV. */
pl->next = (*prev);
@@ -2753,10 +2585,10 @@ static void
add_sysrooted_prefix (struct path_prefix *pprefix, const char *prefix,
const char *component,
/* enum prefix_priority */ int priority,
- int require_machine_suffix, int os_multilib)
+ int require_machine_suffix, int *warn, int os_multilib)
{
if (!IS_ABSOLUTE_PATH (prefix))
- fatal ("system path '%s' is not absolute", prefix);
+ abort ();
if (target_system_root)
{
@@ -2770,7 +2602,7 @@ add_sysrooted_prefix (struct path_prefix *pprefix, const char *prefix,
}
add_prefix (pprefix, prefix, component, priority,
- require_machine_suffix, os_multilib);
+ require_machine_suffix, warn, os_multilib);
}
/* Execute the command specified by the arguments on the current line of spec.
@@ -2785,16 +2617,17 @@ execute (void)
int i;
int n_commands; /* # of command. */
char *string;
- struct pex_obj *pex;
struct command
{
const char *prog; /* program name. */
const char **argv; /* vector of args. */
+ int pid; /* pid of process for this command. */
};
struct command *commands; /* each command buffer with above info. */
- gcc_assert (!processing_spec_function);
+ if (processing_spec_function)
+ abort ();
/* Count # of piped commands. */
for (n_commands = 1, i = 0; i < argbuf_index; i++)
@@ -2810,7 +2643,7 @@ execute (void)
commands[0].prog = argbuf[0]; /* first command. */
commands[0].argv = &argbuf[0];
- string = find_a_file (&exec_prefixes, commands[0].prog, X_OK, false);
+ string = find_a_file (&exec_prefixes, commands[0].prog, X_OK, 0);
if (string)
commands[0].argv[0] = string;
@@ -2825,7 +2658,7 @@ execute (void)
commands[n_commands].prog = argbuf[i + 1];
commands[n_commands].argv = &argbuf[i + 1];
string = find_a_file (&exec_prefixes, commands[n_commands].prog,
- X_OK, false);
+ X_OK, 0);
if (string)
commands[n_commands].argv[0] = string;
n_commands++;
@@ -2922,32 +2755,24 @@ execute (void)
/* Run each piped subprocess. */
- pex = pex_init (PEX_USE_PIPES | (report_times ? PEX_RECORD_TIMES : 0),
- programname, temp_filename);
- if (pex == NULL)
- pfatal_with_name (_("pex_init failed"));
-
for (i = 0; i < n_commands; i++)
{
- const char *errmsg;
- int err;
+ char *errmsg_fmt, *errmsg_arg;
const char *string = commands[i].argv[0];
- errmsg = pex_run (pex,
- ((i + 1 == n_commands ? PEX_LAST : 0)
- | (string == commands[i].prog ? PEX_SEARCH : 0)),
- string, (char * const *) commands[i].argv,
- NULL, NULL, &err);
- if (errmsg != NULL)
- {
- if (err == 0)
- fatal (errmsg);
- else
- {
- errno = err;
- pfatal_with_name (errmsg);
- }
- }
+ /* For some bizarre reason, the second argument of execvp() is
+ char *const *, not const char *const *. */
+ commands[i].pid = pexecute (string, (char *const *) commands[i].argv,
+ programname, temp_filename,
+ &errmsg_fmt, &errmsg_arg,
+ ((i == 0 ? PEXECUTE_FIRST : 0)
+ | (i + 1 == n_commands ? PEXECUTE_LAST : 0)
+ | (string == commands[i].prog
+ ? PEXECUTE_SEARCH : 0)
+ | (verbose_flag ? PEXECUTE_VERBOSE : 0)));
+
+ if (commands[i].pid == -1)
+ pfatal_pexecute (errmsg_fmt, errmsg_arg);
if (string != commands[i].prog)
free ((void *) string);
@@ -2955,77 +2780,89 @@ execute (void)
execution_count++;
- /* Wait for all the subprocesses to finish. */
+ /* Wait for all the subprocesses to finish.
+ We don't care what order they finish in;
+ we know that N_COMMANDS waits will get them all.
+ Ignore subprocesses that we don't know about,
+ since they can be spawned by the process that exec'ed us. */
{
- int *statuses;
- struct pex_time *times = NULL;
int ret_code = 0;
+#ifdef HAVE_GETRUSAGE
+ struct timeval d;
+ double ut = 0.0, st = 0.0;
+#endif
- statuses = alloca (n_commands * sizeof (int));
- if (!pex_get_status (pex, n_commands, statuses))
- pfatal_with_name (_("failed to get exit status"));
-
- if (report_times)
+ for (i = 0; i < n_commands;)
{
- times = alloca (n_commands * sizeof (struct pex_time));
- if (!pex_get_times (pex, n_commands, times))
- pfatal_with_name (_("failed to get process times"));
- }
+ int j;
+ int status;
+ int pid;
- pex_free (pex);
+ pid = pwait (commands[i].pid, &status, 0);
+ if (pid < 0)
+ abort ();
- for (i = 0; i < n_commands; ++i)
- {
- int status = statuses[i];
-
- if (WIFSIGNALED (status))
+#ifdef HAVE_GETRUSAGE
+ if (report_times)
{
+ /* getrusage returns the total resource usage of all children
+ up to now. Copy the previous values into prus, get the
+ current statistics, then take the difference. */
+
+ prus = rus;
+ getrusage (RUSAGE_CHILDREN, &rus);
+ d.tv_sec = rus.ru_utime.tv_sec - prus.ru_utime.tv_sec;
+ d.tv_usec = rus.ru_utime.tv_usec - prus.ru_utime.tv_usec;
+ ut = (double) d.tv_sec + (double) d.tv_usec / 1.0e6;
+
+ d.tv_sec = rus.ru_stime.tv_sec - prus.ru_stime.tv_sec;
+ d.tv_usec = rus.ru_stime.tv_usec - prus.ru_stime.tv_usec;
+ st = (double) d.tv_sec + (double) d.tv_usec / 1.0e6;
+ }
+#endif
+
+ for (j = 0; j < n_commands; j++)
+ if (commands[j].pid == pid)
+ {
+ i++;
+ if (WIFSIGNALED (status))
+ {
#ifdef SIGPIPE
- /* SIGPIPE is a special case. It happens in -pipe mode
- when the compiler dies before the preprocessor is done,
- or the assembler dies before the compiler is done.
- There's generally been an error already, and this is
- just fallout. So don't generate another error unless
- we would otherwise have succeeded. */
- if (WTERMSIG (status) == SIGPIPE
- && (signal_count || greatest_status >= MIN_FATAL_STATUS))
- {
- signal_count++;
- ret_code = -1;
- }
- else
+ /* SIGPIPE is a special case. It happens in -pipe mode
+ when the compiler dies before the preprocessor is
+ done, or the assembler dies before the compiler is
+ done. There's generally been an error already, and
+ this is just fallout. So don't generate another error
+ unless we would otherwise have succeeded. */
+ if (WTERMSIG (status) == SIGPIPE
+ && (signal_count || greatest_status >= MIN_FATAL_STATUS))
+ ;
+ else
#endif
- fatal_ice ("\
+ fatal ("\
Internal error: %s (program %s)\n\
Please submit a full bug report.\n\
See %s for instructions.",
- strsignal (WTERMSIG (status)), commands[i].prog,
- bug_report_url);
- }
- else if (WIFEXITED (status)
- && WEXITSTATUS (status) >= MIN_FATAL_STATUS)
- {
- if (WEXITSTATUS (status) > greatest_status)
- greatest_status = WEXITSTATUS (status);
- ret_code = -1;
- }
-
- if (report_times)
- {
- struct pex_time *pt = &times[i];
- double ut, st;
-
- ut = ((double) pt->user_seconds
- + (double) pt->user_microseconds / 1.0e6);
- st = ((double) pt->system_seconds
- + (double) pt->system_microseconds / 1.0e6);
-
- if (ut + st != 0)
- notice ("# %s %.2f %.2f\n", commands[i].prog, ut, st);
- }
+ strsignal (WTERMSIG (status)), commands[j].prog,
+ bug_report_url);
+ signal_count++;
+ ret_code = -1;
+ }
+ else if (WIFEXITED (status)
+ && WEXITSTATUS (status) >= MIN_FATAL_STATUS)
+ {
+ if (WEXITSTATUS (status) > greatest_status)
+ greatest_status = WEXITSTATUS (status);
+ ret_code = -1;
+ }
+#ifdef HAVE_GETRUSAGE
+ if (report_times && ut + st != 0)
+ notice ("# %s %.2f %.2f\n", commands[j].prog, ut, st);
+#endif
+ break;
+ }
}
-
return ret_code;
}
}
@@ -3062,20 +2899,10 @@ static struct switchstr *switches;
static int n_switches;
-/* Language is one of three things:
-
- 1) The name of a real programming language.
- 2) NULL, indicating that no one has figured out
- what it is yet.
- 3) '*', indicating that the file should be passed
- to the linker. */
struct infile
{
const char *name;
const char *language;
- struct compiler *incompiler;
- bool compiled;
- bool preprocessed;
};
/* Also a vector of input files specified. */
@@ -3097,6 +2924,12 @@ static int added_libraries;
/* And a vector of corresponding output files is made up later. */
const char **outfiles;
+
+/* Used to track if none of the -B paths are used. */
+static int warn_B;
+
+/* Gives value to pass as "warn" to add_prefix for standard prefixes. */
+static int *warn_std_ptr = 0;
#if defined(HAVE_TARGET_OBJECT_SUFFIX) || defined(HAVE_TARGET_EXECUTABLE_SUFFIX)
@@ -3126,7 +2959,7 @@ convert_filename (const char *name, int do_exe ATTRIBUTE_UNUSED,
{
obstack_grow (&obstack, name, len - 2);
obstack_grow0 (&obstack, TARGET_OBJECT_SUFFIX, strlen (TARGET_OBJECT_SUFFIX));
- name = XOBFINISH (&obstack, const char *);
+ name = obstack_finish (&obstack);
}
#endif
@@ -3147,7 +2980,7 @@ convert_filename (const char *name, int do_exe ATTRIBUTE_UNUSED,
obstack_grow (&obstack, name, len);
obstack_grow0 (&obstack, TARGET_EXECUTABLE_SUFFIX,
strlen (TARGET_EXECUTABLE_SUFFIX));
- name = XOBFINISH (&obstack, const char *);
+ name = obstack_finish (&obstack);
#endif
return name;
@@ -3184,15 +3017,11 @@ display_help (void)
fputs (_(" -Xassembler <arg> Pass <arg> on to the assembler\n"), stdout);
fputs (_(" -Xpreprocessor <arg> Pass <arg> on to the preprocessor\n"), stdout);
fputs (_(" -Xlinker <arg> Pass <arg> on to the linker\n"), stdout);
- fputs (_(" -combine Pass multiple source files to compiler at once\n"), stdout);
fputs (_(" -save-temps Do not delete intermediate files\n"), stdout);
fputs (_(" -pipe Use pipes rather than intermediate files\n"), stdout);
fputs (_(" -time Time the execution of each subprocess\n"), stdout);
fputs (_(" -specs=<file> Override built-in specs with the contents of <file>\n"), stdout);
fputs (_(" -std=<standard> Assume that the input sources are for <standard>\n"), stdout);
- fputs (_("\
- --sysroot=<directory> Use <directory> as the root directory for headers\n\
- and libraries\n"), stdout);
fputs (_(" -B <directory> Add <directory> to the compiler's search paths\n"), stdout);
fputs (_(" -b <machine> Run gcc for target <machine>, if installed\n"), stdout);
fputs (_(" -V <version> Run gcc version number <version>, if installed\n"), stdout);
@@ -3225,7 +3054,7 @@ add_preprocessor_option (const char *option, int len)
n_preprocessor_options++;
if (! preprocessor_options)
- preprocessor_options = XNEWVEC (char *, n_preprocessor_options);
+ preprocessor_options = xmalloc (n_preprocessor_options * sizeof (char *));
else
preprocessor_options = xrealloc (preprocessor_options,
n_preprocessor_options * sizeof (char *));
@@ -3240,7 +3069,7 @@ add_assembler_option (const char *option, int len)
n_assembler_options++;
if (! assembler_options)
- assembler_options = XNEWVEC (char *, n_assembler_options);
+ assembler_options = xmalloc (n_assembler_options * sizeof (char *));
else
assembler_options = xrealloc (assembler_options,
n_assembler_options * sizeof (char *));
@@ -3254,7 +3083,7 @@ add_linker_option (const char *option, int len)
n_linker_options++;
if (! linker_options)
- linker_options = XNEWVEC (char *, n_linker_options);
+ linker_options = xmalloc (n_linker_options * sizeof (char *));
else
linker_options = xrealloc (linker_options,
n_linker_options * sizeof (char *));
@@ -3273,10 +3102,12 @@ process_command (int argc, const char **argv)
char *temp1;
const char *spec_lang = 0;
int last_language_n_infiles;
+ int have_c = 0;
+ int have_o = 0;
int lang_n_infiles = 0;
#ifdef MODIFY_TARGET_NAME
int is_modify_target_name;
- unsigned int j;
+ int j;
#endif
GET_ENVIRONMENT (gcc_exec_prefix, "GCC_EXEC_PREFIX");
@@ -3299,12 +3130,9 @@ process_command (int argc, const char **argv)
}
/* If there is a -V or -b option (or both), process it now, before
- trying to interpret the rest of the command line.
- Use heuristic that all configuration names must have at least
- one dash '-'. This allows us to pass options starting with -b. */
+ trying to interpret the rest of the command line. */
if (argc > 1 && argv[1][0] == '-'
- && (argv[1][1] == 'V' ||
- ((argv[1][1] == 'b') && (NULL != strchr(argv[1] + 2,'-')))))
+ && (argv[1][1] == 'V' || argv[1][1] == 'b'))
{
const char *new_version = DEFAULT_TARGET_VERSION;
const char *new_machine = DEFAULT_TARGET_MACHINE;
@@ -3314,8 +3142,7 @@ process_command (int argc, const char **argv)
int baselen;
while (argc > 1 && argv[1][0] == '-'
- && (argv[1][1] == 'V' ||
- ((argv[1][1] == 'b') && ( NULL != strchr(argv[1] + 2,'-')))))
+ && (argv[1][1] == 'V' || argv[1][1] == 'b'))
{
char opt = argv[1][1];
const char *arg;
@@ -3332,7 +3159,7 @@ process_command (int argc, const char **argv)
argv += 2;
}
else
- fatal ("'-%c' option must have argument", opt);
+ fatal ("`-%c' option must have argument", opt);
if (opt == 'V')
new_version = arg;
else
@@ -3354,39 +3181,33 @@ process_command (int argc, const char **argv)
new_argv[0] = new_argv0;
execvp (new_argv0, new_argv);
- fatal ("couldn't run '%s': %s", new_argv0, xstrerror (errno));
+ fatal ("couldn't run `%s': %s", new_argv0, xstrerror (errno));
}
/* Set up the default search paths. If there is no GCC_EXEC_PREFIX,
see if we can create it from the pathname specified in argv[0]. */
gcc_libexec_prefix = standard_libexec_prefix;
+#ifndef FREEBSD_NATIVE
#ifndef VMS
/* FIXME: make_relative_prefix doesn't yet work for VMS. */
if (!gcc_exec_prefix)
{
gcc_exec_prefix = make_relative_prefix (argv[0], standard_bindir_prefix,
standard_exec_prefix);
- gcc_libexec_prefix = make_relative_prefix (argv[0],
+ gcc_libexec_prefix = make_relative_prefix (argv[0],
standard_bindir_prefix,
standard_libexec_prefix);
if (gcc_exec_prefix)
putenv (concat ("GCC_EXEC_PREFIX=", gcc_exec_prefix, NULL));
}
else
- {
- /* make_relative_prefix requires a program name, but
- GCC_EXEC_PREFIX is typically a directory name with a trailing
- / (which is ignored by make_relative_prefix), so append a
- program name. */
- char *tmp_prefix = concat (gcc_exec_prefix, "gcc", NULL);
- gcc_libexec_prefix = make_relative_prefix (tmp_prefix,
- standard_exec_prefix,
- standard_libexec_prefix);
- free (tmp_prefix);
- }
+ gcc_libexec_prefix = make_relative_prefix (gcc_exec_prefix,
+ standard_exec_prefix,
+ standard_libexec_prefix);
#else
#endif
+#endif /* not FREEBSD_NATIVE */
if (gcc_exec_prefix)
{
@@ -3405,9 +3226,9 @@ process_command (int argc, const char **argv)
set_std_prefix (gcc_exec_prefix, len);
add_prefix (&exec_prefixes, gcc_libexec_prefix, "GCC",
- PREFIX_PRIORITY_LAST, 0, 0);
+ PREFIX_PRIORITY_LAST, 0, NULL, 0);
add_prefix (&startfile_prefixes, gcc_exec_prefix, "GCC",
- PREFIX_PRIORITY_LAST, 0, 0);
+ PREFIX_PRIORITY_LAST, 0, NULL, 0);
}
/* COMPILER_PATH and LIBRARY_PATH have values
@@ -3435,9 +3256,10 @@ process_command (int argc, const char **argv)
else
nstore[endp - startp] = 0;
add_prefix (&exec_prefixes, nstore, 0,
- PREFIX_PRIORITY_LAST, 0, 0);
- add_prefix (&include_prefixes, nstore, 0,
- PREFIX_PRIORITY_LAST, 0, 0);
+ PREFIX_PRIORITY_LAST, 0, NULL, 0);
+ add_prefix (&include_prefixes,
+ concat (nstore, "include", NULL),
+ 0, PREFIX_PRIORITY_LAST, 0, NULL, 0);
if (*endp == 0)
break;
endp = startp = endp + 1;
@@ -3469,7 +3291,7 @@ process_command (int argc, const char **argv)
else
nstore[endp - startp] = 0;
add_prefix (&startfile_prefixes, nstore, NULL,
- PREFIX_PRIORITY_LAST, 0, 1);
+ PREFIX_PRIORITY_LAST, 0, NULL, 1);
if (*endp == 0)
break;
endp = startp = endp + 1;
@@ -3502,7 +3324,7 @@ process_command (int argc, const char **argv)
else
nstore[endp - startp] = 0;
add_prefix (&startfile_prefixes, nstore, NULL,
- PREFIX_PRIORITY_LAST, 0, 1);
+ PREFIX_PRIORITY_LAST, 0, NULL, 1);
if (*endp == 0)
break;
endp = startp = endp + 1;
@@ -3512,6 +3334,44 @@ process_command (int argc, const char **argv)
}
}
+ /* Options specified as if they appeared on the command line. */
+ temp = getenv ("GCC_OPTIONS");
+ if ((temp) && (strlen (temp) > 0))
+ {
+ int len;
+ int optc = 1;
+ int new_argc;
+ const char **new_argv;
+ char *envopts;
+
+ while (isspace (*temp))
+ temp++;
+ len = strlen (temp);
+ envopts = (char *) xmalloc (len + 1);
+ strcpy (envopts, temp);
+
+ for (i = 0; i < (len - 1); i++)
+ if ((isspace (envopts[i])) && ! (isspace (envopts[i+1])))
+ optc++;
+
+ new_argv = (const char **) alloca ((optc + argc) * sizeof(char *));
+
+ for (i = 0, new_argc = 1; new_argc <= optc; new_argc++)
+ {
+ while (isspace (envopts[i]))
+ i++;
+ new_argv[new_argc] = envopts + i;
+ while (!isspace (envopts[i]) && (envopts[i] != '\0'))
+ i++;
+ envopts[i++] = '\0';
+ }
+ for (i = 1; i < argc; i++)
+ new_argv[new_argc++] = argv[i];
+
+ argv = new_argv;
+ argc = new_argc;
+ }
+
/* Convert new-style -- options to old-style. */
translate_options (&argc, (const char *const **) &argv);
@@ -3548,7 +3408,7 @@ process_command (int argc, const char **argv)
{
/* translate_options () has turned --version into -fversion. */
printf (_("%s (GCC) %s\n"), programname, version_string);
- printf ("Copyright %s 2007 Free Software Foundation, Inc.\n",
+ printf ("Copyright %s 2006 Free Software Foundation, Inc.\n",
_("(C)"));
fputs (_("This is free software; see the source for copying conditions. There is NO\n\
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\n"),
@@ -3651,7 +3511,7 @@ warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\n"
else if (strcmp (argv[i], "-Xlinker") == 0)
{
if (i + 1 == argc)
- fatal ("argument to '-Xlinker' is missing");
+ fatal ("argument to `-Xlinker' is missing");
n_infiles++;
i++;
@@ -3659,21 +3519,21 @@ warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\n"
else if (strcmp (argv[i], "-Xpreprocessor") == 0)
{
if (i + 1 == argc)
- fatal ("argument to '-Xpreprocessor' is missing");
+ fatal ("argument to `-Xpreprocessor' is missing");
add_preprocessor_option (argv[i+1], strlen (argv[i+1]));
}
else if (strcmp (argv[i], "-Xassembler") == 0)
{
if (i + 1 == argc)
- fatal ("argument to '-Xassembler' is missing");
+ fatal ("argument to `-Xassembler' is missing");
add_assembler_option (argv[i+1], strlen (argv[i+1]));
}
else if (strcmp (argv[i], "-l") == 0)
{
if (i + 1 == argc)
- fatal ("argument to '-l' is missing");
+ fatal ("argument to `-l' is missing");
n_infiles++;
i++;
@@ -3685,16 +3545,11 @@ warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\n"
save_temps_flag = 1;
n_switches++;
}
- else if (strcmp (argv[i], "-combine") == 0)
- {
- combine_flag = 1;
- n_switches++;
- }
else if (strcmp (argv[i], "-specs") == 0)
{
- struct user_specs *user = XNEW (struct user_specs);
+ struct user_specs *user = xmalloc (sizeof (struct user_specs));
if (++i >= argc)
- fatal ("argument to '-specs' is missing");
+ fatal ("argument to `-specs' is missing");
user->next = (struct user_specs *) 0;
user->filename = argv[i];
@@ -3706,9 +3561,9 @@ warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\n"
}
else if (strncmp (argv[i], "-specs=", 7) == 0)
{
- struct user_specs *user = XNEW (struct user_specs);
+ struct user_specs *user = xmalloc (sizeof (struct user_specs));
if (strlen (argv[i]) == 7)
- fatal ("argument to '-specs=' is missing");
+ fatal ("argument to `-specs=' is missing");
user->next = (struct user_specs *) 0;
user->filename = argv[i] + 7;
@@ -3744,12 +3599,8 @@ warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\n"
switch (c)
{
case 'b':
- if (NULL == strchr(argv[i] + 2, '-'))
- goto normal_switch;
-
- /* Fall through. */
case 'V':
- fatal ("'-%c' must come at the start of the command line", c);
+ fatal ("`-%c' must come at the start of the command line", c);
break;
case 'B':
@@ -3758,7 +3609,7 @@ warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\n"
int len;
if (p[1] == 0 && i + 1 == argc)
- fatal ("argument to '-B' is missing");
+ fatal ("argument to `-B' is missing");
if (p[1] == 0)
value = argv[++i];
else
@@ -3774,9 +3625,9 @@ warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\n"
if appending a directory separator actually makes a
valid directory name. */
if (! IS_DIR_SEPARATOR (value [len - 1])
- && is_directory (value, false))
+ && is_directory (value, "", 0))
{
- char *tmp = XNEWVEC (char, len + 2);
+ char *tmp = xmalloc (len + 2);
strcpy (tmp, value);
tmp[len] = DIR_SEPARATOR;
tmp[++ len] = 0;
@@ -3793,24 +3644,25 @@ warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\n"
&& (IS_DIR_SEPARATOR (value[len - 1])))
{
if (len == 7)
- add_prefix (&include_prefixes, "./", NULL,
- PREFIX_PRIORITY_B_OPT, 0, 0);
+ add_prefix (&include_prefixes, "include", NULL,
+ PREFIX_PRIORITY_B_OPT, 0, NULL, 0);
else
{
- char *string = xmalloc (len - 6);
- memcpy (string, value, len - 7);
- string[len - 7] = 0;
- add_prefix (&include_prefixes, string, NULL,
- PREFIX_PRIORITY_B_OPT, 0, 0);
+ char * string = xmalloc (len + 1);
+
+ strncpy (string, value, len - 7);
+ strcpy (string + len - 7, "include");
+ add_prefix (&include_prefixes, string, NULL,
+ PREFIX_PRIORITY_B_OPT, 0, NULL, 0);
}
}
add_prefix (&exec_prefixes, value, NULL,
- PREFIX_PRIORITY_B_OPT, 0, 0);
+ PREFIX_PRIORITY_B_OPT, 0, &warn_B, 0);
add_prefix (&startfile_prefixes, value, NULL,
- PREFIX_PRIORITY_B_OPT, 0, 0);
- add_prefix (&include_prefixes, value, NULL,
- PREFIX_PRIORITY_B_OPT, 0, 0);
+ PREFIX_PRIORITY_B_OPT, 0, &warn_B, 0);
+ add_prefix (&include_prefixes, concat (value, "include", NULL),
+ NULL, PREFIX_PRIORITY_B_OPT, 0, NULL, 0);
n_switches++;
}
break;
@@ -3928,11 +3780,18 @@ warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\n"
}
}
- if (save_temps_flag && use_pipes)
+ combine_inputs = (have_c && have_o && lang_n_infiles > 1);
+
+ if ((save_temps_flag || report_times) && use_pipes)
{
/* -save-temps overrides -pipe, so that temp files are produced */
if (save_temps_flag)
error ("warning: -pipe ignored because -save-temps specified");
+ /* -time overrides -pipe because we can't get correct stats when
+ multiple children are running at once. */
+ else if (report_times)
+ error ("warning: -pipe ignored because -time specified");
+
use_pipes = 0;
}
@@ -3942,23 +3801,31 @@ warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\n"
(such as cpp) rather than those of the host system. */
/* Use 2 as fourth arg meaning try just the machine as a suffix,
as well as trying the machine and the version. */
+#ifdef FREEBSD_NATIVE
+ add_prefix (&exec_prefixes, PREFIX"/bin/", "BINUTILS",
+ PREFIX_PRIORITY_LAST, 0, warn_std_ptr, 0);
+#endif /* FREEBSD_NATIVE */
#ifndef OS2
add_prefix (&exec_prefixes, standard_libexec_prefix, "GCC",
- PREFIX_PRIORITY_LAST, 1, 0);
+ PREFIX_PRIORITY_LAST, 1, warn_std_ptr, 0);
add_prefix (&exec_prefixes, standard_libexec_prefix, "BINUTILS",
- PREFIX_PRIORITY_LAST, 2, 0);
+ PREFIX_PRIORITY_LAST, 2, warn_std_ptr, 0);
+#ifndef FREEBSD_NATIVE
add_prefix (&exec_prefixes, standard_exec_prefix, "BINUTILS",
- PREFIX_PRIORITY_LAST, 2, 0);
+ PREFIX_PRIORITY_LAST, 2, warn_std_ptr, 0);
add_prefix (&exec_prefixes, standard_exec_prefix_1, "BINUTILS",
- PREFIX_PRIORITY_LAST, 2, 0);
+ PREFIX_PRIORITY_LAST, 2, warn_std_ptr, 0);
add_prefix (&exec_prefixes, standard_exec_prefix_2, "BINUTILS",
- PREFIX_PRIORITY_LAST, 2, 0);
+ PREFIX_PRIORITY_LAST, 2, warn_std_ptr, 0);
+#endif /* FREEBSD_NATIVE */
#endif
+#ifndef FREEBSD_NATIVE
add_prefix (&startfile_prefixes, standard_exec_prefix, "BINUTILS",
- PREFIX_PRIORITY_LAST, 1, 0);
+ PREFIX_PRIORITY_LAST, 1, warn_std_ptr, 0);
add_prefix (&startfile_prefixes, standard_exec_prefix_2, "BINUTILS",
- PREFIX_PRIORITY_LAST, 1, 0);
+ PREFIX_PRIORITY_LAST, 1, warn_std_ptr, 0);
+#endif /* not FREEBSD_NATIVE */
tooldir_prefix = concat (tooldir_base_prefix, spec_machine,
dir_separator_str, NULL);
@@ -3981,11 +3848,11 @@ warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\n"
add_prefix (&exec_prefixes,
concat (gcc_exec_tooldir_prefix, "bin",
dir_separator_str, NULL),
- NULL, PREFIX_PRIORITY_LAST, 0, 0);
+ NULL, PREFIX_PRIORITY_LAST, 0, NULL, 0);
add_prefix (&startfile_prefixes,
concat (gcc_exec_tooldir_prefix, "lib",
dir_separator_str, NULL),
- NULL, PREFIX_PRIORITY_LAST, 0, 1);
+ NULL, PREFIX_PRIORITY_LAST, 0, NULL, 1);
}
tooldir_prefix = concat (standard_exec_prefix, spec_machine,
@@ -3993,12 +3860,13 @@ warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\n"
dir_separator_str, tooldir_prefix, NULL);
}
+#ifndef FREEBSD_NATIVE
add_prefix (&exec_prefixes,
concat (tooldir_prefix, "bin", dir_separator_str, NULL),
- "BINUTILS", PREFIX_PRIORITY_LAST, 0, 0);
+ "BINUTILS", PREFIX_PRIORITY_LAST, 0, NULL, 0);
add_prefix (&startfile_prefixes,
concat (tooldir_prefix, "lib", dir_separator_str, NULL),
- "BINUTILS", PREFIX_PRIORITY_LAST, 0, 1);
+ "BINUTILS", PREFIX_PRIORITY_LAST, 0, NULL, 1);
#if defined(TARGET_SYSTEM_ROOT_RELOCATABLE) && !defined(VMS)
/* If the normal TARGET_SYSTEM_ROOT is inside of $exec_prefix,
@@ -4017,14 +3885,15 @@ warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\n"
}
}
#endif
+#endif /* FREEBSD_NATIVE */
/* More prefixes are enabled in main, after we read the specs file
and determine whether this is cross-compilation or not. */
/* Then create the space for the vectors and scan again. */
- switches = XNEWVEC (struct switchstr, n_switches + 1);
- infiles = XNEWVEC (struct infile, n_infiles + 1);
+ switches = xmalloc ((n_switches + 1) * sizeof (struct switchstr));
+ infiles = xmalloc ((n_infiles + 1) * sizeof (struct infile));
n_switches = 0;
n_infiles = 0;
last_language_n_infiles = -1;
@@ -4071,11 +3940,6 @@ warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\n"
;
else if (! strcmp (argv[i], "-fhelp"))
;
- else if (! strncmp (argv[i], "--sysroot=", strlen ("--sysroot=")))
- {
- target_system_root = argv[i] + strlen ("--sysroot=");
- target_system_root_changed = 1;
- }
else if (argv[i][0] == '+' && argv[i][1] == 'e')
{
/* Compensate for the +e options to the C++ front-end;
@@ -4111,12 +3975,16 @@ warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\n"
infiles[n_infiles].language = "*";
infiles[n_infiles++].name = argv[++i];
}
- /* Xassembler and Xpreprocessor were already handled in the first argv
- scan, so all we need to do here is ignore them and their argument. */
else if (strcmp (argv[i], "-Xassembler") == 0)
- i++;
+ {
+ infiles[n_infiles].language = "*";
+ infiles[n_infiles++].name = argv[++i];
+ }
else if (strcmp (argv[i], "-Xpreprocessor") == 0)
- i++;
+ {
+ infiles[n_infiles].language = "*";
+ infiles[n_infiles++].name = argv[++i];
+ }
else if (strcmp (argv[i], "-l") == 0)
{ /* POSIX allows separation of -l and the lib arg;
canonicalize by concatenating -l with its arg */
@@ -4144,7 +4012,7 @@ warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\n"
if (c == 'x')
{
if (p[1] == 0 && i + 1 == argc)
- fatal ("argument to '-x' is missing");
+ fatal ("argument to `-x' is missing");
if (p[1] == 0)
spec_lang = argv[++i];
else
@@ -4172,9 +4040,9 @@ warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\n"
n_args = SWITCH_TAKES_ARG (c) - (p[1] != 0);
}
if (i + n_args >= argc)
- fatal ("argument to '-%s' is missing", p);
+ fatal ("argument to `-%s' is missing", p);
switches[n_switches].args
- = XNEWVEC (const char *, n_args + 1);
+ = xmalloc ((n_args + 1) * sizeof(const char *));
while (j < n_args)
switches[n_switches].args[j++] = argv[++i];
/* Null-terminate the vector. */
@@ -4184,12 +4052,12 @@ warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\n"
{
/* On some systems, ld cannot handle some options without
a space. So split the option from its argument. */
- char *part1 = XNEWVEC (char, 2);
+ char *part1 = xmalloc (2);
part1[0] = c;
part1[1] = '\0';
switches[n_switches].part1 = part1;
- switches[n_switches].args = XNEWVEC (const char *, 2);
+ switches[n_switches].args = xmalloc (2 * sizeof (const char *));
switches[n_switches].args[0] = xstrdup (p+1);
switches[n_switches].args[1] = 0;
}
@@ -4233,7 +4101,7 @@ warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\n"
}
if (n_infiles == last_language_n_infiles && spec_lang != 0)
- error ("warning: '-x %s' after last input file has no effect", spec_lang);
+ error ("warning: `-x %s' after last input file has no effect", spec_lang);
/* Ensure we only invoke each subprocess once. */
if (target_help_flag || print_help_list)
@@ -4324,7 +4192,7 @@ set_collect_gcc_options (void)
}
}
obstack_grow (&collect_obstack, "\0", 1);
- putenv (XOBFINISH (&collect_obstack, char *));
+ putenv (obstack_finish (&collect_obstack));
}
/* Process a spec string, accumulating and running commands. */
@@ -4343,9 +4211,7 @@ static int basename_length;
static int suffixed_basename_length;
static const char *input_basename;
static const char *input_suffix;
-#ifndef HOST_LACKS_INODE_NUMBERS
static struct stat input_stat;
-#endif
static int input_stat_set;
/* The compiler used to process the current input file. */
@@ -4423,7 +4289,7 @@ do_spec_2 (const char *spec)
if (arg_going)
{
obstack_1grow (&obstack, 0);
- string = XOBFINISH (&obstack, const char *);
+ string = obstack_finish (&obstack);
if (this_is_library_file)
string = find_file (string);
store_arg (string, delete_this_arg, this_is_output_file);
@@ -4510,7 +4376,7 @@ do_self_spec (const char *spec)
/* Each switch should start with '-'. */
if (argbuf[i][0] != '-')
- fatal ("switch '%s' does not start with '-'", argbuf[i]);
+ abort ();
sw = &switches[i + first];
sw->part1 = &argbuf[i][1];
@@ -4522,57 +4388,6 @@ do_self_spec (const char *spec)
}
}
-/* Callback for processing %D and %I specs. */
-
-struct spec_path_info {
- const char *option;
- const char *append;
- size_t append_len;
- bool omit_relative;
- bool separate_options;
-};
-
-static void *
-spec_path (char *path, void *data)
-{
- struct spec_path_info *info = data;
- size_t len = 0;
- char save = 0;
-
- if (info->omit_relative && !IS_ABSOLUTE_PATH (path))
- return NULL;
-
- if (info->append_len != 0)
- {
- len = strlen (path);
- memcpy (path + len, info->append, info->append_len + 1);
- }
-
- if (!is_directory (path, true))
- return NULL;
-
- do_spec_1 (info->option, 1, NULL);
- if (info->separate_options)
- do_spec_1 (" ", 0, NULL);
-
- if (info->append_len == 0)
- {
- len = strlen (path);
- save = path[len - 1];
- if (IS_DIR_SEPARATOR (path[len - 1]))
- path[len - 1] = '\0';
- }
-
- do_spec_1 (path, 1, NULL);
- do_spec_1 (" ", 0, NULL);
-
- /* Must not damage the original path. */
- if (info->append_len == 0)
- path[len - 1] = save;
-
- return NULL;
-}
-
/* Process the sub-spec SPEC as a portion of a larger spec.
This is like processing a whole spec except that we do
not initialize at the beginning and we do not supply a
@@ -4605,7 +4420,7 @@ do_spec_1 (const char *spec, int inswitch, const char *soft_matched_part)
if (arg_going)
{
obstack_1grow (&obstack, 0);
- string = XOBFINISH (&obstack, const char *);
+ string = obstack_finish (&obstack);
if (this_is_library_file)
string = find_file (string);
store_arg (string, delete_this_arg, this_is_output_file);
@@ -4650,7 +4465,7 @@ do_spec_1 (const char *spec, int inswitch, const char *soft_matched_part)
if (arg_going)
{
obstack_1grow (&obstack, 0);
- string = XOBFINISH (&obstack, const char *);
+ string = obstack_finish (&obstack);
if (this_is_library_file)
string = find_file (string);
store_arg (string, delete_this_arg, this_is_output_file);
@@ -4669,7 +4484,7 @@ do_spec_1 (const char *spec, int inswitch, const char *soft_matched_part)
if (arg_going)
{
obstack_1grow (&obstack, 0);
- string = XOBFINISH (&obstack, const char *);
+ string = obstack_finish (&obstack);
if (this_is_library_file)
string = find_file (string);
store_arg (string, delete_this_arg, this_is_output_file);
@@ -4687,7 +4502,7 @@ do_spec_1 (const char *spec, int inswitch, const char *soft_matched_part)
switch (c = *p++)
{
case 0:
- fatal ("spec '%s' invalid", spec);
+ fatal ("invalid specification! Bug in cc");
case 'b':
obstack_grow (&obstack, input_basename, basename_length);
@@ -4708,23 +4523,111 @@ do_spec_1 (const char *spec, int inswitch, const char *soft_matched_part)
that we search for startfiles. */
case 'D':
{
- struct spec_path_info info;
+ struct prefix_list *pl = startfile_prefixes.plist;
+ size_t bufsize = 100;
+ char *buffer = xmalloc (bufsize);
+ int idx;
- info.option = "-L";
- info.append_len = 0;
+ for (; pl; pl = pl->next)
+ {
#ifdef RELATIVE_PREFIX_NOT_LINKDIR
- /* Used on systems which record the specified -L dirs
- and use them to search for dynamic linking.
- Relative directories always come from -B,
- and it is better not to use them for searching
- at run time. In particular, stage1 loses. */
- info.omit_relative = true;
-#else
- info.omit_relative = false;
+ /* Used on systems which record the specified -L dirs
+ and use them to search for dynamic linking. */
+ /* Relative directories always come from -B,
+ and it is better not to use them for searching
+ at run time. In particular, stage1 loses. */
+ if (!IS_ABSOLUTE_PATH (pl->prefix))
+ continue;
#endif
- info.separate_options = false;
+ /* Try subdirectory if there is one. */
+ if (multilib_dir != NULL
+ || (pl->os_multilib && multilib_os_dir != NULL))
+ {
+ const char *multi_dir;
- for_each_path (&startfile_prefixes, true, 0, spec_path, &info);
+ multi_dir = pl->os_multilib ? multilib_os_dir
+ : multilib_dir;
+ if (machine_suffix && multilib_dir)
+ {
+ if (strlen (pl->prefix) + strlen (machine_suffix)
+ >= bufsize)
+ bufsize = (strlen (pl->prefix)
+ + strlen (machine_suffix)) * 2 + 1;
+ buffer = xrealloc (buffer, bufsize);
+ strcpy (buffer, pl->prefix);
+ strcat (buffer, machine_suffix);
+ if (is_directory (buffer, multilib_dir, 1))
+ {
+ do_spec_1 ("-L", 0, NULL);
+#ifdef SPACE_AFTER_L_OPTION
+ do_spec_1 (" ", 0, NULL);
+#endif
+ do_spec_1 (buffer, 1, NULL);
+ do_spec_1 (multilib_dir, 1, NULL);
+ /* Make this a separate argument. */
+ do_spec_1 (" ", 0, NULL);
+ }
+ }
+ if (!pl->require_machine_suffix)
+ {
+ if (is_directory (pl->prefix, multi_dir, 1))
+ {
+ do_spec_1 ("-L", 0, NULL);
+#ifdef SPACE_AFTER_L_OPTION
+ do_spec_1 (" ", 0, NULL);
+#endif
+ do_spec_1 (pl->prefix, 1, NULL);
+ do_spec_1 (multi_dir, 1, NULL);
+ /* Make this a separate argument. */
+ do_spec_1 (" ", 0, NULL);
+ }
+ }
+ }
+ if (machine_suffix)
+ {
+ if (is_directory (pl->prefix, machine_suffix, 1))
+ {
+ do_spec_1 ("-L", 0, NULL);
+#ifdef SPACE_AFTER_L_OPTION
+ do_spec_1 (" ", 0, NULL);
+#endif
+ do_spec_1 (pl->prefix, 1, NULL);
+ /* Remove slash from machine_suffix. */
+ if (strlen (machine_suffix) >= bufsize)
+ bufsize = strlen (machine_suffix) * 2 + 1;
+ buffer = xrealloc (buffer, bufsize);
+ strcpy (buffer, machine_suffix);
+ idx = strlen (buffer);
+ if (IS_DIR_SEPARATOR (buffer[idx - 1]))
+ buffer[idx - 1] = 0;
+ do_spec_1 (buffer, 1, NULL);
+ /* Make this a separate argument. */
+ do_spec_1 (" ", 0, NULL);
+ }
+ }
+ if (!pl->require_machine_suffix)
+ {
+ if (is_directory (pl->prefix, "", 1))
+ {
+ do_spec_1 ("-L", 0, NULL);
+#ifdef SPACE_AFTER_L_OPTION
+ do_spec_1 (" ", 0, NULL);
+#endif
+ /* Remove slash from pl->prefix. */
+ if (strlen (pl->prefix) >= bufsize)
+ bufsize = strlen (pl->prefix) * 2 + 1;
+ buffer = xrealloc (buffer, bufsize);
+ strcpy (buffer, pl->prefix);
+ idx = strlen (buffer);
+ if (IS_DIR_SEPARATOR (buffer[idx - 1]))
+ buffer[idx - 1] = 0;
+ do_spec_1 (buffer, 1, NULL);
+ /* Make this a separate argument. */
+ do_spec_1 (" ", 0, NULL);
+ }
+ }
+ }
+ free (buffer);
}
break;
@@ -4788,7 +4691,7 @@ do_spec_1 (const char *spec, int inswitch, const char *soft_matched_part)
arg_going = 1;
/* consume suffix */
- while (*p == '.' || ISALNUM ((unsigned char) *p))
+ while (*p == '.' || ISALPHA ((unsigned char) *p))
p++;
if (p[0] == '%' && p[1] == 'O')
p += 2;
@@ -4800,7 +4703,7 @@ do_spec_1 (const char *spec, int inswitch, const char *soft_matched_part)
if (use_pipes)
{
/* consume suffix */
- while (*p == '.' || ISALNUM ((unsigned char) *p))
+ while (*p == '.' || ISALPHA ((unsigned char) *p))
p++;
if (p[0] == '%' && p[1] == 'O')
p += 2;
@@ -4818,21 +4721,21 @@ do_spec_1 (const char *spec, int inswitch, const char *soft_matched_part)
const char *suffix = p;
char *saved_suffix = NULL;
- while (*p == '.' || ISALNUM ((unsigned char) *p))
+ while (*p == '.' || ISALPHA ((unsigned char) *p))
p++;
suffix_length = p - suffix;
if (p[0] == '%' && p[1] == 'O')
{
p += 2;
/* We don't support extra suffix characters after %O. */
- if (*p == '.' || ISALNUM ((unsigned char) *p))
- fatal ("spec '%s' has invalid '%%0%c'", spec, *p);
+ if (*p == '.' || ISALPHA ((unsigned char) *p))
+ abort ();
if (suffix_length == 0)
suffix = TARGET_OBJECT_SUFFIX;
else
{
saved_suffix
- = XNEWVEC (char, suffix_length
+ = xmalloc (suffix_length
+ strlen (TARGET_OBJECT_SUFFIX));
strncpy (saved_suffix, suffix, suffix_length);
strcpy (saved_suffix + suffix_length,
@@ -4859,7 +4762,6 @@ do_spec_1 (const char *spec, int inswitch, const char *soft_matched_part)
*((char *) temp_filename + temp_filename_length) = '\0';
if (strcmp (temp_filename, input_filename) != 0)
{
-#ifndef HOST_LACKS_INODE_NUMBERS
struct stat st_temp;
/* Note, set_input() resets input_stat_set to 0. */
@@ -4874,19 +4776,11 @@ do_spec_1 (const char *spec, int inswitch, const char *soft_matched_part)
and we can do the stat for the temp_filename
then the they could still refer to the same
file if st_dev/st_ino's are the same. */
+
if (input_stat_set != 1
|| stat (temp_filename, &st_temp) < 0
|| input_stat.st_dev != st_temp.st_dev
|| input_stat.st_ino != st_temp.st_ino)
-#else
- /* Just compare canonical pathnames. */
- char* input_realname = lrealpath (input_filename);
- char* temp_realname = lrealpath (temp_filename);
- bool files_differ = strcmp (input_realname, temp_realname);
- free (input_realname);
- free (temp_realname);
- if (files_differ)
-#endif
{
temp_filename = save_string (temp_filename,
temp_filename_length + 1);
@@ -4945,12 +4839,7 @@ do_spec_1 (const char *spec, int inswitch, const char *soft_matched_part)
if (combine_inputs)
{
for (i = 0; (int) i < n_infiles; i++)
- if ((!infiles[i].language) || (infiles[i].language[0] != '*'))
- if (infiles[i].incompiler == input_file_compiler)
- {
- store_arg (infiles[i].name, 0, 0);
- infiles[i].compiled = true;
- }
+ store_arg (infiles[i].name, 0, 0);
}
else
{
@@ -4961,16 +4850,7 @@ do_spec_1 (const char *spec, int inswitch, const char *soft_matched_part)
case 'I':
{
- struct spec_path_info info;
-
- if (multilib_dir)
- {
- do_spec_1 ("-imultilib", 1, NULL);
- /* Make this a separate argument. */
- do_spec_1 (" ", 0, NULL);
- do_spec_1 (multilib_dir, 1, NULL);
- do_spec_1 (" ", 0, NULL);
- }
+ struct prefix_list *pl = include_prefixes.plist;
if (gcc_exec_prefix)
{
@@ -4993,14 +4873,14 @@ do_spec_1 (const char *spec, int inswitch, const char *soft_matched_part)
do_spec_1 (" ", 0, NULL);
}
- info.option = "-isystem";
- info.append = "include";
- info.append_len = strlen (info.append);
- info.omit_relative = false;
- info.separate_options = true;
-
- for_each_path (&include_prefixes, false, info.append_len,
- spec_path, &info);
+ for (; pl; pl = pl->next)
+ {
+ do_spec_1 ("-isystem", 1, NULL);
+ /* Make this a separate argument. */
+ do_spec_1 (" ", 0, NULL);
+ do_spec_1 (pl->prefix, 1, NULL);
+ do_spec_1 (" ", 0, NULL);
+ }
}
break;
@@ -5037,7 +4917,7 @@ do_spec_1 (const char *spec, int inswitch, const char *soft_matched_part)
int cur_index = argbuf_index;
/* Handle the {...} following the %W. */
if (*p != '{')
- fatal ("spec '%s' has invalid '%%W%c", spec, *p);
+ abort ();
p = handle_braces (p + 1);
if (p == 0)
return -1;
@@ -5045,7 +4925,7 @@ do_spec_1 (const char *spec, int inswitch, const char *soft_matched_part)
if (arg_going)
{
obstack_1grow (&obstack, 0);
- string = XOBFINISH (&obstack, const char *);
+ string = obstack_finish (&obstack);
if (this_is_library_file)
string = find_file (string);
store_arg (string, delete_this_arg, this_is_output_file);
@@ -5068,7 +4948,7 @@ do_spec_1 (const char *spec, int inswitch, const char *soft_matched_part)
/* Skip past the option value and make a copy. */
if (*p != '{')
- fatal ("spec '%s' has invalid '%%x%c'", spec, *p);
+ abort ();
while (*p++ != '}')
;
string = save_string (p1 + 1, p - p1 - 2);
@@ -5179,6 +5059,23 @@ do_spec_1 (const char *spec, int inswitch, const char *soft_matched_part)
return value;
break;
+ case 'M':
+ if (multilib_dir && strcmp (multilib_dir, ".") != 0)
+ {
+ char *p;
+ const char *q;
+ size_t len;
+
+ len = strlen (multilib_dir);
+ obstack_blank (&obstack, len + 1);
+ p = obstack_next_free (&obstack) - (len + 1);
+
+ *p++ = '_';
+ for (q = multilib_dir; *q ; ++q, ++p)
+ *p = (IS_DIR_SEPARATOR (*q) ? '_' : *q);
+ }
+ break;
+
case 'R':
/* We assume there is a directory
separator at the end of this string. */
@@ -5261,7 +5158,7 @@ do_spec_1 (const char *spec, int inswitch, const char *soft_matched_part)
}
else
/* Catch the case where a spec string contains something like
- '%{foo:%*}'. i.e. there is no * in the pattern on the left
+ '%{foo:%*}'. ie there is no * in the pattern on the left
hand side of the :. */
error ("spec failure: '%%*' has not been initialized by pattern match");
break;
@@ -5374,7 +5271,7 @@ do_spec_1 (const char *spec, int inswitch, const char *soft_matched_part)
if (processing_spec_function && arg_going)
{
obstack_1grow (&obstack, 0);
- string = XOBFINISH (&obstack, const char *);
+ string = obstack_finish (&obstack);
if (this_is_library_file)
string = find_file (string);
store_arg (string, delete_this_arg, this_is_output_file);
@@ -5391,11 +5288,20 @@ do_spec_1 (const char *spec, int inswitch, const char *soft_matched_part)
static const struct spec_function *
lookup_spec_function (const char *name)
{
+ static const struct spec_function * const spec_function_tables[] =
+ {
+ static_spec_functions,
+ lang_specific_spec_functions,
+ };
const struct spec_function *sf;
+ unsigned int i;
- for (sf = static_spec_functions; sf->name != NULL; sf++)
- if (strcmp (sf->name, name) == 0)
- return sf;
+ for (i = 0; i < ARRAY_SIZE (spec_function_tables); i++)
+ {
+ for (sf = spec_function_tables[i]; sf->name != NULL; sf++)
+ if (strcmp (sf->name, name) == 0)
+ return sf;
+ }
return NULL;
}
@@ -5423,7 +5329,7 @@ eval_spec_function (const char *func, const char *args)
sf = lookup_spec_function (func);
if (sf == NULL)
- fatal ("unknown spec function '%s'", func);
+ fatal ("unknown spec function `%s'", func);
/* Push the spec processing context. */
save_argbuf_index = argbuf_index;
@@ -5442,7 +5348,7 @@ eval_spec_function (const char *func, const char *args)
alloc_args ();
if (do_spec_2 (args) < 0)
- fatal ("error in args to spec function '%s'", func);
+ fatal ("error in args to spec function `%s'", func);
/* argbuf_index is an index for the next argument to be inserted, and
so contains the count of the args already inserted. */
@@ -5535,31 +5441,15 @@ handle_spec_function (const char *p)
static inline bool
input_suffix_matches (const char *atom, const char *end_atom)
{
- /* We special case the semantics of {.s:...} and {.S:...} and their
- negative variants. Instead of testing the input filename suffix,
- we test whether the input source file is an assembler file or an
- assembler-with-cpp file respectively. This allows us to correctly
- handle the -x command line option. */
-
- if (atom + 1 == end_atom
- && input_file_compiler
- && input_file_compiler->suffix)
- {
- if (*atom == 's')
- return !strcmp (input_file_compiler->suffix, "@assembler");
- if (*atom == 'S')
- return !strcmp (input_file_compiler->suffix, "@assembler-with-cpp");
- }
-
return (input_suffix
&& !strncmp (input_suffix, atom, end_atom - atom)
&& input_suffix[end_atom - atom] == '\0');
}
-/* Subroutine of handle_braces. Returns true if a switch
+/* Inline subroutine of handle_braces. Returns true if a switch
matching the atom bracketed by ATOM and END_ATOM appeared on the
command line. */
-static bool
+static inline bool
switch_matches (const char *atom, const char *end_atom, int starred)
{
int i;
@@ -5616,7 +5506,6 @@ handle_braces (const char *p)
{
const char *atom, *end_atom;
const char *d_atom = NULL, *d_end_atom = NULL;
- const char *orig = p;
bool a_is_suffix;
bool a_is_starred;
@@ -5636,7 +5525,7 @@ handle_braces (const char *p)
do
{
if (a_must_be_last)
- goto invalid;
+ abort ();
/* Scan one "atom" (S in the description above of %{}, possibly
with !, ., or * modifiers). */
@@ -5660,33 +5549,32 @@ handle_braces (const char *p)
p++, a_is_starred = 1;
SKIP_WHITE();
- switch (*p)
+ if (*p == '&' || *p == '}')
{
- case '&': case '}':
/* Substitute the switch(es) indicated by the current atom. */
ordered_set = true;
if (disjunct_set || n_way_choice || a_is_negated || a_is_suffix
|| atom == end_atom)
- goto invalid;
+ abort ();
mark_matching_switches (atom, end_atom, a_is_starred);
if (*p == '}')
process_marked_switches ();
- break;
-
- case '|': case ':':
+ }
+ else if (*p == '|' || *p == ':')
+ {
/* Substitute some text if the current atom appears as a switch
or suffix. */
disjunct_set = true;
if (ordered_set)
- goto invalid;
+ abort ();
if (atom == end_atom)
{
if (!n_way_choice || disj_matched || *p == '|'
|| a_is_negated || a_is_suffix || a_is_starred)
- goto invalid;
+ abort ();
/* An empty term may appear as the last choice of an
N-way choice set; it means "otherwise". */
@@ -5697,7 +5585,7 @@ handle_braces (const char *p)
else
{
if (a_is_suffix && a_is_starred)
- goto invalid;
+ abort ();
if (!a_is_starred)
disj_starred = false;
@@ -5740,19 +5628,14 @@ handle_braces (const char *p)
d_atom = d_end_atom = NULL;
}
}
- break;
-
- default:
- goto invalid;
}
+ else
+ abort ();
}
while (*p++ != '}');
return p;
- invalid:
- fatal ("braced spec '%s' is invalid at '%c'", orig, *p);
-
#undef SKIP_WHITE
}
@@ -5792,7 +5675,7 @@ process_brace_body (const char *p, const char *atom, const char *end_atom,
else if (*p == '%' && p[1] == '*' && nesting_level == 1)
have_subst = true;
else if (*p == '\0')
- goto invalid;
+ abort ();
p++;
}
@@ -5801,7 +5684,7 @@ process_brace_body (const char *p, const char *atom, const char *end_atom,
end_body--;
if (have_subst && !starred)
- goto invalid;
+ abort ();
if (matched)
{
@@ -5837,9 +5720,6 @@ process_brace_body (const char *p, const char *atom, const char *end_atom,
}
return p;
-
- invalid:
- fatal ("braced spec body '%s' is invalid", body);
}
/* Return 0 iff switch number SWITCHNUM is obsoleted by a later switch
@@ -5977,42 +5857,65 @@ give_switch (int switchnum, int omit_first_word)
static const char *
find_file (const char *name)
{
- char *newname = find_a_file (&startfile_prefixes, name, R_OK, true);
+ char *newname;
+
+ /* Try multilib_dir if it is defined. */
+ if (multilib_os_dir != NULL)
+ {
+ newname = find_a_file (&startfile_prefixes, name, R_OK, 1);
+
+ /* If we don't find it in the multi library dir, then fall
+ through and look for it in the normal places. */
+ if (newname != NULL)
+ return newname;
+ }
+
+ newname = find_a_file (&startfile_prefixes, name, R_OK, 0);
return newname ? newname : name;
}
/* Determine whether a directory exists. If LINKER, return 0 for
- certain fixed names not needed by the linker. */
+ certain fixed names not needed by the linker. If not LINKER, it is
+ only important to return 0 if the host machine has a small ARG_MAX
+ limit. */
static int
-is_directory (const char *path1, bool linker)
+is_directory (const char *path1, const char *path2, int linker)
{
- int len1;
- char *path;
+ int len1 = strlen (path1);
+ int len2 = strlen (path2);
+ char *path = alloca (3 + len1 + len2);
char *cp;
struct stat st;
- /* Ensure the string ends with "/.". The resulting path will be a
- directory even if the given path is a symbolic link. */
- len1 = strlen (path1);
- path = alloca (3 + len1);
+#ifndef SMALL_ARG_MAX
+ if (! linker)
+ return 1;
+#endif
+
+ /* 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. */
memcpy (path, path1, len1);
- cp = path + len1;
+ memcpy (path + len1, path2, len2);
+ cp = path + len1 + len2;
if (!IS_DIR_SEPARATOR (cp[-1]))
*cp++ = DIR_SEPARATOR;
*cp++ = '.';
*cp = '\0';
+#ifndef FREEBSD_NATIVE
/* Exclude directories that the linker is known to search. */
if (linker
- && IS_DIR_SEPARATOR (path[0])
&& ((cp - path == 6
- && strncmp (path + 1, "lib", 3) == 0)
+ && strcmp (path, concat (dir_separator_str, "lib",
+ dir_separator_str, ".", NULL)) == 0)
|| (cp - path == 10
- && strncmp (path + 1, "usr", 3) == 0
- && IS_DIR_SEPARATOR (path[4])
- && strncmp (path + 5, "lib", 3) == 0)))
+ && strcmp (path, concat (dir_separator_str, "usr",
+ dir_separator_str, "lib",
+ dir_separator_str, ".", NULL)) == 0)))
return 0;
+#endif /* FREEBSD_NATIVE */
return (stat (path, &st) >= 0 && S_ISDIR (st.st_mode));
}
@@ -6072,15 +5975,14 @@ fatal_error (int signum)
kill (getpid (), signum);
}
-extern int main (int, char **);
+extern int main (int, const char **);
int
-main (int argc, char **argv)
+main (int argc, const char **argv)
{
size_t i;
int value;
int linker_was_run = 0;
- int lang_n_infiles = 0;
int num_linker_inputs = 0;
char *explicit_link_files;
char *specs_file;
@@ -6094,18 +5996,11 @@ main (int argc, char **argv)
xmalloc_set_program_name (programname);
- expandargv (&argc, &argv);
-
- prune_options (&argc, &argv);
-
#ifdef GCC_DRIVER_HOST_INITIALIZATION
/* Perform host dependent initialization when needed. */
GCC_DRIVER_HOST_INITIALIZATION;
#endif
- /* Unlock the stdio streams. */
- unlock_std_streams ();
-
gcc_init_libintl ();
if (signal (SIGINT, SIG_IGN) != SIG_IGN)
@@ -6142,21 +6037,21 @@ main (int argc, char **argv)
obstack_grow (&multilib_obstack, p, strlen (p));
obstack_1grow (&multilib_obstack, 0);
- multilib_select = XOBFINISH (&multilib_obstack, const char *);
+ multilib_select = obstack_finish (&multilib_obstack);
q = multilib_matches_raw;
while ((p = *q++) != (char *) 0)
obstack_grow (&multilib_obstack, p, strlen (p));
obstack_1grow (&multilib_obstack, 0);
- multilib_matches = XOBFINISH (&multilib_obstack, const char *);
+ multilib_matches = obstack_finish (&multilib_obstack);
q = multilib_exclusions_raw;
while ((p = *q++) != (char *) 0)
obstack_grow (&multilib_obstack, p, strlen (p));
obstack_1grow (&multilib_obstack, 0);
- multilib_exclusions = XOBFINISH (&multilib_obstack, const char *);
+ multilib_exclusions = obstack_finish (&multilib_obstack);
need_space = FALSE;
for (i = 0; i < ARRAY_SIZE (multilib_defaults_raw); i++)
@@ -6170,7 +6065,7 @@ main (int argc, char **argv)
}
obstack_1grow (&multilib_obstack, 0);
- multilib_defaults = XOBFINISH (&multilib_obstack, const char *);
+ multilib_defaults = obstack_finish (&multilib_obstack);
}
/* Set up to remember the pathname of gcc and any options
@@ -6179,7 +6074,7 @@ main (int argc, char **argv)
obstack_init (&collect_obstack);
obstack_grow (&collect_obstack, "COLLECT_GCC=", sizeof ("COLLECT_GCC=") - 1);
obstack_grow (&collect_obstack, argv[0], strlen (argv[0]) + 1);
- putenv (XOBFINISH (&collect_obstack, char *));
+ putenv (obstack_finish (&collect_obstack));
#ifdef INIT_ENVIRONMENT
/* Set up any other necessary machine specific environment variables. */
@@ -6190,7 +6085,7 @@ main (int argc, char **argv)
Make a table of specified input files (infiles, n_infiles).
Decode switches that are handled locally. */
- process_command (argc, (const char **) argv);
+ process_command (argc, argv);
/* Initialize the vector of specs to just the default.
This means one element containing 0s, as a terminator. */
@@ -6201,11 +6096,15 @@ main (int argc, char **argv)
/* Read specs from a file if there is one. */
+#ifdef FREEBSD_NATIVE
+ just_machine_suffix = "";
+#else /* FREEBSD_NATIVE */
machine_suffix = concat (spec_machine, dir_separator_str,
spec_version, dir_separator_str, NULL);
just_machine_suffix = concat (spec_machine, dir_separator_str, NULL);
+#endif /* FREEBSD_NATIVE */
- specs_file = find_a_file (&startfile_prefixes, "specs", R_OK, true);
+ specs_file = find_a_file (&startfile_prefixes, "specs", R_OK, 0);
/* Read the specs file unless it is a default one. */
if (specs_file != 0 && strcmp (specs_file, "specs"))
read_specs (specs_file, TRUE);
@@ -6214,10 +6113,11 @@ main (int argc, char **argv)
/* We need to check standard_exec_prefix/just_machine_suffix/specs
for any override of as, ld and libraries. */
- specs_file = alloca (strlen (standard_exec_prefix)
- + strlen (just_machine_suffix) + sizeof ("specs"));
+ specs_file = (char *) alloca (strlen (FBSD_DATA_PREFIX)
+ + strlen (just_machine_suffix)
+ + sizeof ("specs"));
- strcpy (specs_file, standard_exec_prefix);
+ strcpy (specs_file, FBSD_DATA_PREFIX);
strcat (specs_file, just_machine_suffix);
strcat (specs_file, "specs");
if (access (specs_file, R_OK) == 0)
@@ -6242,7 +6142,7 @@ main (int argc, char **argv)
if (*md_exec_prefix)
{
add_prefix (&exec_prefixes, md_exec_prefix, "GCC",
- PREFIX_PRIORITY_LAST, 0, 0);
+ PREFIX_PRIORITY_LAST, 0, NULL, 0);
}
}
@@ -6251,30 +6151,17 @@ main (int argc, char **argv)
&& do_spec_2 (sysroot_suffix_spec) == 0)
{
if (argbuf_index > 1)
- error ("spec failure: more than one arg to SYSROOT_SUFFIX_SPEC");
+ error ("spec failure: more than one arg to SYSROOT_SUFFIX_SPEC.");
else if (argbuf_index == 1)
target_sysroot_suffix = xstrdup (argbuf[argbuf_index -1]);
}
-#ifdef HAVE_LD_SYSROOT
- /* Pass the --sysroot option to the linker, if it supports that. If
- there is a sysroot_suffix_spec, it has already been processed by
- this point, so target_system_root really is the system root we
- should be using. */
- if (target_system_root)
- {
- obstack_grow (&obstack, "%(sysroot_spec) ", strlen ("%(sysroot_spec) "));
- obstack_grow0 (&obstack, link_spec, strlen (link_spec));
- set_spec ("link", XOBFINISH (&obstack, const char *));
- }
-#endif
-
/* Process sysroot_hdrs_suffix_spec. */
if (*sysroot_hdrs_suffix_spec != 0
&& do_spec_2 (sysroot_hdrs_suffix_spec) == 0)
{
if (argbuf_index > 1)
- error ("spec failure: more than one arg to SYSROOT_HEADERS_SUFFIX_SPEC");
+ error ("spec failure: more than one arg to SYSROOT_HEADERS_SUFFIX_SPEC.");
else if (argbuf_index == 1)
target_sysroot_hdrs_suffix = xstrdup (argbuf[argbuf_index -1]);
}
@@ -6287,19 +6174,23 @@ main (int argc, char **argv)
int ndx;
for (ndx = 0; ndx < argbuf_index; ndx++)
add_sysrooted_prefix (&startfile_prefixes, argbuf[ndx], "BINUTILS",
- PREFIX_PRIORITY_LAST, 0, 1);
+ PREFIX_PRIORITY_LAST, 0, NULL, 1);
}
/* We should eventually get rid of all these and stick to
startfile_prefix_spec exclusively. */
else if (*cross_compile == '0' || target_system_root)
{
+ if (*md_exec_prefix)
+ add_sysrooted_prefix (&startfile_prefixes, md_exec_prefix, "GCC",
+ PREFIX_PRIORITY_LAST, 0, NULL, 1);
+
if (*md_startfile_prefix)
add_sysrooted_prefix (&startfile_prefixes, md_startfile_prefix,
- "GCC", PREFIX_PRIORITY_LAST, 0, 1);
+ "GCC", PREFIX_PRIORITY_LAST, 0, NULL, 1);
if (*md_startfile_prefix_1)
add_sysrooted_prefix (&startfile_prefixes, md_startfile_prefix_1,
- "GCC", PREFIX_PRIORITY_LAST, 0, 1);
+ "GCC", PREFIX_PRIORITY_LAST, 0, NULL, 1);
/* If standard_startfile_prefix is relative, base it on
standard_exec_prefix. This lets us move the installed tree
@@ -6311,29 +6202,31 @@ main (int argc, char **argv)
if (IS_ABSOLUTE_PATH (standard_startfile_prefix))
add_sysrooted_prefix (&startfile_prefixes,
standard_startfile_prefix, "BINUTILS",
- PREFIX_PRIORITY_LAST, 0, 1);
+ PREFIX_PRIORITY_LAST, 0, NULL, 1);
else if (*cross_compile == '0')
{
if (gcc_exec_prefix)
add_prefix (&startfile_prefixes,
concat (gcc_exec_prefix, machine_suffix,
standard_startfile_prefix, NULL),
- NULL, PREFIX_PRIORITY_LAST, 0, 1);
+ NULL, PREFIX_PRIORITY_LAST, 0, NULL, 1);
add_prefix (&startfile_prefixes,
concat (standard_exec_prefix,
machine_suffix,
standard_startfile_prefix, NULL),
- NULL, PREFIX_PRIORITY_LAST, 0, 1);
+ NULL, PREFIX_PRIORITY_LAST, 0, NULL, 1);
}
- if (*standard_startfile_prefix_1)
- add_sysrooted_prefix (&startfile_prefixes,
- standard_startfile_prefix_1, "BINUTILS",
- PREFIX_PRIORITY_LAST, 0, 1);
- if (*standard_startfile_prefix_2)
- add_sysrooted_prefix (&startfile_prefixes,
- standard_startfile_prefix_2, "BINUTILS",
- PREFIX_PRIORITY_LAST, 0, 1);
+#ifndef FREEBSD_NATIVE
+ add_sysrooted_prefix (&startfile_prefixes, standard_startfile_prefix_1,
+ "BINUTILS", PREFIX_PRIORITY_LAST, 0, NULL, 1);
+ add_sysrooted_prefix (&startfile_prefixes, standard_startfile_prefix_2,
+ "BINUTILS", PREFIX_PRIORITY_LAST, 0, NULL, 1);
+#endif /* not FREEBSD_NATIVE */
+#if 0 /* Can cause surprises, and one can use -B./ instead. */
+ add_prefix (&startfile_prefixes, "./", NULL,
+ PREFIX_PRIORITY_LAST, 1, NULL, 0);
+#endif
}
/* Process any user specified specs in the order given on the command
@@ -6341,7 +6234,7 @@ main (int argc, char **argv)
for (uptr = user_specs_head; uptr; uptr = uptr->next)
{
char *filename = find_a_file (&startfile_prefixes, uptr->filename,
- R_OK, true);
+ R_OK, 0);
read_specs (filename ? filename : uptr->filename, FALSE);
}
@@ -6363,17 +6256,15 @@ main (int argc, char **argv)
for (i = 0; (int) i < n_switches; i++)
if (! switches[i].validated)
- error ("unrecognized option '-%s'", switches[i].part1);
+ error ("unrecognized option `-%s'", switches[i].part1);
/* Obey some of the options. */
if (print_search_dirs)
{
printf (_("install: %s%s\n"), standard_exec_prefix, machine_suffix);
- printf (_("programs: %s\n"),
- build_search_list (&exec_prefixes, "", false, false));
- printf (_("libraries: %s\n"),
- build_search_list (&startfile_prefixes, "", false, true));
+ printf (_("programs: %s\n"), build_search_list (&exec_prefixes, "", 0));
+ printf (_("libraries: %s\n"), build_search_list (&startfile_prefixes, "", 0));
return (0);
}
@@ -6446,7 +6337,6 @@ main (int argc, char **argv)
int n;
const char *thrmod;
- notice ("Target: %s\n", spec_machine);
notice ("Configured with: %s\n", configuration_arguments);
#ifdef THREAD_MODEL_SPEC
@@ -6456,7 +6346,7 @@ main (int argc, char **argv)
obstack_init (&obstack);
do_spec_1 (THREAD_MODEL_SPEC, 0, thread_model);
obstack_1grow (&obstack, '\0');
- thrmod = XOBFINISH (&obstack, const char *);
+ thrmod = obstack_finish (&obstack);
#else
thrmod = thread_model;
#endif
@@ -6482,113 +6372,41 @@ main (int argc, char **argv)
}
if (n_infiles == added_libraries)
- fatal ("no input files");
+ fatal ("No input files specified");
/* Make a place to record the compiler output file names
that correspond to the input files. */
i = n_infiles;
i += lang_specific_extra_outfiles;
- outfiles = XCNEWVEC (const char *, i);
+ outfiles = xcalloc (i, sizeof (char *));
/* Record which files were specified explicitly as link input. */
- explicit_link_files = XCNEWVEC (char, n_infiles);
-
- if (combine_flag)
- combine_inputs = true;
- else
- combine_inputs = false;
-
- for (i = 0; (int) i < n_infiles; i++)
- {
- const char *name = infiles[i].name;
- struct compiler *compiler = lookup_compiler (name,
- strlen (name),
- infiles[i].language);
-
- if (compiler && !(compiler->combinable))
- combine_inputs = false;
-
- if (lang_n_infiles > 0 && compiler != input_file_compiler
- && infiles[i].language && infiles[i].language[0] != '*')
- infiles[i].incompiler = compiler;
- else if (compiler)
- {
- lang_n_infiles++;
- input_file_compiler = compiler;
- infiles[i].incompiler = compiler;
- }
- else
- {
- /* Since there is no compiler for this input file, assume it is a
- linker file. */
- explicit_link_files[i] = 1;
- infiles[i].incompiler = NULL;
- }
- infiles[i].compiled = false;
- infiles[i].preprocessed = false;
- }
-
- if (!combine_inputs && have_c && have_o && lang_n_infiles > 1)
- fatal ("cannot specify -o with -c or -S with multiple files");
+ explicit_link_files = xcalloc (1, n_infiles);
- if (combine_flag && save_temps_flag)
+ if (combine_inputs)
{
- bool save_combine_inputs = combine_inputs;
- /* Must do a separate pre-processing pass for C & Objective-C files, to
- obtain individual .i files. */
-
- combine_inputs = false;
- for (i = 0; (int) i < n_infiles; i++)
- {
- int this_file_error = 0;
-
- input_file_number = i;
- set_input (infiles[i].name);
- if (infiles[i].incompiler
- && (infiles[i].incompiler)->needs_preprocessing)
- input_file_compiler = infiles[i].incompiler;
- else
- continue;
-
- if (input_file_compiler)
- {
- if (input_file_compiler->spec[0] == '#')
- {
- error ("%s: %s compiler not installed on this system",
- input_filename, &input_file_compiler->spec[1]);
- this_file_error = 1;
- }
- else
- {
- value = do_spec (input_file_compiler->spec);
- infiles[i].preprocessed = true;
- if (!have_o_argbuf_index)
- fatal ("spec '%s' is invalid", input_file_compiler->spec);
- infiles[i].name = argbuf[have_o_argbuf_index];
- infiles[i].incompiler
- = lookup_compiler (infiles[i].name,
- strlen (infiles[i].name),
- infiles[i].language);
-
- if (value < 0)
- this_file_error = 1;
- }
- }
-
- if (this_file_error)
- {
- delete_failure_queue ();
- error_count++;
- break;
- }
- clear_failure_queue ();
- }
- combine_inputs = save_combine_inputs;
+ int lang_n_infiles = 0;
+ for (i = 0; (int) i < n_infiles; i++)
+ {
+ const char *name = infiles[i].name;
+ struct compiler *compiler
+ = lookup_compiler (name, strlen (name), infiles[i].language);
+ if (compiler == NULL)
+ error ("%s: linker input file unused because linking not done",
+ name);
+ else if (lang_n_infiles > 0 && compiler != input_file_compiler)
+ fatal ("cannot specify -o with -c or -S and multiple languages");
+ else
+ {
+ lang_n_infiles++;
+ input_file_compiler = compiler;
+ }
+ }
}
-
- for (i = 0; (int) i < n_infiles; i++)
+
+ for (i = 0; (int) i < (combine_inputs ? 1 : n_infiles); i++)
{
int this_file_error = 0;
@@ -6597,9 +6415,6 @@ main (int argc, char **argv)
input_file_number = i;
set_input (infiles[i].name);
- if (infiles[i].compiled)
- continue;
-
/* Use the same thing in %o, unless cp->spec says otherwise. */
outfiles[i] = input_filename;
@@ -6610,8 +6425,6 @@ main (int argc, char **argv)
input_file_compiler
= lookup_compiler (infiles[i].name, input_filename_length,
infiles[i].language);
- else
- input_file_compiler = infiles[i].incompiler;
if (input_file_compiler)
{
@@ -6626,7 +6439,6 @@ main (int argc, char **argv)
else
{
value = do_spec (input_file_compiler->spec);
- infiles[i].compiled = true;
if (value < 0)
this_file_error = 1;
}
@@ -6650,21 +6462,11 @@ main (int argc, char **argv)
clear_failure_queue ();
}
- /* Reset the input file name to the first compile/object file name, for use
- with %b in LINK_SPEC. We use the first input file that we can find
- a compiler to compile it instead of using infiles.language since for
- languages other than C we use aliases that we then lookup later. */
+ /* Reset the output file name to the first input file name, for use
+ with %b in LINK_SPEC on a target that prefers not to emit a.out
+ by default. */
if (n_infiles > 0)
- {
- int i;
-
- for (i = 0; i < n_infiles ; i++)
- if (infiles[i].language && infiles[i].language[0] != '*')
- {
- set_input (infiles[i].name);
- break;
- }
- }
+ set_input (infiles[0].name);
if (error_count == 0)
{
@@ -6690,14 +6492,14 @@ main (int argc, char **argv)
/* We'll use ld if we can't find collect2. */
if (! strcmp (linker_name_spec, "collect2"))
{
- char *s = find_a_file (&exec_prefixes, "collect2", X_OK, false);
+ char *s = find_a_file (&exec_prefixes, "collect2", X_OK, 0);
if (s == NULL)
linker_name_spec = "ld";
}
/* Rebuild the COMPILER_PATH and LIBRARY_PATH environment variables
for collect. */
- putenv_from_prefixes (&exec_prefixes, "COMPILER_PATH", false);
- putenv_from_prefixes (&startfile_prefixes, LIBRARY_PATH_ENV, true);
+ putenv_from_prefixes (&exec_prefixes, "COMPILER_PATH");
+ putenv_from_prefixes (&startfile_prefixes, LIBRARY_PATH_ENV);
value = do_spec (link_command_spec);
if (value < 0)
@@ -6769,7 +6571,7 @@ lookup_compiler (const char *name, size_t length, const char *language)
}
#if defined (OS2) ||defined (HAVE_DOS_BASED_FILE_SYSTEM)
- /* Look again, but case-insensitively this time. */
+ /* look again, but case-insensitively this time. */
if (cp < compilers)
for (cp = compilers + n_compilers - 1; cp >= compilers; cp--)
{
@@ -6804,7 +6606,7 @@ lookup_compiler (const char *name, size_t length, const char *language)
static char *
save_string (const char *s, int len)
{
- char *result = XNEWVEC (char, len + 1);
+ char *result = xmalloc (len + 1);
memcpy (result, s, len);
result[len] = 0;
@@ -6825,72 +6627,69 @@ perror_with_name (const char *name)
error ("%s: %s", name, xstrerror (errno));
}
-/* Output an error message and exit. */
-
-void
-fancy_abort (const char *file, int line, const char *func)
+static void
+pfatal_pexecute (const char *errmsg_fmt, const char *errmsg_arg)
{
- fatal_ice ("internal gcc abort in %s, at %s:%d", func, file, line);
+ 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;
+ }
+
+ pfatal_with_name (errmsg_fmt);
}
-
+
/* Output an error message and exit. */
void
-fatal_ice (const char *cmsgid, ...)
+fancy_abort (void)
{
- va_list ap;
-
- va_start (ap, cmsgid);
-
- fprintf (stderr, "%s: ", programname);
- vfprintf (stderr, _(cmsgid), ap);
- va_end (ap);
- fprintf (stderr, "\n");
- delete_temp_files ();
- exit (pass_exit_codes ? ICE_EXIT_CODE : 1);
+ fatal ("internal gcc abort");
}
+
+/* Output an error message and exit. */
void
-fatal (const char *cmsgid, ...)
+fatal (const char *msgid, ...)
{
va_list ap;
- va_start (ap, cmsgid);
+ va_start (ap, msgid);
fprintf (stderr, "%s: ", programname);
- vfprintf (stderr, _(cmsgid), ap);
+ vfprintf (stderr, _(msgid), ap);
va_end (ap);
fprintf (stderr, "\n");
delete_temp_files ();
exit (1);
}
-/* The argument is actually c-format, not gcc-internal-format,
- but because functions with identical names are used through
- the rest of the compiler with gcc-internal-format, we just
- need to hope all users of these functions use the common
- subset between c-format and gcc-internal-format. */
-
void
-error (const char *gmsgid, ...)
+error (const char *msgid, ...)
{
va_list ap;
- va_start (ap, gmsgid);
+ va_start (ap, msgid);
fprintf (stderr, "%s: ", programname);
- vfprintf (stderr, _(gmsgid), ap);
+ vfprintf (stderr, _(msgid), ap);
va_end (ap);
fprintf (stderr, "\n");
}
static void
-notice (const char *cmsgid, ...)
+notice (const char *msgid, ...)
{
va_list ap;
- va_start (ap, cmsgid);
- vfprintf (stderr, _(cmsgid), ap);
+ va_start (ap, msgid);
+ vfprintf (stderr, _(msgid), ap);
va_end (ap);
}
@@ -7043,10 +6842,7 @@ used_arg (const char *p, int len)
while (*q != ' ')
{
if (*q == '\0')
- {
- invalid_matches:
- fatal ("multilib spec '%s' is invalid", multilib_matches);
- }
+ abort ();
q++;
}
matches[i].len = q - matches[i].str;
@@ -7055,7 +6851,7 @@ used_arg (const char *p, int len)
while (*q != ';' && *q != '\0')
{
if (*q == ' ')
- goto invalid_matches;
+ abort ();
q++;
}
matches[i].rep_len = q - matches[i].replace;
@@ -7069,23 +6865,23 @@ used_arg (const char *p, int len)
xmalloc from calling fatal, and prevents us from re-executing this
block of code. */
mswitches
- = XNEWVEC (struct mswitchstr, n_mdswitches + (n_switches ? n_switches : 1));
+ = xmalloc (sizeof (struct mswitchstr)
+ * (n_mdswitches + (n_switches ? n_switches : 1)));
for (i = 0; i < n_switches; i++)
- if (switches[i].live_cond != SWITCH_IGNORE)
- {
- int xlen = strlen (switches[i].part1);
- for (j = 0; j < cnt; j++)
- if (xlen == matches[j].len
- && ! strncmp (switches[i].part1, matches[j].str, xlen))
- {
- mswitches[n_mswitches].str = matches[j].replace;
- mswitches[n_mswitches].len = matches[j].rep_len;
- mswitches[n_mswitches].replace = (char *) 0;
- mswitches[n_mswitches].rep_len = 0;
- n_mswitches++;
- break;
- }
- }
+ {
+ int xlen = strlen (switches[i].part1);
+ for (j = 0; j < cnt; j++)
+ if (xlen == matches[j].len
+ && ! strncmp (switches[i].part1, matches[j].str, xlen))
+ {
+ mswitches[n_mswitches].str = matches[j].replace;
+ mswitches[n_mswitches].len = matches[j].rep_len;
+ mswitches[n_mswitches].replace = (char *) 0;
+ mswitches[n_mswitches].rep_len = 0;
+ n_mswitches++;
+ break;
+ }
+ }
/* Add MULTILIB_DEFAULTS switches too, as long as they were not present
on the command line nor any options mutually incompatible with
@@ -7196,7 +6992,7 @@ set_multilib_dir (void)
{
int i = 0;
- mdswitches = XNEWVEC (struct mdswitchstr, n_mdswitches);
+ mdswitches = xmalloc (sizeof (struct mdswitchstr) * n_mdswitches);
for (start = multilib_defaults; *start != '\0'; start = end + 1)
{
while (*start == ' ' || *start == '\t')
@@ -7211,7 +7007,7 @@ set_multilib_dir (void)
obstack_grow (&multilib_obstack, start, end - start);
obstack_1grow (&multilib_obstack, 0);
- mdswitches[i].str = XOBFINISH (&multilib_obstack, const char *);
+ mdswitches[i].str = obstack_finish (&multilib_obstack);
mdswitches[i++].len = end - start;
if (*end == '\0')
@@ -7234,11 +7030,7 @@ set_multilib_dir (void)
while (*p != ';')
{
if (*p == '\0')
- {
- invalid_exclusions:
- fatal ("multilib exclusions '%s' is invalid",
- multilib_exclusions);
- }
+ abort ();
if (! ok)
{
@@ -7250,7 +7042,7 @@ set_multilib_dir (void)
while (*p != ' ' && *p != ';')
{
if (*p == '\0')
- goto invalid_exclusions;
+ abort ();
++p;
}
@@ -7292,11 +7084,7 @@ set_multilib_dir (void)
while (*p != ' ')
{
if (*p == '\0')
- {
- invalid_select:
- fatal ("multilib select '%s' is invalid",
- multilib_select);
- }
+ abort ();
++p;
}
this_path_len = p - this_path;
@@ -7308,7 +7096,7 @@ set_multilib_dir (void)
while (*p != ';')
{
if (*p == '\0')
- goto invalid_select;
+ abort ();
if (! ok)
{
@@ -7320,7 +7108,7 @@ set_multilib_dir (void)
while (*p != ' ' && *p != ';')
{
if (*p == '\0')
- goto invalid_select;
+ abort ();
++p;
}
@@ -7358,7 +7146,7 @@ set_multilib_dir (void)
if (this_path_len != 1
|| this_path[0] != '.')
{
- char *new_multilib_dir = XNEWVEC (char, this_path_len + 1);
+ char *new_multilib_dir = xmalloc (this_path_len + 1);
char *q;
strncpy (new_multilib_dir, this_path, this_path_len);
@@ -7379,7 +7167,7 @@ set_multilib_dir (void)
q++;
if (q < end)
{
- char *new_multilib_os_dir = XNEWVEC (char, end - q);
+ char *new_multilib_os_dir = xmalloc (end - q);
memcpy (new_multilib_os_dir, q + 1, end - q - 1);
new_multilib_os_dir[end - q - 1] = '\0';
multilib_os_dir = new_multilib_os_dir;
@@ -7433,11 +7221,7 @@ print_multilib_info (void)
while (*p != ' ')
{
if (*p == '\0')
- {
- invalid_select:
- fatal ("multilib select '%s' is invalid", multilib_select);
- }
-
+ abort ();
++p;
}
@@ -7471,11 +7255,7 @@ print_multilib_info (void)
int mp = 0;
if (*e == '\0')
- {
- invalid_exclusion:
- fatal ("multilib exclusion '%s' is invalid",
- multilib_exclusions);
- }
+ abort ();
if (! m)
{
@@ -7488,7 +7268,7 @@ print_multilib_info (void)
while (*e != ' ' && *e != ';')
{
if (*e == '\0')
- goto invalid_exclusion;
+ abort ();
++e;
}
@@ -7499,20 +7279,19 @@ print_multilib_info (void)
int len = e - this_arg;
if (*q == '\0')
- goto invalid_select;
+ abort ();
arg = q;
while (*q != ' ' && *q != ';')
{
if (*q == '\0')
- goto invalid_select;
+ abort ();
++q;
}
- if (! strncmp (arg, this_arg,
- (len < q - arg) ? q - arg : len)
- || default_arg (this_arg, e - this_arg))
+ if (! strncmp (arg, this_arg, (len < q - arg) ? q - arg : len) ||
+ default_arg (this_arg, e - this_arg))
{
mp = 1;
break;
@@ -7543,8 +7322,7 @@ print_multilib_info (void)
if (! skip)
{
/* If this is a duplicate, skip it. */
- skip = (last_path != 0
- && (unsigned int) (p - this_path) == last_path_len
+ skip = (last_path != 0 && (unsigned int) (p - this_path) == last_path_len
&& ! strncmp (last_path, this_path, last_path_len));
last_path = this_path;
@@ -7564,7 +7342,7 @@ print_multilib_info (void)
const char *arg;
if (*q == '\0')
- goto invalid_select;
+ abort ();
if (*q == '!')
arg = NULL;
@@ -7574,7 +7352,7 @@ print_multilib_info (void)
while (*q != ' ' && *q != ';')
{
if (*q == '\0')
- goto invalid_select;
+ abort ();
++q;
}
@@ -7605,7 +7383,7 @@ print_multilib_info (void)
int use_arg;
if (*p == '\0')
- goto invalid_select;
+ abort ();
if (skip)
{
@@ -7621,7 +7399,7 @@ print_multilib_info (void)
while (*p != ' ' && *p != ';')
{
if (*p == '\0')
- goto invalid_select;
+ abort ();
if (use_arg)
putchar (*p);
++p;
@@ -7695,161 +7473,3 @@ if_exists_else_spec_function (int argc, const char **argv)
return argv[1];
}
-
-/* replace-outfile built-in spec function.
-
- This looks for the first argument in the outfiles array's name and
- replaces it with the second argument. */
-
-static const char *
-replace_outfile_spec_function (int argc, const char **argv)
-{
- int i;
- /* Must have exactly two arguments. */
- if (argc != 2)
- abort ();
-
- for (i = 0; i < n_infiles; i++)
- {
- if (outfiles[i] && !strcmp (outfiles[i], argv[0]))
- outfiles[i] = xstrdup (argv[1]);
- }
- return NULL;
-}
-
-/* Given two version numbers, compares the two numbers.
- A version number must match the regular expression
- ([1-9][0-9]*|0)(\.([1-9][0-9]*|0))*
-*/
-static int
-compare_version_strings (const char *v1, const char *v2)
-{
- int rresult;
- regex_t r;
-
- if (regcomp (&r, "^([1-9][0-9]*|0)(\\.([1-9][0-9]*|0))*$",
- REG_EXTENDED | REG_NOSUB) != 0)
- abort ();
- rresult = regexec (&r, v1, 0, NULL, 0);
- if (rresult == REG_NOMATCH)
- fatal ("invalid version number `%s'", v1);
- else if (rresult != 0)
- abort ();
- rresult = regexec (&r, v2, 0, NULL, 0);
- if (rresult == REG_NOMATCH)
- fatal ("invalid version number `%s'", v2);
- else if (rresult != 0)
- abort ();
-
- return strverscmp (v1, v2);
-}
-
-
-/* version_compare built-in spec function.
-
- This takes an argument of the following form:
-
- <comparison-op> <arg1> [<arg2>] <switch> <result>
-
- and produces "result" if the comparison evaluates to true,
- and nothing if it doesn't.
-
- The supported <comparison-op> values are:
-
- >= true if switch is a later (or same) version than arg1
- !> opposite of >=
- < true if switch is an earlier version than arg1
- !< opposite of <
- >< true if switch is arg1 or later, and earlier than arg2
- <> true if switch is earlier than arg1 or is arg2 or later
-
- If the switch is not present, the condition is false unless
- the first character of the <comparison-op> is '!'.
-
- For example,
- %:version-compare(>= 10.3 mmacosx-version-min= -lmx)
- adds -lmx if -mmacosx-version-min=10.3.9 was passed. */
-
-static const char *
-version_compare_spec_function (int argc, const char **argv)
-{
- int comp1, comp2;
- size_t switch_len;
- const char *switch_value = NULL;
- int nargs = 1, i;
- bool result;
-
- if (argc < 3)
- fatal ("too few arguments to %%:version-compare");
- if (argv[0][0] == '\0')
- abort ();
- if ((argv[0][1] == '<' || argv[0][1] == '>') && argv[0][0] != '!')
- nargs = 2;
- if (argc != nargs + 3)
- fatal ("too many arguments to %%:version-compare");
-
- switch_len = strlen (argv[nargs + 1]);
- for (i = 0; i < n_switches; i++)
- if (!strncmp (switches[i].part1, argv[nargs + 1], switch_len)
- && check_live_switch (i, switch_len))
- switch_value = switches[i].part1 + switch_len;
-
- if (switch_value == NULL)
- comp1 = comp2 = -1;
- else
- {
- comp1 = compare_version_strings (switch_value, argv[1]);
- if (nargs == 2)
- comp2 = compare_version_strings (switch_value, argv[2]);
- else
- comp2 = -1; /* This value unused. */
- }
-
- switch (argv[0][0] << 8 | argv[0][1])
- {
- case '>' << 8 | '=':
- result = comp1 >= 0;
- break;
- case '!' << 8 | '<':
- result = comp1 >= 0 || switch_value == NULL;
- break;
- case '<' << 8:
- result = comp1 < 0;
- break;
- case '!' << 8 | '>':
- result = comp1 < 0 || switch_value == NULL;
- break;
- case '>' << 8 | '<':
- result = comp1 >= 0 && comp2 < 0;
- break;
- case '<' << 8 | '>':
- result = comp1 < 0 || comp2 >= 0;
- break;
-
- default:
- fatal ("unknown operator '%s' in %%:version-compare", argv[0]);
- }
- if (! result)
- return NULL;
-
- return argv[nargs + 2];
-}
-
-/* %:include builtin spec function. This differs from %include in that it
- can be nested inside a spec, and thus be conditionalized. It takes
- one argument, the filename, and looks for it in the startfile path.
- The result is always NULL, i.e. an empty expansion. */
-
-static const char *
-include_spec_function (int argc, const char **argv)
-{
- char *file;
-
- if (argc != 1)
- abort ();
-
- file = find_a_file (&startfile_prefixes, argv[0], R_OK, 0);
- read_specs (file ? file : argv[0], FALSE);
-
- return NULL;
-}
OpenPOWER on IntegriCloud