mirror of
https://github.com/RPCSX/llvm.git
synced 2025-02-04 19:38:22 +00:00
[Orc] Separate callback manager selection from callback manager construction for
OrcLazyJIT in lli. Separating these concerns enables more natural error handling. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@233579 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
d0db611445
commit
70c2586498
@ -12,31 +12,36 @@
|
|||||||
|
|
||||||
using namespace llvm;
|
using namespace llvm;
|
||||||
|
|
||||||
std::unique_ptr<OrcLazyJIT::CompileCallbackMgr>
|
OrcLazyJIT::CallbackManagerBuilder
|
||||||
OrcLazyJIT::createCallbackMgr(Triple T, LLVMContext &Context) {
|
OrcLazyJIT::createCallbackManagerBuilder(Triple T) {
|
||||||
switch (T.getArch()) {
|
switch (T.getArch()) {
|
||||||
default:
|
default: return nullptr;
|
||||||
// Flag error.
|
|
||||||
Error = true;
|
|
||||||
return nullptr;
|
|
||||||
|
|
||||||
case Triple::x86_64: {
|
case Triple::x86_64: {
|
||||||
typedef orc::JITCompileCallbackManager<CompileLayerT,
|
typedef orc::JITCompileCallbackManager<CompileLayerT,
|
||||||
orc::OrcX86_64> CCMgrT;
|
orc::OrcX86_64> CCMgrT;
|
||||||
return make_unique<CCMgrT>(CompileLayer, CCMgrMemMgr, Context, 0, 64);
|
return [](CompileLayerT &CompileLayer, RuntimeDyld::MemoryManager &MemMgr,
|
||||||
|
LLVMContext &Context) {
|
||||||
|
return make_unique<CCMgrT>(CompileLayer, MemMgr, Context, 0, 64);
|
||||||
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int llvm::runOrcLazyJIT(std::unique_ptr<Module> M, int ArgC, char* ArgV[]) {
|
int llvm::runOrcLazyJIT(std::unique_ptr<Module> M, int ArgC, char* ArgV[]) {
|
||||||
OrcLazyJIT J(std::unique_ptr<TargetMachine>(EngineBuilder().selectTarget()),
|
auto TM = std::unique_ptr<TargetMachine>(EngineBuilder().selectTarget());
|
||||||
getGlobalContext());
|
auto &Context = getGlobalContext();
|
||||||
|
auto CallbackMgrBuilder =
|
||||||
|
OrcLazyJIT::createCallbackManagerBuilder(Triple(TM->getTargetTriple()));
|
||||||
|
|
||||||
if (!J.Ok()) {
|
if (!CallbackMgrBuilder) {
|
||||||
errs() << "Could not construct JIT.\n";
|
errs() << "No callback manager available for target '"
|
||||||
|
<< TM->getTargetTriple() << "'.\n";
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
OrcLazyJIT J(std::move(TM), Context, CallbackMgrBuilder);
|
||||||
|
|
||||||
auto MainHandle = J.addModule(std::move(M));
|
auto MainHandle = J.addModule(std::move(M));
|
||||||
auto MainSym = J.findSymbolIn(MainHandle, "main");
|
auto MainSym = J.findSymbolIn(MainHandle, "main");
|
||||||
|
|
||||||
|
@ -36,17 +36,24 @@ public:
|
|||||||
CompileCallbackMgr> CODLayerT;
|
CompileCallbackMgr> CODLayerT;
|
||||||
typedef CODLayerT::ModuleSetHandleT ModuleHandleT;
|
typedef CODLayerT::ModuleSetHandleT ModuleHandleT;
|
||||||
|
|
||||||
OrcLazyJIT(std::unique_ptr<TargetMachine> TM, LLVMContext &Context)
|
typedef std::function<
|
||||||
: Error(false), TM(std::move(TM)),
|
std::unique_ptr<CompileCallbackMgr>(CompileLayerT&,
|
||||||
|
RuntimeDyld::MemoryManager&,
|
||||||
|
LLVMContext&)>
|
||||||
|
CallbackManagerBuilder;
|
||||||
|
|
||||||
|
static CallbackManagerBuilder createCallbackManagerBuilder(Triple T);
|
||||||
|
|
||||||
|
OrcLazyJIT(std::unique_ptr<TargetMachine> TM, LLVMContext &Context,
|
||||||
|
CallbackManagerBuilder &BuildCallbackMgr)
|
||||||
|
: TM(std::move(TM)),
|
||||||
Mang(this->TM->getDataLayout()),
|
Mang(this->TM->getDataLayout()),
|
||||||
ObjectLayer(),
|
ObjectLayer(),
|
||||||
CompileLayer(ObjectLayer, orc::SimpleCompiler(*this->TM)),
|
CompileLayer(ObjectLayer, orc::SimpleCompiler(*this->TM)),
|
||||||
LazyEmitLayer(CompileLayer),
|
LazyEmitLayer(CompileLayer),
|
||||||
CCMgr(createCallbackMgr(Triple(this->TM->getTargetTriple()), Context)),
|
CCMgr(BuildCallbackMgr(CompileLayer, CCMgrMemMgr, Context)),
|
||||||
CODLayer(LazyEmitLayer, *CCMgr) { }
|
CODLayer(LazyEmitLayer, *CCMgr) { }
|
||||||
|
|
||||||
bool Ok() const { return !Error; }
|
|
||||||
|
|
||||||
ModuleHandleT addModule(std::unique_ptr<Module> M) {
|
ModuleHandleT addModule(std::unique_ptr<Module> M) {
|
||||||
// Attach a data-layout if one isn't already present.
|
// Attach a data-layout if one isn't already present.
|
||||||
if (M->getDataLayout().isDefault())
|
if (M->getDataLayout().isDefault())
|
||||||
@ -67,9 +74,6 @@ public:
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
std::unique_ptr<CompileCallbackMgr>
|
|
||||||
createCallbackMgr(Triple T, LLVMContext &Context);
|
|
||||||
|
|
||||||
std::string mangle(const std::string &Name) {
|
std::string mangle(const std::string &Name) {
|
||||||
std::string MangledName;
|
std::string MangledName;
|
||||||
{
|
{
|
||||||
@ -79,7 +83,6 @@ private:
|
|||||||
return MangledName;
|
return MangledName;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Error;
|
|
||||||
std::unique_ptr<TargetMachine> TM;
|
std::unique_ptr<TargetMachine> TM;
|
||||||
Mangler Mang;
|
Mangler Mang;
|
||||||
SectionMemoryManager CCMgrMemMgr;
|
SectionMemoryManager CCMgrMemMgr;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user