## Immutability try: assignblk1[id_a] = id_a except RuntimeError: pass else: raise RuntimeError("An error was expected") try: del assignblk1[id_a] except RuntimeError: pass else: raise RuntimeError("An error was expected") ## Basic APIs assert assignblk1.get_r() == set([id_b]) assert assignblk1.get_w() == set([id_a]) assert assignblk1.get_rw() == {id_a: set([id_b])} assert assignblk1.keys() == [id_a] assert dict(assignblk1) == {id_a: id_b} assert assignblk1[id_a] == id_b assert list(assignblk1.iteritems()) == assignblk1.items() ## Simplify assignblk3 = AssignBlock({id_a: id_b - id_b}) assert assignblk3[id_a] != int0 assignblk4 = assignblk3.simplify(expr_simp) assert assignblk3[id_a] != int0 assert assignblk4[id_a] == int0
def do_it_block(self, loc, index, block, assignments, gen_pc_updt): instr = block.lines[index] it_hints, it_cond = self.parse_itt(instr) cond_num = cond_dct_inv[it_cond.name] cond_eq = tab_cond[cond_num] if not index + len(it_hints) <= len(block.lines): raise NotImplementedError("Split IT block non supported yet") ir_blocks_all = [] # Gen dummy irblock for IT instr loc_next = self.get_next_loc_key(instr) dst = ExprAssign(self.IRDst, ExprLoc(loc_next, 32)) dst_blk = AssignBlock([dst], instr) assignments.append(dst_blk) irblock = IRBlock(loc, assignments) ir_blocks_all.append([irblock]) loc = loc_next assignments = [] for hint in it_hints: irblocks = [] index += 1 instr = block.lines[index] # Add conditionnal jump to current irblock loc_do = self.loc_db.add_location() loc_next = self.get_next_loc_key(instr) if hint: local_cond = ~cond_eq else: local_cond = cond_eq dst = ExprAssign( self.IRDst, ExprCond(local_cond, ExprLoc(loc_do, 32), ExprLoc(loc_next, 32))) dst_blk = AssignBlock([dst], instr) assignments.append(dst_blk) irblock = IRBlock(loc, assignments) irblocks.append(irblock) it_instr_irblocks = [] assignments = [] loc = loc_do split = self.add_instr_to_current_state(instr, block, assignments, it_instr_irblocks, gen_pc_updt) if split: raise NotImplementedError( "Unsupported instr in IT block (%s)" % instr) if it_instr_irblocks: assert len(it_instr_irblocks) == 1 it_instr_irblocks = it_instr_irblocks.pop() # Remove flags assignment if instr != [CMP, CMN, TST] if instr.name not in ["CMP", "CMN", "TST"]: # Fix assignments out = [] for assignment in assignments: assignment = AssignBlock( { dst: src for (dst, src) in assignment.iteritems() if dst not in [zf, nf, of, cf] }, assignment.instr) out.append(assignment) assignments = out # Fix extra irblocksx new_irblocks = [] for irblock in it_instr_irblocks: out = [] for tmp_assignment in irblock: assignment = AssignBlock( { dst: src for (dst, src) in assignment.iteritems() if dst not in [zf, nf, of, cf] }, assignment.instr) out.append(assignment) new_irblock = IRBlock(irblock.loc_key, out) new_irblocks.append(new_irblock) it_instr_irblocks = new_irblocks irblocks += it_instr_irblocks dst = ExprAssign(self.IRDst, ExprLoc(loc_next, 32)) dst_blk = AssignBlock([dst], instr) assignments.append(dst_blk) irblock = IRBlock(loc, assignments) irblocks.append(irblock) loc = loc_next assignments = [] ir_blocks_all.append(irblocks) return index, ir_blocks_all