diff options
author | meadori <meadori@138bc75d-0d04-0410-961f-82ee72b054a4> | 2012-11-27 16:55:47 +0000 |
---|---|---|
committer | meadori <meadori@138bc75d-0d04-0410-961f-82ee72b054a4> | 2012-11-27 16:55:47 +0000 |
commit | cdd7a5a41ecd752050f6cb2d927d4892d64585f3 (patch) | |
tree | b327f0c1eba3f0941ca3e99f9c8e852a2b117082 | |
parent | c7abeac58d5bb179f032292b4c9bc05b0b4402fc (diff) | |
download | gcc-cdd7a5a41ecd752050f6cb2d927d4892d64585f3.tar.gz |
2012-11-27 Meador Inge <meadori@codesourcery.com>
* collect2.c (main): Call find_file_set_debug.
(find_a_find, add_prefix, prefix_from_env, prefix_from_string):
Factor out into ...
* file-find.c (New file): ... here and ...
* file-find.h (New file): ... here.
* gcc-ar.c (standard_exec_prefix): New variable.
(standard_libexec_prefix): Ditto.
(tooldir_base_prefix) Ditto.
(self_exec_prefix): Ditto.
(self_libexec_prefix): Ditto.
(self_tooldir_prefix): Ditto.
(target_version): Ditto.
(path): Ditto.
(target_path): Ditto.
(setup_prefixes): New function.
(main): Rework how wrapped programs are found.
* Makefile.in (OBJS-libcommon-target): Add file-find.o.
(AR_OBJS): New variable.
(gcc-ar$(exeext)): Add dependency on $(AR_OBJS).
(gcc-nm$(exeext)): Ditto.
(gcc-ranlib(exeext)): Ditto.
(COLLECT2_OBJS): Add file-find.o.
(collect2.o): Add file-find.h prerequisite.
(file-find.o): New rule.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@193859 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r-- | gcc/ChangeLog | 27 | ||||
-rw-r--r-- | gcc/Makefile.in | 20 | ||||
-rw-r--r-- | gcc/collect2.c | 184 | ||||
-rw-r--r-- | gcc/file-find.c | 194 | ||||
-rw-r--r-- | gcc/file-find.h | 47 | ||||
-rw-r--r-- | gcc/gcc-ar.c | 147 |
6 files changed, 398 insertions, 221 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 7ae020a9dba..e41e34d3230 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,30 @@ +2012-11-27 Meador Inge <meadori@codesourcery.com> + + * collect2.c (main): Call find_file_set_debug. + (find_a_find, add_prefix, prefix_from_env, prefix_from_string): + Factor out into ... + * file-find.c (New file): ... here and ... + * file-find.h (New file): ... here. + * gcc-ar.c (standard_exec_prefix): New variable. + (standard_libexec_prefix): Ditto. + (tooldir_base_prefix) Ditto. + (self_exec_prefix): Ditto. + (self_libexec_prefix): Ditto. + (self_tooldir_prefix): Ditto. + (target_version): Ditto. + (path): Ditto. + (target_path): Ditto. + (setup_prefixes): New function. + (main): Rework how wrapped programs are found. + * Makefile.in (OBJS-libcommon-target): Add file-find.o. + (AR_OBJS): New variable. + (gcc-ar$(exeext)): Add dependency on $(AR_OBJS). + (gcc-nm$(exeext)): Ditto. + (gcc-ranlib(exeext)): Ditto. + (COLLECT2_OBJS): Add file-find.o. + (collect2.o): Add file-find.h prerequisite. + (file-find.o): New rule. + 2010-11-27 Dehao Chen <dehao@google.com> * ipa-prop.c (ipa_modify_call_arguments): Set loc correctly. diff --git a/gcc/Makefile.in b/gcc/Makefile.in index 44f1e085866..8f8316fb6e7 100644 --- a/gcc/Makefile.in +++ b/gcc/Makefile.in @@ -1471,7 +1471,7 @@ OBJS-libcommon = diagnostic.o pretty-print.o intl.o input.o version.o # compiler and containing target-dependent code. OBJS-libcommon-target = $(common_out_object_file) prefix.o params.o \ opts.o opts-common.o options.o vec.o hooks.o common/common-targhooks.o \ - hash-table.o + hash-table.o file-find.o # This lists all host objects for the front ends. ALL_HOST_FRONTEND_OBJS = $(foreach v,$(CONFIG_LANGUAGES),$($(v)_OBJS)) @@ -1852,19 +1852,20 @@ graph.o: graph.c $(SYSTEM_H) coretypes.h $(TM_H) toplev.h $(DIAGNOSTIC_CORE_H) $ sbitmap.o: sbitmap.c sbitmap.h $(CONFIG_H) $(SYSTEM_H) coretypes.h sparseset.o: sparseset.c $(SYSTEM_H) sparseset.h $(CONFIG_H) +AR_OBJS = file-find.o AR_LIBS = @COLLECT2_LIBS@ -gcc-ar$(exeext): gcc-ar.o $(LIBDEPS) +gcc-ar$(exeext): gcc-ar.o $(AR_OBJS) $(LIBDEPS) +$(LINKER) $(ALL_LINKERFLAGS) $(LDFLAGS) gcc-ar.o -o $@ \ - $(LIBS) $(AR_LIBS) + $(AR_OBJS) $(LIBS) $(AR_LIBS) -gcc-nm$(exeext): gcc-nm.o $(LIBDEPS) +gcc-nm$(exeext): gcc-nm.o $(AR_OBJS) $(LIBDEPS) +$(LINKER) $(ALL_LINKERFLAGS) $(LDFLAGS) gcc-nm.o -o $@ \ - $(LIBS) $(AR_LIBS) + $(AR_OBJS) $(LIBS) $(AR_LIBS) -gcc-ranlib$(exeext): gcc-ranlib.o $(LIBDEPS) +gcc-ranlib$(exeext): gcc-ranlib.o $(AR_OBJS) $(LIBDEPS) +$(LINKER) $(ALL_LINKERFLAGS) $(LDFLAGS) gcc-ranlib.o -o $@ \ - $(LIBS) $(AR_LIBS) + $(AR_OBJS) $(LIBS) $(AR_LIBS) CFLAGS-gcc-ar.o += $(DRIVER_DEFINES) \ -DTARGET_MACHINE=\"$(target_noncanonical)\" \ @@ -1892,7 +1893,7 @@ gcc-ranlib.c: gcc-ar.c gcc-nm.c: gcc-ar.c cp $^ $@ -COLLECT2_OBJS = collect2.o collect2-aix.o tlink.o vec.o ggc-none.o +COLLECT2_OBJS = collect2.o collect2-aix.o tlink.o vec.o ggc-none.o file-find.o COLLECT2_LIBS = @COLLECT2_LIBS@ collect2$(exeext): $(COLLECT2_OBJS) $(LIBDEPS) # Don't try modifying collect2 (aka ld) in place--it might be linking this. @@ -1904,7 +1905,7 @@ CFLAGS-collect2.o += -DTARGET_MACHINE=\"$(target_noncanonical)\" \ @TARGET_SYSTEM_ROOT_DEFINE@ collect2.o : collect2.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) intl.h \ $(OBSTACK_H) $(DEMANGLE_H) collect2.h collect2-aix.h version.h \ - $(DIAGNOSTIC_H) + $(DIAGNOSTIC_H) file-find.h collect2-aix.o : collect2-aix.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) \ collect2-aix.h @@ -3425,6 +3426,7 @@ hw-doloop.o : hw-doloop.c $(CONFIG_H) $(SYSTEM_H) coretypes.h dumpfile.h $(TM_H) $(RTL_H) $(FLAGS_H) $(EXPR_H) hard-reg-set.h $(BASIC_BLOCK_H) $(TM_P_H) \ $(DF_H) $(CFGLOOP_H) $(RECOG_H) $(TARGET_H) \ $(REGS_H) hw-doloop.h +file-find.o: file-find.c $(CONFIG_H) $(SYSTEM_H) file-find.h $(out_object_file): $(out_file) $(CONFIG_H) coretypes.h $(TM_H) $(TREE_H) \ $(RTL_H) $(REGS_H) hard-reg-set.h insn-config.h conditions.h \ output.h $(INSN_ATTR_H) $(SYSTEM_H) toplev.h $(DIAGNOSTIC_CORE_H) \ diff --git a/gcc/collect2.c b/gcc/collect2.c index fc69e2f71bf..49c40301d6c 100644 --- a/gcc/collect2.c +++ b/gcc/collect2.c @@ -31,6 +31,7 @@ along with GCC; see the file COPYING3. If not see #include "coretypes.h" #include "tm.h" #include "filenames.h" +#include "file-find.h" /* TARGET_64BIT may be defined to use driver specific functionality. */ #undef TARGET_64BIT @@ -243,22 +244,6 @@ static const char *target_system_root = ""; would leave untouched. */ bool may_unlink_output_file = false; -/* Structure to hold all the directories in which to search for files to - execute. */ - -struct prefix_list -{ - const char *prefix; /* String to prepend to the path. */ - struct prefix_list *next; /* Next in linked list. */ -}; - -struct path_prefix -{ - struct prefix_list *plist; /* List of prefixes to try */ - int max_len; /* Max length of a prefix in PLIST */ - const char *name; /* Name of this list (used in config stuff) */ -}; - #ifdef COLLECT_EXPORT_LIST /* Lists to keep libraries to be scanned for global constructors/destructors. */ static struct head libs; /* list of libraries */ @@ -302,10 +287,6 @@ typedef enum { static symkind is_ctor_dtor (const char *); static void handler (int); -static char *find_a_file (struct path_prefix *, const char *); -static void add_prefix (struct path_prefix *, const char *); -static void prefix_from_env (const char *, struct path_prefix *); -static void prefix_from_string (const char *, struct path_prefix *); static void do_wait (const char *, struct pex_obj *); static void fork_execute (const char *, char **); static void maybe_unlink (const char *); @@ -653,168 +634,6 @@ static const char *const target_machine = TARGET_MACHINE; Return 0 if not found, otherwise return its name, allocated with malloc. */ -static char * -find_a_file (struct path_prefix *pprefix, const char *name) -{ - char *temp; - struct prefix_list *pl; - int len = pprefix->max_len + strlen (name) + 1; - - if (debug) - fprintf (stderr, "Looking for '%s'\n", name); - -#ifdef HOST_EXECUTABLE_SUFFIX - len += strlen (HOST_EXECUTABLE_SUFFIX); -#endif - - temp = XNEWVEC (char, len); - - /* Determine the filename to execute (special case for absolute paths). */ - - if (IS_ABSOLUTE_PATH (name)) - { - if (access (name, X_OK) == 0) - { - strcpy (temp, name); - - if (debug) - fprintf (stderr, " - found: absolute path\n"); - - return temp; - } - -#ifdef HOST_EXECUTABLE_SUFFIX - /* Some systems have a suffix for executable files. - So try appending that. */ - strcpy (temp, name); - strcat (temp, HOST_EXECUTABLE_SUFFIX); - - if (access (temp, X_OK) == 0) - return temp; -#endif - - if (debug) - fprintf (stderr, " - failed to locate using absolute path\n"); - } - else - for (pl = pprefix->plist; pl; pl = pl->next) - { - struct stat st; - - strcpy (temp, pl->prefix); - strcat (temp, name); - - if (stat (temp, &st) >= 0 - && ! S_ISDIR (st.st_mode) - && access (temp, X_OK) == 0) - return temp; - -#ifdef HOST_EXECUTABLE_SUFFIX - /* Some systems have a suffix for executable files. - So try appending that. */ - strcat (temp, HOST_EXECUTABLE_SUFFIX); - - if (stat (temp, &st) >= 0 - && ! S_ISDIR (st.st_mode) - && access (temp, X_OK) == 0) - return temp; -#endif - } - - if (debug && pprefix->plist == NULL) - fprintf (stderr, " - failed: no entries in prefix list\n"); - - free (temp); - return 0; -} - -/* Add an entry for PREFIX to prefix list PPREFIX. */ - -static void -add_prefix (struct path_prefix *pprefix, const char *prefix) -{ - struct prefix_list *pl, **prev; - int len; - - if (pprefix->plist) - { - for (pl = pprefix->plist; pl->next; pl = pl->next) - ; - prev = &pl->next; - } - else - prev = &pprefix->plist; - - /* Keep track of the longest prefix. */ - - len = strlen (prefix); - if (len > pprefix->max_len) - pprefix->max_len = len; - - pl = XNEW (struct prefix_list); - pl->prefix = xstrdup (prefix); - - if (*prev) - pl->next = *prev; - else - pl->next = (struct prefix_list *) 0; - *prev = pl; -} - -/* Take the value of the environment variable ENV, break it into a path, and - add of the entries to PPREFIX. */ - -static void -prefix_from_env (const char *env, struct path_prefix *pprefix) -{ - const char *p; - p = getenv (env); - - if (p) - prefix_from_string (p, pprefix); -} - -static void -prefix_from_string (const char *p, struct path_prefix *pprefix) -{ - const char *startp, *endp; - char *nstore = XNEWVEC (char, strlen (p) + 3); - - if (debug) - fprintf (stderr, "Convert string '%s' into prefixes, separator = '%c'\n", p, PATH_SEPARATOR); - - startp = endp = p; - while (1) - { - if (*endp == PATH_SEPARATOR || *endp == 0) - { - strncpy (nstore, startp, endp-startp); - if (endp == startp) - { - strcpy (nstore, "./"); - } - else if (! IS_DIR_SEPARATOR (endp[-1])) - { - nstore[endp-startp] = DIR_SEPARATOR; - nstore[endp-startp+1] = 0; - } - else - nstore[endp-startp] = 0; - - if (debug) - fprintf (stderr, " - add prefix: %s\n", nstore); - - add_prefix (pprefix, nstore); - if (*endp == 0) - break; - endp = startp = endp + 1; - } - else - endp++; - } - free (nstore); -} - #ifdef OBJECT_FORMAT_NONE /* Add an entry for the object file NAME to object file list LIST. @@ -1198,6 +1017,7 @@ main (int argc, char **argv) #endif } vflag = debug; + find_file_set_debug (debug); if (no_partition && lto_mode == LTO_MODE_WHOPR) lto_mode = LTO_MODE_LTO; } diff --git a/gcc/file-find.c b/gcc/file-find.c new file mode 100644 index 00000000000..fcc25612008 --- /dev/null +++ b/gcc/file-find.c @@ -0,0 +1,194 @@ +/* Utility functions for finding files relative to GCC binaries. + Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, + 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2007, 2008, 2009, 2010, 2011, 2012 + +This file is part of GCC. + +GCC is free software; you can redistribute it and/or modify it under +the terms of the GNU General Public License as published by the Free +Software Foundation; either version 3, or (at your option) any later +version. + +GCC is distributed in the hope that it will be useful, but WITHOUT ANY +WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with GCC; see the file COPYING3. If not see +<http://www.gnu.org/licenses/>. */ + +#include "config.h" +#include "system.h" +#include "filenames.h" +#include "file-find.h" + +static bool debug = false; + +void +find_file_set_debug(bool debug_state) +{ + debug = debug_state; +} + +char * +find_a_file (struct path_prefix *pprefix, const char *name) +{ + char *temp; + struct prefix_list *pl; + int len = pprefix->max_len + strlen (name) + 1; + + if (debug) + fprintf (stderr, "Looking for '%s'\n", name); + +#ifdef HOST_EXECUTABLE_SUFFIX + len += strlen (HOST_EXECUTABLE_SUFFIX); +#endif + + temp = XNEWVEC (char, len); + + /* Determine the filename to execute (special case for absolute paths). */ + + if (IS_ABSOLUTE_PATH (name)) + { + if (access (name, X_OK) == 0) + { + strcpy (temp, name); + + if (debug) + fprintf (stderr, " - found: absolute path\n"); + + return temp; + } + +#ifdef HOST_EXECUTABLE_SUFFIX + /* Some systems have a suffix for executable files. + So try appending that. */ + strcpy (temp, name); + strcat (temp, HOST_EXECUTABLE_SUFFIX); + + if (access (temp, X_OK) == 0) + return temp; +#endif + + if (debug) + fprintf (stderr, " - failed to locate using absolute path\n"); + } + else + for (pl = pprefix->plist; pl; pl = pl->next) + { + struct stat st; + + strcpy (temp, pl->prefix); + strcat (temp, name); + + if (stat (temp, &st) >= 0 + && ! S_ISDIR (st.st_mode) + && access (temp, X_OK) == 0) + return temp; + +#ifdef HOST_EXECUTABLE_SUFFIX + /* Some systems have a suffix for executable files. + So try appending that. */ + strcat (temp, HOST_EXECUTABLE_SUFFIX); + + if (stat (temp, &st) >= 0 + && ! S_ISDIR (st.st_mode) + && access (temp, X_OK) == 0) + return temp; +#endif + } + + if (debug && pprefix->plist == NULL) + fprintf (stderr, " - failed: no entries in prefix list\n"); + + free (temp); + return 0; +} + +/* Add an entry for PREFIX to prefix list PPREFIX. */ + +void +add_prefix (struct path_prefix *pprefix, const char *prefix) +{ + struct prefix_list *pl, **prev; + int len; + + if (pprefix->plist) + { + for (pl = pprefix->plist; pl->next; pl = pl->next) + ; + prev = &pl->next; + } + else + prev = &pprefix->plist; + + /* Keep track of the longest prefix. */ + + len = strlen (prefix); + if (len > pprefix->max_len) + pprefix->max_len = len; + + pl = XNEW (struct prefix_list); + pl->prefix = xstrdup (prefix); + + if (*prev) + pl->next = *prev; + else + pl->next = (struct prefix_list *) 0; + *prev = pl; +} + +/* Take the value of the environment variable ENV, break it into a path, and + add of the entries to PPREFIX. */ + +void +prefix_from_env (const char *env, struct path_prefix *pprefix) +{ + const char *p; + p = getenv (env); + + if (p) + prefix_from_string (p, pprefix); +} + +void +prefix_from_string (const char *p, struct path_prefix *pprefix) +{ + const char *startp, *endp; + char *nstore = XNEWVEC (char, strlen (p) + 3); + + if (debug) + fprintf (stderr, "Convert string '%s' into prefixes, separator = '%c'\n", p, PATH_SEPARATOR); + + startp = endp = p; + while (1) + { + if (*endp == PATH_SEPARATOR || *endp == 0) + { + strncpy (nstore, startp, endp-startp); + if (endp == startp) + { + strcpy (nstore, "./"); + } + else if (! IS_DIR_SEPARATOR (endp[-1])) + { + nstore[endp-startp] = DIR_SEPARATOR; + nstore[endp-startp+1] = 0; + } + else + nstore[endp-startp] = 0; + + if (debug) + fprintf (stderr, " - add prefix: %s\n", nstore); + + add_prefix (pprefix, nstore); + if (*endp == 0) + break; + endp = startp = endp + 1; + } + else + endp++; + } + free (nstore); +} diff --git a/gcc/file-find.h b/gcc/file-find.h new file mode 100644 index 00000000000..4c0182a5eda --- /dev/null +++ b/gcc/file-find.h @@ -0,0 +1,47 @@ +/* Prototypes and data structures used for implementing functions for + finding files relative to GCC binaries. + Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, + 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2007, 2008, 2009, 2010, 2011, 2012 + +This file is part of GCC. + +GCC is free software; you can redistribute it and/or modify it under +the terms of the GNU General Public License as published by the Free +Software Foundation; either version 3, or (at your option) any later +version. + +GCC is distributed in the hope that it will be useful, but WITHOUT ANY +WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with GCC; see the file COPYING3. If not see +<http://www.gnu.org/licenses/>. */ + +#ifndef GCC_FILE_FIND_H +#define GCC_FILE_FIND_H + +/* Structure to hold all the directories in which to search for files to + execute. */ + +struct prefix_list +{ + const char *prefix; /* String to prepend to the path. */ + struct prefix_list *next; /* Next in linked list. */ +}; + +struct path_prefix +{ + struct prefix_list *plist; /* List of prefixes to try */ + int max_len; /* Max length of a prefix in PLIST */ + const char *name; /* Name of this list (used in config stuff) */ +}; + +extern void find_file_set_debug (bool); +extern char *find_a_file (struct path_prefix *, const char *); +extern void add_prefix (struct path_prefix *, const char *); +extern void prefix_from_env (const char *, struct path_prefix *); +extern void prefix_from_string (const char *, struct path_prefix *); + +#endif /* GCC_FILE_FIND_H */ diff --git a/gcc/gcc-ar.c b/gcc/gcc-ar.c index 5f78378dea8..c614566bb7c 100644 --- a/gcc/gcc-ar.c +++ b/gcc/gcc-ar.c @@ -21,21 +21,110 @@ along with GCC; see the file COPYING3. If not see #include "config.h" #include "system.h" #include "libiberty.h" +#include "file-find.h" #ifndef PERSONALITY #error "Please set personality" #endif +/* The exec prefix as derived at compile-time from --prefix. */ + +static const char standard_exec_prefix[] = STANDARD_EXEC_PREFIX; + +/* The libexec prefix as derived at compile-time from --prefix. */ + static const char standard_libexec_prefix[] = STANDARD_LIBEXEC_PREFIX; + +/* The bindir prefix as derived at compile-time from --prefix. */ + static const char standard_bin_prefix[] = STANDARD_BINDIR_PREFIX; -static const char *const target_machine = TARGET_MACHINE; + +/* A relative path to be used in finding the location of tools + relative to this program. */ + +static const char *const tooldir_base_prefix = TOOLDIR_BASE_PREFIX; + +/* The exec prefix as relocated from the location of this program. */ + +static const char *self_exec_prefix; + +/* The libexec prefix as relocated from the location of this program. */ + +static const char *self_libexec_prefix; + +/* The tools prefix as relocated from the location of this program. */ + +static const char *self_tooldir_prefix; + +/* The name of the machine that is being targeted. */ + +static const char *const target_machine = DEFAULT_TARGET_MACHINE; + +/* The target version. */ + +static const char *const target_version = DEFAULT_TARGET_VERSION; + +/* The collection of target specific path prefixes. */ + +static struct path_prefix target_path; + +/* The collection path prefixes. */ + +static struct path_prefix path; + +/* The directory separator. */ static const char dir_separator[] = { DIR_SEPARATOR, 0 }; +static void +setup_prefixes (const char *exec_path) +{ + const char *self; + + self = getenv ("GCC_EXEC_PREFIX"); + if (!self) + self = exec_path; + else + self = concat (self, "gcc-" PERSONALITY, NULL); + + /* Relocate the exec prefix. */ + self_exec_prefix = make_relative_prefix (self, + standard_bin_prefix, + standard_exec_prefix); + if (self_exec_prefix == NULL) + self_exec_prefix = standard_exec_prefix; + + /* Relocate libexec prefix. */ + self_libexec_prefix = make_relative_prefix (self, + standard_bin_prefix, + standard_libexec_prefix); + if (self_libexec_prefix == NULL) + self_libexec_prefix = standard_libexec_prefix; + + + /* Build the relative path to the target-specific tool directory. */ + self_tooldir_prefix = concat (tooldir_base_prefix, target_machine, + dir_separator, NULL); + self_tooldir_prefix = concat (self_exec_prefix, target_machine, + dir_separator, target_version, dir_separator, + self_tooldir_prefix, NULL); + + /* Add the target-specific tool bin prefix. */ + prefix_from_string (concat (self_tooldir_prefix, "bin", NULL), &target_path); + + /* Add the target-specific libexec prefix. */ + self_libexec_prefix = concat (self_libexec_prefix, target_machine, + dir_separator, target_version, + dir_separator, NULL); + prefix_from_string (self_libexec_prefix, &target_path); + + /* Add path as a last resort. */ + prefix_from_env ("PATH", &path); +} + int main(int ac, char **av) { - const char *nprefix; const char *exe_name; char *plugin; int k, status, err; @@ -44,39 +133,37 @@ main(int ac, char **av) bool is_ar = !strcmp (PERSONALITY, "ar"); int exit_code = FATAL_EXIT_CODE; - exe_name = PERSONALITY; -#ifdef CROSS_DIRECTORY_STRUCTURE - exe_name = concat (target_machine, "-", exe_name, NULL); -#endif + setup_prefixes (av[0]); - /* Find plugin */ - /* XXX implement more magic from gcc.c? */ - nprefix = getenv ("GCC_EXEC_PREFIX"); - if (!nprefix) - nprefix = av[0]; - else - nprefix = concat (nprefix, "gcc-" PERSONALITY, NULL); - - nprefix = make_relative_prefix (nprefix, - standard_bin_prefix, - standard_libexec_prefix); - if (nprefix == NULL) - nprefix = standard_libexec_prefix; - - plugin = concat (nprefix, - dir_separator, - DEFAULT_TARGET_MACHINE, - dir_separator, - DEFAULT_TARGET_VERSION, - dir_separator, - LTOPLUGINSONAME, - NULL); - if (access (plugin, R_OK)) + /* Find the GCC LTO plugin */ + plugin = find_a_file (&target_path, LTOPLUGINSONAME); + if (!plugin) { - fprintf (stderr, "%s: Cannot find plugin %s\n", av[0], plugin); + fprintf (stderr, "%s: Cannot find plugin '%s'\n", av[0], LTOPLUGINSONAME); exit (1); } + /* Find the wrapped binutils program. */ + exe_name = find_a_file (&target_path, PERSONALITY); + if (!exe_name) + { +#ifdef CROSS_DIRECTORY_STRUCTURE + const char *cross_exe_name; + + cross_exe_name = concat (target_machine, "-", PERSONALITY, NULL); + exe_name = find_a_file (&path, cross_exe_name); + if (!exe_name) + { + fprintf (stderr, "%s: Cannot find binary '%s'\n", av[0], + cross_exe_name); + exit (1); + } +#else + fprintf (stderr, "%s: Cannot find binary '%s'\n", av[0], PERSONALITY); + exit (1); +#endif + } + /* Create new command line with plugin */ nargv = XCNEWVEC (const char *, ac + 4); nargv[0] = exe_name; |