* 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.
This commit is contained in:
parent
a10ae76082
commit
1706a06f9e
4 changed files with 52 additions and 57 deletions
|
@ -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
|
||||
|
|
|
@ -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());
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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*
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in a new issue