mirror of
https://github.com/Gericom/teak-llvm.git
synced 2025-06-21 12:35:47 -04:00

In particular this patch switches RTDyldObjectLinkingLayer to use orc::SymbolResolver and threads the requried changse (ExecutionSession references and VModuleKeys) through the existing layer APIs. The purpose of the new resolver interface is to improve query performance and better support parallelism, both in JIT'd code and within the compiler itself. The most visibile change is switch of the <Layer>::addModule signatures from: Expected<Handle> addModule(std::shared_ptr<ModuleType> Mod, std::shared_ptr<JITSymbolResolver> Resolver) to: Expected<Handle> addModule(VModuleKey K, std::shared_ptr<ModuleType> Mod); Typical usage of addModule will now look like: auto K = ES.allocateVModuleKey(); Resolvers[K] = createSymbolResolver(...); Layer.addModule(K, std::move(Mod)); See the BuildingAJIT tutorial code for example usage. llvm-svn: 324405
85 lines
2.5 KiB
C++
85 lines
2.5 KiB
C++
//===----- 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() : JITCompileCallbackManager(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");
|
|
}
|
|
|
|
JITSymbol findStub(StringRef Name, bool ExportedStubsOnly) override {
|
|
llvm_unreachable("Not implemented");
|
|
}
|
|
|
|
JITSymbol 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);
|
|
};
|
|
|
|
DummyCallbackManager CallbackMgr;
|
|
|
|
SymbolStringPool SSP;
|
|
ExecutionSession ES(SSP);
|
|
|
|
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.";
|
|
}
|
|
}
|