summaryrefslogtreecommitdiffstats
path: root/lld/lib/Core/Resolver.cpp
diff options
context:
space:
mode:
authorRui Ueyama <ruiu@google.com>2015-01-21 18:54:26 +0000
committerRui Ueyama <ruiu@google.com>2015-01-21 18:54:26 +0000
commitbcf891801311fc338617d6a11ec72380f030d728 (patch)
tree011a71689f3b3601e84e9e9d49f895918cd90eaa /lld/lib/Core/Resolver.cpp
parentcfb8ad29b525298fb853f4bfaae97af062eb376e (diff)
downloadbcm5719-llvm-bcf891801311fc338617d6a11ec72380f030d728.tar.gz
bcm5719-llvm-bcf891801311fc338617d6a11ec72380f030d728.zip
Simplify.
What we are trying to do here is to skip object files in group if group is repeated. This code is simpler than before. llvm-svn: 226688
Diffstat (limited to 'lld/lib/Core/Resolver.cpp')
-rw-r--r--lld/lib/Core/Resolver.cpp18
1 files changed, 10 insertions, 8 deletions
diff --git a/lld/lib/Core/Resolver.cpp b/lld/lib/Core/Resolver.cpp
index 2fcd254aa68..71d51139424 100644
--- a/lld/lib/Core/Resolver.cpp
+++ b/lld/lib/Core/Resolver.cpp
@@ -254,7 +254,7 @@ bool Resolver::undefinesAdded(int begin, int end) {
return false;
}
-File *Resolver::getFile(int &index, bool &inGroup) {
+File *Resolver::getFile(int &index) {
std::vector<std::unique_ptr<Node>> &inputs = _context.getNodes();
if ((size_t)index >= inputs.size())
return nullptr;
@@ -265,12 +265,10 @@ File *Resolver::getFile(int &index, bool &inGroup) {
int size = group->getSize();
if (undefinesAdded(index - size, index)) {
index -= size;
- inGroup = true;
- return getFile(index, inGroup);
+ return getFile(index);
}
++index;
- inGroup = false;
- return getFile(index, inGroup);
+ return getFile(index);
}
return cast<FileNode>(inputs[index++].get())->getFile();
}
@@ -290,10 +288,10 @@ void Resolver::makePreloadArchiveMap() {
bool Resolver::resolveUndefines() {
ScopedTask task(getDefaultDomain(), "resolveUndefines");
int index = 0;
- bool inGroup = false;
+ std::set<File *> seen;
for (;;) {
bool undefAdded = false;
- File *file = getFile(index, inGroup);
+ File *file = getFile(index);
if (!file)
return true;
if (std::error_code ec = file->parse()) {
@@ -304,8 +302,12 @@ bool Resolver::resolveUndefines() {
file->beforeLink();
switch (file->kind()) {
case File::kindObject:
- if (inGroup)
+ // The same file may be visited more than once if the file is
+ // in --start-group and --end-group. Only library files should
+ // be processed more than once.
+ if (seen.count(file))
break;
+ seen.insert(file);
assert(!file->hasOrdinal());
file->setOrdinal(_context.getNextOrdinalAndIncrement());
undefAdded = handleFile(*file);
OpenPOWER on IntegriCloud