def post_add_bloc(self, bloc, ir_blocs): ir.post_add_bloc(self, bloc, ir_blocs) if not bloc.lines: return l = bloc.lines[-1] sub_call_dst = None if not l.is_subcall(): return sub_call_dst = l.args[0] if expr_is_label(sub_call_dst): sub_call_dst = sub_call_dst.name for b in ir_blocs: l = b.lines[-1] sub_call_dst = None if not l.is_subcall(): continue sub_call_dst = l.args[0] if expr_is_label(sub_call_dst): sub_call_dst = sub_call_dst.name lbl = bloc.get_next() new_lbl = self.gen_label() irs = self.call_effects(l.args[0]) irs.append([ExprAff(self.IRDst, ExprId(lbl, size=self.pc.size))]) nbloc = irbloc(new_lbl, irs) nbloc.lines = [l] self.blocs[new_lbl] = nbloc b.dst = ExprId(new_lbl, size=self.pc.size) return
def post_add_bloc(self, bloc, ir_blocs): ir.post_add_bloc(self, bloc, ir_blocs) if not bloc.lines: return l = bloc.lines[-1] sub_call_dst = None if not l.is_subcall(): return sub_call_dst = l.args[0] if expr_is_label(sub_call_dst): sub_call_dst = sub_call_dst.name for irb in ir_blocs: l = irb.lines[-1] sub_call_dst = None if not l.is_subcall(): continue sub_call_dst = l.args[0] if expr_is_label(sub_call_dst): sub_call_dst = sub_call_dst.name lbl = bloc.get_next() new_lbl = self.gen_label() irs = self.call_effects(l.args[0]) irs.append( AssignBlock( [ExprAff(self.IRDst, ExprId(lbl, size=self.pc.size))])) nbloc = irbloc(new_lbl, irs) nbloc.lines = [l] * len(irs) self.blocs[new_lbl] = nbloc irb.dst = ExprId(new_lbl, size=self.pc.size) return
def post_add_bloc(self, bloc, ir_blocs): ir.post_add_bloc(self, bloc, ir_blocs) for irb in ir_blocs: pc_val = None lr_val = None 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): continue if expr_is_label(lr_val): lr_val = ExprInt32(lr_val.name.offset) l = bloc.lines[-2] if lr_val.arg != l.offset + 8: raise ValueError("Wrong arg") # CALL lbl = bloc.get_next() new_lbl = self.gen_label() irs = self.call_effects(pc_val) irs.append( AssignBlock( [ExprAff(self.IRDst, ExprId(lbl, size=self.pc.size))])) nbloc = irbloc(new_lbl, irs) nbloc.lines = [l] * len(irs) self.blocs[new_lbl] = nbloc irb.dst = ExprId(new_lbl, size=self.pc.size)
def post_add_bloc(self, bloc, ir_blocs): ir.post_add_bloc(self, bloc, ir_blocs) for irb in ir_blocs: pc_val = None lr_val = None 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): continue if expr_is_label(lr_val): lr_val = ExprInt32(lr_val.name.offset) l = bloc.lines[-2] if lr_val.arg != l.offset + 8: raise ValueError("Wrong arg") # CALL lbl = bloc.get_next() new_lbl = self.gen_label() irs = self.call_effects(pc_val) irs.append(AssignBlock([ExprAff(self.IRDst, ExprId(lbl, size=self.pc.size))])) nbloc = irbloc(new_lbl, irs) nbloc.lines = [l] * len(irs) self.blocs[new_lbl] = nbloc irb.dst = ExprId(new_lbl, size=self.pc.size)
def post_add_bloc(self, bloc, ir_blocs): ir.post_add_bloc(self, bloc, ir_blocs) for irb in ir_blocs: pc_val = None lr_val = None for assignblk in irb.irs: pc_val = assignblk.get(PC, pc_val) lr_val = assignblk.get(LR, lr_val) if pc_val is None or lr_val is None: continue if not isinstance(lr_val, ExprInt): continue l = bloc.lines[-1] if lr_val.arg != l.offset + l.l: continue # CALL lbl = bloc.get_next() new_lbl = self.gen_label() irs = self.call_effects(pc_val) irs.append(AssignBlock([ExprAff(self.IRDst, ExprId(lbl, size=self.pc.size))])) nbloc = irbloc(new_lbl, irs) nbloc.lines = [l] * len(irs) self.blocs[new_lbl] = nbloc irb.dst = ExprId(new_lbl, size=self.pc.size)
def post_add_bloc(self, bloc, ir_blocs): ir.post_add_bloc(self, bloc, ir_blocs) for irb in ir_blocs: 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 == LR: lr_val = e.src if pc_val is None or lr_val is None: continue if not isinstance(lr_val, ExprInt): continue l = bloc.lines[-1] if lr_val.arg != l.offset + l.l: continue 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))]) nbloc = irbloc(new_lbl, irs) nbloc.lines = [l] * len(irs) self.blocs[new_lbl] = nbloc irb.dst = ExprId(new_lbl, size=self.pc.size)
def post_add_bloc(self, bloc, ir_blocs): ir.post_add_bloc(self, bloc, ir_blocs) # flow_graph = DiGraph() 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 == LR: lr_val = e.src if pc_val is None or lr_val is None: continue if not isinstance(lr_val, ExprInt): continue l = bloc.lines[-1] if lr_val.arg != l.offset + l.l: continue # print 'IS 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))]) nbloc = irbloc(new_lbl, irs) nbloc.lines = [l]*len(irs) self.blocs[new_lbl] = nbloc irb.set_dst(ExprId(new_lbl, size=self.pc.size)) """
def post_add_bloc(self, bloc, ir_blocs): ir.post_add_bloc(self, bloc, ir_blocs) for irb in ir_blocs: pc_val = None lr_val = None for assignblk in irb.irs: pc_val = assignblk.get(PC, pc_val) lr_val = assignblk.get(LR, lr_val) if pc_val is None or lr_val is None: continue if not isinstance(lr_val, ExprInt): continue l = bloc.lines[-1] if lr_val.arg != l.offset + l.l: continue # CALL lbl = bloc.get_next() new_lbl = self.gen_label() irs = self.call_effects(pc_val, l) irs.append( AssignBlock( [ExprAff(self.IRDst, ExprId(lbl, size=self.pc.size))])) nbloc = irbloc(new_lbl, irs) nbloc.lines = [l] * len(irs) self.blocs[new_lbl] = nbloc irb.dst = ExprId(new_lbl, size=self.pc.size)
def post_add_bloc(self, bloc, ir_blocs): ir.post_add_bloc(self, bloc, ir_blocs) # flow_graph = DiGraph() l = bloc.lines[-1] if not l.is_subcall(): return for irb in ir_blocs: # print 'X'*40 # print irb pc_val = None for exprs in irb.irs: for e in exprs: if e.dst == PC: pc_val = e.src if pc_val is None: continue l = bloc.lines[-1] # print str(l), 'IS CALL!' lbl = bloc.get_next() new_lbl = self.gen_label() irs = self.call_effects(pc_val) irs.append([ExprAff(IRDst, ExprId(lbl, size=self.pc.size))]) nbloc = irbloc(new_lbl, irs) nbloc.lines = [l] self.blocs[new_lbl] = nbloc irb.dst = ExprId(new_lbl, size=self.pc.size)
def post_add_bloc(self, bloc, ir_blocs): ir.post_add_bloc(self, bloc, ir_blocs) l = bloc.lines[-1] if not l.is_subcall(): return for irb in ir_blocs: pc_val = None for assignblk in irb.irs: pc_val = assignblk.get(PC, pc_val) if pc_val is None: continue l = bloc.lines[-1] lbl = bloc.get_next() new_lbl = self.gen_label() irs = self.call_effects(pc_val) irs.append(AssignBlock([ExprAff(self.IRDst, ExprId(lbl, size=self.pc.size))])) nbloc = irbloc(new_lbl, irs) nbloc.lines = [l] * len(irs) self.blocs[new_lbl] = nbloc irb.dst = ExprId(new_lbl, size=self.pc.size)
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 if pc_val is None or lr_val is None: continue if not expr_is_int_or_label(lr_val): continue if expr_is_label(lr_val): 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!' 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))]) nbloc = irbloc(new_lbl, irs) nbloc.lines = [l] self.blocs[new_lbl] = nbloc irb.dst = ExprId(new_lbl, size=self.pc.size)
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 if pc_val is None or lr_val is None: continue if not expr_is_int_or_label(lr_val): continue if expr_is_label(lr_val): 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: fds continue # print 'IS 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))]) nbloc = irbloc(new_lbl, irs) nbloc.lines = [l] self.blocs[new_lbl] = nbloc irb.dst = ExprId(new_lbl, size=self.pc.size)
def post_add_bloc(self, bloc, ir_blocs): ir.post_add_bloc(self, bloc, ir_blocs) l = bloc.lines[-1] if not l.is_subcall(): return for irb in ir_blocs: pc_val = None for assignblk in irb.irs: pc_val = assignblk.get(PC, pc_val) if pc_val is None: continue l = bloc.lines[-1] lbl = bloc.get_next() new_lbl = self.gen_label() irs = self.call_effects(pc_val, l) irs.append( AssignBlock( [ExprAff(self.IRDst, ExprId(lbl, size=self.pc.size))])) nbloc = irbloc(new_lbl, irs) nbloc.lines = [l] * len(irs) self.blocs[new_lbl] = nbloc irb.dst = ExprId(new_lbl, size=self.pc.size)