//===----- 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 "llvm/ExecutionEngine/Orc/CompileOnDemandLayer.h" #include "OrcTestCommon.h" #include "gtest/gtest.h" using namespace llvm; using namespace llvm::orc; namespace { class DummyCallbackManager : public orc::JITCompileCallbackManager { public: DummyCallbackManager(ExecutionSession &ES) : JITCompileCallbackManager(ES, 0) {} public: Error grow() override { llvm_unreachable("not implemented"); } }; class DummyStubsManager : public orc::IndirectStubsManager { public: Error createStub(StringRef StubName, JITTargetAddress InitAddr, JITSymbolFlags Flags) override { llvm_unreachable("Not implemented"); } Error createStubs(const StubInitsMap &StubInits) override { llvm_unreachable("Not implemented"); } JITEvaluatedSymbol findStub(StringRef Name, bool ExportedStubsOnly) override { llvm_unreachable("Not implemented"); } JITEvaluatedSymbol findPointer(StringRef Name) override { llvm_unreachable("Not implemented"); } Error updatePointer(StringRef Name, JITTargetAddress NewAddr) override { llvm_unreachable("Not implemented"); } }; TEST(CompileOnDemandLayerTest, FindSymbol) { MockBaseLayer<int, std::shared_ptr<Module>> TestBaseLayer; TestBaseLayer.findSymbolImpl = [](const std::string &Name, bool) { if (Name == "foo") return JITSymbol(1, JITSymbolFlags::Exported); return JITSymbol(nullptr); }; ExecutionSession ES(std::make_shared<SymbolStringPool>()); DummyCallbackManager CallbackMgr(ES); auto GetResolver = [](orc::VModuleKey) -> std::shared_ptr<llvm::orc::SymbolResolver> { llvm_unreachable("Should never be called"); }; auto SetResolver = [](orc::VModuleKey, std::shared_ptr<orc::SymbolResolver>) { llvm_unreachable("Should never be called"); }; llvm::orc::CompileOnDemandLayer<decltype(TestBaseLayer)> COD( ES, TestBaseLayer, GetResolver, SetResolver, [](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."; } }