diff options
Diffstat (limited to 'unittests/ExecutionEngine/Orc/ObjectTransformLayerTest.cpp')
-rw-r--r-- | unittests/ExecutionEngine/Orc/ObjectTransformLayerTest.cpp | 95 |
1 files changed, 47 insertions, 48 deletions
diff --git a/unittests/ExecutionEngine/Orc/ObjectTransformLayerTest.cpp b/unittests/ExecutionEngine/Orc/ObjectTransformLayerTest.cpp index 2fdf9e8b7379..25103f79ac6c 100644 --- a/unittests/ExecutionEngine/Orc/ObjectTransformLayerTest.cpp +++ b/unittests/ExecutionEngine/Orc/ObjectTransformLayerTest.cpp @@ -14,6 +14,7 @@ #include "llvm/ExecutionEngine/Orc/IRCompileLayer.h" #include "llvm/ExecutionEngine/Orc/NullResolver.h" #include "llvm/ExecutionEngine/Orc/RTDyldObjectLinkingLayer.h" +#include "llvm/ExecutionEngine/SectionMemoryManager.h" #include "llvm/Object/ObjectFile.h" #include "gtest/gtest.h" @@ -21,12 +22,6 @@ using namespace llvm::orc; namespace { -// Stand-in for RuntimeDyld::MemoryManager -typedef int MockMemoryManager; - -// Stand-in for RuntimeDyld::SymbolResolver -typedef int MockSymbolResolver; - // stand-in for object::ObjectFile typedef int MockObjectFile; @@ -54,34 +49,37 @@ public: MockBaseLayer() : MockSymbol(nullptr) { resetExpectations(); } - template <typename ObjPtrT, typename MemoryManagerPtrT, - typename SymbolResolverPtrT> - ObjHandleT addObject(ObjPtrT Obj, MemoryManagerPtrT MemMgr, - SymbolResolverPtrT Resolver) { - EXPECT_EQ(MockManager, *MemMgr) << "MM should pass through"; - EXPECT_EQ(MockResolver, *Resolver) << "Resolver should pass through"; + template <typename ObjPtrT> + 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"; MockObjHandle = 111; return MockObjHandle; } + template <typename ObjPtrT> - void expectAddObject(ObjPtrT Obj, MockMemoryManager *MemMgr, - MockSymbolResolver *Resolver) { - MockManager = *MemMgr; - MockResolver = *Resolver; + void expectAddObject(ObjPtrT Obj, + std::shared_ptr<llvm::JITSymbolResolver> Resolver) { + MockResolver = Resolver; MockObject = *Obj; } + + void verifyAddObject(ObjHandleT Returned) { EXPECT_EQ("addObject", LastCalled); EXPECT_EQ(MockObjHandle, Returned) << "Return should pass through"; 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); @@ -94,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; @@ -102,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(); } @@ -114,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) { @@ -124,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(); @@ -160,8 +163,7 @@ public: private: // Backing fields for remembering parameter/return values std::string LastCalled; - MockMemoryManager MockManager; - MockSymbolResolver MockResolver; + std::shared_ptr<llvm::JITSymbolResolver> MockResolver; MockObjectFile MockObject; ObjHandleT MockObjHandle; std::string MockName; @@ -174,8 +176,7 @@ private: // Clear remembered parameters between calls void resetExpectations() { LastCalled = "nothing"; - MockManager = 0; - MockResolver = 0; + MockResolver = nullptr; MockObject = 0; MockObjHandle = 0; MockName = "bogus"; @@ -204,47 +205,42 @@ TEST(ObjectTransformLayerTest, Main) { return Obj; }); - // Instantiate some mock objects to use below - MockMemoryManager MockManager = 233; - MockSymbolResolver MockResolver = 244; - // Test addObject with T1 (allocating) auto Obj1 = std::make_shared<MockObjectFile>(211); - auto MM = llvm::make_unique<MockMemoryManager>(MockManager); - auto SR = llvm::make_unique<MockSymbolResolver>(MockResolver); - M.expectAddObject(Obj1, MM.get(), SR.get()); - auto H = T1.addObject(std::move(Obj1), std::move(MM), std::move(SR)); + auto SR = std::make_shared<NullResolver>(); + M.expectAddObject(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, &MockManager, &MockResolver); - H = T2.addObject(Obj2, &MockManager, &MockResolver); + M.expectAddObject(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 @@ -295,7 +291,11 @@ TEST(ObjectTransformLayerTest, Main) { }; // Construct the jit layers. - RTDyldObjectLinkingLayer BaseLayer; + RTDyldObjectLinkingLayer BaseLayer( + []() { + return std::make_shared<llvm::SectionMemoryManager>(); + }); + auto IdentityTransform = [](std::shared_ptr<llvm::object::OwningBinary<llvm::object::ObjectFile>> Obj) { @@ -312,17 +312,16 @@ TEST(ObjectTransformLayerTest, Main) { // Make sure that the calls from IRCompileLayer to ObjectTransformLayer // compile. - NullResolver Resolver; - NullManager Manager; - CompileLayer.addModule(std::shared_ptr<llvm::Module>(), &Manager, &Resolver); + auto Resolver = std::make_shared<NullResolver>(); + 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)); } } |