about summary refs log tree commit diff stats
path: root/miasm2/jitter/Jitllvm.c
diff options
context:
space:
mode:
authorAjax <commial@gmail.com>2017-01-05 16:11:32 +0100
committerAjax <commial@gmail.com>2017-01-05 16:11:32 +0100
commitefef33fb6e6d3a0d4c4c6818a57a9f7e829d4da1 (patch)
tree4f2a29ab37f22d1ffcae3bd4c5b95d2a6d44899c /miasm2/jitter/Jitllvm.c
parent06461f1bd7a8c987b47381dffa3e1462cee8e44f (diff)
downloadmiasm-efef33fb6e6d3a0d4c4c6818a57a9f7e829d4da1.tar.gz
miasm-efef33fb6e6d3a0d4c4c6818a57a9f7e829d4da1.zip
LLVM: avoid going back to Python while next block are already jitted
Diffstat (limited to 'miasm2/jitter/Jitllvm.c')
-rw-r--r--miasm2/jitter/Jitllvm.c38
1 files changed, 32 insertions, 6 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;
+	}
 }