コード例 #1
0
ファイル: cfg.py プロジェクト: hanushgowrav66/uroboros_python
 def aux(bnl, acc, i):
     if isinstance(i, Types.SingleInstr) and Opcode_utils.is_ret(i[0]):
         bn = self.bbn_byloc(get_loc(i).loc_addr)
         acc.insert(0, (bn, (Types.J(), 'RET')))
     elif isinstance(i, Types.DoubleInstr):
         if Opcode_utils.is_indirect(i[1]):
             bn = self.bbn_byloc(get_loc(i).loc_addr)
             acc.insert(0, (bn, (Types.J(), 'T')))
         elif Opcode_utils.is_call(i[0]):
             bn = self.bbn_byloc(get_loc(i).loc_addr)
             bn1 = self.next_bb(bnl, bn)
             acc.insert(0, (bn, (Types.J(), bn1)))
             acc.insert(0, (bn, (Types.J(), 'INTER')))
         elif Opcode_utils.is_jmp(i[0]):
             bn = self.bbn_byloc(get_loc(i).loc_addr)
             if Opcode_utils.is_func(i[1]):
                 acc.insert(0, (bn, (Types.J(), 'INTER')))
             else:
                 en = recover_addr_from_label(p_exp(i[1]))
                 if en == -1:
                     acc.insert(0, (bn, (Types.J(), 'T')))
                 else:
                     dn = self.bbn_byloc(en)
                     acc.insert(0, (bn, (Types.J(), dn)))
         elif Opcode_utils.is_cond_jmp(i[0]):
             if not Opcode_utils.is_func(i[1]):
                 bn = self.bbn_byloc(get_loc(i).loc_addr)
                 sn = self.next_bb(bnl, bn)
                 acc.insert(0, (bn, (Types.F(), sn)))
             else:
                 assert (False)
     else:
         bn = self.bbn_byloc(get_loc(i).loc_addr)
         dn = self.next_bb(bnl, bn)
         acc.insert(0, (bn, (Types.F(), dn)))
     return acc