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.msp430.sem import ir_msp430
8 from miasm2.arch.msp430.regs import *
9 # from miasm2.core.graph import DiGraph
10 
11 
13 
14  def __init__(self, symbol_pool=None):
15  ir_msp430.__init__(self, symbol_pool)
16  self.ret_reg = self.arch.regs.R15
17 
18 
20 
21  def __init__(self, symbol_pool=None):
22  ir_a_msp430_base.__init__(self, symbol_pool)
23 
24  # for test XXX TODO
25  def set_dead_regs(self, b):
26  b.rw[-1][1].add(self.arch.regs.zf)
27  b.rw[-1][1].add(self.arch.regs.nf)
28  b.rw[-1][1].add(self.arch.regs.of)
29  b.rw[-1][1].add(self.arch.regs.cf)
30 
31  b.rw[-1][1].add(self.arch.regs.res)
32  b.rw[-1][1].add(self.arch.regs.scg1)
33  b.rw[-1][1].add(self.arch.regs.scg0)
34  b.rw[-1][1].add(self.arch.regs.osc)
35  b.rw[-1][1].add(self.arch.regs.cpuoff)
36  b.rw[-1][1].add(self.arch.regs.gie)
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  # flow_graph = DiGraph()
47 
48  l = bloc.lines[-1]
49  if not l.is_subcall():
50  return
51 
52  for irb in ir_blocs:
53  # print 'X'*40
54  # print irb
55  pc_val = None
56  for exprs in irb.irs:
57  for e in exprs:
58  if e.dst == PC:
59  pc_val = e.src
60  if pc_val is None:
61  continue
62 
63  l = bloc.lines[-1]
64  # print str(l), 'IS CALL!'
65  lbl = bloc.get_next()
66  new_lbl = self.gen_label()
67  irs = self.call_effects(pc_val)
68  irs.append([ExprAff(self.IRDst, ExprId(lbl, size=self.pc.size))])
69  nbloc = irbloc(new_lbl, irs)
70  nbloc.lines = [l]
71  self.blocs[new_lbl] = nbloc
72  irb.dst = ExprId(new_lbl, size=self.pc.size)
73 
74  def get_out_regs(self, b):
75  return set([self.ret_reg, self.sp])
76 
def gen_label
Definition: ir.py:309