1 //===----- CompileOnDemandLayerTest.cpp - Unit tests for the COD layer ----===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 
9 #include "llvm/ExecutionEngine/Orc/CompileOnDemandLayer.h"
10 #include "OrcTestCommon.h"
11 #include "gtest/gtest.h"
12 
13 using namespace llvm;
14 using namespace llvm::orc;
15 
16 namespace {
17 
18 class DummyTrampolinePool : public orc::TrampolinePool {
19 public:
getTrampoline()20   Expected<JITTargetAddress> getTrampoline() {
21     llvm_unreachable("Unimplemented");
22   }
23 };
24 
25 class DummyCallbackManager : public JITCompileCallbackManager {
26 public:
DummyCallbackManager(ExecutionSession & ES)27   DummyCallbackManager(ExecutionSession &ES)
28       : JITCompileCallbackManager(std::make_unique<DummyTrampolinePool>(), ES,
29                                   0) {}
30 };
31 
32 class DummyStubsManager : public orc::IndirectStubsManager {
33 public:
createStub(StringRef StubName,JITTargetAddress InitAddr,JITSymbolFlags Flags)34   Error createStub(StringRef StubName, JITTargetAddress InitAddr,
35                    JITSymbolFlags Flags) override {
36     llvm_unreachable("Not implemented");
37   }
38 
createStubs(const StubInitsMap & StubInits)39   Error createStubs(const StubInitsMap &StubInits) override {
40     llvm_unreachable("Not implemented");
41   }
42 
findStub(StringRef Name,bool ExportedStubsOnly)43   JITEvaluatedSymbol findStub(StringRef Name, bool ExportedStubsOnly) override {
44     llvm_unreachable("Not implemented");
45   }
46 
findPointer(StringRef Name)47   JITEvaluatedSymbol findPointer(StringRef Name) override {
48     llvm_unreachable("Not implemented");
49   }
50 
updatePointer(StringRef Name,JITTargetAddress NewAddr)51   Error updatePointer(StringRef Name, JITTargetAddress NewAddr) override {
52     llvm_unreachable("Not implemented");
53   }
54 };
55 
TEST(LegacyCompileOnDemandLayerTest,FindSymbol)56 TEST(LegacyCompileOnDemandLayerTest, FindSymbol) {
57   MockBaseLayer<int, std::shared_ptr<Module>> TestBaseLayer;
58   TestBaseLayer.findSymbolImpl =
59     [](const std::string &Name, bool) {
60       if (Name == "foo")
61         return JITSymbol(1, JITSymbolFlags::Exported);
62       return JITSymbol(nullptr);
63     };
64 
65 
66   ExecutionSession ES(std::make_shared<SymbolStringPool>());
67   DummyCallbackManager CallbackMgr(ES);
68 
69   auto GetResolver =
70       [](orc::VModuleKey) -> std::shared_ptr<llvm::orc::SymbolResolver> {
71     llvm_unreachable("Should never be called");
72   };
73 
74   auto SetResolver = [](orc::VModuleKey, std::shared_ptr<orc::SymbolResolver>) {
75     llvm_unreachable("Should never be called");
76   };
77 
78   llvm::orc::LegacyCompileOnDemandLayer<decltype(TestBaseLayer)> COD(
79       AcknowledgeORCv1Deprecation, ES, TestBaseLayer, GetResolver, SetResolver,
80       [](Function &F) { return std::set<Function *>{&F}; }, CallbackMgr,
81       [] { return std::make_unique<DummyStubsManager>(); }, true);
82 
83   auto Sym = COD.findSymbol("foo", true);
84 
85   EXPECT_TRUE(!!Sym) << "CompileOnDemand::findSymbol should call findSymbol in "
86                         "the base layer.";
87 }
88 }
89