Miasm2
 All Classes Namespaces Files Functions Variables Typedefs Properties Macros
ira.py
Go to the documentation of this file.
1 #!/usr/bin/env python
2 #-*- coding:utf-8 -*-
3 
5 from miasm2.ir.ir import ir, irbloc
6 from miasm2.ir.analysis import ira
7 from miasm2.arch.aarch64.sem import ir_aarch64l, ir_aarch64b
8 from miasm2.arch.aarch64.regs import *
9 
10 
12 
13  def __init__(self, symbol_pool=None):
14  ir_aarch64l.__init__(self, symbol_pool)
15  self.ret_reg = self.arch.regs.X0
16 
17 
19 
20  def __init__(self, symbol_pool=None):
21  ir_aarch64b.__init__(self, symbol_pool)
22  self.ret_reg = self.arch.regs.X0
23 
24 
26 
27  def __init__(self, symbol_pool=None):
28  ir_a_aarch64l_base.__init__(self, symbol_pool)
29  self.ret_reg = self.arch.regs.X0
30 
31  # for test XXX TODO
32  def set_dead_regs(self, b):
33  b.rw[-1][1].add(self.arch.regs.zf)
34  b.rw[-1][1].add(self.arch.regs.nf)
35  b.rw[-1][1].add(self.arch.regs.of)
36  b.rw[-1][1].add(self.arch.regs.cf)
37 
38  def call_effects(self, ad):
39  irs = [[ExprAff(self.ret_reg, ExprOp('call_func_ret', ad, self.sp)),
40  ExprAff(self.sp, ExprOp('call_func_stack', ad, self.sp)),
41  ]]
42  return irs
43 
44  def post_add_bloc(self, bloc, ir_blocs):
45  ir.post_add_bloc(self, bloc, ir_blocs)
46  for irb in ir_blocs:
47  pc_val = None
48  lr_val = None
49  for exprs in irb.irs:
50  for e in exprs:
51  if e.dst == PC:
52  pc_val = e.src
53  if e.dst == LR:
54  lr_val = e.src
55  if pc_val is None or lr_val is None:
56  continue
57  if not isinstance(lr_val, ExprInt):
58  continue
59 
60  l = bloc.lines[-1]
61  if lr_val.arg != l.offset + l.l:
62  continue
63  lbl = bloc.get_next()
64  new_lbl = self.gen_label()
65  irs = self.call_effects(pc_val)
66  irs.append([ExprAff(self.IRDst, ExprId(lbl, size=self.pc.size))])
67  nbloc = irbloc(new_lbl, irs)
68  nbloc.lines = [l] * len(irs)
69  self.blocs[new_lbl] = nbloc
70  irb.dst = ExprId(new_lbl, size=self.pc.size)
71 
72  def get_out_regs(self, b):
73  return set([self.ret_reg, self.sp])
74 
75  def sizeof_char(self):
76  return 8
77 
78  def sizeof_short(self):
79  return 16
80 
81  def sizeof_int(self):
82  return 32
83 
84  def sizeof_long(self):
85  return 32
86 
87  def sizeof_pointer(self):
88  return 32
89 
90 
92 
93  def __init__(self, symbol_pool=None):
94  ir_a_aarch64b_base.__init__(self, symbol_pool)
95  self.ret_reg = self.arch.regs.X0
def gen_label
Definition: ir.py:309