summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lld/include/lld/Core/Resolver.h2
-rw-r--r--lld/lib/Core/Resolver.cpp13
2 files changed, 8 insertions, 7 deletions
diff --git a/lld/include/lld/Core/Resolver.h b/lld/include/lld/Core/Resolver.h
index b0dc268efc3..7ffd3523b50 100644
--- a/lld/include/lld/Core/Resolver.h
+++ b/lld/include/lld/Core/Resolver.h
@@ -69,7 +69,7 @@ public:
private:
/// \brief The main function that iterates over the files to resolve
- void resolveUndefines();
+ bool resolveUndefines();
void updateReferences();
void deadStripOptimize();
bool checkUndefines(bool final);
diff --git a/lld/lib/Core/Resolver.cpp b/lld/lib/Core/Resolver.cpp
index 863b36db2e0..8b211cb9a5e 100644
--- a/lld/lib/Core/Resolver.cpp
+++ b/lld/lib/Core/Resolver.cpp
@@ -289,20 +289,20 @@ void Resolver::addAtoms(const std::vector<const DefinedAtom*>& newAtoms) {
}
}
-// Ask symbol table if any undefined atoms still exist. If so, keep searching
-// libraries until no more atoms being added.
-void Resolver::resolveUndefines() {
+// Keep adding atoms until _context.nextFile() returns an error. This function
+// is where undefined atoms are resolved.
+bool Resolver::resolveUndefines() {
ScopedTask task(getDefaultDomain(), "resolveUndefines");
for (;;) {
ErrorOr<File &> file = _context.nextFile();
_context.setResolverState(Resolver::StateNoChange);
if (error_code(file) == InputGraphError::no_more_files)
- return;
+ return true;
if (!file) {
llvm::errs() << "Error occurred in nextFile: "
<< error_code(file).message() << "\n";
- return;
+ return false;
}
switch (file->kind()) {
@@ -470,7 +470,8 @@ void Resolver::linkTimeOptimize() {
}
bool Resolver::resolve() {
- this->resolveUndefines();
+ if (!this->resolveUndefines())
+ return false;
this->updateReferences();
this->deadStripOptimize();
if (this->checkUndefines(false)) {
OpenPOWER on IntegriCloud