From: Richard Biener <richard.guenther@gmail.com>
To: Meador Inge <meadori@codesourcery.com>
Cc: gcc-patches@gcc.gnu.org, dnovillo@google.com
Subject: Re: [PATCH] gcc-{ar,nm,ranlib}: Find binutils binaries relative to self
Date: Mon, 26 Nov 2012 15:06:00 -0000 [thread overview]
Message-ID: <CAFiYyc3aiagqrNrTWN=sMr3KCCiTa6N48oD-5t+_x2Q46DmQ4w@mail.gmail.com> (raw)
In-Reply-To: <509AD7E0.2060008@codesourcery.com>
On Wed, Nov 7, 2012 at 10:51 PM, Meador Inge <meadori@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 <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.
>>>>>
>>>>> 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
next prev parent reply other threads:[~2012-11-26 15:06 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-10-04 20:46 Meador Inge
2012-10-10 2:47 ` Meador Inge
2012-10-18 15:39 ` Meador Inge
2012-10-18 19:08 ` Bernhard Reutner-Fischer
2012-10-19 21:55 ` Meador Inge
2012-10-19 22:26 ` Meador Inge
2012-10-29 16:10 ` Meador Inge
2012-11-07 21:51 ` Meador Inge
2012-11-26 15:06 ` Richard Biener [this message]
2012-11-27 18:14 ` Meador Inge
2013-06-19 12:03 ` Matthias Klose
2013-06-19 12:10 ` Jakub Jelinek
2013-06-19 15:29 ` Matthias Klose
2013-06-19 17:47 ` Jakub Jelinek
2013-06-19 20:58 ` Matthias Klose
2013-06-19 12:20 ` Matthias Klose
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to='CAFiYyc3aiagqrNrTWN=sMr3KCCiTa6N48oD-5t+_x2Q46DmQ4w@mail.gmail.com' \
--to=richard.guenther@gmail.com \
--cc=dnovillo@google.com \
--cc=gcc-patches@gcc.gnu.org \
--cc=meadori@codesourcery.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).