diff options
| author | Fabrice Desclaux <fabrice.desclaux@cea.fr> | 2019-01-27 17:07:41 +0100 |
|---|---|---|
| committer | Fabrice Desclaux <fabrice.desclaux@cea.fr> | 2019-01-27 17:09:54 +0100 |
| commit | 045792970f462e4d408fd01b419ccd851a1301a2 (patch) | |
| tree | d36dfd2d7452ceef5ebbb66a8a5288d5c7595ada /miasm2/jitter/llvmconvert.py | |
| parent | 98f54e1cff3b80d2c0c14ed0424b90bfe9112680 (diff) | |
| download | miasm-045792970f462e4d408fd01b419ccd851a1301a2.tar.gz miasm-045792970f462e4d408fd01b419ccd851a1301a2.zip | |
Jitter: support high level flags
Diffstat (limited to '')
| -rw-r--r-- | miasm2/jitter/llvmconvert.py | 37 |
1 files changed, 36 insertions, 1 deletions
diff --git a/miasm2/jitter/llvmconvert.py b/miasm2/jitter/llvmconvert.py index a31348cf..fd32001c 100644 --- a/miasm2/jitter/llvmconvert.py +++ b/miasm2/jitter/llvmconvert.py @@ -15,7 +15,11 @@ import os from llvmlite import binding as llvm from llvmlite import ir as llvm_ir from miasm2.expression.expression import ExprId, ExprInt, ExprMem, ExprSlice, \ - ExprCond, ExprLoc, ExprOp, ExprCompose, LocKey, Expr + ExprCond, ExprLoc, ExprOp, ExprCompose, LocKey, Expr, \ + TOK_EQUAL, \ + TOK_INF_SIGNED, TOK_INF_UNSIGNED, \ + TOK_INF_EQUAL_SIGNED, TOK_INF_EQUAL_UNSIGNED + import miasm2.jitter.csts as m2_csts import miasm2.core.asmblock as m2_asmblock from miasm2.jitter.codegen import CGen, Attributes @@ -1074,6 +1078,37 @@ class LLVMFunction(object): self.update_cache(expr, ret) return ret + if op in [ + TOK_EQUAL, + TOK_INF_SIGNED, + TOK_INF_EQUAL_SIGNED, + TOK_INF_UNSIGNED, + TOK_INF_EQUAL_UNSIGNED, + ]: + if op == TOK_EQUAL: + opname = "==" + callback = builder.icmp_unsigned + elif op == TOK_INF_SIGNED: + opname = "<" + callback = builder.icmp_signed + elif op == TOK_INF_UNSIGNED: + opname = "<" + callback = builder.icmp_unsigned + elif op == TOK_INF_EQUAL_SIGNED: + opname = "<=" + callback = builder.icmp_signed + elif op == TOK_INF_EQUAL_UNSIGNED: + opname = "<" + callback = builder.icmp_unsigned + + left = self.add_ir(expr.args[0]) + right = self.add_ir(expr.args[1]) + + ret = callback(opname, left, right) + self.update_cache(expr, ret) + + return ret + if len(expr.args) > 1: if op == "*": |