@Override public byte evaluate(PointsToSetVariable lhs, PointsToSetVariable rhs) { FilteredPointerKey pk = (FilteredPointerKey) lhs.getPointerKey(); if (DEBUG_FILTER) { String S = "EVAL Filter " + lhs.getPointerKey() + ' ' + rhs.getPointerKey(); S += "\nEVAL " + lhs + ' ' + rhs; System.err.println(S); } if (rhs.size() == 0) { return NOT_CHANGED; } boolean changed = false; FilteredPointerKey.TypeFilter filter = pk.getTypeFilter(); changed = filter.addFiltered(system, lhs, rhs); if (DEBUG_FILTER) { System.err.println("RESULT " + lhs + (changed ? " (changed)" : "")); } return changed ? CHANGED : NOT_CHANGED; }
@Override public byte evaluate(PointsToSetVariable lhs, PointsToSetVariable rhs) { FilteredPointerKey pk = (FilteredPointerKey) lhs.getPointerKey(); if (DEBUG_FILTER) { String S = "EVAL Filter " + lhs.getPointerKey() + ' ' + rhs.getPointerKey(); S += "\nEVAL " + lhs + ' ' + rhs; System.err.println(S); } if (rhs.size() == 0) { return NOT_CHANGED; } boolean changed = false; FilteredPointerKey.TypeFilter filter = pk.getTypeFilter(); changed = filter.addFiltered(system, lhs, rhs); if (DEBUG_FILTER) { System.err.println("RESULT " + lhs + (changed ? " (changed)" : "")); } return changed ? CHANGED : NOT_CHANGED; }
@Override public byte evaluate(PointsToSetVariable lhs, PointsToSetVariable rhs) { FilteredPointerKey pk = (FilteredPointerKey) lhs.getPointerKey(); FilteredPointerKey.TypeFilter filter = pk.getTypeFilter(); boolean debug = false; if (DEBUG_FILTER) { String S = "EVAL InverseFilter/" + filter + ' ' + lhs.getPointerKey() + ' ' + rhs.getPointerKey(); S += "\nEVAL " + lhs + ' ' + rhs; System.err.println(S); } if (rhs.size() == 0) { return NOT_CHANGED; } boolean changed = filter.addInverseFiltered(system, lhs, rhs); if (DEBUG_FILTER) { if (debug) { System.err.println("RESULT " + lhs + (changed ? " (changed)" : "")); } } return changed ? CHANGED : NOT_CHANGED; } }
@Override public byte evaluate(PointsToSetVariable lhs, PointsToSetVariable rhs) { FilteredPointerKey pk = (FilteredPointerKey) lhs.getPointerKey(); FilteredPointerKey.TypeFilter filter = pk.getTypeFilter(); boolean debug = false; if (DEBUG_FILTER) { String S = "EVAL InverseFilter/" + filter + ' ' + lhs.getPointerKey() + ' ' + rhs.getPointerKey(); S += "\nEVAL " + lhs + ' ' + rhs; System.err.println(S); } if (rhs.size() == 0) { return NOT_CHANGED; } boolean changed = filter.addInverseFiltered(system, lhs, rhs); if (DEBUG_FILTER) { if (debug) { System.err.println("RESULT " + lhs + (changed ? " (changed)" : "")); } } return changed ? CHANGED : NOT_CHANGED; } }
private void upgradeTypeFilter(PointsToSetVariable src, PointsToSetVariable dest) { if (src.getPointerKey() instanceof FilteredPointerKey) { FilteredPointerKey fpk = (FilteredPointerKey) src.getPointerKey(); if (dest.getPointerKey() instanceof FilteredPointerKey) { FilteredPointerKey fp = (FilteredPointerKey) dest.getPointerKey(); if (!fp.getTypeFilter().equals(fpk.getTypeFilter())) { Assertions.UNREACHABLE("src " + fpk.getTypeFilter() + " dest " + fp.getTypeFilter()); } } else { upgradeToFilter(dest, fpk.getTypeFilter()); } } }
private void upgradeTypeFilter(PointsToSetVariable src, PointsToSetVariable dest) { if (src.getPointerKey() instanceof FilteredPointerKey) { FilteredPointerKey fpk = (FilteredPointerKey) src.getPointerKey(); if (dest.getPointerKey() instanceof FilteredPointerKey) { FilteredPointerKey fp = (FilteredPointerKey) dest.getPointerKey(); if (!fp.getTypeFilter().equals(fpk.getTypeFilter())) { Assertions.UNREACHABLE("src " + fpk.getTypeFilter() + " dest " + fp.getTypeFilter()); } } else { upgradeToFilter(dest, fpk.getTypeFilter()); } } }
private void upgradeToFilter(PointsToSetVariable p, FilteredPointerKey.TypeFilter typeFilter) { if (p.getPointerKey() instanceof LocalPointerKey) { LocalPointerKey lpk = (LocalPointerKey) p.getPointerKey(); LocalPointerKeyWithFilter f = new LocalPointerKeyWithFilter(lpk.getNode(), lpk.getValueNumber(), typeFilter); p.setPointerKey(f); pointerKeys.replace(lpk, f); } else if (p.getPointerKey() instanceof ReturnValueKey) { ReturnValueKey r = (ReturnValueKey) p.getPointerKey(); ReturnValueKeyWithFilter f = new ReturnValueKeyWithFilter(r.getNode(), typeFilter); p.setPointerKey(f); pointerKeys.replace(r, f); } else { Assertions.UNREACHABLE(p.getPointerKey().getClass().toString()); } }
@Override public String toString() { return "GetField " + getField() + ',' + getFixedSet().getPointerKey(); }
@Override public String toString() { return "GetField " + getField() + ',' + getFixedSet().getPointerKey(); }
private void upgradeToFilter(PointsToSetVariable p, FilteredPointerKey.TypeFilter typeFilter) { if (p.getPointerKey() instanceof LocalPointerKey) { LocalPointerKey lpk = (LocalPointerKey) p.getPointerKey(); LocalPointerKeyWithFilter f = new LocalPointerKeyWithFilter(lpk.getNode(), lpk.getValueNumber(), typeFilter); p.setPointerKey(f); pointerKeys.replace(lpk, f); } else if (p.getPointerKey() instanceof ReturnValueKey) { ReturnValueKey r = (ReturnValueKey) p.getPointerKey(); ReturnValueKeyWithFilter f = new ReturnValueKeyWithFilter(r.getNode(), typeFilter); p.setPointerKey(f); pointerKeys.replace(r, f); } else { Assertions.UNREACHABLE(p.getPointerKey().getClass().toString()); } }
pointsToMap.recordTransitiveRoot(L.getPointerKey()); if (!(L.getPointerKey() instanceof FilteredPointerKey)) { Assertions.UNREACHABLE("expected filtered lhs " + L.getPointerKey() + ' ' + L.getPointerKey().getClass() + ' ' + lhs + ' ' + lhs.getClass());
pointsToMap.recordTransitiveRoot(L.getPointerKey()); if (!(L.getPointerKey() instanceof FilteredPointerKey)) { Assertions.UNREACHABLE("expected filtered lhs " + L.getPointerKey() + ' ' + L.getPointerKey().getClass() + ' ' + lhs + ' ' + lhs.getClass());
/** * did the pointer analysis use a type filter for a given points-to set? (this is ugly). */ @Override public boolean isFiltered(PointerKey key) { if (pointsToMap.isImplicit(key)) { return false; } PointsToSetVariable v = pointsToMap.getPointsToSet(key); if (v == null) { return false; } else { return v.getPointerKey() instanceof FilteredPointerKey; } }
/** * did the pointer analysis use a type filter for a given points-to set? (this is ugly). */ @Override public boolean isFiltered(PointerKey key) { if (pointsToMap.isImplicit(key)) { return false; } PointsToSetVariable v = pointsToMap.getPointsToSet(key); if (v == null) { return false; } else { return v.getPointerKey() instanceof FilteredPointerKey; } }
/** * If p is unified, returns the representative for p. */ public PointsToSetVariable getPointsToSet(PointerKey p) { if (p == null) { throw new IllegalArgumentException("null p"); } if (isImplicit(p)) { throw new IllegalArgumentException("unexpected: shouldn't ask a PointsToMap for an implicit points-to-set: " + p); } int i = pointerKeys.getMappedIndex(p); if (i == -1) { return null; } int repI = uf.find(i); PointsToSetVariable result = (PointsToSetVariable) pointsToSets.get(repI); if (result != null && p instanceof FilteredPointerKey && (!(result.getPointerKey() instanceof FilteredPointerKey))) { upgradeToFilter(result, ((FilteredPointerKey) p).getTypeFilter()); } return result; }
/** * If p is unified, returns the representative for p. */ public PointsToSetVariable getPointsToSet(PointerKey p) { if (p == null) { throw new IllegalArgumentException("null p"); } if (isImplicit(p)) { throw new IllegalArgumentException("unexpected: shouldn't ask a PointsToMap for an implicit points-to-set: " + p); } int i = pointerKeys.getMappedIndex(p); if (i == -1) { return null; } int repI = uf.find(i); PointsToSetVariable result = (PointsToSetVariable) pointsToSets.get(repI); if (result != null && p instanceof FilteredPointerKey && (!(result.getPointerKey() instanceof FilteredPointerKey))) { upgradeToFilter(result, ((FilteredPointerKey) p).getTypeFilter()); } return result; }
recordUnified(pi.getPointerKey()); upgradeTypeFilter(pi, p); recordUnified(pj.getPointerKey()); upgradeTypeFilter(pj, p); if (isTransitiveRoot(pi.getPointerKey()) || isTransitiveRoot(pj.getPointerKey())) { recordTransitiveRoot(p.getPointerKey());
recordUnified(pi.getPointerKey()); upgradeTypeFilter(pi, p); recordUnified(pj.getPointerKey()); upgradeTypeFilter(pj, p); if (isTransitiveRoot(pi.getPointerKey()) || isTransitiveRoot(pj.getPointerKey())) { recordTransitiveRoot(p.getPointerKey());
if (DEBUG_ARRAY_STORE) { PointsToSetVariable val = getFixedSet(); String S = "EVAL ArrayStore " + rhs.getPointerKey() + ' ' + val.getPointerKey(); System.err.println(S); System.err.println("EVAL ArrayStore " + rhs + ' ' + getFixedSet()); PointerKey pVal = val.getPointerKey();
if (DEBUG_ARRAY_STORE) { PointsToSetVariable val = getFixedSet(); String S = "EVAL ArrayStore " + rhs.getPointerKey() + ' ' + val.getPointerKey(); System.err.println(S); System.err.println("EVAL ArrayStore " + rhs + ' ' + getFixedSet()); PointerKey pVal = val.getPointerKey();