summaryrefslogtreecommitdiff
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.cpp126
1 files changed, 58 insertions, 68 deletions
diff --git a/unittests/ExecutionEngine/Orc/ObjectTransformLayerTest.cpp b/unittests/ExecutionEngine/Orc/ObjectTransformLayerTest.cpp
index 7cd6443b5d4a..6ad3c19ada95 100644
--- a/unittests/ExecutionEngine/Orc/ObjectTransformLayerTest.cpp
+++ b/unittests/ExecutionEngine/Orc/ObjectTransformLayerTest.cpp
@@ -14,6 +14,7 @@
#include "llvm/ExecutionEngine/Orc/NullResolver.h"
#include "llvm/ExecutionEngine/Orc/RTDyldObjectLinkingLayer.h"
#include "llvm/ExecutionEngine/SectionMemoryManager.h"
+#include "llvm/IR/Module.h"
#include "llvm/Object/ObjectFile.h"
#include "gtest/gtest.h"
@@ -44,42 +45,32 @@ struct AllocatingTransform {
// transform layer called the base layer and forwarded any return value.
class MockBaseLayer {
public:
- typedef int ObjHandleT;
-
MockBaseLayer() : MockSymbol(nullptr) { resetExpectations(); }
- template <typename ObjPtrT>
- llvm::Expected<ObjHandleT>
- addObject(ObjPtrT Obj,
- std::shared_ptr<llvm::JITSymbolResolver> Resolver) {
- EXPECT_EQ(MockResolver, Resolver) << "Resolver should pass through";
+ template <typename ObjPtrT> llvm::Error addObject(VModuleKey K, ObjPtrT Obj) {
+ EXPECT_EQ(MockKey, K) << "Key should pass through";
EXPECT_EQ(MockObject + 1, *Obj) << "Transform should be applied";
LastCalled = "addObject";
- MockObjHandle = 111;
- return MockObjHandle;
+ return llvm::Error::success();
}
- template <typename ObjPtrT>
- void expectAddObject(ObjPtrT Obj,
- std::shared_ptr<llvm::JITSymbolResolver> Resolver) {
- MockResolver = Resolver;
+ template <typename ObjPtrT> void expectAddObject(VModuleKey K, ObjPtrT Obj) {
+ MockKey = K;
MockObject = *Obj;
}
-
- void verifyAddObject(ObjHandleT Returned) {
+ void verifyAddObject() {
EXPECT_EQ("addObject", LastCalled);
- EXPECT_EQ(MockObjHandle, Returned) << "Return should pass through";
resetExpectations();
}
- llvm::Error removeObject(ObjHandleT H) {
- EXPECT_EQ(MockObjHandle, H);
+ llvm::Error removeObject(VModuleKey K) {
+ EXPECT_EQ(MockKey, K);
LastCalled = "removeObject";
return llvm::Error::success();
}
- void expectRemoveObject(ObjHandleT H) { MockObjHandle = H; }
+ void expectRemoveObject(VModuleKey K) { MockKey = K; }
void verifyRemoveObject() {
EXPECT_EQ("removeObject", LastCalled);
resetExpectations();
@@ -105,18 +96,18 @@ public:
resetExpectations();
}
- llvm::JITSymbol findSymbolIn(ObjHandleT H, const std::string &Name,
+ llvm::JITSymbol findSymbolIn(VModuleKey K, const std::string &Name,
bool ExportedSymbolsOnly) {
- EXPECT_EQ(MockObjHandle, H) << "Handle should pass through";
+ EXPECT_EQ(MockKey, K) << "VModuleKey should pass through";
EXPECT_EQ(MockName, Name) << "Name should pass through";
EXPECT_EQ(MockBool, ExportedSymbolsOnly) << "Flag should pass through";
LastCalled = "findSymbolIn";
MockSymbol = llvm::JITSymbol(122, llvm::JITSymbolFlags::None);
return llvm::JITSymbol(122, llvm::JITSymbolFlags::None);
}
- void expectFindSymbolIn(ObjHandleT H, const std::string &Name,
+ void expectFindSymbolIn(VModuleKey K, const std::string &Name,
bool ExportedSymbolsOnly) {
- MockObjHandle = H;
+ MockKey = K;
MockName = Name;
MockBool = ExportedSymbolsOnly;
}
@@ -128,29 +119,29 @@ public:
resetExpectations();
}
- llvm::Error emitAndFinalize(ObjHandleT H) {
- EXPECT_EQ(MockObjHandle, H) << "Handle should pass through";
+ llvm::Error emitAndFinalize(VModuleKey K) {
+ EXPECT_EQ(MockKey, K) << "VModuleKey should pass through";
LastCalled = "emitAndFinalize";
return llvm::Error::success();
}
- void expectEmitAndFinalize(ObjHandleT H) { MockObjHandle = H; }
+ void expectEmitAndFinalize(VModuleKey K) { MockKey = K; }
void verifyEmitAndFinalize() {
EXPECT_EQ("emitAndFinalize", LastCalled);
resetExpectations();
}
- void mapSectionAddress(ObjHandleT H, const void *LocalAddress,
+ void mapSectionAddress(VModuleKey K, const void *LocalAddress,
llvm::JITTargetAddress TargetAddr) {
- EXPECT_EQ(MockObjHandle, H);
+ EXPECT_EQ(MockKey, K);
EXPECT_EQ(MockLocalAddress, LocalAddress);
EXPECT_EQ(MockTargetAddress, TargetAddr);
LastCalled = "mapSectionAddress";
}
- void expectMapSectionAddress(ObjHandleT H, const void *LocalAddress,
+ void expectMapSectionAddress(VModuleKey K, const void *LocalAddress,
llvm::JITTargetAddress TargetAddr) {
- MockObjHandle = H;
+ MockKey = K;
MockLocalAddress = LocalAddress;
MockTargetAddress = TargetAddr;
}
@@ -162,9 +153,8 @@ public:
private:
// Backing fields for remembering parameter/return values
std::string LastCalled;
- std::shared_ptr<llvm::JITSymbolResolver> MockResolver;
+ VModuleKey MockKey;
MockObjectFile MockObject;
- ObjHandleT MockObjHandle;
std::string MockName;
bool MockBool;
llvm::JITSymbol MockSymbol;
@@ -175,9 +165,8 @@ private:
// Clear remembered parameters between calls
void resetExpectations() {
LastCalled = "nothing";
- MockResolver = nullptr;
+ MockKey = 0;
MockObject = 0;
- MockObjHandle = 0;
MockName = "bogus";
MockSymbol = llvm::JITSymbol(nullptr);
MockLocalAddress = nullptr;
@@ -190,6 +179,8 @@ private:
TEST(ObjectTransformLayerTest, Main) {
MockBaseLayer M;
+ ExecutionSession ES(std::make_shared<SymbolStringPool>());
+
// Create one object transform layer using a transform (as a functor)
// that allocates new objects, and deals in unique pointers.
ObjectTransformLayer<MockBaseLayer, AllocatingTransform> T1(M);
@@ -205,22 +196,23 @@ TEST(ObjectTransformLayerTest, Main) {
});
// Test addObject with T1 (allocating)
+ auto K1 = ES.allocateVModule();
auto Obj1 = std::make_shared<MockObjectFile>(211);
- auto SR = std::make_shared<NullResolver>();
- M.expectAddObject(Obj1, SR);
- auto H = cantFail(T1.addObject(std::move(Obj1), SR));
- M.verifyAddObject(H);
+ M.expectAddObject(K1, Obj1);
+ cantFail(T1.addObject(K1, std::move(Obj1)));
+ M.verifyAddObject();
// Test addObjectSet with T2 (mutating)
+ auto K2 = ES.allocateVModule();
auto Obj2 = std::make_shared<MockObjectFile>(222);
- M.expectAddObject(Obj2, SR);
- H = cantFail(T2.addObject(Obj2, SR));
- M.verifyAddObject(H);
+ M.expectAddObject(K2, Obj2);
+ cantFail(T2.addObject(K2, Obj2));
+ M.verifyAddObject();
EXPECT_EQ(223, *Obj2) << "Expected mutation";
// Test removeObjectSet
- M.expectRemoveObject(H);
- cantFail(T1.removeObject(H));
+ M.expectRemoveObject(K2);
+ cantFail(T1.removeObject(K2));
M.verifyRemoveObject();
// Test findSymbol
@@ -233,20 +225,20 @@ TEST(ObjectTransformLayerTest, Main) {
// Test findSymbolIn
Name = "bar";
ExportedOnly = false;
- M.expectFindSymbolIn(H, Name, ExportedOnly);
- llvm::JITSymbol Sym2 = T1.findSymbolIn(H, Name, ExportedOnly);
+ M.expectFindSymbolIn(K1, Name, ExportedOnly);
+ llvm::JITSymbol Sym2 = T1.findSymbolIn(K1, Name, ExportedOnly);
M.verifyFindSymbolIn(std::move(Sym2));
// Test emitAndFinalize
- M.expectEmitAndFinalize(H);
- cantFail(T2.emitAndFinalize(H));
+ M.expectEmitAndFinalize(K1);
+ cantFail(T2.emitAndFinalize(K1));
M.verifyEmitAndFinalize();
// Test mapSectionAddress
char Buffer[24];
llvm::JITTargetAddress MockAddress = 255;
- M.expectMapSectionAddress(H, Buffer, MockAddress);
- T1.mapSectionAddress(H, Buffer, MockAddress);
+ M.expectMapSectionAddress(K1, Buffer, MockAddress);
+ T1.mapSectionAddress(K1, Buffer, MockAddress);
M.verifyMapSectionAddress();
// Verify transform getter (non-const)
@@ -290,37 +282,35 @@ TEST(ObjectTransformLayerTest, Main) {
};
// Construct the jit layers.
- RTDyldObjectLinkingLayer BaseLayer(
- []() {
- return std::make_shared<llvm::SectionMemoryManager>();
- });
-
- auto IdentityTransform =
- [](std::shared_ptr<llvm::object::OwningBinary<llvm::object::ObjectFile>>
- Obj) {
- return Obj;
- };
+ RTDyldObjectLinkingLayer BaseLayer(ES, [](VModuleKey) {
+ return RTDyldObjectLinkingLayer::Resources{
+ std::make_shared<llvm::SectionMemoryManager>(),
+ std::make_shared<NullResolver>()};
+ });
+
+ auto IdentityTransform = [](std::unique_ptr<llvm::MemoryBuffer> Obj) {
+ return Obj;
+ };
ObjectTransformLayer<decltype(BaseLayer), decltype(IdentityTransform)>
TransformLayer(BaseLayer, IdentityTransform);
auto NullCompiler = [](llvm::Module &) {
- return llvm::object::OwningBinary<llvm::object::ObjectFile>(nullptr,
- nullptr);
+ return std::unique_ptr<llvm::MemoryBuffer>(nullptr);
};
IRCompileLayer<decltype(TransformLayer), decltype(NullCompiler)>
CompileLayer(TransformLayer, NullCompiler);
// Make sure that the calls from IRCompileLayer to ObjectTransformLayer
// compile.
- auto Resolver = std::make_shared<NullResolver>();
- cantFail(CompileLayer.addModule(std::shared_ptr<llvm::Module>(), Resolver));
+ cantFail(CompileLayer.addModule(ES.allocateVModule(),
+ std::unique_ptr<llvm::Module>()));
// Make sure that the calls from ObjectTransformLayer to ObjectLinkingLayer
// compile.
- decltype(TransformLayer)::ObjHandleT H2;
- cantFail(TransformLayer.emitAndFinalize(H2));
- TransformLayer.findSymbolIn(H2, Name, false);
+ VModuleKey DummyKey = ES.allocateVModule();
+ cantFail(TransformLayer.emitAndFinalize(DummyKey));
+ TransformLayer.findSymbolIn(DummyKey, Name, false);
TransformLayer.findSymbol(Name, true);
- TransformLayer.mapSectionAddress(H2, nullptr, 0);
- cantFail(TransformLayer.removeObject(H2));
+ TransformLayer.mapSectionAddress(DummyKey, nullptr, 0);
+ cantFail(TransformLayer.removeObject(DummyKey));
}
}