Ping ^ 4. 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