diff options
Diffstat (limited to 'miasm2/arch/mips32/ira.py')
| -rw-r--r-- | miasm2/arch/mips32/ira.py | 30 |
1 files changed, 9 insertions, 21 deletions
diff --git a/miasm2/arch/mips32/ira.py b/miasm2/arch/mips32/ira.py index f88172fb..de508e41 100644 --- a/miasm2/arch/mips32/ira.py +++ b/miasm2/arch/mips32/ira.py @@ -2,7 +2,7 @@ #-*- coding:utf-8 -*- from miasm2.expression.expression import * -from miasm2.ir.ir import ir, irbloc +from miasm2.ir.ir import ir, irbloc, AssignBlock from miasm2.ir.analysis import ira from miasm2.arch.mips32.sem import ir_mips32l, ir_mips32b from miasm2.arch.mips32.regs import * @@ -18,26 +18,15 @@ class ir_a_mips32l(ir_mips32l, ira): def set_dead_regs(self, b): pass - def call_effects(self, ad): - irs = [[ExprAff(self.ret_reg, ExprOp('call_func_ret', ad, self.sp)), - ExprAff(self.sp, ExprOp('call_func_stack', ad, self.sp)), - ]] - return irs - def post_add_bloc(self, bloc, ir_blocs): ir.post_add_bloc(self, bloc, ir_blocs) for irb in ir_blocs: - # print 'X'*40 - # print irb pc_val = None lr_val = None - for exprs in irb.irs: - for e in exprs: - if e.dst == PC: - pc_val = e.src - if e.dst == RA: - lr_val = e.src - #print "XXX", pc_val, lr_val + for assignblk in irb.irs: + pc_val = assignblk.get(PC, pc_val) + lr_val = assignblk.get(RA, lr_val) + if pc_val is None or lr_val is None: continue if not expr_is_int_or_label(lr_val): @@ -46,18 +35,17 @@ class ir_a_mips32l(ir_mips32l, ira): lr_val = ExprInt32(lr_val.name.offset) l = bloc.lines[-2] - #print 'TEST', l, hex(lr_val.arg), hex(l.offset + 8) - #print lr_val.arg, hex(l.offset + l.l) if lr_val.arg != l.offset + 8: raise ValueError("Wrong arg") - # print 'IS CALL!' + # CALL lbl = bloc.get_next() new_lbl = self.gen_label() irs = self.call_effects(pc_val) - irs.append([ExprAff(self.IRDst, ExprId(lbl, size=self.pc.size))]) + irs.append(AssignBlock([ExprAff(self.IRDst, + ExprId(lbl, size=self.pc.size))])) nbloc = irbloc(new_lbl, irs) - nbloc.lines = [l] + nbloc.lines = [l] * len(irs) self.blocs[new_lbl] = nbloc irb.dst = ExprId(new_lbl, size=self.pc.size) |