On Wed, Nov 7, 2012 at 10:51 PM, Meador Inge <mead...@codesourcery.com> wrote: > Ping ^ 4.
Ok. Thanks, Richard. > On 10/29/2012 10:46 AM, Meador Inge wrote: >> Ping ^ 3. >> >> On 10/18/2012 10:30 AM, Meador Inge wrote: >>> Ping ^ 2. >>> >>> On 10/09/2012 09:44 PM, Meador Inge wrote: >>>> Ping. >>>> >>>> On 10/04/2012 03:45 PM, Meador Inge wrote: >>>>> Hi All, >>>>> >>>>> Currently the gcc-{ar,nm,ranlib} utilities assume that binutils is in >>>>> path when invoking the wrapped binutils program. This goes against the >>>>> accepted practice in GCC to find sub-programs relative to where the >>>>> GCC binaries are stored and to not make assumptions about the PATH. >>>>> >>>>> This patch changes the gcc-{ar,nm,ranlib} utilities to do the same >>>>> by factoring out some utility code for finding files from collect2.c. >>>>> These functions are then leveraged to find the binutils programs. >>>>> Note that similar code exist in gcc.c. Perhaps one day everything >>>>> can be merged to the file-find files. >>>>> >>>>> Tested for Windows and GNU/Linux hosts and i686-pc-linux-gnu and >>>>> arm-none-eabi targets. OK? >>>>> >>>>> P.S. I am not quite sure what is best for the copyrights and contributed >>>>> by comments in the file-find* files I added since that code was just >>>>> moved. >>>>> This patch drops the contributed by and keeps all the copyright dates from >>>>> collect2.c. >>>>> >>>>> 2012-10-04 Meador Inge <mead...@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. >>>>> >>>>> Index: gcc/gcc-ar.c >>>>> =================================================================== >>>>> --- gcc/gcc-ar.c (revision 192099) >>>>> +++ gcc/gcc-ar.c (working copy) >>>>> @@ -21,21 +21,110 @@ >>>>> #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,37 +133,35 @@ >>>>> 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); >>>>> + /* Find the GCC LTO plugin */ >>>>> + plugin = find_a_file (&target_path, LTOPLUGINSONAME); >>>>> + if (!plugin) >>>>> + { >>>>> + fprintf (stderr, "%s: Cannot find plugin '%s'\n", av[0], >>>>> LTOPLUGINSONAME); >>>>> + exit (1); >>>>> + } >>>>> >>>>> - nprefix = make_relative_prefix (nprefix, >>>>> - standard_bin_prefix, >>>>> - standard_libexec_prefix); >>>>> - if (nprefix == NULL) >>>>> - nprefix = standard_libexec_prefix; >>>>> + /* 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; >>>>> >>>>> - plugin = concat (nprefix, >>>>> - dir_separator, >>>>> - DEFAULT_TARGET_MACHINE, >>>>> - dir_separator, >>>>> - DEFAULT_TARGET_VERSION, >>>>> - dir_separator, >>>>> - LTOPLUGINSONAME, >>>>> - NULL); >>>>> - if (access (plugin, R_OK)) >>>>> - { >>>>> - fprintf (stderr, "%s: Cannot find plugin %s\n", av[0], plugin); >>>>> + 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 */ >>>>> Index: gcc/Makefile.in >>>>> =================================================================== >>>>> --- gcc/Makefile.in (revision 192099) >>>>> +++ gcc/Makefile.in (working copy) >>>>> @@ -1446,7 +1446,7 @@ >>>>> # 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)) >>>>> @@ -1827,19 +1827,20 @@ >>>>> ebitmap.o: ebitmap.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(EBITMAP_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)\" \ >>>>> @@ -1867,7 +1868,7 @@ >>>>> 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. >>>>> @@ -1879,7 +1880,7 @@ >>>>> @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 >>>>> @@ -3353,6 +3354,7 @@ >>>>> $(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) \ >>>>> Index: gcc/file-find.c >>>>> =================================================================== >>>>> --- gcc/file-find.c (revision 0) >>>>> +++ gcc/file-find.c (revision 0) >>>>> @@ -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); >>>>> +} >>>>> Index: gcc/file-find.h >>>>> =================================================================== >>>>> --- gcc/file-find.h (revision 0) >>>>> +++ gcc/file-find.h (revision 0) >>>>> @@ -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 */ >>>>> Index: gcc/collect2.c >>>>> =================================================================== >>>>> --- gcc/collect2.c (revision 192099) >>>>> +++ gcc/collect2.c (working copy) >>>>> @@ -31,6 +31,7 @@ >>>>> #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 @@ >>>>> 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 @@ >>>>> 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 @@ >>>>> >>>>> 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 @@ >>>>> #endif >>>>> } >>>>> vflag = debug; >>>>> + find_file_set_debug (debug); >>>>> if (no_partition && lto_mode == LTO_MODE_WHOPR) >>>>> lto_mode = LTO_MODE_LTO; >>>>> } >>>> >>>> >>> >>> >> >> > > > -- > Meador Inge > CodeSourcery / Mentor Embedded > http://www.mentor.com/embedded-software