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,
const Slice *desc, size_t descSize) {
const Slice *params, size_t paramsSize) {
assert(handle != nullptr);
assert(originalFunc != nullptr);
JITContext &myJit = getJit();
myJit.registerBind(handle, originalFunc, toArray(params, paramsSize));
}
EXTERNAL void JIT_UNREG_BIND_PAYLOAD(void *handle) {
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) {
cantFail(compileLayer.removeModule(handle));
#if LDC_LLVM_VER >= 700

View file

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