/** * Propagate information for an "exit" edge to a caller return site * * [23] for each d5 s.t. {@literal <s_p,d2> -> <returnSite(c),d5>} .. * * @param edge the edge being processed * @param c a call site of edge.s_p * @param D4 set of d1 s.t. {@literal <c, d1> -> <edge.s_p, edge.d2>} was recorded as call flow * @param entries the blocks in the supergraph that are entries for the procedure of c * @param retSite the return site being propagated to * @param retf the flow function */ private void propagateToReturnSiteWithBinaryFlowFunction(final PathEdge<T> edge, final T c, final IntSet D4, final T[] entries, final T retSite, final IFlowFunction retf) { D4.foreach(d4 -> { final IntSet D5 = computeBinaryFlow(d4, edge.d2, (IBinaryReturnFlowFunction) retf); propToReturnSite(c, entries, retSite, d4, D5, edge); }); }
/** * Propagate information for an "exit" edge to a caller return site * * [23] for each d5 s.t. {@literal <s_p,d2> -> <returnSite(c),d5>} .. * * @param edge the edge being processed * @param c a call site of edge.s_p * @param D4 set of d1 s.t. {@literal <c, d1> -> <edge.s_p, edge.d2>} was recorded as call flow * @param entries the blocks in the supergraph that are entries for the procedure of c * @param retSite the return site being propagated to * @param retf the flow function */ private void propagateToReturnSiteWithBinaryFlowFunction(final PathEdge<T> edge, final T c, final IntSet D4, final T[] entries, final T retSite, final IFlowFunction retf) { D4.foreach(d4 -> { final IntSet D5 = computeBinaryFlow(d4, edge.d2, (IBinaryReturnFlowFunction) retf); propToReturnSite(c, entries, retSite, d4, D5, edge); }); }
public SparseIntSet(IntSet S) throws IllegalArgumentException { if (S == null) { throw new IllegalArgumentException("S == null"); } if (S instanceof SparseIntSet) { cloneState((SparseIntSet) S); } else { elements = new int[S.size()]; size = S.size(); S.foreach(new IntSetAction() { private int index = 0; @Override public void act(int i) { elements[index++] = i; } }); } }
public SparseIntSet(IntSet S) throws IllegalArgumentException { if (S == null) { throw new IllegalArgumentException("S == null"); } if (S instanceof SparseIntSet) { cloneState((SparseIntSet) S); } else { elements = new int[S.size()]; size = S.size(); S.foreach(new IntSetAction() { private int index = 0; @Override public void act(int i) { elements[index++] = i; } }); } }
public SparseLongSet(IntSet S) throws IllegalArgumentException { if (S == null) { throw new IllegalArgumentException("S == null"); } if (S instanceof SparseLongSet) { cloneState((SparseLongSet) S); } else { elements = new long[S.size()]; size = S.size(); S.foreach(new IntSetAction() { private int index = 0; @Override public void act(int i) { elements[index++] = i; } }); } }
public SparseLongSet(IntSet S) throws IllegalArgumentException { if (S == null) { throw new IllegalArgumentException("S == null"); } if (S instanceof SparseLongSet) { cloneState((SparseLongSet) S); } else { elements = new long[S.size()]; size = S.size(); S.foreach(new IntSetAction() { private int index = 0; @Override public void act(int i) { elements[index++] = i; } }); } }
public SparseIntSet(IntSet S) throws IllegalArgumentException { if (S == null) { throw new IllegalArgumentException("S == null"); } if (S instanceof SparseIntSet) { cloneState((SparseIntSet) S); } else { elements = new int[S.size()]; size = S.size(); S.foreach(new IntSetAction() { private int index = 0; @Override public void act(int i) { elements[index++] = i; } }); } }
public SparseLongSet(IntSet S) throws IllegalArgumentException { if (S == null) { throw new IllegalArgumentException("S == null"); } if (S instanceof SparseLongSet) { cloneState((SparseLongSet) S); } else { elements = new long[S.size()]; size = S.size(); S.foreach(new IntSetAction() { private int index = 0; @Override public void act(int i) { elements[index++] = i; } }); } }
@Override public void removeOutgoingEdges(T node) throws IllegalArgumentException { final int number = nodeManager.getNumber(node); if (number < 0) { throw new IllegalArgumentException("node not in graph: " + node); } IntSet succ = successors.getRelated(number); if (succ != null) { succ.foreach(x -> predecessors.remove(x, number)); } successors.removeAll(number); hasSuccessor.clear(number); }
@Override public void removeOutgoingEdges(T node) throws IllegalArgumentException { final int number = nodeManager.getNumber(node); if (number < 0) { throw new IllegalArgumentException("node not in graph: " + node); } IntSet succ = successors.getRelated(number); if (succ != null) { succ.foreach(x -> predecessors.remove(x, number)); } successors.removeAll(number); hasSuccessor.clear(number); }
@Override public void removeOutgoingEdges(T node) throws IllegalArgumentException { final int number = nodeManager.getNumber(node); if (number < 0) { throw new IllegalArgumentException("node not in graph: " + node); } IntSet succ = successors.getRelated(number); if (succ != null) { succ.foreach(x -> predecessors.remove(x, number)); } successors.removeAll(number); hasSuccessor.clear(number); }
/** * Flow function composition * * @return { (x, z) | (x, y) \in g, (y, z) \in f } */ private static IUnaryFlowFunction compose(final IUnaryFlowFunction f, final IUnaryFlowFunction g) { return d1 -> { final MutableSparseIntSet set = MutableSparseIntSet.makeEmpty(); g.getTargets(d1).foreach(x -> set.addAll(f.getTargets(x))); return set; }; }
@Override public void removeIncomingEdges(T node) throws IllegalArgumentException { final int number = nodeManager.getNumber(node); if (number < 0) { throw new IllegalArgumentException("node not in graph: " + node); } IntSet pred = predecessors.getRelated(number); if (pred != null) { pred.foreach(x -> { successors.remove(x, number); if (successors.getRelatedCount(x) == 0) { hasSuccessor.clear(x); } }); } predecessors.removeAll(number); }
@Override public void removeIncomingEdges(T node) throws IllegalArgumentException { final int number = nodeManager.getNumber(node); if (number < 0) { throw new IllegalArgumentException("node not in graph: " + node); } IntSet pred = predecessors.getRelated(number); if (pred != null) { pred.foreach(x -> { successors.remove(x, number); if (successors.getRelatedCount(x) == 0) { hasSuccessor.clear(x); } }); } predecessors.removeAll(number); }
@Override public void removeIncomingEdges(T node) throws IllegalArgumentException { final int number = nodeManager.getNumber(node); if (number < 0) { throw new IllegalArgumentException("node not in graph: " + node); } IntSet pred = predecessors.getRelated(number); if (pred != null) { pred.foreach(x -> { successors.remove(x, number); if (successors.getRelatedCount(x) == 0) { hasSuccessor.clear(x); } }); } predecessors.removeAll(number); }
@Override public void removeAllIncidentEdges(T node) throws IllegalArgumentException { final int number = nodeManager.getNumber(node); if (number < 0) { throw new IllegalArgumentException("node not in graph: " + node); } IntSet succ = successors.getRelated(number); if (succ != null) { succ.foreach(x -> predecessors.remove(x, number)); } IntSet pred = predecessors.getRelated(number); if (pred != null) { pred.foreach(x -> { successors.remove(x, number); if (successors.getRelatedCount(x) == 0) { hasSuccessor.clear(x); } }); } successors.removeAll(number); hasSuccessor.clear(number); predecessors.removeAll(number); }
@Override public Iterator<T> iterateNodes(IntSet s) { final MutableIntSet os = IntSetUtil.make(); final MutableIntSet es = IntSetUtil.make(); s.foreach(x -> { if (x <= original.getMaxNumber()) { os.add(x); } else { es.add(x - original.getMaxNumber() - 1); } }); return new CompoundIterator<>(original.iterateNodes(os), additionalNodes.iterateNodes(es)); }
@Override public Iterator<T> iterateNodes(IntSet s) { final MutableIntSet os = IntSetUtil.make(); final MutableIntSet es = IntSetUtil.make(); s.foreach(x -> { if (x <= original.getMaxNumber()) { os.add(x); } else { es.add(x - original.getMaxNumber() - 1); } }); return new CompoundIterator<>(original.iterateNodes(os), additionalNodes.iterateNodes(es)); }
@Override public Iterator<T> iterateNodes(IntSet s) { final MutableIntSet os = IntSetUtil.make(); final MutableIntSet es = IntSetUtil.make(); s.foreach(x -> { if (x <= original.getMaxNumber()) { os.add(x); } else { es.add(x - original.getMaxNumber() - 1); } }); return new CompoundIterator<>(original.iterateNodes(os), additionalNodes.iterateNodes(es)); }
private Collection<Statement> findTargetStatement(CallGraph CG) { final Collection<Statement> ss = HashSetFactory.make(); for(CGNode n : getNodes(CG, "suffix:_slice_target_fn")) { for(CGNode caller : Iterator2Iterable.make(CG.getPredNodes(n))) { for(CallSiteReference site : Iterator2Iterable.make(CG.getPossibleSites(caller, n))) { caller.getIR().getCallInstructionIndices(site).foreach(x -> ss.add(new NormalStatement(caller, x))); } } } return ss; } }