[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:
Lang Hames 2015-03-30 18:37:01 +00:00
parent d0db611445
commit 70c2586498
2 changed files with 28 additions and 20 deletions

View File

@ -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");

View File

@ -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;