* dirsearch.cc (Dirsearch::find): Replace n1 and n2 parameters
authorIan Lance Taylor <ian@airs.com>
Wed, 25 May 2011 06:15:28 +0000 (06:15 +0000)
committerIan Lance Taylor <ian@airs.com>
Wed, 25 May 2011 06:15:28 +0000 (06:15 +0000)
with name parameter.  Add found_name parameter.
* fileread.cc (Input_file::find_file): Adjust code accordingly.
* dirsearch.h (class Dirsearch): Update declaration.

gold/ChangeLog
gold/dirsearch.cc
gold/dirsearch.h
gold/fileread.cc

index 94774ae..292d301 100644 (file)
@@ -1,3 +1,10 @@
+2011-05-24  David Meyer  <pdox@google.com>
+
+       * dirsearch.cc (Dirsearch::find): Replace n1 and n2 parameters
+       with name parameter.  Add found_name parameter.
+       * fileread.cc (Input_file::find_file): Adjust code accordingly.
+       * dirsearch.h (class Dirsearch): Update declaration.
+
 2011-05-24  Ian Lance Taylor  <iant@google.com>
 
        * archive.cc (Library_base::should_include_member): Pull in object
index fac3b2c..a149db5 100644 (file)
@@ -1,6 +1,6 @@
 // dirsearch.cc -- directory searching for gold
 
-// Copyright 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
+// Copyright 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc.
 // Written by Ian Lance Taylor <iant@google.com>.
 
 // This file is part of gold.
@@ -241,8 +241,9 @@ Dirsearch::initialize(Workqueue* workqueue,
 // File_read::open.
 
 std::string
-Dirsearch::find(const std::string& n1, const std::string& n2,
-               bool* is_in_sysroot, int* pindex) const
+Dirsearch::find(const std::vector<std::string>& names,
+               bool* is_in_sysroot, int* pindex,
+               std::string *found_name) const
 {
   gold_assert(!this->token_.is_blocked());
   gold_assert(*pindex >= 0);
@@ -254,27 +255,20 @@ Dirsearch::find(const std::string& n1, const std::string& n2,
       const Search_directory* p = &this->directories_->at(i);
       Dir_cache* pdc = caches->lookup(p->name().c_str());
       gold_assert(pdc != NULL);
-      if (pdc->find(n1))
+      for (std::vector<std::string>::const_iterator n = names.begin();
+          n != names.end();
+          ++n)
        {
-         *is_in_sysroot = p->is_in_sysroot();
-         *pindex = i;
-         return p->name() + '/' + n1;
-       }
-      else
-        gold_debug(DEBUG_FILES, "Attempt to open %s/%s failed",
-                   p->name().c_str(), n1.c_str());
-
-      if (!n2.empty())
-        {
-          if (pdc->find(n2))
-            {
-              *is_in_sysroot = p->is_in_sysroot();
+         if (pdc->find(*n))
+           {
+             *is_in_sysroot = p->is_in_sysroot();
              *pindex = i;
-              return p->name() + '/' + n2;
-            }
-          else
-            gold_debug(DEBUG_FILES, "Attempt to open %s/%s failed",
-                       p->name().c_str(), n2.c_str());
+             *found_name = *n;
+             return p->name() + '/' + *n;
+           }
+         else
+           gold_debug(DEBUG_FILES, "Attempt to open %s/%s failed",
+                      p->name().c_str(), (*n).c_str());
        }
     }
 
index 986d389..270cef6 100644 (file)
@@ -1,6 +1,6 @@
 // dirsearch.h -- directory searching for gold  -*- C++ -*-
 
-// Copyright 2006, 2007, 2008 Free Software Foundation, Inc.
+// Copyright 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc.
 // Written by Ian Lance Taylor <iant@google.com>.
 
 // This file is part of gold.
@@ -59,8 +59,8 @@ class Dirsearch
   // and that value plus one may be used to find the next file with
   // the same name(s).
   std::string
-  find(const std::string&, const std::string& n2, bool* is_in_sysroot,
-       int* pindex) const;
+  find(const std::vector<std::string>& names, bool* is_in_sysroot,
+       int* pindex, std::string *found_name) const;
 
   // Return the blocker token which controls access.
   Task_token*
index 2324734..80ddfbc 100644 (file)
@@ -986,45 +986,40 @@ Input_file::find_file(const Dirsearch& dirpath, int* pindex,
   else if (input_argument->is_lib()
           || input_argument->is_searched_file())
     {
-      std::string n1, n2;
+      std::vector<std::string> names;
+      names.reserve(2);
       if (input_argument->is_lib())
        {
-         n1 = "lib";
-         n1 += input_argument->name();
+         std::string prefix = "lib";
+         prefix += input_argument->name();
          if (parameters->options().is_static()
              || !input_argument->options().Bdynamic())
-           n1 += ".a";
+           names.push_back(prefix + ".a");
          else
            {
-             n2 = n1 + ".a";
-             n1 += ".so";
+             names.push_back(prefix + ".so");
+             names.push_back(prefix + ".a");
            }
        }
       else
-       n1 = input_argument->name();
+       names.push_back(input_argument->name());
 
-      if (Input_file::try_extra_search_path(pindex, input_argument, n1,
-                                           found_name, namep))
-        return true;
-
-      if (!n2.empty() && Input_file::try_extra_search_path(pindex,
-                                                          input_argument, n2,
-                                                          found_name, namep))
-        return true;
+      for (std::vector<std::string>::const_iterator n = names.begin();
+          n != names.end();
+          ++n)
+       if (Input_file::try_extra_search_path(pindex, input_argument, *n,
+                                             found_name, namep))
+         return true;
 
       // It is not in the extra_search_path.
-      name = dirpath.find(n1, n2, is_in_sysroot, pindex);
+      name = dirpath.find(names, is_in_sysroot, pindex, found_name);
       if (name.empty())
        {
          gold_error(_("cannot find %s%s"),
-                    input_argument->is_lib() ? "-l" : "",
+                    input_argument->is_lib() ? "-l" : "",
                     input_argument->name());
          return false;
        }
-      if (n2.empty() || name[name.length() - 1] == 'o')
-       *found_name = n1;
-      else
-       *found_name = n2;
       *namep = name;
       return true;
     }
@@ -1034,22 +1029,21 @@ Input_file::find_file(const Dirsearch& dirpath, int* pindex,
       gold_assert(input_argument->extra_search_path() != NULL);
 
       if (try_extra_search_path(pindex, input_argument, input_argument->name(),
-                                found_name, namep))
-        return true;
+                               found_name, namep))
+       return true;
 
       // extra_search_path failed, so check the normal search-path.
       int index = *pindex;
       if (index > 0)
-        --index;
-      name = dirpath.find(input_argument->name(), "",
-                          is_in_sysroot, &index);
+       --index;
+      name = dirpath.find(std::vector<std::string>(1, input_argument->name()),
+                         is_in_sysroot, &index, found_name);
       if (name.empty())
-        {
-          gold_error(_("cannot find %s"),
-                     input_argument->name());
-          return false;
-        }
-      *found_name = input_argument->name();
+       {
+         gold_error(_("cannot find %s"),
+                    input_argument->name());
+         return false;
+       }
       *namep = name;
       *pindex = index + 1;
       return true;