11 "JiT management, using LLVM as backend"
14 arch_dependent_libs = {
"x86":
"JitCore_x86.so",
15 "arm":
"JitCore_arm.so",
16 "msp430":
"JitCore_msp430.so",
17 "mips32":
"JitCore_mips32.so"}
20 super(JitCore_LLVM, self).
__init__(ir_arch, bs)
22 self.options.update({
"safe_mode":
False,
25 "log_assembly":
False,
39 lib_dir = os.path.dirname(os.path.realpath(__file__))
40 lib_dir = os.path.join(lib_dir,
'arch')
42 jit_lib = os.path.join(
44 libs_to_load.append(jit_lib)
52 self.context.optimise_level()
55 self.
arch = self.ir_arch.arch
58 mod_name =
"miasm2.jitter.arch.JitCore_%s" % (self.ir_arch.arch.name)
59 mod = importlib.import_module(mod_name)
60 self.context.set_vmcpu(mod.get_gpreg_offset_all())
66 self.context.set_IR_transformation(self.ir_arch.expr_fix_regs_for_mode)
71 if self.
options[
"cache_ir"]
is not None:
77 func_name = bloc.label.name
81 for line
in bloc.lines:
86 md5 = hashlib.md5(to_hash).hexdigest()
89 filename = self.
options[
"cache_ir"] + md5 +
".ll"
92 fcontent = open(filename)
93 content = fcontent.read()
101 super(JitCore_LLVM, self).
add_bloc(bloc)
104 fdest = open(filename,
"w")
105 dump = str(self.context.mod.get_function_named(func_name))
106 my =
"declare i16 @llvm.bswap.i16(i16) nounwind readnone\n"
112 import llvm.core
as llvm_c
113 import llvm.ee
as llvm_e
114 my_mod = llvm_c.Module.from_assembly(content)
115 func = my_mod.get_function_named(func_name)
116 exec_en = llvm_e.ExecutionEngine.new(my_mod)
117 self.exec_engines.append(exec_en)
120 ptr = self.
exec_engines[0].get_pointer_to_function(func)
126 super(JitCore_LLVM, self).
add_bloc(bloc)
138 func.from_blocs(irblocs)
141 if self.
options[
"safe_mode"]
is True:
145 if self.
options[
"optimise"]
is True:
149 if self.
options[
"log_func"]
is True:
151 if self.
options[
"log_assembly"]
is True:
152 print func.get_assembly()
155 self.
lbl2jitbloc[label.offset] = func.get_function_pointer()
dictionary arch_dependent_libs