def emit_mov(ir, instr, a, b): # movの中間表現を生成 instr_ir, extra_ir = sem.mov(ir, instr, a, b) # カウンタをインクリメントする中間表現を追加 dst = expr.ExprMem(expr.ExprInt64(ADDR_COUNTER), 64) new_value = dst + expr.ExprInt64(1) instr_ir.append(expr.ExprAff(dst, new_value)) return instr_ir, extra_ir
def emit_syscall(ir, instr): e = [] # EXCEPT_PRIV_INSNの設定 e.append( expr.ExprAff(regs.exception_flags, expr.ExprInt32(sem.EXCEPT_PRIV_INSN))) # syscallの次命令のポインタを保存 e.append( expr.ExprAff(expr.ExprMem(expr.ExprInt64(ADDR_SYSCALL_NEXTIP), 64), expr.ExprId(ir.get_next_label(instr), instr.mode))) return e, []
def mod_pc(self, instr, instr_ir, extra_ir): "Replace PC by the instruction's offset" cur_offset = m2_expr.ExprInt64(instr.offset) for i, expr in enumerate(instr_ir): dst, src = expr.dst, expr.src if dst != self.pc: dst = dst.replace_expr({self.pc: cur_offset}) src = src.replace_expr({self.pc: cur_offset}) instr_ir[i] = m2_expr.ExprAff(dst, src) for b in extra_ir: for irs in b.irs: for i, expr in enumerate(irs): dst, src = expr.dst, expr.src if dst != self.pc: dst = dst.replace_expr({self.pc: cur_offset}) src = src.replace_expr({self.pc: cur_offset}) irs[i] = m2_expr.ExprAff(dst, src)
class imm64_noarg(object): int2expr = lambda self, x: m2_expr.ExprInt64(x)
def adrp(arg1, arg2): arg1 = (PC & m2_expr.ExprInt64(0xfffffffffffff000)) + arg2
def bl(arg1): PC = arg1 ir.IRDst = arg1 LR = m2_expr.ExprInt64(instr.offset + instr.l)