1 //===----- CompileOnDemandLayerTest.cpp - Unit tests for the COD layer ----===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 #include "OrcTestCommon.h"
11 #include "llvm/ExecutionEngine/Orc/CompileOnDemandLayer.h"
12 #include "gtest/gtest.h"
15 using namespace llvm::orc;
19 class DummyCallbackManager : public orc::JITCompileCallbackManagerBase {
21 DummyCallbackManager()
22 : JITCompileCallbackManagerBase(0, 0), NextStubAddress(0),
23 UniversalCompile([]() { return 0; }) {
26 CompileCallbackInfo getCompileCallback(LLVMContext &Context) override {
27 return CompileCallbackInfo(++NextStubAddress, UniversalCompile);
30 TargetAddress NextStubAddress;
31 CompileFtor UniversalCompile;
34 class DummyStubsManager : public orc::IndirectStubsManagerBase {
36 std::error_code init(const StubInitsMap &StubInits) override {
37 llvm_unreachable("Not implemented");
40 JITSymbol findStub(StringRef Name, bool ExportedStubsOnly) override {
41 llvm_unreachable("Not implemented");
44 JITSymbol findPointer(StringRef Name) override {
45 llvm_unreachable("Not implemented");
48 std::error_code updatePointer(StringRef Name,
49 TargetAddress NewAddr) override {
50 llvm_unreachable("Not implemented");
54 TEST(CompileOnDemandLayerTest, FindSymbol) {
56 createMockBaseLayer<int>(DoNothingAndReturn<int>(0),
57 DoNothingAndReturn<void>(),
58 [](const std::string &Name, bool) {
60 return JITSymbol(1, JITSymbolFlags::Exported);
61 return JITSymbol(nullptr);
63 DoNothingAndReturn<JITSymbol>(nullptr));
65 typedef decltype(MockBaseLayer) MockBaseLayerT;
66 DummyCallbackManager CallbackMgr;
67 auto StubsMgrBuilder =
69 return llvm::make_unique<DummyStubsManager>();
72 llvm::orc::CompileOnDemandLayer<MockBaseLayerT>
74 [](Function &F) { std::set<Function*> S; S.insert(&F); return S; },
75 CallbackMgr, StubsMgrBuilder, true);
76 auto Sym = COD.findSymbol("foo", true);
79 << "CompileOnDemand::findSymbol should call findSymbol in the base layer.";