361 "Add a Miasm2 IR to the last bbl. Return the var created"
368 if isinstance(expr, m2_expr.ExprInt):
369 ret = llvm_c.Constant.int(LLVMType.int(expr.size), int(expr.arg))
373 if isinstance(expr, m2_expr.ExprId):
375 if not isinstance(name, str):
378 ret = llvm_c.Constant.int(LLVMType.int(expr.size), offset)
390 var = builder.load(ptr_casted, name)
394 if isinstance(expr, m2_expr.ExprOp):
398 fc_ptr = self.mod.get_function_named(
"parity")
399 arg = builder.zext(self.
add_ir(expr.args[0]),
401 ret = builder.call(fc_ptr, [arg])
402 ret = builder.trunc(ret, LLVMType.int(expr.size))
406 if op
in [
"<<<",
">>>"]:
407 fc_name =
"rot_left" if op ==
"<<<" else "rot_right"
408 fc_ptr = self.mod.get_function_named(fc_name)
409 args = [self.
add_ir(arg)
for arg
in expr.args]
410 arg_size = expr.args[0].size
413 args = [builder.zext(arg, LLVMType.int(32))
415 arg_size_cst = llvm_c.Constant.int(LLVMType.int(),
417 ret = builder.call(fc_ptr, [arg_size_cst] + args)
420 ret = builder.trunc(ret, LLVMType.int(arg_size))
425 size = expr.args[0].size
426 fc_ptr = self.mod.get_function_named(
"bcdadd_%s" % size)
427 args = [self.
add_ir(arg)
for arg
in expr.args]
428 ret = builder.call(fc_ptr, args)
432 if op ==
"bcdadd_cf":
433 size = expr.args[0].size
434 fc_ptr = self.mod.get_function_named(
"bcdadd_cf_%s" % size)
435 args = [self.
add_ir(arg)
for arg
in expr.args]
436 ret = builder.call(fc_ptr, args)
437 ret = builder.trunc(ret, LLVMType.int(expr.size))
442 zero = llvm_c.Constant.int(LLVMType.int(expr.size),
444 ret = builder.sub(zero, self.
add_ir(expr.args[0]))
449 fc_ptr = self.mod.get_function_named(
"segm2addr")
450 args_casted = [builder.zext(self.
add_ir(arg), LLVMType.int(64))
451 for arg
in expr.args]
452 args = [self.
local_vars[
"vmcpu"]] + args_casted
453 ret = builder.call(fc_ptr, args)
454 ret = builder.trunc(ret, LLVMType.int(expr.size))
458 if op
in [
"imod",
"idiv"]:
459 fc_ptr = self.mod.get_function_named(
460 "%s%s" % (op, expr.args[0].size))
461 args_casted = [self.
add_ir(arg)
for arg
in expr.args]
462 args = [self.
local_vars[
"vmcpu"]] + args_casted
463 ret = builder.call(fc_ptr, args)
467 if len(expr.args) > 1:
470 callback = builder.mul
472 callback = builder.add
474 callback = builder.and_
476 callback = builder.xor
478 callback = builder.or_
480 callback = builder.lshr
482 callback = builder.shl
484 callback = builder.ashr
486 callback = builder.udiv
488 callback = builder.urem
490 raise NotImplementedError(
'Unknown op: %s' % op)
492 last = self.
add_ir(expr.args[0])
494 for i
in range(1, len(expr.args)):
495 last = callback(last,
496 self.
add_ir(expr.args[i]))
502 raise NotImplementedError()
504 if isinstance(expr, m2_expr.ExprMem):
506 fc_name =
"MEM_LOOKUP_%02d" % expr.size
507 fc_ptr = self.mod.get_function_named(fc_name)
508 addr_casted = builder.zext(self.
add_ir(expr.arg),
511 ret = builder.call(fc_ptr, [self.
local_vars[
"vmmngr"],
517 if isinstance(expr, m2_expr.ExprCond):
519 cond = self.
add_ir(expr.cond)
520 zero_casted = llvm_c.Constant.int(LLVMType.int(expr.cond.size),
522 condition_bool = builder.icmp(llvm_c.ICMP_NE, cond,
534 builder.cbranch(condition_bool, then_block, else_block)
541 builder.position_at_end(then_block)
542 then_value = self.
add_ir(expr.src1)
543 builder.store(then_value, alloca)
544 builder.branch(merge_block)
547 builder.position_at_end(else_block)
548 else_value = self.
add_ir(expr.src2)
549 builder.store(else_value, alloca)
550 builder.branch(merge_block)
553 builder.position_at_end(merge_block)
554 ret = builder.load(alloca)
562 if isinstance(expr, m2_expr.ExprSlice):
564 src = self.
add_ir(expr.arg)
568 to_shr = llvm_c.Constant.int(LLVMType.int(expr.arg.size),
570 shred = builder.lshr(src,
576 to_and = llvm_c.Constant.int(LLVMType.int(expr.arg.size),
577 (1 << (expr.stop - expr.start)) - 1)
578 anded = builder.and_(shred,
582 ret = builder.trunc(anded,
583 LLVMType.int(expr.size))
588 if isinstance(expr, m2_expr.ExprCompose):
593 for arg
in expr.args:
594 src, start, stop = arg
598 src_casted = builder.zext(src,
599 LLVMType.int(expr.size))
600 to_and = llvm_c.Constant.int(LLVMType.int(expr.size),
601 (1 << (stop - start)) - 1)
602 anded = builder.and_(src_casted,
607 to_shl = llvm_c.Constant.int(LLVMType.int(expr.size),
609 shled = builder.shl(anded, to_shl)
619 for i
in xrange(1, len(expr.args)):
620 last = builder.or_(last, args[i])
625 raise Exception(
"UnkownExpression", expr.__class__.__name__)