about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorajax <devnull@localhost>2014-06-04 21:35:01 +0200
committerajax <devnull@localhost>2014-06-04 21:35:01 +0200
commit34e601b811841b4da24e1a057a80dc2be33368f8 (patch)
tree922639b534472a0e1a7580e38f4d49d0ab005a2e
parent2e6cfc22012ee7d2900ad704f0cc001138c11cbc (diff)
downloadmiasm-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.py14
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"