diff options
| author | Ajax <commial@gmail.com> | 2017-01-05 16:11:32 +0100 |
|---|---|---|
| committer | Ajax <commial@gmail.com> | 2017-01-05 16:11:32 +0100 |
| commit | efef33fb6e6d3a0d4c4c6818a57a9f7e829d4da1 (patch) | |
| tree | 4f2a29ab37f22d1ffcae3bd4c5b95d2a6d44899c | |
| parent | 06461f1bd7a8c987b47381dffa3e1462cee8e44f (diff) | |
| download | miasm-efef33fb6e6d3a0d4c4c6818a57a9f7e829d4da1.tar.gz miasm-efef33fb6e6d3a0d4c4c6818a57a9f7e829d4da1.zip | |
LLVM: avoid going back to Python while next block are already jitted
| -rw-r--r-- | miasm2/jitter/Jitllvm.c | 38 | ||||
| -rw-r--r-- | miasm2/jitter/jitcore_llvm.py | 3 |
2 files changed, 34 insertions, 7 deletions
diff --git a/miasm2/jitter/Jitllvm.c b/miasm2/jitter/Jitllvm.c index c176a4b2..979c4f3a 100644 --- a/miasm2/jitter/Jitllvm.c +++ b/miasm2/jitter/Jitllvm.c @@ -12,19 +12,45 @@ PyObject* llvm_exec_bloc(PyObject* self, PyObject* args) { - uint64_t func_addr; uint64_t (*func)(void*, void*, void*, uint8_t*); uint64_t vm; uint64_t ret; JitCpu* jitcpu; uint8_t status; - - if (!PyArg_ParseTuple(args, "KOK", &func_addr, &jitcpu, &vm)) + PyObject* func_py; + PyObject* lbl2ptr; + PyObject* breakpoints; + PyObject* retaddr = NULL; + + + if (!PyArg_ParseTuple(args, "OOKOO", &retaddr, &jitcpu, &vm, &lbl2ptr, &breakpoints)) return NULL; vm_cpu_t* cpu = jitcpu->cpu; - func = (void *) (intptr_t) func_addr; - ret = func((void*) jitcpu, (void*)(intptr_t) cpu, (void*)(intptr_t) vm, &status); - return PyLong_FromUnsignedLongLong(ret); + /* The loop will decref retaddr always once */ + Py_INCREF(retaddr); + + for (;;) { + // Get the expected jitted function address + func_py = PyDict_GetItem(lbl2ptr, retaddr); + if (func_py) + func = PyLong_AsVoidPtr((PyObject*) func_py); + else + // retaddr is not jitted yet + return retaddr; + + // Execute it + ret = func((void*) jitcpu, (void*)(intptr_t) cpu, (void*)(intptr_t) vm, &status); + Py_DECREF(retaddr); + retaddr = PyLong_FromUnsignedLongLong(ret); + + // Check exception + if (status) + return retaddr; + + // Check breakpoint + if (PyDict_Contains(breakpoints, retaddr)) + return retaddr; + } } diff --git a/miasm2/jitter/jitcore_llvm.py b/miasm2/jitter/jitcore_llvm.py index 0f265073..9f9a63e4 100644 --- a/miasm2/jitter/jitcore_llvm.py +++ b/miasm2/jitter/jitcore_llvm.py @@ -99,4 +99,5 @@ class JitCore_LLVM(jitcore.JitCore): @cpu: JitCpu instance @breakpoints: Dict instance of used breakpoints """ - return self.exec_wrapper(self.lbl2jitbloc[label], cpu, cpu.vmmngr.vmmngr) + return self.exec_wrapper(label, cpu, cpu.vmmngr.vmmngr, + self.lbl2jitbloc.data, breakpoints) |