summaryrefslogtreecommitdiffstats
path: root/lld/lib/Core/Resolver.cpp
diff options
context:
space:
mode:
authorRui Ueyama <ruiu@google.com>2014-12-04 18:29:03 +0000
committerRui Ueyama <ruiu@google.com>2014-12-04 18:29:03 +0000
commit5ae2050420fa002580e42bc8619acb15363fa53d (patch)
treeecc9522663dd9566048b9bc4830f5e0c7302e255 /lld/lib/Core/Resolver.cpp
parent19c39ee077aacccf1e80d9313cca09316d8813b4 (diff)
downloadbcm5719-llvm-5ae2050420fa002580e42bc8619acb15363fa53d.tar.gz
bcm5719-llvm-5ae2050420fa002580e42bc8619acb15363fa53d.zip
Revert "Rewrite InputGraph's Group"
This reverts commit r223330 because it broke Darwin and ELF linkers in a way that we couldn't have caught with the existing test cases. llvm-svn: 223373
Diffstat (limited to 'lld/lib/Core/Resolver.cpp')
-rw-r--r--lld/lib/Core/Resolver.cpp74
1 files changed, 21 insertions, 53 deletions
diff --git a/lld/lib/Core/Resolver.cpp b/lld/lib/Core/Resolver.cpp
index f92c1155ad1..e4a1b53cc33 100644
--- a/lld/lib/Core/Resolver.cpp
+++ b/lld/lib/Core/Resolver.cpp
@@ -27,7 +27,7 @@
namespace lld {
-bool Resolver::handleFile(const File &file) {
+void Resolver::handleFile(const File &file) {
bool undefAdded = false;
for (const DefinedAtom *atom : file.defined())
doDefinedAtom(*atom);
@@ -38,7 +38,13 @@ bool Resolver::handleFile(const File &file) {
doSharedLibraryAtom(*atom);
for (const AbsoluteAtom *atom : file.absolute())
doAbsoluteAtom(*atom);
- return undefAdded;
+
+ // Notify the input file manager of the fact that we have made some progress
+ // on linking using the current input file. It may want to know the fact for
+ // --start-group/--end-group.
+ if (undefAdded) {
+ _context.getInputGraph().notifyProgress();
+ }
}
void Resolver::forEachUndefines(bool searchForOverrides,
@@ -70,19 +76,17 @@ void Resolver::forEachUndefines(bool searchForOverrides,
} while (undefineGenCount != _symbolTable.size());
}
-bool Resolver::handleArchiveFile(const File &file) {
+void Resolver::handleArchiveFile(const File &file) {
const ArchiveLibraryFile *archiveFile = cast<ArchiveLibraryFile>(&file);
bool searchForOverrides =
_context.searchArchivesToOverrideTentativeDefinitions();
- bool undefAdded = false;
forEachUndefines(searchForOverrides,
[&](StringRef undefName, bool dataSymbolOnly) {
if (const File *member = archiveFile->find(undefName, dataSymbolOnly)) {
member->setOrdinal(_context.getNextOrdinalAndIncrement());
- undefAdded = undefAdded || handleFile(*member);
+ handleFile(*member);
}
});
- return undefAdded;
}
void Resolver::handleSharedLibrary(const File &file) {
@@ -229,66 +233,31 @@ void Resolver::addAtoms(const std::vector<const DefinedAtom *> &newAtoms) {
doDefinedAtom(*newAtom);
}
-// Returns true if at least one of N previous files has created an
-// undefined symbol.
-bool Resolver::undefinesAdded(int n) {
- for (size_t i = _fileIndex - n; i < _fileIndex; ++i)
- if (_newUndefinesAdded[_files[i]])
- return true;
- return false;
-}
-
-ErrorOr<File &> Resolver::nextFile(bool &inGroup) {
- if (size_t groupSize = _context.getInputGraph().getGroupSize()) {
- // We are at the end of the current group. If one or more new
- // undefined atom has been added in the last groupSize files, we
- // reiterate over the files.
- if (undefinesAdded(groupSize))
- _fileIndex -= groupSize;
- _context.getInputGraph().skipGroup();
- return nextFile(inGroup);
- }
- if (_fileIndex < _files.size()) {
- // We are still in the current group.
- inGroup = true;
- return *_files[_fileIndex++];
- }
- // We are not in a group. Get a new file.
- ErrorOr<File &> file = _context.getInputGraph().getNextFile();
- if (std::error_code ec = file.getError()) {
- if (ec != InputGraphError::no_more_files)
- llvm::errs() << "Error occurred in getNextFile: " << ec.message() << "\n";
- return ec;
- }
- _files.push_back(&*file);
- ++_fileIndex;
- inGroup = false;
- return *file;
-}
-
// Keep adding atoms until _context.getNextFile() returns an error. This
// function is where undefined atoms are resolved.
bool Resolver::resolveUndefines() {
ScopedTask task(getDefaultDomain(), "resolveUndefines");
for (;;) {
- bool inGroup = false;
- bool undefAdded = false;
- ErrorOr<File &> file = nextFile(inGroup);
- if (std::error_code ec = file.getError())
- return ec == InputGraphError::no_more_files;
+ ErrorOr<File &> file = _context.getInputGraph().getNextFile();
+ std::error_code ec = file.getError();
+ if (ec == InputGraphError::no_more_files)
+ return true;
+ if (!file) {
+ llvm::errs() << "Error occurred in getNextFile: " << ec.message() << "\n";
+ return false;
+ }
+
switch (file->kind()) {
case File::kindObject:
- if (inGroup)
- break;
assert(!file->hasOrdinal());
file->setOrdinal(_context.getNextOrdinalAndIncrement());
- undefAdded = handleFile(*file);
+ handleFile(*file);
break;
case File::kindArchiveLibrary:
if (!file->hasOrdinal())
file->setOrdinal(_context.getNextOrdinalAndIncrement());
- undefAdded = handleArchiveFile(*file);
+ handleArchiveFile(*file);
break;
case File::kindSharedLibrary:
if (!file->hasOrdinal())
@@ -296,7 +265,6 @@ bool Resolver::resolveUndefines() {
handleSharedLibrary(*file);
break;
}
- _newUndefinesAdded[&*file] = undefAdded;
}
}
OpenPOWER on IntegriCloud