diff --git a/llvm/include/llvm/ExecutionEngine/Orc/Core.h b/llvm/include/llvm/ExecutionEngine/Orc/Core.h index 062b1f3e93e63..4583f84b51d71 100644 --- a/llvm/include/llvm/ExecutionEngine/Orc/Core.h +++ b/llvm/include/llvm/ExecutionEngine/Orc/Core.h @@ -433,13 +433,16 @@ class SymbolsNotFound : public ErrorInfo { public: static char ID; - SymbolsNotFound(SymbolNameSet Symbols); - SymbolsNotFound(SymbolNameVector Symbols); + SymbolsNotFound(std::shared_ptr SSP, SymbolNameSet Symbols); + SymbolsNotFound(std::shared_ptr SSP, + SymbolNameVector Symbols); std::error_code convertToErrorCode() const override; void log(raw_ostream &OS) const override; + std::shared_ptr getSymbolStringPool() { return SSP; } const SymbolNameVector &getSymbols() const { return Symbols; } private: + std::shared_ptr SSP; SymbolNameVector Symbols; }; @@ -448,12 +451,15 @@ class SymbolsCouldNotBeRemoved : public ErrorInfo { public: static char ID; - SymbolsCouldNotBeRemoved(SymbolNameSet Symbols); + SymbolsCouldNotBeRemoved(std::shared_ptr SSP, + SymbolNameSet Symbols); std::error_code convertToErrorCode() const override; void log(raw_ostream &OS) const override; + std::shared_ptr getSymbolStringPool() { return SSP; } const SymbolNameSet &getSymbols() const { return Symbols; } private: + std::shared_ptr SSP; SymbolNameSet Symbols; }; @@ -465,13 +471,17 @@ class MissingSymbolDefinitions : public ErrorInfo { public: static char ID; - MissingSymbolDefinitions(std::string ModuleName, SymbolNameVector Symbols) - : ModuleName(std::move(ModuleName)), Symbols(std::move(Symbols)) {} + MissingSymbolDefinitions(std::shared_ptr SSP, + std::string ModuleName, SymbolNameVector Symbols) + : SSP(std::move(SSP)), ModuleName(std::move(ModuleName)), + Symbols(std::move(Symbols)) {} std::error_code convertToErrorCode() const override; void log(raw_ostream &OS) const override; + std::shared_ptr getSymbolStringPool() { return SSP; } const std::string &getModuleName() const { return ModuleName; } const SymbolNameVector &getSymbols() const { return Symbols; } private: + std::shared_ptr SSP; std::string ModuleName; SymbolNameVector Symbols; }; @@ -484,13 +494,17 @@ class UnexpectedSymbolDefinitions : public ErrorInfo SSP, + std::string ModuleName, SymbolNameVector Symbols) + : SSP(std::move(SSP)), ModuleName(std::move(ModuleName)), + Symbols(std::move(Symbols)) {} std::error_code convertToErrorCode() const override; void log(raw_ostream &OS) const override; + std::shared_ptr getSymbolStringPool() { return SSP; } const std::string &getModuleName() const { return ModuleName; } const SymbolNameVector &getSymbols() const { return Symbols; } private: + std::shared_ptr SSP; std::string ModuleName; SymbolNameVector Symbols; }; @@ -1310,6 +1324,11 @@ class ExecutionSession { /// ExecutionSession. ExecutorProcessControl &getExecutorProcessControl() { return *EPC; } + /// Get the SymbolStringPool for this instance. + std::shared_ptr getSymbolStringPool() { + return EPC->getSymbolStringPool(); + } + /// Add a symbol name to the SymbolStringPool and return a pointer to it. SymbolStringPtr intern(StringRef SymName) { return EPC->intern(SymName); } diff --git a/llvm/lib/ExecutionEngine/Orc/Core.cpp b/llvm/lib/ExecutionEngine/Orc/Core.cpp index 810601bdea375..8ec3bf64754e7 100644 --- a/llvm/lib/ExecutionEngine/Orc/Core.cpp +++ b/llvm/lib/ExecutionEngine/Orc/Core.cpp @@ -90,14 +90,17 @@ void FailedToMaterialize::log(raw_ostream &OS) const { OS << "Failed to materialize symbols: " << *Symbols; } -SymbolsNotFound::SymbolsNotFound(SymbolNameSet Symbols) { +SymbolsNotFound::SymbolsNotFound(std::shared_ptr SSP, + SymbolNameSet Symbols) + : SSP(std::move(SSP)) { for (auto &Sym : Symbols) this->Symbols.push_back(Sym); assert(!this->Symbols.empty() && "Can not fail to resolve an empty set"); } -SymbolsNotFound::SymbolsNotFound(SymbolNameVector Symbols) - : Symbols(std::move(Symbols)) { +SymbolsNotFound::SymbolsNotFound(std::shared_ptr SSP, + SymbolNameVector Symbols) + : SSP(std::move(SSP)), Symbols(std::move(Symbols)) { assert(!this->Symbols.empty() && "Can not fail to resolve an empty set"); } @@ -109,8 +112,9 @@ void SymbolsNotFound::log(raw_ostream &OS) const { OS << "Symbols not found: " << Symbols; } -SymbolsCouldNotBeRemoved::SymbolsCouldNotBeRemoved(SymbolNameSet Symbols) - : Symbols(std::move(Symbols)) { +SymbolsCouldNotBeRemoved::SymbolsCouldNotBeRemoved( + std::shared_ptr SSP, SymbolNameSet Symbols) + : SSP(std::move(SSP)), Symbols(std::move(Symbols)) { assert(!this->Symbols.empty() && "Can not fail to resolve an empty set"); } @@ -1333,11 +1337,13 @@ Error JITDylib::remove(const SymbolNameSet &Names) { // If any of the symbols are not defined, return an error. if (!Missing.empty()) - return make_error(std::move(Missing)); + return make_error(ES.getSymbolStringPool(), + std::move(Missing)); // If any of the symbols are currently materializing, return an error. if (!Materializing.empty()) - return make_error(std::move(Materializing)); + return make_error(ES.getSymbolStringPool(), + std::move(Materializing)); // Remove the symbols. for (auto &SymbolMaterializerItrPair : SymbolsToRemove) { @@ -2234,7 +2240,8 @@ Error ExecutionSession::IL_updateCandidatesFor( // weakly referenced" specific error here to reduce confusion. if (SymI->second.getFlags().hasMaterializationSideEffectsOnly() && SymLookupFlags != SymbolLookupFlags::WeaklyReferencedSymbol) - return make_error(SymbolNameVector({Name})); + return make_error(getSymbolStringPool(), + SymbolNameVector({Name})); // If we matched against this symbol but it is in the error state // then bail out and treat it as a failure to materialize. @@ -2422,7 +2429,7 @@ void ExecutionSession::OL_applyQueryPhase1( } else { LLVM_DEBUG(dbgs() << "Phase 1 failed with unresolved symbols.\n"); IPLS->fail(make_error( - IPLS->DefGeneratorCandidates.getSymbolNames())); + getSymbolStringPool(), IPLS->DefGeneratorCandidates.getSymbolNames())); } } @@ -2492,7 +2499,8 @@ void ExecutionSession::OL_completeLookup( dbgs() << "error: " "required, but symbol is has-side-effects-only\n"; }); - return make_error(SymbolNameVector({Name})); + return make_error(getSymbolStringPool(), + SymbolNameVector({Name})); } // If we matched against this symbol but it is in the error state @@ -2606,7 +2614,8 @@ void ExecutionSession::OL_completeLookup( if (!IPLS->LookupSet.empty()) { LLVM_DEBUG(dbgs() << "Failing due to unresolved symbols\n"); - return make_error(IPLS->LookupSet.getSymbolNames()); + return make_error(getSymbolStringPool(), + IPLS->LookupSet.getSymbolNames()); } // Record whether the query completed. @@ -2733,7 +2742,8 @@ void ExecutionSession::OL_completeLookupFlags( if (!IPLS->LookupSet.empty()) { LLVM_DEBUG(dbgs() << "Failing due to unresolved symbols\n"); - return make_error(IPLS->LookupSet.getSymbolNames()); + return make_error(getSymbolStringPool(), + IPLS->LookupSet.getSymbolNames()); } LLVM_DEBUG(dbgs() << "Succeded, result = " << Result << "\n"); diff --git a/llvm/lib/ExecutionEngine/Orc/ExecutorProcessControl.cpp b/llvm/lib/ExecutionEngine/Orc/ExecutorProcessControl.cpp index 4ee96fa16c3ef..c138ea378e27d 100644 --- a/llvm/lib/ExecutionEngine/Orc/ExecutorProcessControl.cpp +++ b/llvm/lib/ExecutionEngine/Orc/ExecutorProcessControl.cpp @@ -93,7 +93,7 @@ SelfExecutorProcessControl::lookupSymbols(ArrayRef Request) { // FIXME: Collect all failing symbols before erroring out. SymbolNameVector MissingSymbols; MissingSymbols.push_back(Sym); - return make_error(std::move(MissingSymbols)); + return make_error(SSP, std::move(MissingSymbols)); } R.back().push_back(pointerToJITTargetAddress(Addr)); } diff --git a/llvm/lib/ExecutionEngine/Orc/ObjectLinkingLayer.cpp b/llvm/lib/ExecutionEngine/Orc/ObjectLinkingLayer.cpp index c663f5cfa3b5a..40d4f199ff658 100644 --- a/llvm/lib/ExecutionEngine/Orc/ObjectLinkingLayer.cpp +++ b/llvm/lib/ExecutionEngine/Orc/ObjectLinkingLayer.cpp @@ -279,8 +279,9 @@ class ObjectLinkingLayerJITLinkContext final : public JITLinkContext { // If there were missing symbols then report the error. if (!MissingSymbols.empty()) - return make_error(G.getName(), - std::move(MissingSymbols)); + return make_error( + Layer.getExecutionSession().getSymbolStringPool(), G.getName(), + std::move(MissingSymbols)); // If there are more definitions than expected, add them to the // ExtraSymbols vector. @@ -293,8 +294,9 @@ class ObjectLinkingLayerJITLinkContext final : public JITLinkContext { // If there were extra definitions then report the error. if (!ExtraSymbols.empty()) - return make_error(G.getName(), - std::move(ExtraSymbols)); + return make_error( + Layer.getExecutionSession().getSymbolStringPool(), G.getName(), + std::move(ExtraSymbols)); } if (auto Err = MR->notifyResolved(InternedResult))