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