@Override public HeapGraph<InstanceKey> getHeapGraph() { if (heapGraph == null) { heapGraph = new BasicHeapGraph<>(this, cg); } return heapGraph; }
@Override public int getMaxNumber() { return getNumberOfNodes() - 1; }
@Override public boolean containsNode(Object n) { return getNumber(n) != -1; }
@Override public String toString() { StringBuilder result = new StringBuilder(); result.append("Nodes:\n"); for (int i = 0; i <= getMaxNumber(); i++) { Object node = getNode(i); if (node != null) { result.append(i).append(" ").append(node).append('\n'); } } result.append("Edges:\n"); for (int i = 0; i <= getMaxNumber(); i++) { Object node = getNode(i); if (node != null) { result.append(i).append(" -> "); for (Object s : Iterator2Iterable.make(getSuccNodes(node))) { result.append(getNumber(s)).append(' '); } result.append('\n'); } } return result.toString(); }
/** * @return R, y \in R(x,y) if the node y is a predecessor of node x */ private IBinaryNaturalRelation computePredecessors(NumberedNodeManager<Object> nodeManager) { BasicNaturalRelation R = new BasicNaturalRelation(new byte[] { BasicNaturalRelation.SIMPLE }, BasicNaturalRelation.SIMPLE); // we split the following loops to improve temporal locality, // particularly for locals computePredecessorsForNonLocals(nodeManager, R); computePredecessorsForLocals(nodeManager, R); return R; }
/** * traverse locals in order, first by node, then by value number: attempt to improve locality */ private void computePredecessorsForLocals(NumberedNodeManager<Object> nodeManager, BasicNaturalRelation R) { ArrayList<LocalPointerKey> list = new ArrayList<>(); for (Object n : nodeManager) { if (n instanceof LocalPointerKey) { list.add((LocalPointerKey) n); } } Object[] arr = list.toArray(); Arrays.sort(arr, new LocalPointerComparator()); for (int i = 0; i < arr.length; i++) { if (VERBOSE) { if (i % VERBOSE_INTERVAL == 0) { System.err.println("Building HeapGraph: " + i + " of " + arr.length); } } LocalPointerKey n = (LocalPointerKey) arr[i]; int num = nodeManager.getNumber(n); int[] succ = computeSuccNodeNumbers(n, nodeManager); if (succ != null) { for (int j : succ) { R.add(j, num); } } } }
private OrdinalSetMapping<PointerKey> getPointerKeys() { MutableMapping<PointerKey> result = MutableMapping.make(); for (PointerKey p : getPointerAnalysis().getPointerKeys()) { result.add(p); } return result; }
@Override public boolean mayBeLive(CGNode allocMethod, int allocPC, CGNode m, int instructionIndex) throws IllegalArgumentException, WalaException { if (allocMethod == null) { throw new IllegalArgumentException("allocMethod == null"); } NewSiteReference site = TrivialMethodEscape.findAlloc(allocMethod, allocPC); InstanceKey ik = heapGraph.getHeapModel().getInstanceKeyForAllocation(allocMethod, site); return mayBeLive(ik, m, instructionIndex); }
private void computePredecessorsForNonLocals(NumberedNodeManager<Object> nodeManager, BasicNaturalRelation R) { // Note: we run this loop backwards on purpose, to avoid lots of resizing of // bitvectors // in the backing relation. i.e., we will add the biggest bits first. // pretty damn tricky. for (int i = nodeManager.getMaxNumber(); i >= 0; i--) { if (VERBOSE) { if (i % VERBOSE_INTERVAL == 0) { System.err.println("Building HeapGraph: " + i); } } Object n = nodeManager.getNode(i); if (!(n instanceof LocalPointerKey)) { int[] succ = computeSuccNodeNumbers(n, nodeManager); if (succ != null) { for (int j : succ) { R.add(j, i); } } } } }
@Override public String toString() { StringBuilder result = new StringBuilder(); result.append("Nodes:\n"); for (int i = 0; i <= getMaxNumber(); i++) { Object node = getNode(i); if (node != null) { result.append(i).append(" ").append(node).append('\n'); } } result.append("Edges:\n"); for (int i = 0; i <= getMaxNumber(); i++) { Object node = getNode(i); if (node != null) { result.append(i).append(" -> "); for (Object s : Iterator2Iterable.make(getSuccNodes(node))) { result.append(getNumber(s)).append(' '); } result.append('\n'); } } return result.toString(); }
@Override public HeapGraph<InstanceKey> getHeapGraph() { if (heapGraph == null) { heapGraph = new BasicHeapGraph<>(this, cg); } return heapGraph; }
/** * @return R, y \in R(x,y) if the node y is a predecessor of node x */ private IBinaryNaturalRelation computePredecessors(NumberedNodeManager<Object> nodeManager) { BasicNaturalRelation R = new BasicNaturalRelation(new byte[] { BasicNaturalRelation.SIMPLE }, BasicNaturalRelation.SIMPLE); // we split the following loops to improve temporal locality, // particularly for locals computePredecessorsForNonLocals(nodeManager, R); computePredecessorsForLocals(nodeManager, R); return R; }
/** * traverse locals in order, first by node, then by value number: attempt to improve locality */ private void computePredecessorsForLocals(NumberedNodeManager<Object> nodeManager, BasicNaturalRelation R) { ArrayList<LocalPointerKey> list = new ArrayList<>(); for (Object n : nodeManager) { if (n instanceof LocalPointerKey) { list.add((LocalPointerKey) n); } } Object[] arr = list.toArray(); Arrays.sort(arr, new LocalPointerComparator()); for (int i = 0; i < arr.length; i++) { if (VERBOSE) { if (i % VERBOSE_INTERVAL == 0) { System.err.println("Building HeapGraph: " + i + " of " + arr.length); } } LocalPointerKey n = (LocalPointerKey) arr[i]; int num = nodeManager.getNumber(n); int[] succ = computeSuccNodeNumbers(n, nodeManager); if (succ != null) { for (int j : succ) { R.add(j, num); } } } }
@Override public int getMaxNumber() { return getNumberOfNodes() - 1; }
@Override public boolean containsNode(Object n) { return getNumber(n) != -1; }
private OrdinalSetMapping<PointerKey> getPointerKeys() { MutableMapping<PointerKey> result = MutableMapping.make(); for (PointerKey p : getPointerAnalysis().getPointerKeys()) { result.add(p); } return result; }
@Override public boolean mayBeLive(CGNode allocMethod, int allocPC, CGNode m, int instructionIndex) throws IllegalArgumentException, WalaException { if (allocMethod == null) { throw new IllegalArgumentException("allocMethod == null"); } NewSiteReference site = TrivialMethodEscape.findAlloc(allocMethod, allocPC); InstanceKey ik = heapGraph.getHeapModel().getInstanceKeyForAllocation(allocMethod, site); return mayBeLive(ik, m, instructionIndex); }
private void computePredecessorsForNonLocals(NumberedNodeManager<Object> nodeManager, BasicNaturalRelation R) { // Note: we run this loop backwards on purpose, to avoid lots of resizing of // bitvectors // in the backing relation. i.e., we will add the biggest bits first. // pretty damn tricky. for (int i = nodeManager.getMaxNumber(); i >= 0; i--) { if (VERBOSE) { if (i % VERBOSE_INTERVAL == 0) { System.err.println("Building HeapGraph: " + i); } } Object n = nodeManager.getNode(i); if (!(n instanceof LocalPointerKey)) { int[] succ = computeSuccNodeNumbers(n, nodeManager); if (succ != null) { for (int j : succ) { R.add(j, i); } } } } }
public HeapGraph getHeapGraph() { if (heapGraph == null) { heapGraph = new BasicHeapGraph<>(getPointerAnalysis(), cg); } return heapGraph; }
public HeapGraph getHeapGraph() { if (heapGraph == null) { heapGraph = new BasicHeapGraph<>(getPointerAnalysis(), cg); } return heapGraph; }