1*9880d681SAndroid Build Coastguard Worker //===----- CompileOnDemandLayerTest.cpp - Unit tests for the COD layer ----===//
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 "OrcTestCommon.h"
11*9880d681SAndroid Build Coastguard Worker #include "llvm/ExecutionEngine/Orc/CompileOnDemandLayer.h"
12*9880d681SAndroid Build Coastguard Worker #include "gtest/gtest.h"
13*9880d681SAndroid Build Coastguard Worker
14*9880d681SAndroid Build Coastguard Worker using namespace llvm;
15*9880d681SAndroid Build Coastguard Worker using namespace llvm::orc;
16*9880d681SAndroid Build Coastguard Worker
17*9880d681SAndroid Build Coastguard Worker namespace {
18*9880d681SAndroid Build Coastguard Worker
19*9880d681SAndroid Build Coastguard Worker class DummyCallbackManager : public orc::JITCompileCallbackManager {
20*9880d681SAndroid Build Coastguard Worker public:
DummyCallbackManager()21*9880d681SAndroid Build Coastguard Worker DummyCallbackManager() : JITCompileCallbackManager(0) {}
22*9880d681SAndroid Build Coastguard Worker
23*9880d681SAndroid Build Coastguard Worker public:
grow()24*9880d681SAndroid Build Coastguard Worker void grow() override { llvm_unreachable("not implemented"); }
25*9880d681SAndroid Build Coastguard Worker };
26*9880d681SAndroid Build Coastguard Worker
27*9880d681SAndroid Build Coastguard Worker class DummyStubsManager : public orc::IndirectStubsManager {
28*9880d681SAndroid Build Coastguard Worker public:
createStub(StringRef StubName,TargetAddress InitAddr,JITSymbolFlags Flags)29*9880d681SAndroid Build Coastguard Worker Error createStub(StringRef StubName, TargetAddress InitAddr,
30*9880d681SAndroid Build Coastguard Worker JITSymbolFlags Flags) override {
31*9880d681SAndroid Build Coastguard Worker llvm_unreachable("Not implemented");
32*9880d681SAndroid Build Coastguard Worker }
33*9880d681SAndroid Build Coastguard Worker
createStubs(const StubInitsMap & StubInits)34*9880d681SAndroid Build Coastguard Worker Error createStubs(const StubInitsMap &StubInits) override {
35*9880d681SAndroid Build Coastguard Worker llvm_unreachable("Not implemented");
36*9880d681SAndroid Build Coastguard Worker }
37*9880d681SAndroid Build Coastguard Worker
findStub(StringRef Name,bool ExportedStubsOnly)38*9880d681SAndroid Build Coastguard Worker JITSymbol findStub(StringRef Name, bool ExportedStubsOnly) override {
39*9880d681SAndroid Build Coastguard Worker llvm_unreachable("Not implemented");
40*9880d681SAndroid Build Coastguard Worker }
41*9880d681SAndroid Build Coastguard Worker
findPointer(StringRef Name)42*9880d681SAndroid Build Coastguard Worker JITSymbol findPointer(StringRef Name) override {
43*9880d681SAndroid Build Coastguard Worker llvm_unreachable("Not implemented");
44*9880d681SAndroid Build Coastguard Worker }
45*9880d681SAndroid Build Coastguard Worker
updatePointer(StringRef Name,TargetAddress NewAddr)46*9880d681SAndroid Build Coastguard Worker Error updatePointer(StringRef Name, TargetAddress NewAddr) override {
47*9880d681SAndroid Build Coastguard Worker llvm_unreachable("Not implemented");
48*9880d681SAndroid Build Coastguard Worker }
49*9880d681SAndroid Build Coastguard Worker };
50*9880d681SAndroid Build Coastguard Worker
TEST(CompileOnDemandLayerTest,FindSymbol)51*9880d681SAndroid Build Coastguard Worker TEST(CompileOnDemandLayerTest, FindSymbol) {
52*9880d681SAndroid Build Coastguard Worker auto MockBaseLayer = createMockBaseLayer<int>(
53*9880d681SAndroid Build Coastguard Worker DoNothingAndReturn<int>(0), DoNothingAndReturn<void>(),
54*9880d681SAndroid Build Coastguard Worker [](const std::string &Name, bool) {
55*9880d681SAndroid Build Coastguard Worker if (Name == "foo")
56*9880d681SAndroid Build Coastguard Worker return JITSymbol(1, JITSymbolFlags::Exported);
57*9880d681SAndroid Build Coastguard Worker return JITSymbol(nullptr);
58*9880d681SAndroid Build Coastguard Worker },
59*9880d681SAndroid Build Coastguard Worker DoNothingAndReturn<JITSymbol>(nullptr));
60*9880d681SAndroid Build Coastguard Worker
61*9880d681SAndroid Build Coastguard Worker typedef decltype(MockBaseLayer) MockBaseLayerT;
62*9880d681SAndroid Build Coastguard Worker DummyCallbackManager CallbackMgr;
63*9880d681SAndroid Build Coastguard Worker
64*9880d681SAndroid Build Coastguard Worker llvm::orc::CompileOnDemandLayer<MockBaseLayerT> COD(
65*9880d681SAndroid Build Coastguard Worker MockBaseLayer, [](Function &F) { return std::set<Function *>{&F}; },
66*9880d681SAndroid Build Coastguard Worker CallbackMgr, [] { return llvm::make_unique<DummyStubsManager>(); }, true);
67*9880d681SAndroid Build Coastguard Worker
68*9880d681SAndroid Build Coastguard Worker auto Sym = COD.findSymbol("foo", true);
69*9880d681SAndroid Build Coastguard Worker
70*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(!!Sym) << "CompileOnDemand::findSymbol should call findSymbol in "
71*9880d681SAndroid Build Coastguard Worker "the base layer.";
72*9880d681SAndroid Build Coastguard Worker }
73*9880d681SAndroid Build Coastguard Worker }
74