bindInstaces

This commit is contained in:
Ivan 2018-04-05 00:35:18 +03:00
parent e453edcc6a
commit bdc5f65070
3 changed files with 35 additions and 1 deletions

View file

@ -299,12 +299,16 @@ EXTERNAL void JIT_API_ENTRYPOINT(const void *modlist_head,
} }
EXTERNAL void JIT_REG_BIND_PAYLOAD(void *handle, void *originalFunc, EXTERNAL void JIT_REG_BIND_PAYLOAD(void *handle, void *originalFunc,
const Slice *desc, size_t descSize) { const Slice *params, size_t paramsSize) {
assert(handle != nullptr); assert(handle != nullptr);
assert(originalFunc != nullptr); assert(originalFunc != nullptr);
JITContext &myJit = getJit();
myJit.registerBind(handle, originalFunc, toArray(params, paramsSize));
} }
EXTERNAL void JIT_UNREG_BIND_PAYLOAD(void *handle) { EXTERNAL void JIT_UNREG_BIND_PAYLOAD(void *handle) {
assert(handle != nullptr); assert(handle != nullptr);
JITContext &myJit = getJit();
myJit.unregisterBind(handle);
} }
} }

View file

@ -154,6 +154,18 @@ void JITContext::reset() {
} }
} }
void JITContext::registerBind(void *handle, void *originalFunc,
const llvm::ArrayRef<Slice> &params) {
assert(bindInstances.count(handle) == 0);
BindDesc::ParamsVec vec(params.begin(), params.end());
bindInstances.insert({handle, {originalFunc, std::move(vec)}});
}
void JITContext::unregisterBind(void *handle) {
assert(bindInstances.count(handle) == 1);
bindInstances.erase(handle);
}
void JITContext::removeModule(const ModuleHandleT &handle) { void JITContext::removeModule(const ModuleHandleT &handle) {
cantFail(compileLayer.removeModule(handle)); cantFail(compileLayer.removeModule(handle));
#if LDC_LLVM_VER >= 700 #if LDC_LLVM_VER >= 700

View file

@ -19,6 +19,7 @@
#include <memory> #include <memory>
#include <utility> #include <utility>
#include "llvm/ADT/MapVector.h"
#include "llvm/ExecutionEngine/JITSymbol.h" #include "llvm/ExecutionEngine/JITSymbol.h"
#include "llvm/ExecutionEngine/Orc/CompileUtils.h" #include "llvm/ExecutionEngine/Orc/CompileUtils.h"
#include "llvm/ExecutionEngine/Orc/IRCompileLayer.h" #include "llvm/ExecutionEngine/Orc/IRCompileLayer.h"
@ -32,6 +33,7 @@
#include "llvm/ExecutionEngine/Orc/Legacy.h" #include "llvm/ExecutionEngine/Orc/Legacy.h"
#endif #endif
#include "context.h"
#include "disassembler.h" #include "disassembler.h"
namespace llvm { namespace llvm {
@ -87,6 +89,13 @@ private:
ModuleHandleT moduleHandle; ModuleHandleT moduleHandle;
SymMap symMap; SymMap symMap;
struct BindDesc final {
void *originalFunc;
using ParamsVec = llvm::SmallVector<Slice, 5>;
ParamsVec params;
};
llvm::MapVector<void*, BindDesc> bindInstances;
struct ListenerCleaner final { struct ListenerCleaner final {
JITContext &owner; JITContext &owner;
ListenerCleaner(JITContext &o, llvm::raw_ostream *stream); ListenerCleaner(JITContext &o, llvm::raw_ostream *stream);
@ -113,6 +122,15 @@ public:
void reset(); void reset();
void registerBind(void *handle, void *originalFunc,
const llvm::ArrayRef<Slice>& params);
void unregisterBind(void *handle);
const llvm::MapVector<void*, BindDesc> &getBindInstances() const {
return bindInstances;
}
private: private:
void removeModule(const ModuleHandleT &handle); void removeModule(const ModuleHandleT &handle);