diff options
| author | Ajax <commial@gmail.com> | 2016-12-22 23:27:48 +0100 |
|---|---|---|
| committer | Ajax <commial@gmail.com> | 2017-01-04 17:14:55 +0100 |
| commit | a90cf9d4e3eaadfb1661e3eaf7f947a5d9e4294b (patch) | |
| tree | 76e21974776c539d5098872b40f8cad12e50ade2 /miasm2/jitter/llvmconvert.py | |
| parent | 0831662234778e438657e89e1af5c4f3515c4135 (diff) | |
| download | miasm-a90cf9d4e3eaadfb1661e3eaf7f947a5d9e4294b.tar.gz miasm-a90cf9d4e3eaadfb1661e3eaf7f947a5d9e4294b.zip | |
LLVM: handle the specific size of segm2addr operation
Diffstat (limited to '')
| -rw-r--r-- | miasm2/jitter/llvmconvert.py | 22 |
1 files changed, 17 insertions, 5 deletions
diff --git a/miasm2/jitter/llvmconvert.py b/miasm2/jitter/llvmconvert.py index 44495ad3..294f9f90 100644 --- a/miasm2/jitter/llvmconvert.py +++ b/miasm2/jitter/llvmconvert.py @@ -572,11 +572,23 @@ class LLVMFunction(): if op == "segm": fc_ptr = self.mod.get_global("segm2addr") - args_casted = [builder.zext(self.add_ir(arg), LLVMType.IntType(64)) - for arg in expr.args] - args = [self.local_vars["jitcpu"]] + args_casted - ret = builder.call(fc_ptr, args) - ret = builder.trunc(ret, LLVMType.IntType(expr.size)) + + # Cast args if needed + args = [self.add_ir(arg) for arg in expr.args] + casted_args = [] + for i, arg in enumerate(args, 1): + if arg.type.width < fc_ptr.args[i].type.width: + casted_args.append(builder.zext(arg, fc_ptr.args[i].type)) + else: + casted_args.append(arg) + + ret = builder.call(fc_ptr, + [self.local_vars["jitcpu"]] + casted_args) + # Ret size is not expr.size on segm2addr (which is the size of + # the segment, for instance 16 bits), but the size of an addr + ret_size = self.llvm_context.PC.size + if ret.type.width > ret_size: + ret = builder.trunc(ret, LLVMType.IntType(ret_size)) self.update_cache(expr, ret) return ret |