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

Reply via email to