Author: Stefan Gränitz Date: 2021-01-15T12:53:41+01:00 New Revision: cf905274c6f4ec119fdb06a283070dcae4ed5881
URL: https://github.com/llvm/llvm-project/commit/cf905274c6f4ec119fdb06a283070dcae4ed5881 DIFF: https://github.com/llvm/llvm-project/commit/cf905274c6f4ec119fdb06a283070dcae4ed5881.diff LOG: [Orc] Allow LLJITBuilder's CreateObjectLinkingLayer to return errors It can be useful for an ObjectLinkingLayerCreator to allow callee errors to get propagated to the builder. Specifically, this is the case when the ObjectLayer uses the EHFrameRegistrationPlugin, because it requires a TPCEHFrameRegistrar and instantiation for it may fail (e.g. if the required registration symbols are missing in the target process). Reviewed By: lhames Differential Revision: https://reviews.llvm.org/D94690 Added: Modified: llvm/examples/OrcV2Examples/LLJITWithGDBRegistrationListener/LLJITWithGDBRegistrationListener.cpp llvm/examples/OrcV2Examples/LLJITWithObjectLinkingLayerPlugin/LLJITWithObjectLinkingLayerPlugin.cpp llvm/include/llvm/ExecutionEngine/Orc/LLJIT.h llvm/lib/ExecutionEngine/Orc/LLJIT.cpp Removed: ################################################################################ diff --git a/llvm/examples/OrcV2Examples/LLJITWithGDBRegistrationListener/LLJITWithGDBRegistrationListener.cpp b/llvm/examples/OrcV2Examples/LLJITWithGDBRegistrationListener/LLJITWithGDBRegistrationListener.cpp index 78a0c5b197db..e37b761913fc 100644 --- a/llvm/examples/OrcV2Examples/LLJITWithGDBRegistrationListener/LLJITWithGDBRegistrationListener.cpp +++ b/llvm/examples/OrcV2Examples/LLJITWithGDBRegistrationListener/LLJITWithGDBRegistrationListener.cpp @@ -78,7 +78,7 @@ int main(int argc, char *argv[]) { // Make sure the debug info sections aren't stripped. ObjLinkingLayer->setProcessAllSections(true); - return ObjLinkingLayer; + return std::move(ObjLinkingLayer); }) .create()); diff --git a/llvm/examples/OrcV2Examples/LLJITWithObjectLinkingLayerPlugin/LLJITWithObjectLinkingLayerPlugin.cpp b/llvm/examples/OrcV2Examples/LLJITWithObjectLinkingLayerPlugin/LLJITWithObjectLinkingLayerPlugin.cpp index f349ce900e61..36d28ab1aaaa 100644 --- a/llvm/examples/OrcV2Examples/LLJITWithObjectLinkingLayerPlugin/LLJITWithObjectLinkingLayerPlugin.cpp +++ b/llvm/examples/OrcV2Examples/LLJITWithObjectLinkingLayerPlugin/LLJITWithObjectLinkingLayerPlugin.cpp @@ -147,7 +147,7 @@ int main(int argc, char *argv[]) { ES, std::make_unique<jitlink::InProcessMemoryManager>()); // Add an instance of our plugin. ObjLinkingLayer->addPlugin(std::make_unique<MyPlugin>()); - return ObjLinkingLayer; + return std::move(ObjLinkingLayer); }) .create()); diff --git a/llvm/include/llvm/ExecutionEngine/Orc/LLJIT.h b/llvm/include/llvm/ExecutionEngine/Orc/LLJIT.h index b0a06aa9cb4b..ff0aa0238523 100644 --- a/llvm/include/llvm/ExecutionEngine/Orc/LLJIT.h +++ b/llvm/include/llvm/ExecutionEngine/Orc/LLJIT.h @@ -186,7 +186,7 @@ class LLJIT { } protected: - static std::unique_ptr<ObjectLayer> + static Expected<std::unique_ptr<ObjectLayer>> createObjectLinkingLayer(LLJITBuilderState &S, ExecutionSession &ES); static Expected<std::unique_ptr<IRCompileLayer::IRCompiler>> @@ -250,8 +250,9 @@ class LLLazyJIT : public LLJIT { class LLJITBuilderState { public: - using ObjectLinkingLayerCreator = std::function<std::unique_ptr<ObjectLayer>( - ExecutionSession &, const Triple &TT)>; + using ObjectLinkingLayerCreator = + std::function<Expected<std::unique_ptr<ObjectLayer>>(ExecutionSession &, + const Triple &)>; using CompileFunctionCreator = std::function<Expected<std::unique_ptr<IRCompileLayer::IRCompiler>>( diff --git a/llvm/lib/ExecutionEngine/Orc/LLJIT.cpp b/llvm/lib/ExecutionEngine/Orc/LLJIT.cpp index 056f7b7e5cc0..d26cc6549487 100644 --- a/llvm/lib/ExecutionEngine/Orc/LLJIT.cpp +++ b/llvm/lib/ExecutionEngine/Orc/LLJIT.cpp @@ -954,8 +954,9 @@ Error LLJITBuilderState::prepareForConstruction() { JTMB->setRelocationModel(Reloc::PIC_); JTMB->setCodeModel(CodeModel::Small); CreateObjectLinkingLayer = - [TPC = this->TPC](ExecutionSession &ES, - const Triple &) -> std::unique_ptr<ObjectLayer> { + [TPC = this->TPC]( + ExecutionSession &ES, + const Triple &) -> Expected<std::unique_ptr<ObjectLayer>> { std::unique_ptr<ObjectLinkingLayer> ObjLinkingLayer; if (TPC) ObjLinkingLayer = @@ -1011,7 +1012,7 @@ Expected<JITEvaluatedSymbol> LLJIT::lookupLinkerMangled(JITDylib &JD, makeJITDylibSearchOrder(&JD, JITDylibLookupFlags::MatchAllSymbols), Name); } -std::unique_ptr<ObjectLayer> +Expected<std::unique_ptr<ObjectLayer>> LLJIT::createObjectLinkingLayer(LLJITBuilderState &S, ExecutionSession &ES) { // If the config state provided an ObjectLinkingLayer factory then use it. @@ -1057,8 +1058,7 @@ LLJIT::createCompileFunction(LLJITBuilderState &S, LLJIT::LLJIT(LLJITBuilderState &S, Error &Err) : ES(S.ES ? std::move(S.ES) : std::make_unique<ExecutionSession>()), Main(), - DL(""), TT(S.JTMB->getTargetTriple()), - ObjLinkingLayer(createObjectLinkingLayer(S, *ES)) { + DL(""), TT(S.JTMB->getTargetTriple()) { ErrorAsOutParameter _(&Err); @@ -1078,6 +1078,12 @@ LLJIT::LLJIT(LLJITBuilderState &S, Error &Err) return; } + auto ObjLayer = createObjectLinkingLayer(S, *ES); + if (!ObjLayer) { + Err = ObjLayer.takeError(); + return; + } + ObjLinkingLayer = std::move(*ObjLayer); ObjTransformLayer = std::make_unique<ObjectTransformLayer>(*ES, *ObjLinkingLayer); _______________________________________________ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits