diff --git a/lld/include/lld/Core/Resolver.h b/lld/include/lld/Core/Resolver.h index b0dc268efc3f..7ffd3523b507 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 863b36db2e05..8b211cb9a5e4 100644 --- a/lld/lib/Core/Resolver.cpp +++ b/lld/lib/Core/Resolver.cpp @@ -289,20 +289,20 @@ void Resolver::addAtoms(const std::vector& 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 = _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)) {