//===----- CompileOnDemandLayerTest.cpp - Unit tests for the COD layer ----===// // // The LLVM Compiler Infrastructure // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// #include "OrcTestCommon.h" #include "llvm/ExecutionEngine/Orc/CompileOnDemandLayer.h" #include "gtest/gtest.h" using namespace llvm; using namespace llvm::orc; namespace { class DummyCallbackManager : public orc::JITCompileCallbackManager { public: DummyCallbackManager() : JITCompileCallbackManager(0) { } public: void grow() override { llvm_unreachable("not implemented"); } }; class DummyStubsManager : public orc::IndirectStubsManager { public: std::error_code createStub(StringRef StubName, TargetAddress InitAddr, JITSymbolFlags Flags) override { llvm_unreachable("Not implemented"); } std::error_code createStubs(const StubInitsMap &StubInits) override { llvm_unreachable("Not implemented"); } JITSymbol findStub(StringRef Name, bool ExportedStubsOnly) override { llvm_unreachable("Not implemented"); } JITSymbol findPointer(StringRef Name) override { llvm_unreachable("Not implemented"); } std::error_code updatePointer(StringRef Name, TargetAddress NewAddr) override { llvm_unreachable("Not implemented"); } }; TEST(CompileOnDemandLayerTest, FindSymbol) { auto MockBaseLayer = createMockBaseLayer<int>(DoNothingAndReturn<int>(0), DoNothingAndReturn<void>(), [](const std::string &Name, bool) { if (Name == "foo") return JITSymbol(1, JITSymbolFlags::Exported); return JITSymbol(nullptr); }, DoNothingAndReturn<JITSymbol>(nullptr)); typedef decltype(MockBaseLayer) MockBaseLayerT; DummyCallbackManager CallbackMgr; llvm::orc::CompileOnDemandLayer<MockBaseLayerT> COD( MockBaseLayer, [](Function &F) { return std::set<Function *>{&F}; }, CallbackMgr, [] { return llvm::make_unique<DummyStubsManager>(); }, true); auto Sym = COD.findSymbol("foo", true); EXPECT_TRUE(!!Sym) << "CompileOnDemand::findSymbol should call findSymbol in the base layer."; } }