diff options
author | Lang Hames <lhames@gmail.com> | 2017-07-07 02:59:13 +0000 |
---|---|---|
committer | Lang Hames <lhames@gmail.com> | 2017-07-07 02:59:13 +0000 |
commit | 4ce98662e7d109b4579c35945345db685ae5b3fb (patch) | |
tree | 4538ca3c0131f3275286aac4347bf712ed0068e7 /llvm/unittests/ExecutionEngine | |
parent | b909f11a319ae62e683d1f9d82e28a05b360b8ae (diff) | |
download | bcm5719-llvm-4ce98662e7d109b4579c35945345db685ae5b3fb.tar.gz bcm5719-llvm-4ce98662e7d109b4579c35945345db685ae5b3fb.zip |
[ORC] Errorize the ORC APIs.
This patch updates the ORC layers and utilities to return and propagate
llvm::Errors where appropriate. This is necessary to allow ORC to safely handle
error cases in cross-process and remote JITing.
llvm-svn: 307350
Diffstat (limited to 'llvm/unittests/ExecutionEngine')
7 files changed, 90 insertions, 62 deletions
diff --git a/llvm/unittests/ExecutionEngine/Orc/CompileOnDemandLayerTest.cpp b/llvm/unittests/ExecutionEngine/Orc/CompileOnDemandLayerTest.cpp index 13693381c00..844746f28c0 100644 --- a/llvm/unittests/ExecutionEngine/Orc/CompileOnDemandLayerTest.cpp +++ b/llvm/unittests/ExecutionEngine/Orc/CompileOnDemandLayerTest.cpp @@ -50,13 +50,14 @@ public: TEST(CompileOnDemandLayerTest, FindSymbol) { auto MockBaseLayer = createMockBaseLayer<int>( - DoNothingAndReturn<int>(0), DoNothingAndReturn<void>(), + DoNothingAndReturn<int>(0), + [](int Handle) { return Error::success(); }, [](const std::string &Name, bool) { if (Name == "foo") return JITSymbol(1, JITSymbolFlags::Exported); return JITSymbol(nullptr); }, - DoNothingAndReturn<JITSymbol>(nullptr)); + ReturnNullJITSymbol()); typedef decltype(MockBaseLayer) MockBaseLayerT; DummyCallbackManager CallbackMgr; diff --git a/llvm/unittests/ExecutionEngine/Orc/GlobalMappingLayerTest.cpp b/llvm/unittests/ExecutionEngine/Orc/GlobalMappingLayerTest.cpp index 630f127b392..2756999c216 100644 --- a/llvm/unittests/ExecutionEngine/Orc/GlobalMappingLayerTest.cpp +++ b/llvm/unittests/ExecutionEngine/Orc/GlobalMappingLayerTest.cpp @@ -37,13 +37,15 @@ TEST(GlobalMappingLayerTest, Empty) { // Test fall-through for symbol in base layer. auto BarSym = L.findSymbol("bar", true); - EXPECT_EQ(BarSym.getAddress(), static_cast<JITTargetAddress>(0x4567)) + EXPECT_EQ(cantFail(BarSym.getAddress()), + static_cast<JITTargetAddress>(0x4567)) << "Symbol lookup fall-through failed."; // Test setup of a global mapping. L.setGlobalMapping("foo", 0x0123); auto FooSym2 = L.findSymbol("foo", true); - EXPECT_EQ(FooSym2.getAddress(), static_cast<JITTargetAddress>(0x0123)) + EXPECT_EQ(cantFail(FooSym2.getAddress()), + static_cast<JITTargetAddress>(0x0123)) << "Symbol mapping setup failed."; // Test removal of a global mapping. diff --git a/llvm/unittests/ExecutionEngine/Orc/LazyEmittingLayerTest.cpp b/llvm/unittests/ExecutionEngine/Orc/LazyEmittingLayerTest.cpp index 26d13e2dbc6..0dba66d4753 100644 --- a/llvm/unittests/ExecutionEngine/Orc/LazyEmittingLayerTest.cpp +++ b/llvm/unittests/ExecutionEngine/Orc/LazyEmittingLayerTest.cpp @@ -27,7 +27,7 @@ struct MockBaseLayer { TEST(LazyEmittingLayerTest, Empty) { MockBaseLayer M; llvm::orc::LazyEmittingLayer<MockBaseLayer> L(M); - L.addModule(std::unique_ptr<llvm::Module>(), nullptr); + cantFail(L.addModule(std::unique_ptr<llvm::Module>(), nullptr)); } } diff --git a/llvm/unittests/ExecutionEngine/Orc/ObjectTransformLayerTest.cpp b/llvm/unittests/ExecutionEngine/Orc/ObjectTransformLayerTest.cpp index 6671442db42..25103f79ac6 100644 --- a/llvm/unittests/ExecutionEngine/Orc/ObjectTransformLayerTest.cpp +++ b/llvm/unittests/ExecutionEngine/Orc/ObjectTransformLayerTest.cpp @@ -50,8 +50,9 @@ public: MockBaseLayer() : MockSymbol(nullptr) { resetExpectations(); } template <typename ObjPtrT> - ObjHandleT addObject(ObjPtrT Obj, - std::shared_ptr<llvm::JITSymbolResolver> Resolver) { + llvm::Expected<ObjHandleT> + addObject(ObjPtrT Obj, + std::shared_ptr<llvm::JITSymbolResolver> Resolver) { EXPECT_EQ(MockResolver, Resolver) << "Resolver should pass through"; EXPECT_EQ(MockObject + 1, *Obj) << "Transform should be applied"; LastCalled = "addObject"; @@ -73,10 +74,12 @@ public: resetExpectations(); } - void removeObject(ObjHandleT H) { + llvm::Error removeObject(ObjHandleT H) { EXPECT_EQ(MockObjHandle, H); LastCalled = "removeObject"; + return llvm::Error::success(); } + void expectRemoveObject(ObjHandleT H) { MockObjHandle = H; } void verifyRemoveObject() { EXPECT_EQ("removeObject", LastCalled); @@ -89,7 +92,7 @@ public: EXPECT_EQ(MockBool, ExportedSymbolsOnly) << "Flag should pass through"; LastCalled = "findSymbol"; MockSymbol = llvm::JITSymbol(122, llvm::JITSymbolFlags::None); - return MockSymbol; + return llvm::JITSymbol(122, llvm::JITSymbolFlags::None); } void expectFindSymbol(const std::string &Name, bool ExportedSymbolsOnly) { MockName = Name; @@ -97,7 +100,8 @@ public: } void verifyFindSymbol(llvm::JITSymbol Returned) { EXPECT_EQ("findSymbol", LastCalled); - EXPECT_EQ(MockSymbol.getAddress(), Returned.getAddress()) + EXPECT_EQ(cantFail(MockSymbol.getAddress()), + cantFail(Returned.getAddress())) << "Return should pass through"; resetExpectations(); } @@ -109,7 +113,7 @@ public: EXPECT_EQ(MockBool, ExportedSymbolsOnly) << "Flag should pass through"; LastCalled = "findSymbolIn"; MockSymbol = llvm::JITSymbol(122, llvm::JITSymbolFlags::None); - return MockSymbol; + return llvm::JITSymbol(122, llvm::JITSymbolFlags::None); } void expectFindSymbolIn(ObjHandleT H, const std::string &Name, bool ExportedSymbolsOnly) { @@ -119,16 +123,20 @@ public: } void verifyFindSymbolIn(llvm::JITSymbol Returned) { EXPECT_EQ("findSymbolIn", LastCalled); - EXPECT_EQ(MockSymbol.getAddress(), Returned.getAddress()) + EXPECT_EQ(cantFail(MockSymbol.getAddress()), + cantFail(Returned.getAddress())) << "Return should pass through"; resetExpectations(); } - void emitAndFinalize(ObjHandleT H) { + llvm::Error emitAndFinalize(ObjHandleT H) { EXPECT_EQ(MockObjHandle, H) << "Handle should pass through"; LastCalled = "emitAndFinalize"; + return llvm::Error::success(); } + void expectEmitAndFinalize(ObjHandleT H) { MockObjHandle = H; } + void verifyEmitAndFinalize() { EXPECT_EQ("emitAndFinalize", LastCalled); resetExpectations(); @@ -201,38 +209,38 @@ TEST(ObjectTransformLayerTest, Main) { auto Obj1 = std::make_shared<MockObjectFile>(211); auto SR = std::make_shared<NullResolver>(); M.expectAddObject(Obj1, SR); - auto H = T1.addObject(std::move(Obj1), SR); + auto H = cantFail(T1.addObject(std::move(Obj1), SR)); M.verifyAddObject(H); // Test addObjectSet with T2 (mutating) auto Obj2 = std::make_shared<MockObjectFile>(222); M.expectAddObject(Obj2, SR); - H = T2.addObject(Obj2, SR); + H = cantFail(T2.addObject(Obj2, SR)); M.verifyAddObject(H); EXPECT_EQ(223, *Obj2) << "Expected mutation"; // Test removeObjectSet M.expectRemoveObject(H); - T1.removeObject(H); + cantFail(T1.removeObject(H)); M.verifyRemoveObject(); // Test findSymbol std::string Name = "foo"; bool ExportedOnly = true; M.expectFindSymbol(Name, ExportedOnly); - llvm::JITSymbol Symbol = T2.findSymbol(Name, ExportedOnly); - M.verifyFindSymbol(Symbol); + llvm::JITSymbol Sym1 = T2.findSymbol(Name, ExportedOnly); + M.verifyFindSymbol(std::move(Sym1)); // Test findSymbolIn Name = "bar"; ExportedOnly = false; M.expectFindSymbolIn(H, Name, ExportedOnly); - Symbol = T1.findSymbolIn(H, Name, ExportedOnly); - M.verifyFindSymbolIn(Symbol); + llvm::JITSymbol Sym2 = T1.findSymbolIn(H, Name, ExportedOnly); + M.verifyFindSymbolIn(std::move(Sym2)); // Test emitAndFinalize M.expectEmitAndFinalize(H); - T2.emitAndFinalize(H); + cantFail(T2.emitAndFinalize(H)); M.verifyEmitAndFinalize(); // Test mapSectionAddress @@ -305,15 +313,15 @@ TEST(ObjectTransformLayerTest, Main) { // Make sure that the calls from IRCompileLayer to ObjectTransformLayer // compile. auto Resolver = std::make_shared<NullResolver>(); - CompileLayer.addModule(std::shared_ptr<llvm::Module>(), Resolver); + cantFail(CompileLayer.addModule(std::shared_ptr<llvm::Module>(), Resolver)); // Make sure that the calls from ObjectTransformLayer to ObjectLinkingLayer // compile. decltype(TransformLayer)::ObjHandleT H2; - TransformLayer.emitAndFinalize(H2); + cantFail(TransformLayer.emitAndFinalize(H2)); TransformLayer.findSymbolIn(H2, Name, false); TransformLayer.findSymbol(Name, true); TransformLayer.mapSectionAddress(H2, nullptr, 0); - TransformLayer.removeObject(H2); + cantFail(TransformLayer.removeObject(H2)); } } diff --git a/llvm/unittests/ExecutionEngine/Orc/OrcCAPITest.cpp b/llvm/unittests/ExecutionEngine/Orc/OrcCAPITest.cpp index 2900a9c9276..5a4d6b4a225 100644 --- a/llvm/unittests/ExecutionEngine/Orc/OrcCAPITest.cpp +++ b/llvm/unittests/ExecutionEngine/Orc/OrcCAPITest.cpp @@ -66,10 +66,11 @@ protected: auto *ET = CCtx->APIExecTest; CCtx->M = ET->createTestModule(ET->TM->getTargetTriple()); LLVMSharedModuleRef SM = LLVMOrcMakeSharedModule(wrap(CCtx->M.release())); - CCtx->H = LLVMOrcAddEagerlyCompiledIR(JITStack, SM, myResolver, nullptr); + LLVMOrcAddEagerlyCompiledIR(JITStack, &CCtx->H, SM, myResolver, nullptr); LLVMOrcDisposeSharedModuleRef(SM); CCtx->Compiled = true; - LLVMOrcTargetAddress MainAddr = LLVMOrcGetSymbolAddress(JITStack, "main"); + LLVMOrcTargetAddress MainAddr; + LLVMOrcGetSymbolAddress(JITStack, &MainAddr, "main"); LLVMOrcSetIndirectStubPointer(JITStack, "foo", MainAddr); return MainAddr; } @@ -89,10 +90,12 @@ TEST_F(OrcCAPIExecutionTest, TestEagerIRCompilation) { LLVMOrcGetMangledSymbol(JIT, &testFuncName, "testFunc"); LLVMSharedModuleRef SM = LLVMOrcMakeSharedModule(wrap(M.release())); - LLVMOrcModuleHandle H = - LLVMOrcAddEagerlyCompiledIR(JIT, SM, myResolver, nullptr); + LLVMOrcModuleHandle H; + LLVMOrcAddEagerlyCompiledIR(JIT, &H, SM, myResolver, nullptr); LLVMOrcDisposeSharedModuleRef(SM); - MainFnTy MainFn = (MainFnTy)LLVMOrcGetSymbolAddress(JIT, "main"); + LLVMOrcTargetAddress MainAddr; + LLVMOrcGetSymbolAddress(JIT, &MainAddr, "main"); + MainFnTy MainFn = (MainFnTy)MainAddr; int Result = MainFn(); EXPECT_EQ(Result, 42) << "Eagerly JIT'd code did not return expected result"; @@ -115,10 +118,12 @@ TEST_F(OrcCAPIExecutionTest, TestLazyIRCompilation) { LLVMOrcGetMangledSymbol(JIT, &testFuncName, "testFunc"); LLVMSharedModuleRef SM = LLVMOrcMakeSharedModule(wrap(M.release())); - LLVMOrcModuleHandle H = - LLVMOrcAddLazilyCompiledIR(JIT, SM, myResolver, nullptr); + LLVMOrcModuleHandle H; + LLVMOrcAddLazilyCompiledIR(JIT, &H, SM, myResolver, nullptr); LLVMOrcDisposeSharedModuleRef(SM); - MainFnTy MainFn = (MainFnTy)LLVMOrcGetSymbolAddress(JIT, "main"); + LLVMOrcTargetAddress MainAddr; + LLVMOrcGetSymbolAddress(JIT, &MainAddr, "main"); + MainFnTy MainFn = (MainFnTy)MainAddr; int Result = MainFn(); EXPECT_EQ(Result, 42) << "Lazily JIT'd code did not return expected result"; @@ -140,11 +145,12 @@ TEST_F(OrcCAPIExecutionTest, TestDirectCallbacksAPI) { CompileContext C; C.APIExecTest = this; - LLVMOrcCreateIndirectStub(JIT, "foo", - LLVMOrcCreateLazyCompileCallback(JIT, - myCompileCallback, - &C)); - MainFnTy FooFn = (MainFnTy)LLVMOrcGetSymbolAddress(JIT, "foo"); + LLVMOrcTargetAddress CCAddr; + LLVMOrcCreateLazyCompileCallback(JIT, &CCAddr, myCompileCallback, &C); + LLVMOrcCreateIndirectStub(JIT, "foo", CCAddr); + LLVMOrcTargetAddress MainAddr; + LLVMOrcGetSymbolAddress(JIT, &MainAddr, "foo"); + MainFnTy FooFn = (MainFnTy)MainAddr; int Result = FooFn(); EXPECT_TRUE(C.Compiled) << "Function wasn't lazily compiled"; diff --git a/llvm/unittests/ExecutionEngine/Orc/OrcTestCommon.h b/llvm/unittests/ExecutionEngine/Orc/OrcTestCommon.h index d7049ef00e6..6c6b4918c20 100644 --- a/llvm/unittests/ExecutionEngine/Orc/OrcTestCommon.h +++ b/llvm/unittests/ExecutionEngine/Orc/OrcTestCommon.h @@ -119,19 +119,21 @@ public: RemoveModuleFtor &&RemoveModule, FindSymbolFtor &&FindSymbol, FindSymbolInFtor &&FindSymbolIn) - : AddModule(AddModule), RemoveModule(RemoveModule), - FindSymbol(FindSymbol), FindSymbolIn(FindSymbolIn) + : AddModule(std::move(AddModule)), + RemoveModule(std::move(RemoveModule)), + FindSymbol(std::move(FindSymbol)), + FindSymbolIn(std::move(FindSymbolIn)) {} template <typename ModuleT, typename MemoryManagerPtrT, typename SymbolResolverPtrT> - ModuleHandleT addModule(ModuleT Ms, MemoryManagerPtrT MemMgr, - SymbolResolverPtrT Resolver) { + Expected<ModuleHandleT> addModule(ModuleT Ms, MemoryManagerPtrT MemMgr, + SymbolResolverPtrT Resolver) { return AddModule(std::move(Ms), std::move(MemMgr), std::move(Resolver)); } - void removeModule(ModuleHandleT H) { - RemoveModule(H); + Error removeModule(ModuleHandleT H) { + return RemoveModule(H); } JITSymbol findSymbol(const std::string &Name, bool ExportedSymbolsOnly) { @@ -169,15 +171,24 @@ createMockBaseLayer(AddModuleFtor &&AddModule, std::forward<FindSymbolInFtor>(FindSymbolIn)); } + +class ReturnNullJITSymbol { +public: + template <typename... Args> + JITSymbol operator()(Args...) const { + return nullptr; + } +}; + template <typename ReturnT> class DoNothingAndReturn { public: - DoNothingAndReturn(ReturnT Val) : Val(Val) {} + DoNothingAndReturn(ReturnT Ret) : Ret(std::move(Ret)) {} template <typename... Args> - ReturnT operator()(Args...) const { return Val; } + void operator()(Args...) const { return Ret; } private: - ReturnT Val; + ReturnT Ret; }; template <> diff --git a/llvm/unittests/ExecutionEngine/Orc/RTDyldObjectLinkingLayerTest.cpp b/llvm/unittests/ExecutionEngine/Orc/RTDyldObjectLinkingLayerTest.cpp index 383ce8fe54c..e4b61d855c5 100644 --- a/llvm/unittests/ExecutionEngine/Orc/RTDyldObjectLinkingLayerTest.cpp +++ b/llvm/unittests/ExecutionEngine/Orc/RTDyldObjectLinkingLayerTest.cpp @@ -103,21 +103,21 @@ TEST(RTDyldObjectLinkingLayerTest, TestSetProcessAllSections) { { // Test with ProcessAllSections = false (the default). - auto H = ObjLayer.addObject(Obj, Resolver); - ObjLayer.emitAndFinalize(H); + auto H = cantFail(ObjLayer.addObject(Obj, Resolver)); + cantFail(ObjLayer.emitAndFinalize(H)); EXPECT_EQ(DebugSectionSeen, false) << "Unexpected debug info section"; - ObjLayer.removeObject(H); + cantFail(ObjLayer.removeObject(H)); } { // Test with ProcessAllSections = true. ObjLayer.setProcessAllSections(true); - auto H = ObjLayer.addObject(Obj, Resolver); - ObjLayer.emitAndFinalize(H); + auto H = cantFail(ObjLayer.addObject(Obj, Resolver)); + cantFail(ObjLayer.emitAndFinalize(H)); EXPECT_EQ(DebugSectionSeen, true) << "Expected debug info section not seen"; - ObjLayer.removeObject(H); + cantFail(ObjLayer.removeObject(H)); } } @@ -181,11 +181,11 @@ TEST_F(RTDyldObjectLinkingLayerExecutionTest, NoDuplicateFinalization) { return JITSymbol(nullptr); }); - ObjLayer.addObject(std::move(Obj1), Resolver); - auto H = ObjLayer.addObject(std::move(Obj2), Resolver); - ObjLayer.emitAndFinalize(H); - ObjLayer.removeObject(H); - + cantFail(ObjLayer.addObject(std::move(Obj1), Resolver)); + auto H = cantFail(ObjLayer.addObject(std::move(Obj2), Resolver)); + cantFail(ObjLayer.emitAndFinalize(H)); + cantFail(ObjLayer.removeObject(H)); + // Finalization of module 2 should trigger finalization of module 1. // Verify that finalize on SMMW is only called once. EXPECT_EQ(MM->FinalizationCount, 1) @@ -244,11 +244,11 @@ TEST_F(RTDyldObjectLinkingLayerExecutionTest, NoPrematureAllocation) { Compile(*MB2.getModule())); auto NR = std::make_shared<NullResolver>(); - auto H = ObjLayer.addObject(std::move(Obj1), NR); - ObjLayer.addObject(std::move(Obj2), NR); - ObjLayer.emitAndFinalize(H); - ObjLayer.removeObject(H); - + auto H = cantFail(ObjLayer.addObject(std::move(Obj1), NR)); + cantFail(ObjLayer.addObject(std::move(Obj2), NR)); + cantFail(ObjLayer.emitAndFinalize(H)); + cantFail(ObjLayer.removeObject(H)); + // Only one call to needsToReserveAllocationSpace should have been made. EXPECT_EQ(MM->NeedsToReserveAllocationSpaceCount, 1) << "More than one call to needsToReserveAllocationSpace " |