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