summaryrefslogtreecommitdiffstats
path: root/llvm/unittests/ExecutionEngine
diff options
context:
space:
mode:
authorLang Hames <lhames@gmail.com>2017-07-07 02:59:13 +0000
committerLang Hames <lhames@gmail.com>2017-07-07 02:59:13 +0000
commit4ce98662e7d109b4579c35945345db685ae5b3fb (patch)
tree4538ca3c0131f3275286aac4347bf712ed0068e7 /llvm/unittests/ExecutionEngine
parentb909f11a319ae62e683d1f9d82e28a05b360b8ae (diff)
downloadbcm5719-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')
-rw-r--r--llvm/unittests/ExecutionEngine/Orc/CompileOnDemandLayerTest.cpp5
-rw-r--r--llvm/unittests/ExecutionEngine/Orc/GlobalMappingLayerTest.cpp6
-rw-r--r--llvm/unittests/ExecutionEngine/Orc/LazyEmittingLayerTest.cpp2
-rw-r--r--llvm/unittests/ExecutionEngine/Orc/ObjectTransformLayerTest.cpp46
-rw-r--r--llvm/unittests/ExecutionEngine/Orc/OrcCAPITest.cpp32
-rw-r--r--llvm/unittests/ExecutionEngine/Orc/OrcTestCommon.h29
-rw-r--r--llvm/unittests/ExecutionEngine/Orc/RTDyldObjectLinkingLayerTest.cpp32
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 "
OpenPOWER on IntegriCloud