diff options
| author | ajax <devnull@localhost> | 2014-06-04 21:35:01 +0200 |
|---|---|---|
| committer | ajax <devnull@localhost> | 2014-06-04 21:35:01 +0200 |
| commit | 34e601b811841b4da24e1a057a80dc2be33368f8 (patch) | |
| tree | 922639b534472a0e1a7580e38f4d49d0ab005a2e /miasm2/jitter/llvmconvert.py | |
| parent | 2e6cfc22012ee7d2900ad704f0cc001138c11cbc (diff) | |
| download | miasm-34e601b811841b4da24e1a057a80dc2be33368f8.tar.gz miasm-34e601b811841b4da24e1a057a80dc2be33368f8.zip | |
LLVM:
- Extends to 64 bits before ret (avoid memory leak in PC) - Use the common API "set_ret" to return a value
Diffstat (limited to '')
| -rw-r--r-- | miasm2/jitter/llvmconvert.py | 14 |
1 files changed, 9 insertions, 5 deletions
diff --git a/miasm2/jitter/llvmconvert.py b/miasm2/jitter/llvmconvert.py index 406a36c9..588cf4dd 100644 --- a/miasm2/jitter/llvmconvert.py +++ b/miasm2/jitter/llvmconvert.py @@ -624,8 +624,12 @@ class LLVMFunction(): raise Exception("UnkownExpression", expr.__class__.__name__) def set_ret(self, var): - "Add a ret of var to the last bbl" - self.builder.ret(var) + "Cast @var and return it at the end of current bbl" + if var.type.width < 64: + var_casted = self.builder.zext(var, LLVMType.int(64)) + else: + var_casted = var + self.builder.ret(var_casted) def from_expr(self, expr): "Build the function from an expression" @@ -719,7 +723,7 @@ class LLVMFunction(): # Then Bloc builder.position_at_end(then_block) - builder.ret(llvm_c.Constant.int(self.ret_type, pc_to_return)) + self.set_ret(llvm_c.Constant.int(self.ret_type, pc_to_return)) builder.position_at_end(merge_block) @@ -842,11 +846,11 @@ class LLVMFunction(): label = dest_name target_bbl = self.get_basic_bloc_by_label(label) if target_bbl is None: - builder.ret(self.add_ir(dest)) + self.set_ret(self.add_ir(dest)) else: builder.branch(target_bbl) else: - builder.ret(self.add_ir(dest)) + self.set_ret(self.add_ir(dest)) def add_irbloc(self, irbloc): "Add the content of irbloc at the corresponding labeled block" |