reference, declarationdefinition
definition → references, declarations, derived classes, virtual overrides
reference to multiple definitions → definitions
unreferenced
    1
    2
    3
    4
    5
    6
    7
    8
    9
   10
   11
   12
   13
   14
   15
   16
   17
   18
   19
   20
   21
   22
   23
   24
   25
   26
   27
   28
   29
   30
   31
   32
   33
   34
   35
   36
   37
   38
   39
   40
   41
   42
   43
   44
   45
   46
   47
   48
   49
   50
   51
   52
   53
   54
   55
   56
   57
   58
   59
   60
   61
   62
   63
   64
   65
   66
   67
   68
   69
   70
   71
   72
   73
   74
   75
   76
   77
   78
   79
   80
   81
   82
   83
   84
   85
   86
   87
   88
//===----- CompileOnDemandLayerTest.cpp - Unit tests for the COD layer ----===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//

#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<JITTargetAddress> getTrampoline() {
    llvm_unreachable("Unimplemented");
  }
};

class DummyCallbackManager : public JITCompileCallbackManager {
public:
  DummyCallbackManager(ExecutionSession &ES)
      : JITCompileCallbackManager(std::make_unique<DummyTrampolinePool>(), 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(LegacyCompileOnDemandLayerTest, 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::LegacyCompileOnDemandLayer<decltype(TestBaseLayer)> COD(
      AcknowledgeORCv1Deprecation, ES, TestBaseLayer, GetResolver, SetResolver,
      [](Function &F) { return std::set<Function *>{&F}; }, CallbackMgr,
      [] { return std::make_unique<DummyStubsManager>(); }, true);

  auto Sym = COD.findSymbol("foo", true);

  EXPECT_TRUE(!!Sym) << "CompileOnDemand::findSymbol should call findSymbol in "
                        "the base layer.";
}
}