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.mips32.sem import ir_mips32l, ir_mips32b
8 from miasm2.arch.mips32.regs import *
9 from miasm2.core.asmbloc import expr_is_int_or_label, expr_is_label
10 
12  def __init__(self, symbol_pool=None):
13  ir_mips32l.__init__(self, symbol_pool)
14  self.ret_reg = self.arch.regs.V0
15 
16 
17  # for test XXX TODO
18  def set_dead_regs(self, b):
19  pass
20 
21  def call_effects(self, ad):
22  irs = [[ExprAff(self.ret_reg, ExprOp('call_func_ret', ad, self.sp)),
23  ExprAff(self.sp, ExprOp('call_func_stack', ad, self.sp)),
24  ]]
25  return irs
26 
27  def post_add_bloc(self, bloc, ir_blocs):
28  ir.post_add_bloc(self, bloc, ir_blocs)
29  for irb in ir_blocs:
30  # print 'X'*40
31  # print irb
32  pc_val = None
33  lr_val = None
34  for exprs in irb.irs:
35  for e in exprs:
36  if e.dst == PC:
37  pc_val = e.src
38  if e.dst == RA:
39  lr_val = e.src
40  #print "XXX", pc_val, lr_val
41  if pc_val is None or lr_val is None:
42  continue
43  if not expr_is_int_or_label(lr_val):
44  continue
45  if expr_is_label(lr_val):
46  lr_val = ExprInt32(lr_val.name.offset)
47 
48  l = bloc.lines[-2]
49  #print 'TEST', l, hex(lr_val.arg), hex(l.offset + 8)
50  #print lr_val.arg, hex(l.offset + l.l)
51  if lr_val.arg != l.offset + 8:
52  raise ValueError("Wrong arg")
53 
54  # print 'IS CALL!'
55  lbl = bloc.get_next()
56  new_lbl = self.gen_label()
57  irs = self.call_effects(pc_val)
58  irs.append([ExprAff(self.IRDst, ExprId(lbl, size=self.pc.size))])
59  nbloc = irbloc(new_lbl, irs)
60  nbloc.lines = [l]
61  self.blocs[new_lbl] = nbloc
62  irb.dst = ExprId(new_lbl, size=self.pc.size)
63 
64  def get_out_regs(self, b):
65  return set([self.ret_reg, self.sp])
66 
67  def sizeof_char(self):
68  return 8
69 
70  def sizeof_short(self):
71  return 16
72 
73  def sizeof_int(self):
74  return 32
75 
76  def sizeof_long(self):
77  return 32
78 
79  def sizeof_pointer(self):
80  return 32
81 
82 
83 
85  def __init__(self, symbol_pool=None):
86  ir_mips32b.__init__(self, symbol_pool)
87  self.ret_reg = self.arch.regs.V0
def gen_label
Definition: ir.py:309
def expr_is_int_or_label
Definition: asmbloc.py:32