mirror of
https://github.com/ldc-developers/ldc.git
synced 2025-05-05 01:20:51 +03:00
llvm 70 fixes
This commit is contained in:
parent
bfd412cdf9
commit
009570f9a2
1 changed files with 74 additions and 13 deletions
|
@ -50,6 +50,10 @@
|
||||||
#include "llvm/ExecutionEngine/Orc/ObjectLinkingLayer.h"
|
#include "llvm/ExecutionEngine/Orc/ObjectLinkingLayer.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if LDC_LLVM_VER >= 700
|
||||||
|
#include "llvm/ExecutionEngine/Orc/Legacy.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
|
|
||||||
#pragma pack(push, 1)
|
#pragma pack(push, 1)
|
||||||
|
@ -158,7 +162,14 @@ private:
|
||||||
llvm::orc::ObjectTransformLayer<ObjectLayerT, ModuleListener>;
|
llvm::orc::ObjectTransformLayer<ObjectLayerT, ModuleListener>;
|
||||||
using CompileLayerT =
|
using CompileLayerT =
|
||||||
llvm::orc::IRCompileLayer<ListenerLayerT, llvm::orc::SimpleCompiler>;
|
llvm::orc::IRCompileLayer<ListenerLayerT, llvm::orc::SimpleCompiler>;
|
||||||
|
#if LDC_LLVM_VER >= 700
|
||||||
|
using ModuleHandleT = llvm::orc::VModuleKey;
|
||||||
|
llvm::orc::SymbolStringPool stringPool;
|
||||||
|
llvm::orc::ExecutionSession execSession;
|
||||||
|
std::shared_ptr<llvm::orc::SymbolResolver> resolver;
|
||||||
|
#else
|
||||||
using ModuleHandleT = CompileLayerT::ModuleHandleT;
|
using ModuleHandleT = CompileLayerT::ModuleHandleT;
|
||||||
|
#endif
|
||||||
#else
|
#else
|
||||||
using ObjectLayerT = llvm::orc::ObjectLinkingLayer<>;
|
using ObjectLayerT = llvm::orc::ObjectLinkingLayer<>;
|
||||||
using ListenerLayerT =
|
using ListenerLayerT =
|
||||||
|
@ -172,6 +183,7 @@ private:
|
||||||
llvm::LLVMContext context;
|
llvm::LLVMContext context;
|
||||||
bool compiled = false;
|
bool compiled = false;
|
||||||
ModuleHandleT moduleHandle;
|
ModuleHandleT moduleHandle;
|
||||||
|
SymMap symMap;
|
||||||
|
|
||||||
struct ListenerCleaner final {
|
struct ListenerCleaner final {
|
||||||
MyJIT &owner;
|
MyJIT &owner;
|
||||||
|
@ -187,7 +199,16 @@ public:
|
||||||
llvm::Triple(llvm::sys::getProcessTriple()), llvm::StringRef(),
|
llvm::Triple(llvm::sys::getProcessTriple()), llvm::StringRef(),
|
||||||
llvm::sys::getHostCPUName(), getHostAttrs())),
|
llvm::sys::getHostCPUName(), getHostAttrs())),
|
||||||
dataLayout(targetmachine->createDataLayout()),
|
dataLayout(targetmachine->createDataLayout()),
|
||||||
#if LDC_LLVM_VER >= 500
|
#if LDC_LLVM_VER >= 700
|
||||||
|
execSession(stringPool),
|
||||||
|
resolver(createResolver()),
|
||||||
|
objectLayer(
|
||||||
|
execSession,
|
||||||
|
[](llvm::orc::VModuleKey) {
|
||||||
|
return std::make_shared<llvm::SectionMemoryManager>();
|
||||||
|
},
|
||||||
|
[this](llvm::orc::VModuleKey) { return resolver; }),
|
||||||
|
#elif LDC_LLVM_VER >= 500
|
||||||
objectLayer(
|
objectLayer(
|
||||||
[]() { return std::make_shared<llvm::SectionMemoryManager>(); }),
|
[]() { return std::make_shared<llvm::SectionMemoryManager>(); }),
|
||||||
#endif
|
#endif
|
||||||
|
@ -198,16 +219,23 @@ public:
|
||||||
|
|
||||||
llvm::TargetMachine &getTargetMachine() { return *targetmachine; }
|
llvm::TargetMachine &getTargetMachine() { return *targetmachine; }
|
||||||
|
|
||||||
bool addModule(std::unique_ptr<llvm::Module> module, const SymMap &symMap,
|
bool addModule(std::unique_ptr<llvm::Module> module,
|
||||||
llvm::raw_ostream *asmListener) {
|
llvm::raw_ostream *asmListener) {
|
||||||
assert(nullptr != module);
|
assert(nullptr != module);
|
||||||
reset();
|
reset();
|
||||||
auto Resolver = createResolver(symMap);
|
|
||||||
|
|
||||||
ListenerCleaner cleaner(*this, asmListener);
|
ListenerCleaner cleaner(*this, asmListener);
|
||||||
// Add the set to the JIT with the resolver we created above
|
// Add the set to the JIT with the resolver we created above
|
||||||
#if LDC_LLVM_VER >= 500
|
#if LDC_LLVM_VER >= 700
|
||||||
auto result = compileLayer.addModule(std::move(module), Resolver);
|
auto handle = execSession.allocateVModule();
|
||||||
|
auto result = compileLayer.addModule(handle, std::move(module));
|
||||||
|
if (result) {
|
||||||
|
execSession.releaseVModule(handle);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
moduleHandle = handle;
|
||||||
|
#elif LDC_LLVM_VER >= 500
|
||||||
|
auto result = compileLayer.addModule(std::move(module), createResolver());
|
||||||
if (!result) {
|
if (!result) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -217,7 +245,7 @@ public:
|
||||||
modules.emplace_back(std::move(module));
|
modules.emplace_back(std::move(module));
|
||||||
moduleHandle = compileLayer.addModuleSet(
|
moduleHandle = compileLayer.addModuleSet(
|
||||||
std::move(modules), llvm::make_unique<llvm::SectionMemoryManager>(),
|
std::move(modules), llvm::make_unique<llvm::SectionMemoryManager>(),
|
||||||
std::move(Resolver));
|
createResolver());
|
||||||
#endif
|
#endif
|
||||||
compiled = true;
|
compiled = true;
|
||||||
return false;
|
return false;
|
||||||
|
@ -229,6 +257,8 @@ public:
|
||||||
|
|
||||||
llvm::LLVMContext &getContext() { return context; }
|
llvm::LLVMContext &getContext() { return context; }
|
||||||
|
|
||||||
|
SymMap &getSymMap() { return symMap; }
|
||||||
|
|
||||||
void reset() {
|
void reset() {
|
||||||
if (compiled) {
|
if (compiled) {
|
||||||
removeModule(moduleHandle);
|
removeModule(moduleHandle);
|
||||||
|
@ -241,25 +271,54 @@ private:
|
||||||
void removeModule(const ModuleHandleT &handle) {
|
void removeModule(const ModuleHandleT &handle) {
|
||||||
#if LDC_LLVM_VER >= 500
|
#if LDC_LLVM_VER >= 500
|
||||||
cantFail(compileLayer.removeModule(handle));
|
cantFail(compileLayer.removeModule(handle));
|
||||||
|
#if LDC_LLVM_VER >= 700
|
||||||
|
execSession.releaseVModule(handle);
|
||||||
|
#endif
|
||||||
#else
|
#else
|
||||||
compileLayer.removeModuleSet(handle);
|
compileLayer.removeModuleSet(handle);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if LDC_LLVM_VER >= 700
|
||||||
|
std::shared_ptr<llvm::orc::SymbolResolver>
|
||||||
|
createResolver() {
|
||||||
|
return llvm::orc::createLegacyLookupResolver(
|
||||||
|
[this](const std::string &name) -> llvm::JITSymbol {
|
||||||
|
if (auto Sym = compileLayer.findSymbol(name, false)) {
|
||||||
|
return Sym;
|
||||||
|
}
|
||||||
|
else if (auto Err = Sym.takeError()) {
|
||||||
|
return std::move(Err);
|
||||||
|
}
|
||||||
|
auto it = symMap.find(name);
|
||||||
|
if (symMap.end() != it) {
|
||||||
|
return llvm::JITSymbol(
|
||||||
|
reinterpret_cast<llvm::JITTargetAddress>(it->second),
|
||||||
|
llvm::JITSymbolFlags::Exported);
|
||||||
|
}
|
||||||
|
if (auto SymAddr = getSymbolInProcess(name)) {
|
||||||
|
return llvm::JITSymbol(SymAddr, llvm::JITSymbolFlags::Exported);
|
||||||
|
}
|
||||||
|
return nullptr;
|
||||||
|
},
|
||||||
|
[](llvm::Error Err) { llvm::cantFail(std::move(Err),
|
||||||
|
"lookupFlags failed"); });
|
||||||
|
}
|
||||||
|
#else
|
||||||
std::shared_ptr<llvm::JITSymbolResolver>
|
std::shared_ptr<llvm::JITSymbolResolver>
|
||||||
createResolver(const SymMap &symMap) {
|
createResolver() {
|
||||||
// Build our symbol resolver:
|
// Build our symbol resolver:
|
||||||
// Lambda 1: Look back into the JIT itself to find symbols that are part of
|
// Lambda 1: Look back into the JIT itself to find symbols that are part of
|
||||||
// the same "logical dylib".
|
// the same "logical dylib".
|
||||||
// Lambda 2: Search for external symbols in the host process.
|
// Lambda 2: Search for external symbols in the host process.
|
||||||
return llvm::orc::createLambdaResolver(
|
return llvm::orc::createLambdaResolver(
|
||||||
[&](const std::string &name) {
|
[this](const std::string &name) {
|
||||||
if (auto Sym = compileLayer.findSymbol(name, false)) {
|
if (auto Sym = compileLayer.findSymbol(name, false)) {
|
||||||
return Sym;
|
return Sym;
|
||||||
}
|
}
|
||||||
return llvm::JITSymbol(nullptr);
|
return llvm::JITSymbol(nullptr);
|
||||||
},
|
},
|
||||||
[&](const std::string &name) {
|
[this](const std::string &name) {
|
||||||
auto it = symMap.find(name);
|
auto it = symMap.find(name);
|
||||||
if (symMap.end() != it) {
|
if (symMap.end() != it) {
|
||||||
return llvm::JITSymbol(
|
return llvm::JITSymbol(
|
||||||
|
@ -272,6 +331,7 @@ private:
|
||||||
return llvm::JITSymbol(nullptr);
|
return llvm::JITSymbol(nullptr);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
MyJIT &getJit() {
|
MyJIT &getJit() {
|
||||||
|
@ -373,7 +433,8 @@ void rtCompileProcessImplSoInternal(const RtCompileModuleList *modlist_head,
|
||||||
|
|
||||||
std::vector<std::pair<std::string, void **>> functions;
|
std::vector<std::pair<std::string, void **>> functions;
|
||||||
std::unique_ptr<llvm::Module> finalModule;
|
std::unique_ptr<llvm::Module> finalModule;
|
||||||
SymMap symMap;
|
auto &symMap = myJit.getSymMap();
|
||||||
|
symMap.clear();
|
||||||
OptimizerSettings settings;
|
OptimizerSettings settings;
|
||||||
settings.optLevel = context.optLevel;
|
settings.optLevel = context.optLevel;
|
||||||
settings.sizeLevel = context.sizeLevel;
|
settings.sizeLevel = context.sizeLevel;
|
||||||
|
@ -441,11 +502,11 @@ void rtCompileProcessImplSoInternal(const RtCompileModuleList *modlist_head,
|
||||||
};
|
};
|
||||||
|
|
||||||
CallbackOstream os(callback);
|
CallbackOstream os(callback);
|
||||||
if (myJit.addModule(std::move(finalModule), symMap, &os)) {
|
if (myJit.addModule(std::move(finalModule), &os)) {
|
||||||
fatal(context, "Can't codegen module");
|
fatal(context, "Can't codegen module");
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (myJit.addModule(std::move(finalModule), symMap, nullptr)) {
|
if (myJit.addModule(std::move(finalModule), nullptr)) {
|
||||||
fatal(context, "Can't codegen module");
|
fatal(context, "Can't codegen module");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue