aboutsummaryrefslogtreecommitdiff
path: root/unittests/ExecutionEngine/Orc/ObjectTransformLayerTest.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'unittests/ExecutionEngine/Orc/ObjectTransformLayerTest.cpp')
-rw-r--r--unittests/ExecutionEngine/Orc/ObjectTransformLayerTest.cpp95
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));
}
}