blob: 49f4cc124f9ebe7cf17bc371fd91a90a35b5210b [file] [log] [blame]
Lang Hamesc0056562015-10-20 04:35:02 +00001//===----- CompileOnDemandLayerTest.cpp - Unit tests for the COD layer ----===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#include "OrcTestCommon.h"
11#include "llvm/ExecutionEngine/Orc/CompileOnDemandLayer.h"
12#include "gtest/gtest.h"
13
14using namespace llvm;
15using namespace llvm::orc;
16
17namespace {
18
19class DummyCallbackManager : public orc::JITCompileCallbackManagerBase {
20public:
21 DummyCallbackManager()
Rafael Espindolae63e0182015-11-03 16:40:37 +000022 : JITCompileCallbackManagerBase(0), NextStubAddress(0),
Lang Hamesc0056562015-10-20 04:35:02 +000023 UniversalCompile([]() { return 0; }) {
24 }
25
Rafael Espindolae63e0182015-11-03 16:40:37 +000026 CompileCallbackInfo getCompileCallback() override {
Lang Hamesc0056562015-10-20 04:35:02 +000027 return CompileCallbackInfo(++NextStubAddress, UniversalCompile);
28 }
29public:
30 TargetAddress NextStubAddress;
31 CompileFtor UniversalCompile;
32};
33
34class DummyStubsManager : public orc::IndirectStubsManagerBase {
35public:
Lang Hames3f88a9e2015-10-29 22:04:22 +000036 std::error_code createStub(StringRef StubName, TargetAddress InitAddr,
37 JITSymbolFlags Flags) override {
38 llvm_unreachable("Not implemented");
39 }
40
Lang Hamesdeadf2a2015-10-29 18:36:27 +000041 std::error_code createStubs(const StubInitsMap &StubInits) override {
Lang Hamesc0056562015-10-20 04:35:02 +000042 llvm_unreachable("Not implemented");
43 }
44
45 JITSymbol findStub(StringRef Name, bool ExportedStubsOnly) override {
46 llvm_unreachable("Not implemented");
47 }
48
49 JITSymbol findPointer(StringRef Name) override {
50 llvm_unreachable("Not implemented");
51 }
52
53 std::error_code updatePointer(StringRef Name,
54 TargetAddress NewAddr) override {
55 llvm_unreachable("Not implemented");
56 }
57};
58
59TEST(CompileOnDemandLayerTest, FindSymbol) {
60 auto MockBaseLayer =
61 createMockBaseLayer<int>(DoNothingAndReturn<int>(0),
62 DoNothingAndReturn<void>(),
63 [](const std::string &Name, bool) {
64 if (Name == "foo")
65 return JITSymbol(1, JITSymbolFlags::Exported);
66 return JITSymbol(nullptr);
67 },
68 DoNothingAndReturn<JITSymbol>(nullptr));
69
70 typedef decltype(MockBaseLayer) MockBaseLayerT;
71 DummyCallbackManager CallbackMgr;
Lang Hamesc0056562015-10-20 04:35:02 +000072
David Blaikiea895aa62015-11-04 19:43:24 +000073 llvm::orc::CompileOnDemandLayer<MockBaseLayerT> COD(
74 MockBaseLayer, [](Function &F) { return std::set<Function *>{&F}; },
75 CallbackMgr, [] { return llvm::make_unique<DummyStubsManager>(); }, true);
76
Lang Hamesc0056562015-10-20 04:35:02 +000077 auto Sym = COD.findSymbol("foo", true);
78
79 EXPECT_TRUE(!!Sym)
80 << "CompileOnDemand::findSymbol should call findSymbol in the base layer.";
81}
82
83}