SsaBasicBlock rootBlock = reverse ? getExitBlock() : getEntryBlock();
SsaBasicBlock rootBlock = reverse ? getExitBlock() : getEntryBlock();
/** * Deletes all insns in the set from this method. * * @param deletedInsns {@code non-null;} insns to delete */ public void deleteInsns(Set<SsaInsn> deletedInsns) { for (SsaBasicBlock block : getBlocks()) { ArrayList<SsaInsn> insns = block.getInsns(); for (int i = insns.size() - 1; i >= 0; i--) { SsaInsn insn = insns.get(i); if (deletedInsns.contains(insn)) { onInsnRemoved(insn); insns.remove(i); } } // Check to see if we need to add a GOTO int insnsSz = insns.size(); SsaInsn lastInsn = (insnsSz == 0) ? null : insns.get(insnsSz - 1); if (block != getExitBlock() && (insnsSz == 0 || lastInsn.getOriginalRopInsn() == null || lastInsn.getOriginalRopInsn().getOpcode() .getBranchingness() == Rop.BRANCH_NONE)) { // We managed to eat a throwable insn Insn gotoInsn = new PlainInsn(Rops.GOTO, SourcePosition.NO_INFO, null, RegisterSpecList.EMPTY); insns.add(SsaInsn.makeFromRop(gotoInsn, block)); } } }
/** * @return rop-form basic block list */ private BasicBlockList convertBasicBlocks() { ArrayList<SsaBasicBlock> blocks = ssaMeth.getBlocks(); // Exit block may be null. SsaBasicBlock exitBlock = ssaMeth.getExitBlock(); BitSet reachable = ssaMeth.computeReachability(); int ropBlockCount = reachable.cardinality(); // Don't count the exit block, if it exists and is reachable. if (exitBlock != null && reachable.get(exitBlock.getIndex())) { ropBlockCount -= 1; } BasicBlockList result = new BasicBlockList(ropBlockCount); // Convert all the reachable blocks except the exit block. int ropBlockIndex = 0; for (SsaBasicBlock b : blocks) { if (reachable.get(b.getIndex()) && b != exitBlock) { result.set(ropBlockIndex++, convertBasicBlock(b)); } } // The exit block, which is discarded, must do nothing. if (exitBlock != null && !exitBlock.getInsns().isEmpty()) { throw new RuntimeException( "Exit block must have no insns when leaving SSA form"); } return result; }
SsaInsn lastInsn = (insnsSz == 0) ? null : insns.get(insnsSz - 1); if (block != getExitBlock() && (insnsSz == 0 || lastInsn.getOriginalRopInsn() == null || lastInsn.getOriginalRopInsn().getOpcode()
/** * @return rop-form basic block list */ private BasicBlockList convertBasicBlocks() { ArrayList<SsaBasicBlock> blocks = ssaMeth.getBlocks(); // Exit block may be null. SsaBasicBlock exitBlock = ssaMeth.getExitBlock(); int ropBlockCount = ssaMeth.getCountReachableBlocks(); // Don't count the exit block, if it exists. ropBlockCount -= (exitBlock == null) ? 0 : 1; BasicBlockList result = new BasicBlockList(ropBlockCount); // Convert all the reachable blocks except the exit block. int ropBlockIndex = 0; for (SsaBasicBlock b : blocks) { if (b.isReachable() && b != exitBlock) { result.set(ropBlockIndex++, convertBasicBlock(b)); } } // The exit block, which is discarded, must do nothing. if (exitBlock != null && exitBlock.getInsns().size() != 0) { throw new RuntimeException( "Exit block must have no insns when leaving SSA form"); } return result; }
/** * @return rop-form basic block list */ private BasicBlockList convertBasicBlocks() { ArrayList<SsaBasicBlock> blocks = ssaMeth.getBlocks(); // Exit block may be null. SsaBasicBlock exitBlock = ssaMeth.getExitBlock(); ssaMeth.computeReachability(); int ropBlockCount = ssaMeth.getCountReachableBlocks(); // Don't count the exit block, if it exists and is reachable. ropBlockCount -= (exitBlock != null && exitBlock.isReachable()) ? 1 : 0; BasicBlockList result = new BasicBlockList(ropBlockCount); // Convert all the reachable blocks except the exit block. int ropBlockIndex = 0; for (SsaBasicBlock b : blocks) { if (b.isReachable() && b != exitBlock) { result.set(ropBlockIndex++, convertBasicBlock(b)); } } // The exit block, which is discarded, must do nothing. if (exitBlock != null && exitBlock.getInsns().size() != 0) { throw new RuntimeException( "Exit block must have no insns when leaving SSA form"); } return result; }
/** * @return rop-form basic block list */ private BasicBlockList convertBasicBlocks() { ArrayList<SsaBasicBlock> blocks = ssaMeth.getBlocks(); // Exit block may be null. SsaBasicBlock exitBlock = ssaMeth.getExitBlock(); ssaMeth.computeReachability(); int ropBlockCount = ssaMeth.getCountReachableBlocks(); // Don't count the exit block, if it exists and is reachable. ropBlockCount -= (exitBlock != null && exitBlock.isReachable()) ? 1 : 0; BasicBlockList result = new BasicBlockList(ropBlockCount); // Convert all the reachable blocks except the exit block. int ropBlockIndex = 0; for (SsaBasicBlock b : blocks) { if (b.isReachable() && b != exitBlock) { result.set(ropBlockIndex++, convertBasicBlock(b)); } } // The exit block, which is discarded, must do nothing. if (exitBlock != null && exitBlock.getInsns().size() != 0) { throw new RuntimeException( "Exit block must have no insns when leaving SSA form"); } return result; }
/** * @return rop-form basic block list */ private BasicBlockList convertBasicBlocks() { ArrayList<SsaBasicBlock> blocks = ssaMeth.getBlocks(); // Exit block may be null. SsaBasicBlock exitBlock = ssaMeth.getExitBlock(); ssaMeth.computeReachability(); int ropBlockCount = ssaMeth.getCountReachableBlocks(); // Don't count the exit block, if it exists and is reachable. ropBlockCount -= (exitBlock != null && exitBlock.isReachable()) ? 1 : 0; BasicBlockList result = new BasicBlockList(ropBlockCount); // Convert all the reachable blocks except the exit block. int ropBlockIndex = 0; for (SsaBasicBlock b : blocks) { if (b.isReachable() && b != exitBlock) { result.set(ropBlockIndex++, convertBasicBlock(b)); } } // The exit block, which is discarded, must do nothing. if (exitBlock != null && exitBlock.getInsns().size() != 0) { throw new RuntimeException( "Exit block must have no insns when leaving SSA form"); } return result; }
/** * @return rop-form basic block list */ private BasicBlockList convertBasicBlocks() { ArrayList<SsaBasicBlock> blocks = ssaMeth.getBlocks(); // Exit block may be null. SsaBasicBlock exitBlock = ssaMeth.getExitBlock(); ssaMeth.computeReachability(); int ropBlockCount = ssaMeth.getCountReachableBlocks(); // Don't count the exit block, if it exists and is reachable. ropBlockCount -= (exitBlock != null && exitBlock.isReachable()) ? 1 : 0; BasicBlockList result = new BasicBlockList(ropBlockCount); // Convert all the reachable blocks except the exit block. int ropBlockIndex = 0; for (SsaBasicBlock b : blocks) { if (b.isReachable() && b != exitBlock) { result.set(ropBlockIndex++, convertBasicBlock(b)); } } // The exit block, which is discarded, must do nothing. if (exitBlock != null && exitBlock.getInsns().size() != 0) { throw new RuntimeException( "Exit block must have no insns when leaving SSA form"); } return result; }
/** * @return rop-form basic block list */ private BasicBlockList convertBasicBlocks() { ArrayList<SsaBasicBlock> blocks = ssaMeth.getBlocks(); // Exit block may be null. SsaBasicBlock exitBlock = ssaMeth.getExitBlock(); ssaMeth.computeReachability(); int ropBlockCount = ssaMeth.getCountReachableBlocks(); // Don't count the exit block, if it exists and is reachable. ropBlockCount -= (exitBlock != null && exitBlock.isReachable()) ? 1 : 0; BasicBlockList result = new BasicBlockList(ropBlockCount); // Convert all the reachable blocks except the exit block. int ropBlockIndex = 0; for (SsaBasicBlock b : blocks) { if (b.isReachable() && b != exitBlock) { result.set(ropBlockIndex++, convertBasicBlock(b)); } } // The exit block, which is discarded, must do nothing. if (exitBlock != null && exitBlock.getInsns().size() != 0) { throw new RuntimeException( "Exit block must have no insns when leaving SSA form"); } return result; }
/** * @return rop-form basic block list */ private BasicBlockList convertBasicBlocks() { ArrayList<SsaBasicBlock> blocks = ssaMeth.getBlocks(); // Exit block may be null. SsaBasicBlock exitBlock = ssaMeth.getExitBlock(); ssaMeth.computeReachability(); int ropBlockCount = ssaMeth.getCountReachableBlocks(); // Don't count the exit block, if it exists and is reachable. ropBlockCount -= (exitBlock != null && exitBlock.isReachable()) ? 1 : 0; BasicBlockList result = new BasicBlockList(ropBlockCount); // Convert all the reachable blocks except the exit block. int ropBlockIndex = 0; for (SsaBasicBlock b : blocks) { if (b.isReachable() && b != exitBlock) { result.set(ropBlockIndex++, convertBasicBlock(b)); } } // The exit block, which is discarded, must do nothing. if (exitBlock != null && exitBlock.getInsns().size() != 0) { throw new RuntimeException( "Exit block must have no insns when leaving SSA form"); } return result; }
SsaBasicBlock exitBlock = ssaMeth.getExitBlock(); int exitRopLabel = (exitBlock == null) ? -1 : exitBlock.getRopLabel();
SsaBasicBlock exitBlock = ssaMeth.getExitBlock(); int exitRopLabel = (exitBlock == null) ? -1 : exitBlock.getRopLabel();
SsaBasicBlock exitBlock = ssaMeth.getExitBlock(); int exitRopLabel = (exitBlock == null) ? -1 : exitBlock.getRopLabel();
SsaBasicBlock exitBlock = ssaMeth.getExitBlock(); int exitRopLabel = (exitBlock == null) ? -1 : exitBlock.getRopLabel();
SsaBasicBlock exitBlock = ssaMeth.getExitBlock(); int exitRopLabel = (exitBlock == null) ? -1 : exitBlock.getRopLabel();
SsaBasicBlock exitBlock = ssaMeth.getExitBlock(); int exitRopLabel = (exitBlock == null) ? -1 : exitBlock.getRopLabel();
SsaBasicBlock exitBlock = ssaMeth.getExitBlock(); int exitRopLabel = (exitBlock == null) ? -1 : exitBlock.getRopLabel();
SsaBasicBlock exitBlock = ssaMeth.getExitBlock(); int exitRopLabel = (exitBlock == null) ? -1 : exitBlock.getRopLabel();