public BasicBlock block(BasicBlockReader block) { if (block == null) { return null; } return program.basicBlockAt(blockOffset + block.getIndex()); }
private BasicBlock copyBlock(BasicBlockReader block) { return programCopy.basicBlockAt(block.getIndex()); }
@Override public void jump(BasicBlockReader target) { append("goto $").append(target.getIndex()); }
@Override public void choose(VariableReader condition, List<? extends SwitchTableEntryReader> table, BasicBlockReader defaultTarget) { append("switch ").appendLocalVar(condition).append(" "); for (int i = 0; i < table.size(); ++i) { if (i > 0) { append(" "); } SwitchTableEntryReader entry = table.get(i); append("case ").append(entry.getCondition()).append(" goto $").append(entry.getTarget().getIndex()); } sb.append(" else goto $").append(defaultTarget.getIndex()); }
public static List<TryCatchBlock> copyTryCatches(BasicBlockReader block, Program target) { List<TryCatchBlock> result = new ArrayList<>(); for (TryCatchBlockReader tryCatch : block.readTryCatchBlocks()) { TryCatchBlock tryCatchCopy = new TryCatchBlock(); tryCatchCopy.setExceptionType(tryCatch.getExceptionType()); tryCatchCopy.setHandler(target.basicBlockAt(tryCatch.getHandler().getIndex())); result.add(tryCatchCopy); } return result; }
@Override public void jump(BasicBlockReader target) { Object[] newVariables = variables.clone(); for (IncomingReader outgoing : outgoings.get(currentBlock.getIndex())) { if (outgoing.getPhi().getBasicBlock() != target) { continue; } newVariables[outgoing.getPhi().getReceiver().getIndex()] = variables[outgoing.getValue().getIndex()]; } variables = newVariables; currentBlock = target; }
public static List<Phi> copyPhis(BasicBlockReader block, Program target) { List<Phi> result = new ArrayList<>(); for (PhiReader phi : block.readPhis()) { Phi phiCopy = new Phi(); phiCopy.setReceiver(target.variableAt(phi.getReceiver().getIndex())); for (IncomingReader incoming : phi.readIncomings()) { Incoming incomingCopy = new Incoming(); incomingCopy.setSource(target.basicBlockAt(incoming.getSource().getIndex())); incomingCopy.setValue(target.variableAt(incoming.getValue().getIndex())); phiCopy.getIncomings().add(incomingCopy); } result.add(phiCopy); } return result; }
@Override public void jumpIf(BinaryBranchingCondition cond, VariableReader first, VariableReader second, BasicBlockReader consequent, BasicBlockReader alternative) { append("if ").appendLocalVar(first).append(" "); switch (cond) { case EQUAL: append("=="); break; case REFERENCE_EQUAL: append("==="); break; case NOT_EQUAL: append("!="); break; case REFERENCE_NOT_EQUAL: append("!=="); break; } appendLocalVar(second).append(" then goto $").append(consequent.getIndex()) .append(" else goto $").append(alternative.getIndex()); }
for (PhiReader phi : block.readPhis()) { for (IncomingReader incoming : phi.readIncomings()) { outgoings.get(incoming.getSource().getIndex()).add(incoming);
incoming.setSource(substitutor.block(templateIncoming.getSource())); phi.getIncomings().add(incoming); int sourceIndex = templateIncoming.getSource().getIndex(); outgoings.get(sourceIndex).add(incoming); outgoingVars.get(sourceIndex).add(templateIncoming.getValue());
public BasicBlock block(BasicBlockReader block) { if (block == null) { return null; } return program.basicBlockAt(blockOffset + block.getIndex()); }
private BasicBlock copyBlock(BasicBlockReader block) { return programCopy.basicBlockAt(block.getIndex()); }
@Override public void jump(BasicBlockReader target) { append("goto $").append(target.getIndex()); }
@Override public void choose(VariableReader condition, List<? extends SwitchTableEntryReader> table, BasicBlockReader defaultTarget) { append("switch ").appendLocalVar(condition).append(" "); for (int i = 0; i < table.size(); ++i) { if (i > 0) { append(" "); } SwitchTableEntryReader entry = table.get(i); append("case ").append(entry.getCondition()).append(" goto $").append(entry.getTarget().getIndex()); } sb.append(" else goto $").append(defaultTarget.getIndex()); }
public static List<TryCatchBlock> copyTryCatches(BasicBlockReader block, Program target) { List<TryCatchBlock> result = new ArrayList<>(); for (TryCatchBlockReader tryCatch : block.readTryCatchBlocks()) { TryCatchBlock tryCatchCopy = new TryCatchBlock(); tryCatchCopy.setExceptionType(tryCatch.getExceptionType()); tryCatchCopy.setHandler(target.basicBlockAt(tryCatch.getHandler().getIndex())); result.add(tryCatchCopy); } return result; }
@Override public void jump(BasicBlockReader target) { Object[] newVariables = variables.clone(); for (IncomingReader outgoing : outgoings.get(currentBlock.getIndex())) { if (outgoing.getPhi().getBasicBlock() != target) { continue; } newVariables[outgoing.getPhi().getReceiver().getIndex()] = variables[outgoing.getValue().getIndex()]; } variables = newVariables; currentBlock = target; }
@Override public void jumpIf(BinaryBranchingCondition cond, VariableReader first, VariableReader second, BasicBlockReader consequent, BasicBlockReader alternative) { append("if ").appendLocalVar(first).append(" "); switch (cond) { case EQUAL: append("=="); break; case REFERENCE_EQUAL: append("==="); break; case NOT_EQUAL: append("!="); break; case REFERENCE_NOT_EQUAL: append("!=="); break; } appendLocalVar(second).append(" then goto $").append(consequent.getIndex()) .append(" else goto $").append(alternative.getIndex()); }
public static List<Phi> copyPhis(BasicBlockReader block, Program target) { List<Phi> result = new ArrayList<>(); for (PhiReader phi : block.readPhis()) { Phi phiCopy = new Phi(); phiCopy.setReceiver(target.variableAt(phi.getReceiver().getIndex())); for (IncomingReader incoming : phi.readIncomings()) { Incoming incomingCopy = new Incoming(); incomingCopy.setSource(target.basicBlockAt(incoming.getSource().getIndex())); incomingCopy.setValue(target.variableAt(incoming.getValue().getIndex())); phiCopy.getIncomings().add(incomingCopy); } result.add(phiCopy); } return result; }