diff options
author | Andres Freund <andres@anarazel.de> | 2018-05-24 21:32:50 +0000 |
---|---|---|
committer | Andres Freund <andres@anarazel.de> | 2018-05-24 21:32:50 +0000 |
commit | 00af3355f1bcaa192150429f7544666ee04cbf08 (patch) | |
tree | 38c5d88baf3db3b2f934be2e72af951540e0ff57 /lib/ExecutionEngine/Orc | |
parent | 803d39f85cd20a57b74b8d894e6608bc382eeb4c (diff) |
[ORC] Add ability [un]register JITEventListener on Orc C stack.
Reviewed By: lhames
Differential Revision: https://reviews.llvm.org/D44890
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@333228 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/ExecutionEngine/Orc')
-rw-r--r-- | lib/ExecutionEngine/Orc/OrcCBindingsStack.h | 41 |
1 files changed, 40 insertions, 1 deletions
diff --git a/lib/ExecutionEngine/Orc/OrcCBindingsStack.h b/lib/ExecutionEngine/Orc/OrcCBindingsStack.h index 0a18f6b731c..984adbae1b8 100644 --- a/lib/ExecutionEngine/Orc/OrcCBindingsStack.h +++ b/lib/ExecutionEngine/Orc/OrcCBindingsStack.h @@ -15,6 +15,7 @@ #include "llvm/ADT/STLExtras.h" #include "llvm/ADT/StringRef.h" #include "llvm/ExecutionEngine/JITSymbol.h" +#include "llvm/ExecutionEngine/JITEventListener.h" #include "llvm/ExecutionEngine/Orc/CompileOnDemandLayer.h" #include "llvm/ExecutionEngine/Orc/CompileUtils.h" #include "llvm/ExecutionEngine/Orc/ExecutionUtils.h" @@ -214,7 +215,14 @@ public: Resolvers.erase(ResolverI); return ObjLayerT::Resources{ std::make_shared<SectionMemoryManager>(), Resolver}; - }), + }, + nullptr, + [this](orc::VModuleKey K, const object::ObjectFile &Obj, const RuntimeDyld::LoadedObjectInfo &LoadedObjInfo) { + this->notifyFinalized(K, Obj, LoadedObjInfo); + }, + [this](orc::VModuleKey K, const object::ObjectFile &Obj) { + this->notifyFreed(K, Obj); + }), CompileLayer(ObjectLayer, orc::SimpleCompiler(TM)), CODLayer(ES, CompileLayer, [this](orc::VModuleKey K) { @@ -427,6 +435,23 @@ public: const std::string &getErrorMessage() const { return ErrMsg; } + void RegisterJITEventListener(JITEventListener *L) { + if (!L) + return; + EventListeners.push_back(L); + } + + void UnregisterJITEventListener(JITEventListener *L) { + if (!L) + return; + + auto I = find(reverse(EventListeners), L); + if (I != EventListeners.rend()) { + std::swap(*I, EventListeners.back()); + EventListeners.pop_back(); + } + } + private: LLVMOrcErrorCode mapError(Error Err) { @@ -446,8 +471,22 @@ private: logAllUnhandledErrors(std::move(Err), errs(), "ORC error: "); }; + void notifyFinalized(orc::VModuleKey K, + const object::ObjectFile &Obj, + const RuntimeDyld::LoadedObjectInfo &LoadedObjInfo) { + for (auto &Listener : EventListeners) + Listener->NotifyObjectEmitted(Obj, LoadedObjInfo); + } + + void notifyFreed(orc::VModuleKey K, const object::ObjectFile &Obj) { + for (auto &Listener : EventListeners) + Listener->NotifyFreeingObject(Obj); + } + orc::ExecutionSession ES; + std::vector<JITEventListener *> EventListeners; + DataLayout DL; SectionMemoryManager CCMgrMemMgr; |