public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
From: Meador Inge <meadori@codesourcery.com>
To: <gcc-patches@gcc.gnu.org>
Cc: <rguenther@suse.de>, <dnovillo@google.com>
Subject: Re: [PATCH] gcc-{ar,nm,ranlib}: Find binutils binaries relative to self
Date: Fri, 19 Oct 2012 22:26:00 -0000	[thread overview]
Message-ID: <5081C8DB.3060306@codesourcery.com> (raw)
In-Reply-To: <5080208C.9050207@codesourcery.com>

CC'ing the LTO maintainers.

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;
>>> -}
>>> -\f
>>> -/* 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

  parent reply	other threads:[~2012-10-19 21:40 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 [this message]
2012-10-29 16:10     ` Meador Inge
2012-11-07 21:51       ` Meador Inge
2012-11-26 15:06         ` Richard Biener
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=5081C8DB.3060306@codesourcery.com \
    --to=meadori@codesourcery.com \
    --cc=dnovillo@google.com \
    --cc=gcc-patches@gcc.gnu.org \
    --cc=rguenther@suse.de \
    /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).