diff options
| author | serpilliere <serpilliere@users.noreply.github.com> | 2016-09-05 15:57:28 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2016-09-05 15:57:28 +0200 |
| commit | 0ba30f79356130d46db669b4c933ba508e6a63a4 (patch) | |
| tree | fbce1658d8c2c490ddbddc967f1d0be11f6d39db /miasm2/jitter/jitcore_gcc.py | |
| parent | 297ab9469e72145e1fd43a648d42e52dd3ce91c0 (diff) | |
| parent | 99e3e48993c00c1dbfcdbdc629346e35ce06f34f (diff) | |
| download | miasm-0ba30f79356130d46db669b4c933ba508e6a63a4.tar.gz miasm-0ba30f79356130d46db669b4c933ba508e6a63a4.zip | |
Merge pull request #421 from commial/refactor/merge_cc
Refactor/merge cc
Diffstat (limited to 'miasm2/jitter/jitcore_gcc.py')
| -rw-r--r-- | miasm2/jitter/jitcore_gcc.py | 132 |
1 files changed, 19 insertions, 113 deletions
diff --git a/miasm2/jitter/jitcore_gcc.py b/miasm2/jitter/jitcore_gcc.py index 7f72d8e7..0d9d5778 100644 --- a/miasm2/jitter/jitcore_gcc.py +++ b/miasm2/jitter/jitcore_gcc.py @@ -5,110 +5,25 @@ import os import tempfile import ctypes import _ctypes -from distutils.sysconfig import get_python_inc from subprocess import check_call -from hashlib import md5 -from miasm2.jitter import jitcore, Jitgcc -from miasm2.core.utils import keydefaultdict +from miasm2.jitter import Jitgcc +from miasm2.jitter.jitcore_cc_base import JitCore_Cc_Base, gen_core -def gen_core(arch, attrib): - lib_dir = os.path.dirname(os.path.realpath(__file__)) - - txt = "" - txt += '#include "%s/queue.h"\n' % lib_dir - txt += '#include "%s/vm_mngr.h"\n' % lib_dir - txt += '#include "%s/vm_mngr_py.h"\n' % lib_dir - txt += '#include "%s/JitCore.h"\n' % lib_dir - txt += '#include "%s/arch/JitCore_%s.h"\n' % (lib_dir, arch.name) - txt += r''' -#define RAISE(errtype, msg) {PyObject* p; p = PyErr_Format( errtype, msg ); return p;} -''' - return txt - - -def gen_C_source(ir_arch, func_code): - c_source = "" - c_source += "\n".join(func_code) - - c_source = gen_core(ir_arch.arch, ir_arch.attrib) + c_source - c_source = "#include <Python.h>\n" + c_source - - return c_source - - -class myresolver(object): - - def __init__(self, offset): - self.offset = offset - - def ret(self): - return "return PyLong_FromUnsignedLongLong(0x%X);" % self.offset - - -class resolver(object): - - def __init__(self): - self.resolvers = keydefaultdict(myresolver) - - def get_resolver(self, offset): - return self.resolvers[offset] - - -class JitCore_Gcc(jitcore.JitCore): - - "JiT management, using GCC as backend" +class JitCore_Gcc(JitCore_Cc_Base): + "JiT management, using a C compiler as backend" def __init__(self, ir_arch, bs=None): - self.jitted_block_delete_cb = self.deleteCB super(JitCore_Gcc, self).__init__(ir_arch, bs) - self.resolver = resolver() - self.gcc_states = {} - self.ir_arch = ir_arch - self.tempdir = os.path.join(tempfile.gettempdir(), "miasm_gcc_cache") - try: - os.mkdir(self.tempdir, 0755) - except OSError: - pass - if not os.access(self.tempdir, os.R_OK | os.W_OK): - raise RuntimeError( - 'Cannot access gcc cache directory %s ' % self.tempdir) self.exec_wrapper = Jitgcc.gcc_exec_bloc - self.libs = None - self.include_files = None def deleteCB(self, offset): """Free the state associated to @offset and delete it @offset: gcc state offset """ - _ctypes.dlclose(self.gcc_states[offset]._handle) - del self.gcc_states[offset] - - def load(self): - lib_dir = os.path.dirname(os.path.realpath(__file__)) - libs = [os.path.join(lib_dir, 'VmMngr.so'), - os.path.join(lib_dir, - 'arch/JitCore_%s.so' % (self.ir_arch.arch.name))] - - include_files = [os.path.dirname(__file__), - get_python_inc()] - self.include_files = include_files - self.libs = libs - - def init_codegen(self, codegen): - """ - Get the code generator @codegen - @codegen: an CGen instance - """ - self.codegen = codegen - - def label2fname(self, label): - """ - Generate function name from @label - @label: asm_label instance - """ - return "block_%s" % label.name + _ctypes.dlclose(self.states[offset]._handle) + del self.states[offset] def load_code(self, label, fname_so): f_name = self.label2fname(label) @@ -116,32 +31,13 @@ class JitCore_Gcc(jitcore.JitCore): func = getattr(lib, f_name) addr = ctypes.cast(func, ctypes.c_void_p).value self.lbl2jitbloc[label.offset] = addr - self.gcc_states[label.offset] = lib - - - def gen_c_code(self, label, block): - """ - Return the C code corresponding to the @irblocks - @label: asm_label of the block to jit - @irblocks: list of irblocks - """ - f_name = self.label2fname(label) - f_declaration = 'int %s(block_id * BlockDst, JitCpu* jitcpu)' % f_name - out = self.codegen.gen_c(block, log_mn=self.log_mn, log_regs=self.log_regs) - out = [f_declaration + '{'] + out + ['}\n'] - c_code = out - - return gen_C_source(self.ir_arch, c_code) + self.states[label.offset] = lib def add_bloc(self, block): """Add a bloc to JiT and JiT it. @block: block to jit """ - block_raw = "".join(line.b for line in block.lines) - block_hash = md5("%X_%s_%s_%s" % (block.label.offset, - self.log_mn, - self.log_regs, - block_raw)).hexdigest() + block_hash = self.hash_block(block) fname_out = os.path.join(self.tempdir, "%s.so" % block_hash) if not os.access(fname_out, os.R_OK | os.X_OK): @@ -158,7 +54,7 @@ class JitCore_Gcc(jitcore.JitCore): inc_dir = ["-I%s" % inc for inc in self.include_files] libs = ["%s" % lib for lib in self.libs] - args = ["gcc"] + ["-O3"] + [ + args = ["cc"] + ["-O3"] + [ "-shared", "-fPIC", fname_in, '-o', fname_tmp] + inc_dir + libs check_call(args) # Move temporary file to final file @@ -166,3 +62,13 @@ class JitCore_Gcc(jitcore.JitCore): os.remove(fname_in) self.load_code(block.label, fname_out) + + @staticmethod + def gen_C_source(ir_arch, func_code): + c_source = "" + c_source += "\n".join(func_code) + + c_source = gen_core(ir_arch.arch, ir_arch.attrib) + c_source + c_source = "#include <Python.h>\n" + c_source + + return c_source |