diff options
| -rw-r--r-- | lld/include/lld/Core/Resolver.h | 2 | ||||
| -rw-r--r-- | lld/lib/Core/Resolver.cpp | 13 |
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)) { |

