diff options
| author | Ajax <commial@gmail.com> | 2018-12-20 16:01:57 +0100 |
|---|---|---|
| committer | Ajax <commial@gmail.com> | 2018-12-20 16:01:57 +0100 |
| commit | 31b0a6b52e75192f7eae24d0acaf2264b272dcd6 (patch) | |
| tree | 36d31a52a3c5f96c348f70aff0f60304ee02a586 /miasm2/jitter/llvmconvert.py | |
| parent | a679b2fc7783004b3eb610428d07721dcc9d86d6 (diff) | |
| download | miasm-31b0a6b52e75192f7eae24d0acaf2264b272dcd6.tar.gz miasm-31b0a6b52e75192f7eae24d0acaf2264b272dcd6.zip | |
LLVM: add basic support for unsigned comparison
Diffstat (limited to '')
| -rw-r--r-- | miasm2/jitter/llvmconvert.py | 18 |
1 files changed, 17 insertions, 1 deletions
diff --git a/miasm2/jitter/llvmconvert.py b/miasm2/jitter/llvmconvert.py index 4fa67eaf..5ae94d9b 100644 --- a/miasm2/jitter/llvmconvert.py +++ b/miasm2/jitter/llvmconvert.py @@ -482,7 +482,7 @@ class LLVMContext_IRCompilation(LLVMContext): return builder.store(value, ptr_casted) -class LLVMFunction(): +class LLVMFunction(object): """Represent a LLVM function Implementation note: @@ -893,6 +893,22 @@ class LLVMFunction(): self.update_cache(expr, ret) return ret + unsigned_cmps = { + "==": "==", + "<u": "<", + "<=u": "<=" + } + if op in unsigned_cmps: + op = unsigned_cmps[op] + args = [self.add_ir(arg) for arg in expr.args] + ret = builder.select(builder.icmp_unsigned(op, + args[0], + args[1]), + llvm_ir.IntType(expr.size)(1), + llvm_ir.IntType(expr.size)(0)) + self.update_cache(expr, ret) + return ret + if op in [">>", "<<", "a>>"]: assert len(expr.args) == 2 # Undefined behavior must be enforced to 0 |