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