diff options
Diffstat (limited to 'llvm/lib')
-rw-r--r-- | llvm/lib/ExecutionEngine/Orc/OrcCBindings.cpp | 25 | ||||
-rw-r--r-- | llvm/lib/ExecutionEngine/Orc/OrcCBindingsStack.h | 46 |
2 files changed, 58 insertions, 13 deletions
diff --git a/llvm/lib/ExecutionEngine/Orc/OrcCBindings.cpp b/llvm/lib/ExecutionEngine/Orc/OrcCBindings.cpp index 055636f2a6f..d3effeec97e 100644 --- a/llvm/lib/ExecutionEngine/Orc/OrcCBindings.cpp +++ b/llvm/lib/ExecutionEngine/Orc/OrcCBindings.cpp @@ -12,9 +12,6 @@ using namespace llvm; -DEFINE_SIMPLE_CONVERSION_FUNCTIONS(OrcCBindingsStack, LLVMOrcJITStackRef) -DEFINE_SIMPLE_CONVERSION_FUNCTIONS(TargetMachine, LLVMTargetMachineRef) - LLVMOrcJITStackRef LLVMOrcCreateInstance(LLVMTargetMachineRef TM, LLVMContextRef Context) { TargetMachine *TM2(unwrap(TM)); @@ -45,6 +42,28 @@ void LLVMOrcDisposeMangledSymbol(char *MangledName) { delete[] MangledName; } +LLVMOrcTargetAddress +LLVMOrcCreateLazyCompileCallback(LLVMOrcJITStackRef JITStack, + LLVMOrcLazyCompileCallbackFn Callback, + void *CallbackCtx) { + OrcCBindingsStack &J = *unwrap(JITStack); + return J.createLazyCompileCallback(Callback, CallbackCtx); +} + +void LLVMOrcCreateIndirectStub(LLVMOrcJITStackRef JITStack, + const char *StubName, + LLVMOrcTargetAddress InitAddr) { + OrcCBindingsStack &J = *unwrap(JITStack); + J.createIndirectStub(StubName, InitAddr); +} + +void LLVMOrcSetIndirectStubPointer(LLVMOrcJITStackRef JITStack, + const char *StubName, + LLVMOrcTargetAddress NewAddr) { + OrcCBindingsStack &J = *unwrap(JITStack); + J.setIndirectStubPointer(StubName, NewAddr); +} + LLVMOrcModuleHandle LLVMOrcAddEagerlyCompiledIR(LLVMOrcJITStackRef JITStack, LLVMModuleRef Mod, LLVMOrcSymbolResolverFn SymbolResolver, diff --git a/llvm/lib/ExecutionEngine/Orc/OrcCBindingsStack.h b/llvm/lib/ExecutionEngine/Orc/OrcCBindingsStack.h index dbedf00d08e..6188b29befc 100644 --- a/llvm/lib/ExecutionEngine/Orc/OrcCBindingsStack.h +++ b/llvm/lib/ExecutionEngine/Orc/OrcCBindingsStack.h @@ -17,16 +17,17 @@ #include "llvm/ExecutionEngine/Orc/IRCompileLayer.h" #include "llvm/ExecutionEngine/Orc/ObjectLinkingLayer.h" #include "llvm/IR/LLVMContext.h" +#include "llvm-c/OrcBindings.h" namespace llvm { -class OrcCBindingsStack { -private: +class OrcCBindingsStack; -public: +DEFINE_SIMPLE_CONVERSION_FUNCTIONS(OrcCBindingsStack, LLVMOrcJITStackRef) +DEFINE_SIMPLE_CONVERSION_FUNCTIONS(TargetMachine, LLVMTargetMachineRef) - typedef orc::TargetAddress (*CExternalSymbolResolverFn)(const char *Name, - void *Ctx); +class OrcCBindingsStack { +public: typedef orc::JITCompileCallbackManagerBase CompileCallbackMgr; typedef orc::ObjectLinkingLayer<> ObjLayerT; @@ -91,13 +92,14 @@ public: OrcCBindingsStack(TargetMachine &TM, LLVMContext &Context, CallbackManagerBuilder &BuildCallbackMgr, IndirectStubsManagerBuilder IndirectStubsMgrBuilder) - : DL(TM.createDataLayout()), + : Context(Context), DL(TM.createDataLayout()), ObjectLayer(), CompileLayer(ObjectLayer, orc::SimpleCompiler(TM)), CCMgr(BuildCallbackMgr(CompileLayer, CCMgrMemMgr, Context)), CODLayer(CompileLayer, [](Function &F) { std::set<Function*> S; S.insert(&F); return S; }, *CCMgr, std::move(IndirectStubsMgrBuilder), false), + IndirectStubsMgr(IndirectStubsMgrBuilder()), CXXRuntimeOverrides([this](const std::string &S) { return mangle(S); }) {} ~OrcCBindingsStack() { @@ -122,8 +124,27 @@ public: return reinterpret_cast<PtrTy>(static_cast<uintptr_t>(Addr)); } + orc::TargetAddress + createLazyCompileCallback(LLVMOrcLazyCompileCallbackFn Callback, + void *CallbackCtx) { + auto CCInfo = CCMgr->getCompileCallback(Context); + CCInfo.setCompileAction( + [=]() -> orc::TargetAddress { + return Callback(wrap(this), CallbackCtx); + }); + return CCInfo.getAddress(); + } + + void createIndirectStub(StringRef StubName, orc::TargetAddress Addr) { + IndirectStubsMgr->createStub(StubName, Addr, JITSymbolFlags::Exported); + } + + void setIndirectStubPointer(StringRef Name, orc::TargetAddress Addr) { + IndirectStubsMgr->updatePointer(Name, Addr); + } + std::shared_ptr<RuntimeDyld::SymbolResolver> - createResolver(CExternalSymbolResolverFn ExternalResolver, + createResolver(LLVMOrcSymbolResolverFn ExternalResolver, void *ExternalResolverCtx) { auto Resolver = orc::createLambdaResolver( [this, ExternalResolver, ExternalResolverCtx](const std::string &Name) { @@ -157,7 +178,7 @@ public: ModuleHandleT addIRModule(LayerT &Layer, Module *M, std::unique_ptr<RuntimeDyld::MemoryManager> MemMgr, - CExternalSymbolResolverFn ExternalResolver, + LLVMOrcSymbolResolverFn ExternalResolver, void *ExternalResolverCtx) { // Attach a data-layout if one isn't already present. @@ -194,7 +215,7 @@ public: } ModuleHandleT addIRModuleEager(Module* M, - CExternalSymbolResolverFn ExternalResolver, + LLVMOrcSymbolResolverFn ExternalResolver, void *ExternalResolverCtx) { return addIRModule(CompileLayer, std::move(M), llvm::make_unique<SectionMemoryManager>(), @@ -202,7 +223,7 @@ public: } ModuleHandleT addIRModuleLazy(Module* M, - CExternalSymbolResolverFn ExternalResolver, + LLVMOrcSymbolResolverFn ExternalResolver, void *ExternalResolverCtx) { return addIRModule(CODLayer, std::move(M), nullptr, std::move(ExternalResolver), ExternalResolverCtx); @@ -215,6 +236,8 @@ public: } orc::JITSymbol findSymbol(const std::string &Name, bool ExportedSymbolsOnly) { + if (auto Sym = IndirectStubsMgr->findStub(Name, ExportedSymbolsOnly)) + return Sym; return CODLayer.findSymbol(mangle(Name), ExportedSymbolsOnly); } @@ -241,6 +264,7 @@ private: return NewHandle; } + LLVMContext &Context; DataLayout DL; SectionMemoryManager CCMgrMemMgr; @@ -249,6 +273,8 @@ private: std::unique_ptr<CompileCallbackMgr> CCMgr; CODLayerT CODLayer; + std::unique_ptr<orc::IndirectStubsManagerBase> IndirectStubsMgr; + std::vector<std::unique_ptr<GenericHandle>> GenericHandles; std::vector<unsigned> FreeHandleIndexes; |