//===----- 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 DummyTrampolinePool : public orc::TrampolinePool { public: Expected getTrampoline() { llvm_unreachable("Unimplemented"); } }; class DummyCallbackManager : public JITCompileCallbackManager { public: DummyCallbackManager(ExecutionSession &ES) : JITCompileCallbackManager(llvm::make_unique(), ES, 0) {} }; 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> TestBaseLayer; TestBaseLayer.findSymbolImpl = [](const std::string &Name, bool) { if (Name == "foo") return JITSymbol(1, JITSymbolFlags::Exported); return JITSymbol(nullptr); }; ExecutionSession ES(std::make_shared()); DummyCallbackManager CallbackMgr(ES); auto GetResolver = [](orc::VModuleKey) -> std::shared_ptr { llvm_unreachable("Should never be called"); }; auto SetResolver = [](orc::VModuleKey, std::shared_ptr) { llvm_unreachable("Should never be called"); }; llvm::orc::CompileOnDemandLayer COD( ES, TestBaseLayer, GetResolver, SetResolver, [](Function &F) { return std::set{&F}; }, CallbackMgr, [] { return llvm::make_unique(); }, true); auto Sym = COD.findSymbol("foo", true); EXPECT_TRUE(!!Sym) << "CompileOnDemand::findSymbol should call findSymbol in " "the base layer."; } }