xref: /aosp_15_r20/external/llvm/unittests/ExecutionEngine/Orc/ObjectTransformLayerTest.cpp (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker //===- ObjectTransformLayerTest.cpp - Unit tests for ObjectTransformLayer -===//
2*9880d681SAndroid Build Coastguard Worker //
3*9880d681SAndroid Build Coastguard Worker //                     The LLVM Compiler Infrastructure
4*9880d681SAndroid Build Coastguard Worker //
5*9880d681SAndroid Build Coastguard Worker // This file is distributed under the University of Illinois Open Source
6*9880d681SAndroid Build Coastguard Worker // License. See LICENSE.TXT for details.
7*9880d681SAndroid Build Coastguard Worker //
8*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
9*9880d681SAndroid Build Coastguard Worker 
10*9880d681SAndroid Build Coastguard Worker #include "llvm/ADT/STLExtras.h"
11*9880d681SAndroid Build Coastguard Worker #include "llvm/ADT/SmallVector.h"
12*9880d681SAndroid Build Coastguard Worker #include "llvm/ExecutionEngine/Orc/CompileUtils.h"
13*9880d681SAndroid Build Coastguard Worker #include "llvm/ExecutionEngine/Orc/IRCompileLayer.h"
14*9880d681SAndroid Build Coastguard Worker #include "llvm/ExecutionEngine/Orc/NullResolver.h"
15*9880d681SAndroid Build Coastguard Worker #include "llvm/ExecutionEngine/Orc/ObjectLinkingLayer.h"
16*9880d681SAndroid Build Coastguard Worker #include "llvm/ExecutionEngine/Orc/ObjectTransformLayer.h"
17*9880d681SAndroid Build Coastguard Worker #include "llvm/Object/ObjectFile.h"
18*9880d681SAndroid Build Coastguard Worker #include "gtest/gtest.h"
19*9880d681SAndroid Build Coastguard Worker 
20*9880d681SAndroid Build Coastguard Worker using namespace llvm::orc;
21*9880d681SAndroid Build Coastguard Worker 
22*9880d681SAndroid Build Coastguard Worker namespace {
23*9880d681SAndroid Build Coastguard Worker 
24*9880d681SAndroid Build Coastguard Worker // Stand-in for RuntimeDyld::MemoryManager
25*9880d681SAndroid Build Coastguard Worker typedef int MockMemoryManager;
26*9880d681SAndroid Build Coastguard Worker 
27*9880d681SAndroid Build Coastguard Worker // Stand-in for RuntimeDyld::SymbolResolver
28*9880d681SAndroid Build Coastguard Worker typedef int MockSymbolResolver;
29*9880d681SAndroid Build Coastguard Worker 
30*9880d681SAndroid Build Coastguard Worker // stand-in for object::ObjectFile
31*9880d681SAndroid Build Coastguard Worker typedef int MockObjectFile;
32*9880d681SAndroid Build Coastguard Worker 
33*9880d681SAndroid Build Coastguard Worker // stand-in for llvm::MemoryBuffer set
34*9880d681SAndroid Build Coastguard Worker typedef int MockMemoryBufferSet;
35*9880d681SAndroid Build Coastguard Worker 
36*9880d681SAndroid Build Coastguard Worker // Mock transform that operates on unique pointers to object files, and
37*9880d681SAndroid Build Coastguard Worker // allocates new object files rather than mutating the given ones.
38*9880d681SAndroid Build Coastguard Worker struct AllocatingTransform {
39*9880d681SAndroid Build Coastguard Worker   std::unique_ptr<MockObjectFile>
operator ()__anona9f4a9600111::AllocatingTransform40*9880d681SAndroid Build Coastguard Worker   operator()(std::unique_ptr<MockObjectFile> Obj) const {
41*9880d681SAndroid Build Coastguard Worker     return llvm::make_unique<MockObjectFile>(*Obj + 1);
42*9880d681SAndroid Build Coastguard Worker   }
43*9880d681SAndroid Build Coastguard Worker };
44*9880d681SAndroid Build Coastguard Worker 
45*9880d681SAndroid Build Coastguard Worker // Mock base layer for verifying behavior of transform layer.
46*9880d681SAndroid Build Coastguard Worker // Each method "T foo(args)" is accompanied by two auxiliary methods:
47*9880d681SAndroid Build Coastguard Worker //  - "void expectFoo(args)", to be called before calling foo on the transform
48*9880d681SAndroid Build Coastguard Worker //      layer; saves values of args, which mock layer foo then verifies against.
49*9880d681SAndroid Build Coastguard Worker // - "void verifyFoo(T)", to be called after foo, which verifies that the
50*9880d681SAndroid Build Coastguard Worker //      transform layer called the base layer and forwarded any return value.
51*9880d681SAndroid Build Coastguard Worker class MockBaseLayer {
52*9880d681SAndroid Build Coastguard Worker public:
53*9880d681SAndroid Build Coastguard Worker   typedef int ObjSetHandleT;
54*9880d681SAndroid Build Coastguard Worker 
MockBaseLayer()55*9880d681SAndroid Build Coastguard Worker   MockBaseLayer() : MockSymbol(nullptr) { resetExpectations(); }
56*9880d681SAndroid Build Coastguard Worker 
57*9880d681SAndroid Build Coastguard Worker   template <typename ObjSetT, typename MemoryManagerPtrT,
58*9880d681SAndroid Build Coastguard Worker             typename SymbolResolverPtrT>
addObjectSet(ObjSetT Objects,MemoryManagerPtrT MemMgr,SymbolResolverPtrT Resolver)59*9880d681SAndroid Build Coastguard Worker   ObjSetHandleT addObjectSet(ObjSetT Objects, MemoryManagerPtrT MemMgr,
60*9880d681SAndroid Build Coastguard Worker                              SymbolResolverPtrT Resolver) {
61*9880d681SAndroid Build Coastguard Worker     EXPECT_EQ(MockManager, *MemMgr) << "MM should pass through";
62*9880d681SAndroid Build Coastguard Worker     EXPECT_EQ(MockResolver, *Resolver) << "Resolver should pass through";
63*9880d681SAndroid Build Coastguard Worker     size_t I = 0;
64*9880d681SAndroid Build Coastguard Worker     for (auto &ObjPtr : Objects) {
65*9880d681SAndroid Build Coastguard Worker       EXPECT_EQ(MockObjects[I] + 1, *ObjPtr) << "Transform should be applied";
66*9880d681SAndroid Build Coastguard Worker       I++;
67*9880d681SAndroid Build Coastguard Worker     }
68*9880d681SAndroid Build Coastguard Worker     EXPECT_EQ(MockObjects.size(), I) << "Number of objects should match";
69*9880d681SAndroid Build Coastguard Worker     LastCalled = "addObjectSet";
70*9880d681SAndroid Build Coastguard Worker     MockObjSetHandle = 111;
71*9880d681SAndroid Build Coastguard Worker     return MockObjSetHandle;
72*9880d681SAndroid Build Coastguard Worker   }
73*9880d681SAndroid Build Coastguard Worker   template <typename ObjSetT>
expectAddObjectSet(ObjSetT & Objects,MockMemoryManager * MemMgr,MockSymbolResolver * Resolver)74*9880d681SAndroid Build Coastguard Worker   void expectAddObjectSet(ObjSetT &Objects, MockMemoryManager *MemMgr,
75*9880d681SAndroid Build Coastguard Worker                           MockSymbolResolver *Resolver) {
76*9880d681SAndroid Build Coastguard Worker     MockManager = *MemMgr;
77*9880d681SAndroid Build Coastguard Worker     MockResolver = *Resolver;
78*9880d681SAndroid Build Coastguard Worker     for (auto &ObjPtr : Objects) {
79*9880d681SAndroid Build Coastguard Worker       MockObjects.push_back(*ObjPtr);
80*9880d681SAndroid Build Coastguard Worker     }
81*9880d681SAndroid Build Coastguard Worker   }
verifyAddObjectSet(ObjSetHandleT Returned)82*9880d681SAndroid Build Coastguard Worker   void verifyAddObjectSet(ObjSetHandleT Returned) {
83*9880d681SAndroid Build Coastguard Worker     EXPECT_EQ("addObjectSet", LastCalled);
84*9880d681SAndroid Build Coastguard Worker     EXPECT_EQ(MockObjSetHandle, Returned) << "Return should pass through";
85*9880d681SAndroid Build Coastguard Worker     resetExpectations();
86*9880d681SAndroid Build Coastguard Worker   }
87*9880d681SAndroid Build Coastguard Worker 
removeObjectSet(ObjSetHandleT H)88*9880d681SAndroid Build Coastguard Worker   void removeObjectSet(ObjSetHandleT H) {
89*9880d681SAndroid Build Coastguard Worker     EXPECT_EQ(MockObjSetHandle, H);
90*9880d681SAndroid Build Coastguard Worker     LastCalled = "removeObjectSet";
91*9880d681SAndroid Build Coastguard Worker   }
expectRemoveObjectSet(ObjSetHandleT H)92*9880d681SAndroid Build Coastguard Worker   void expectRemoveObjectSet(ObjSetHandleT H) { MockObjSetHandle = H; }
verifyRemoveObjectSet()93*9880d681SAndroid Build Coastguard Worker   void verifyRemoveObjectSet() {
94*9880d681SAndroid Build Coastguard Worker     EXPECT_EQ("removeObjectSet", LastCalled);
95*9880d681SAndroid Build Coastguard Worker     resetExpectations();
96*9880d681SAndroid Build Coastguard Worker   }
97*9880d681SAndroid Build Coastguard Worker 
findSymbol(const std::string & Name,bool ExportedSymbolsOnly)98*9880d681SAndroid Build Coastguard Worker   JITSymbol findSymbol(const std::string &Name, bool ExportedSymbolsOnly) {
99*9880d681SAndroid Build Coastguard Worker     EXPECT_EQ(MockName, Name) << "Name should pass through";
100*9880d681SAndroid Build Coastguard Worker     EXPECT_EQ(MockBool, ExportedSymbolsOnly) << "Flag should pass through";
101*9880d681SAndroid Build Coastguard Worker     LastCalled = "findSymbol";
102*9880d681SAndroid Build Coastguard Worker     MockSymbol = JITSymbol(122, llvm::JITSymbolFlags::None);
103*9880d681SAndroid Build Coastguard Worker     return MockSymbol;
104*9880d681SAndroid Build Coastguard Worker   }
expectFindSymbol(const std::string & Name,bool ExportedSymbolsOnly)105*9880d681SAndroid Build Coastguard Worker   void expectFindSymbol(const std::string &Name, bool ExportedSymbolsOnly) {
106*9880d681SAndroid Build Coastguard Worker     MockName = Name;
107*9880d681SAndroid Build Coastguard Worker     MockBool = ExportedSymbolsOnly;
108*9880d681SAndroid Build Coastguard Worker   }
verifyFindSymbol(llvm::orc::JITSymbol Returned)109*9880d681SAndroid Build Coastguard Worker   void verifyFindSymbol(llvm::orc::JITSymbol Returned) {
110*9880d681SAndroid Build Coastguard Worker     EXPECT_EQ("findSymbol", LastCalled);
111*9880d681SAndroid Build Coastguard Worker     EXPECT_EQ(MockSymbol.getAddress(), Returned.getAddress())
112*9880d681SAndroid Build Coastguard Worker         << "Return should pass through";
113*9880d681SAndroid Build Coastguard Worker     resetExpectations();
114*9880d681SAndroid Build Coastguard Worker   }
115*9880d681SAndroid Build Coastguard Worker 
findSymbolIn(ObjSetHandleT H,const std::string & Name,bool ExportedSymbolsOnly)116*9880d681SAndroid Build Coastguard Worker   JITSymbol findSymbolIn(ObjSetHandleT H, const std::string &Name,
117*9880d681SAndroid Build Coastguard Worker                          bool ExportedSymbolsOnly) {
118*9880d681SAndroid Build Coastguard Worker     EXPECT_EQ(MockObjSetHandle, H) << "Handle should pass through";
119*9880d681SAndroid Build Coastguard Worker     EXPECT_EQ(MockName, Name) << "Name should pass through";
120*9880d681SAndroid Build Coastguard Worker     EXPECT_EQ(MockBool, ExportedSymbolsOnly) << "Flag should pass through";
121*9880d681SAndroid Build Coastguard Worker     LastCalled = "findSymbolIn";
122*9880d681SAndroid Build Coastguard Worker     MockSymbol = JITSymbol(122, llvm::JITSymbolFlags::None);
123*9880d681SAndroid Build Coastguard Worker     return MockSymbol;
124*9880d681SAndroid Build Coastguard Worker   }
expectFindSymbolIn(ObjSetHandleT H,const std::string & Name,bool ExportedSymbolsOnly)125*9880d681SAndroid Build Coastguard Worker   void expectFindSymbolIn(ObjSetHandleT H, const std::string &Name,
126*9880d681SAndroid Build Coastguard Worker                           bool ExportedSymbolsOnly) {
127*9880d681SAndroid Build Coastguard Worker     MockObjSetHandle = H;
128*9880d681SAndroid Build Coastguard Worker     MockName = Name;
129*9880d681SAndroid Build Coastguard Worker     MockBool = ExportedSymbolsOnly;
130*9880d681SAndroid Build Coastguard Worker   }
verifyFindSymbolIn(llvm::orc::JITSymbol Returned)131*9880d681SAndroid Build Coastguard Worker   void verifyFindSymbolIn(llvm::orc::JITSymbol Returned) {
132*9880d681SAndroid Build Coastguard Worker     EXPECT_EQ("findSymbolIn", LastCalled);
133*9880d681SAndroid Build Coastguard Worker     EXPECT_EQ(MockSymbol.getAddress(), Returned.getAddress())
134*9880d681SAndroid Build Coastguard Worker         << "Return should pass through";
135*9880d681SAndroid Build Coastguard Worker     resetExpectations();
136*9880d681SAndroid Build Coastguard Worker   }
137*9880d681SAndroid Build Coastguard Worker 
emitAndFinalize(ObjSetHandleT H)138*9880d681SAndroid Build Coastguard Worker   void emitAndFinalize(ObjSetHandleT H) {
139*9880d681SAndroid Build Coastguard Worker     EXPECT_EQ(MockObjSetHandle, H) << "Handle should pass through";
140*9880d681SAndroid Build Coastguard Worker     LastCalled = "emitAndFinalize";
141*9880d681SAndroid Build Coastguard Worker   }
expectEmitAndFinalize(ObjSetHandleT H)142*9880d681SAndroid Build Coastguard Worker   void expectEmitAndFinalize(ObjSetHandleT H) { MockObjSetHandle = H; }
verifyEmitAndFinalize()143*9880d681SAndroid Build Coastguard Worker   void verifyEmitAndFinalize() {
144*9880d681SAndroid Build Coastguard Worker     EXPECT_EQ("emitAndFinalize", LastCalled);
145*9880d681SAndroid Build Coastguard Worker     resetExpectations();
146*9880d681SAndroid Build Coastguard Worker   }
147*9880d681SAndroid Build Coastguard Worker 
mapSectionAddress(ObjSetHandleT H,const void * LocalAddress,TargetAddress TargetAddr)148*9880d681SAndroid Build Coastguard Worker   void mapSectionAddress(ObjSetHandleT H, const void *LocalAddress,
149*9880d681SAndroid Build Coastguard Worker                          TargetAddress TargetAddr) {
150*9880d681SAndroid Build Coastguard Worker     EXPECT_EQ(MockObjSetHandle, H);
151*9880d681SAndroid Build Coastguard Worker     EXPECT_EQ(MockLocalAddress, LocalAddress);
152*9880d681SAndroid Build Coastguard Worker     EXPECT_EQ(MockTargetAddress, TargetAddr);
153*9880d681SAndroid Build Coastguard Worker     LastCalled = "mapSectionAddress";
154*9880d681SAndroid Build Coastguard Worker   }
expectMapSectionAddress(ObjSetHandleT H,const void * LocalAddress,TargetAddress TargetAddr)155*9880d681SAndroid Build Coastguard Worker   void expectMapSectionAddress(ObjSetHandleT H, const void *LocalAddress,
156*9880d681SAndroid Build Coastguard Worker                                TargetAddress TargetAddr) {
157*9880d681SAndroid Build Coastguard Worker     MockObjSetHandle = H;
158*9880d681SAndroid Build Coastguard Worker     MockLocalAddress = LocalAddress;
159*9880d681SAndroid Build Coastguard Worker     MockTargetAddress = TargetAddr;
160*9880d681SAndroid Build Coastguard Worker   }
verifyMapSectionAddress()161*9880d681SAndroid Build Coastguard Worker   void verifyMapSectionAddress() {
162*9880d681SAndroid Build Coastguard Worker     EXPECT_EQ("mapSectionAddress", LastCalled);
163*9880d681SAndroid Build Coastguard Worker     resetExpectations();
164*9880d681SAndroid Build Coastguard Worker   }
165*9880d681SAndroid Build Coastguard Worker 
166*9880d681SAndroid Build Coastguard Worker private:
167*9880d681SAndroid Build Coastguard Worker   // Backing fields for remembering parameter/return values
168*9880d681SAndroid Build Coastguard Worker   std::string LastCalled;
169*9880d681SAndroid Build Coastguard Worker   MockMemoryManager MockManager;
170*9880d681SAndroid Build Coastguard Worker   MockSymbolResolver MockResolver;
171*9880d681SAndroid Build Coastguard Worker   std::vector<MockObjectFile> MockObjects;
172*9880d681SAndroid Build Coastguard Worker   ObjSetHandleT MockObjSetHandle;
173*9880d681SAndroid Build Coastguard Worker   std::string MockName;
174*9880d681SAndroid Build Coastguard Worker   bool MockBool;
175*9880d681SAndroid Build Coastguard Worker   JITSymbol MockSymbol;
176*9880d681SAndroid Build Coastguard Worker   const void *MockLocalAddress;
177*9880d681SAndroid Build Coastguard Worker   TargetAddress MockTargetAddress;
178*9880d681SAndroid Build Coastguard Worker   MockMemoryBufferSet MockBufferSet;
179*9880d681SAndroid Build Coastguard Worker 
180*9880d681SAndroid Build Coastguard Worker   // Clear remembered parameters between calls
resetExpectations()181*9880d681SAndroid Build Coastguard Worker   void resetExpectations() {
182*9880d681SAndroid Build Coastguard Worker     LastCalled = "nothing";
183*9880d681SAndroid Build Coastguard Worker     MockManager = 0;
184*9880d681SAndroid Build Coastguard Worker     MockResolver = 0;
185*9880d681SAndroid Build Coastguard Worker     MockObjects.clear();
186*9880d681SAndroid Build Coastguard Worker     MockObjSetHandle = 0;
187*9880d681SAndroid Build Coastguard Worker     MockName = "bogus";
188*9880d681SAndroid Build Coastguard Worker     MockSymbol = JITSymbol(nullptr);
189*9880d681SAndroid Build Coastguard Worker     MockLocalAddress = nullptr;
190*9880d681SAndroid Build Coastguard Worker     MockTargetAddress = 0;
191*9880d681SAndroid Build Coastguard Worker     MockBufferSet = 0;
192*9880d681SAndroid Build Coastguard Worker   }
193*9880d681SAndroid Build Coastguard Worker };
194*9880d681SAndroid Build Coastguard Worker 
195*9880d681SAndroid Build Coastguard Worker // Test each operation on ObjectTransformLayer.
TEST(ObjectTransformLayerTest,Main)196*9880d681SAndroid Build Coastguard Worker TEST(ObjectTransformLayerTest, Main) {
197*9880d681SAndroid Build Coastguard Worker   MockBaseLayer M;
198*9880d681SAndroid Build Coastguard Worker 
199*9880d681SAndroid Build Coastguard Worker   // Create one object transform layer using a transform (as a functor)
200*9880d681SAndroid Build Coastguard Worker   // that allocates new objects, and deals in unique pointers.
201*9880d681SAndroid Build Coastguard Worker   ObjectTransformLayer<MockBaseLayer, AllocatingTransform> T1(M);
202*9880d681SAndroid Build Coastguard Worker 
203*9880d681SAndroid Build Coastguard Worker   // Create a second object transform layer using a transform (as a lambda)
204*9880d681SAndroid Build Coastguard Worker   // that mutates objects in place, and deals in naked pointers
205*9880d681SAndroid Build Coastguard Worker   ObjectTransformLayer<MockBaseLayer,
206*9880d681SAndroid Build Coastguard Worker                        std::function<MockObjectFile *(MockObjectFile *)>>
207*9880d681SAndroid Build Coastguard Worker   T2(M, [](MockObjectFile *Obj) {
208*9880d681SAndroid Build Coastguard Worker     ++(*Obj);
209*9880d681SAndroid Build Coastguard Worker     return Obj;
210*9880d681SAndroid Build Coastguard Worker   });
211*9880d681SAndroid Build Coastguard Worker 
212*9880d681SAndroid Build Coastguard Worker   // Instantiate some mock objects to use below
213*9880d681SAndroid Build Coastguard Worker   MockObjectFile MockObject1 = 211;
214*9880d681SAndroid Build Coastguard Worker   MockObjectFile MockObject2 = 222;
215*9880d681SAndroid Build Coastguard Worker   MockMemoryManager MockManager = 233;
216*9880d681SAndroid Build Coastguard Worker   MockSymbolResolver MockResolver = 244;
217*9880d681SAndroid Build Coastguard Worker 
218*9880d681SAndroid Build Coastguard Worker   // Test addObjectSet with T1 (allocating, unique pointers)
219*9880d681SAndroid Build Coastguard Worker   std::vector<std::unique_ptr<MockObjectFile>> Objs1;
220*9880d681SAndroid Build Coastguard Worker   Objs1.push_back(llvm::make_unique<MockObjectFile>(MockObject1));
221*9880d681SAndroid Build Coastguard Worker   Objs1.push_back(llvm::make_unique<MockObjectFile>(MockObject2));
222*9880d681SAndroid Build Coastguard Worker   auto MM = llvm::make_unique<MockMemoryManager>(MockManager);
223*9880d681SAndroid Build Coastguard Worker   auto SR = llvm::make_unique<MockSymbolResolver>(MockResolver);
224*9880d681SAndroid Build Coastguard Worker   M.expectAddObjectSet(Objs1, MM.get(), SR.get());
225*9880d681SAndroid Build Coastguard Worker   auto H = T1.addObjectSet(std::move(Objs1), std::move(MM), std::move(SR));
226*9880d681SAndroid Build Coastguard Worker   M.verifyAddObjectSet(H);
227*9880d681SAndroid Build Coastguard Worker 
228*9880d681SAndroid Build Coastguard Worker   // Test addObjectSet with T2 (mutating, naked pointers)
229*9880d681SAndroid Build Coastguard Worker   llvm::SmallVector<MockObjectFile *, 2> Objs2Vec;
230*9880d681SAndroid Build Coastguard Worker   Objs2Vec.push_back(&MockObject1);
231*9880d681SAndroid Build Coastguard Worker   Objs2Vec.push_back(&MockObject2);
232*9880d681SAndroid Build Coastguard Worker   llvm::MutableArrayRef<MockObjectFile *> Objs2(Objs2Vec);
233*9880d681SAndroid Build Coastguard Worker   M.expectAddObjectSet(Objs2, &MockManager, &MockResolver);
234*9880d681SAndroid Build Coastguard Worker   H = T2.addObjectSet(Objs2, &MockManager, &MockResolver);
235*9880d681SAndroid Build Coastguard Worker   M.verifyAddObjectSet(H);
236*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(212, MockObject1) << "Expected mutation";
237*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(223, MockObject2) << "Expected mutation";
238*9880d681SAndroid Build Coastguard Worker 
239*9880d681SAndroid Build Coastguard Worker   // Test removeObjectSet
240*9880d681SAndroid Build Coastguard Worker   M.expectRemoveObjectSet(H);
241*9880d681SAndroid Build Coastguard Worker   T1.removeObjectSet(H);
242*9880d681SAndroid Build Coastguard Worker   M.verifyRemoveObjectSet();
243*9880d681SAndroid Build Coastguard Worker 
244*9880d681SAndroid Build Coastguard Worker   // Test findSymbol
245*9880d681SAndroid Build Coastguard Worker   std::string Name = "foo";
246*9880d681SAndroid Build Coastguard Worker   bool ExportedOnly = true;
247*9880d681SAndroid Build Coastguard Worker   M.expectFindSymbol(Name, ExportedOnly);
248*9880d681SAndroid Build Coastguard Worker   JITSymbol Symbol = T2.findSymbol(Name, ExportedOnly);
249*9880d681SAndroid Build Coastguard Worker   M.verifyFindSymbol(Symbol);
250*9880d681SAndroid Build Coastguard Worker 
251*9880d681SAndroid Build Coastguard Worker   // Test findSymbolIn
252*9880d681SAndroid Build Coastguard Worker   Name = "bar";
253*9880d681SAndroid Build Coastguard Worker   ExportedOnly = false;
254*9880d681SAndroid Build Coastguard Worker   M.expectFindSymbolIn(H, Name, ExportedOnly);
255*9880d681SAndroid Build Coastguard Worker   Symbol = T1.findSymbolIn(H, Name, ExportedOnly);
256*9880d681SAndroid Build Coastguard Worker   M.verifyFindSymbolIn(Symbol);
257*9880d681SAndroid Build Coastguard Worker 
258*9880d681SAndroid Build Coastguard Worker   // Test emitAndFinalize
259*9880d681SAndroid Build Coastguard Worker   M.expectEmitAndFinalize(H);
260*9880d681SAndroid Build Coastguard Worker   T2.emitAndFinalize(H);
261*9880d681SAndroid Build Coastguard Worker   M.verifyEmitAndFinalize();
262*9880d681SAndroid Build Coastguard Worker 
263*9880d681SAndroid Build Coastguard Worker   // Test mapSectionAddress
264*9880d681SAndroid Build Coastguard Worker   char Buffer[24];
265*9880d681SAndroid Build Coastguard Worker   TargetAddress MockAddress = 255;
266*9880d681SAndroid Build Coastguard Worker   M.expectMapSectionAddress(H, Buffer, MockAddress);
267*9880d681SAndroid Build Coastguard Worker   T1.mapSectionAddress(H, Buffer, MockAddress);
268*9880d681SAndroid Build Coastguard Worker   M.verifyMapSectionAddress();
269*9880d681SAndroid Build Coastguard Worker 
270*9880d681SAndroid Build Coastguard Worker   // Verify transform getter (non-const)
271*9880d681SAndroid Build Coastguard Worker   MockObjectFile Mutatee = 277;
272*9880d681SAndroid Build Coastguard Worker   MockObjectFile *Out = T2.getTransform()(&Mutatee);
273*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(&Mutatee, Out) << "Expected in-place transform";
274*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(278, Mutatee) << "Expected incrementing transform";
275*9880d681SAndroid Build Coastguard Worker 
276*9880d681SAndroid Build Coastguard Worker   // Verify transform getter (const)
277*9880d681SAndroid Build Coastguard Worker   auto OwnedObj = llvm::make_unique<MockObjectFile>(288);
278*9880d681SAndroid Build Coastguard Worker   const auto &T1C = T1;
279*9880d681SAndroid Build Coastguard Worker   OwnedObj = T1C.getTransform()(std::move(OwnedObj));
280*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(289, *OwnedObj) << "Expected incrementing transform";
281*9880d681SAndroid Build Coastguard Worker 
282*9880d681SAndroid Build Coastguard Worker   volatile bool RunStaticChecks = false;
283*9880d681SAndroid Build Coastguard Worker   if (!RunStaticChecks)
284*9880d681SAndroid Build Coastguard Worker     return;
285*9880d681SAndroid Build Coastguard Worker 
286*9880d681SAndroid Build Coastguard Worker   // Make sure that ObjectTransformLayer implements the object layer concept
287*9880d681SAndroid Build Coastguard Worker   // correctly by sandwitching one between an ObjectLinkingLayer and an
288*9880d681SAndroid Build Coastguard Worker   // IRCompileLayer, verifying that it compiles if we have a call to the
289*9880d681SAndroid Build Coastguard Worker   // IRComileLayer's addModuleSet that should call the transform layer's
290*9880d681SAndroid Build Coastguard Worker   // addObjectSet, and also calling the other public transform layer methods
291*9880d681SAndroid Build Coastguard Worker   // directly to make sure the methods they intend to forward to exist on
292*9880d681SAndroid Build Coastguard Worker   // the ObjectLinkingLayer.
293*9880d681SAndroid Build Coastguard Worker 
294*9880d681SAndroid Build Coastguard Worker   // We'll need a concrete MemoryManager class.
295*9880d681SAndroid Build Coastguard Worker   class NullManager : public llvm::RuntimeDyld::MemoryManager {
296*9880d681SAndroid Build Coastguard Worker   public:
297*9880d681SAndroid Build Coastguard Worker     uint8_t *allocateCodeSection(uintptr_t, unsigned, unsigned,
298*9880d681SAndroid Build Coastguard Worker                                  llvm::StringRef) override {
299*9880d681SAndroid Build Coastguard Worker       return nullptr;
300*9880d681SAndroid Build Coastguard Worker     }
301*9880d681SAndroid Build Coastguard Worker     uint8_t *allocateDataSection(uintptr_t, unsigned, unsigned, llvm::StringRef,
302*9880d681SAndroid Build Coastguard Worker                                  bool) override {
303*9880d681SAndroid Build Coastguard Worker       return nullptr;
304*9880d681SAndroid Build Coastguard Worker     }
305*9880d681SAndroid Build Coastguard Worker     void registerEHFrames(uint8_t *, uint64_t, size_t) override {}
306*9880d681SAndroid Build Coastguard Worker     void deregisterEHFrames(uint8_t *, uint64_t, size_t) override {}
307*9880d681SAndroid Build Coastguard Worker     bool finalizeMemory(std::string *) override { return false; }
308*9880d681SAndroid Build Coastguard Worker   };
309*9880d681SAndroid Build Coastguard Worker 
310*9880d681SAndroid Build Coastguard Worker   // Construct the jit layers.
311*9880d681SAndroid Build Coastguard Worker   ObjectLinkingLayer<> BaseLayer;
312*9880d681SAndroid Build Coastguard Worker   auto IdentityTransform = [](
313*9880d681SAndroid Build Coastguard Worker       std::unique_ptr<llvm::object::OwningBinary<llvm::object::ObjectFile>>
314*9880d681SAndroid Build Coastguard Worker           Obj) { return Obj; };
315*9880d681SAndroid Build Coastguard Worker   ObjectTransformLayer<decltype(BaseLayer), decltype(IdentityTransform)>
316*9880d681SAndroid Build Coastguard Worker       TransformLayer(BaseLayer, IdentityTransform);
317*9880d681SAndroid Build Coastguard Worker   auto NullCompiler = [](llvm::Module &) {
318*9880d681SAndroid Build Coastguard Worker     return llvm::object::OwningBinary<llvm::object::ObjectFile>();
319*9880d681SAndroid Build Coastguard Worker   };
320*9880d681SAndroid Build Coastguard Worker   IRCompileLayer<decltype(TransformLayer)> CompileLayer(TransformLayer,
321*9880d681SAndroid Build Coastguard Worker                                                         NullCompiler);
322*9880d681SAndroid Build Coastguard Worker 
323*9880d681SAndroid Build Coastguard Worker   // Make sure that the calls from IRCompileLayer to ObjectTransformLayer
324*9880d681SAndroid Build Coastguard Worker   // compile.
325*9880d681SAndroid Build Coastguard Worker   NullResolver Resolver;
326*9880d681SAndroid Build Coastguard Worker   NullManager Manager;
327*9880d681SAndroid Build Coastguard Worker   CompileLayer.addModuleSet(std::vector<llvm::Module *>(), &Manager, &Resolver);
328*9880d681SAndroid Build Coastguard Worker 
329*9880d681SAndroid Build Coastguard Worker   // Make sure that the calls from ObjectTransformLayer to ObjectLinkingLayer
330*9880d681SAndroid Build Coastguard Worker   // compile.
331*9880d681SAndroid Build Coastguard Worker   decltype(TransformLayer)::ObjSetHandleT ObjSet;
332*9880d681SAndroid Build Coastguard Worker   TransformLayer.emitAndFinalize(ObjSet);
333*9880d681SAndroid Build Coastguard Worker   TransformLayer.findSymbolIn(ObjSet, Name, false);
334*9880d681SAndroid Build Coastguard Worker   TransformLayer.findSymbol(Name, true);
335*9880d681SAndroid Build Coastguard Worker   TransformLayer.mapSectionAddress(ObjSet, nullptr, 0);
336*9880d681SAndroid Build Coastguard Worker   TransformLayer.removeObjectSet(ObjSet);
337*9880d681SAndroid Build Coastguard Worker }
338*9880d681SAndroid Build Coastguard Worker }
339