-package Analysis.DisjointAnalysis;
+package Analysis.Disjoint;
import IR.*;
import IR.Flat.*;
-package Analysis.DisjointAnalysis;
+package Analysis.Disjoint;
import IR.*;
import IR.Flat.*;
-package Analysis.DisjointAnalysis;
+package Analysis.Disjoint;
public class CanonicalWrapper {
Canonical a;
-package Analysis.DisjointAnalysis;
+package Analysis.Disjoint;
import IR.*;
import IR.Flat.*;
-package Analysis.DisjointAnalysis;
+package Analysis.Disjoint;
import IR.*;
import IR.Flat.*;
ReachGraph rg = analyzeMethod( d );
ReachGraph rgPrev = getPartial( d );
+
if( !rg.equals( rgPrev ) ) {
setPartial( d, rg );
flatm,
fn,
returnNodesToCombineForCompleteReachabilityGraph,
- og);
+ og);
*/
/*
-package Analysis.DisjointAnalysis;
+package Analysis.Disjoint;
import IR.*;
import IR.Flat.*;
protected static final TempDescriptor tdReturn = new TempDescriptor( "_Return___" );
- /*
// some frequently used reachability constants
- protected static final ReachState rstateEmpty = new ReachTupleSet().makeCanonical();
+ protected static final ReachState rstateEmpty = new ReachState().makeCanonical();
protected static final ReachSet rsetEmpty = new ReachSet().makeCanonical();
protected static final ReachSet rsetWithEmptyState = new ReachSet( rstateEmpty ).makeCanonical();
public Hashtable<TempDescriptor, VariableNode > td2vn;
public HashSet<AllocSite> allocSites;
- */
+
// use to disable improvements for comparison
protected static final boolean DISABLE_STRONG_UPDATES = false;
// use a beta that has everything and put it all over the
// parameter model, then use a global sweep later to fix
// it up, since parameters can have different shapes
- ReachState tts0 = new ReachTupleSet( ttPrimary ).makeCanonical();
+ ReachState tts0 = new ReachState( ttPrimary ).makeCanonical();
ReachSet betaSoup;
if( createSecondaryRegion ) {
- ReachState tts1 = new ReachTupleSet( ttSecondary ).makeCanonical();
- ReachState tts2 = new ReachTupleSet( ttPrimary ).makeCanonical().union( ttSecondary );
+ ReachState tts1 = new ReachState( ttSecondary ).makeCanonical();
+ ReachState tts2 = new ReachState( ttPrimary ).makeCanonical().union( ttSecondary );
betaSoup = ReachSet.factory( tts0 ).union( tts1 ).union( tts2 );
} else {
betaSoup = ReachSet.factory( tts0 );
ReachTuple.ARITY_ONE ).makeCanonical();
- ReachState tts0 = new ReachTupleSet( ttPrimary ).makeCanonical();
- ReachState tts1 = new ReachTupleSet( ttAliased ).makeCanonical();
- ReachState tts2 = new ReachTupleSet( ttPrimary ).makeCanonical().union( ttAliased );
+ ReachState tts0 = new ReachState( ttPrimary ).makeCanonical();
+ ReachState tts1 = new ReachState( ttAliased ).makeCanonical();
+ ReachState tts2 = new ReachState( ttPrimary ).makeCanonical().union( ttAliased );
ReachSet betaSoup = ReachSet.factory( tts0 ).union( tts1 ).union( tts2 );
false, // multi-object
ReachTuple.ARITY_ONE ).makeCanonical();
- ReachState ttsI = new ReachTupleSet( ttPrimaryI ).makeCanonical();
- ReachState ttsA = new ReachTupleSet( ttAliased ).makeCanonical();
- ReachState ttsIA = new ReachTupleSet( ttPrimaryI ).makeCanonical().union( ttAliased );
+ ReachState ttsI = new ReachState( ttPrimaryI ).makeCanonical();
+ ReachState ttsA = new ReachState( ttAliased ).makeCanonical();
+ ReachState ttsIA = new ReachState( ttPrimaryI ).makeCanonical().union( ttAliased );
ReachSet betaSoup = ReachSet.factory( ttsI ).union( ttsA ).union( ttsIA );
false, // multi-object
ReachTuple.ARITY_ONE ).makeCanonical();
- ReachState ttsJ = new ReachTupleSet( ttPrimaryJ ).makeCanonical();
+ ReachState ttsJ = new ReachState( ttPrimaryJ ).makeCanonical();
ReachState ttsIJ = ttsI.union( ttsJ );
ReachState ttsAJ = ttsA.union( ttsJ );
ReachState ttsIAJ = ttsIA.union( ttsJ );
ReachSet callerReachabilityNew = new ReachSet().makeCanonical();
// for initializing structures in this method
- ReachState ttsEmpty = new ReachTupleSet().makeCanonical();
+ ReachState ttsEmpty = new ReachState().makeCanonical();
// use this to construct a change set if required; the idea is to
// map every partially rewritten token tuple set to the set of
// caller-context token tuple sets that were used to generate it
- Hashtable<ReachState, HashSet<ReachTupleSet> > rewritten2source =
- new Hashtable<ReachState, HashSet<ReachTupleSet> >();
+ Hashtable<ReachState, HashSet<ReachState> > rewritten2source =
+ new Hashtable<ReachState, HashSet<ReachState> >();
rewritten2source.put( ttsEmpty, new HashSet<ReachState>() );
} else {
// otherwise there's no need for a rewrite, just pass this one on
- ReachState ttsCaller = new ReachTupleSet( ttCallee ).makeCanonical();
+ ReachState ttsCaller = new ReachState( ttCallee ).makeCanonical();
ttCalleeRewrites = new ReachSet( ttsCaller ).makeCanonical();
}
while( stateItr.hasNext() ) {
ReachState ttsOld = stateItr.next();
- ReachState markedTokens = new ReachTupleSet().makeCanonical();
+ ReachState markedTokens = new ReachState().makeCanonical();
Iterator<ReachTuple> ttItr = ttsOld.iterator();
while( ttItr.hasNext() ) {
// remove all marked tokens and establish a change set that should
// propagate backwards over edges from this node
- ReachState ttsPruned = new ReachTupleSet().makeCanonical();
+ ReachState ttsPruned = new ReachState().makeCanonical();
ttItr = ttsOld.iterator();
while( ttItr.hasNext() ) {
ReachTuple ttOld = ttItr.next();
--- /dev/null
+package Analysis.Disjoint;
+
+public class ReachOperation {
+ Canonical a;
+ Canonical b;
+ public Canonical c;
+
+ public ReachOperation(Canonical a, Canonical b) {
+ assert a.canonicalvalue!=0;
+ assert b.canonicalvalue!=0;
+ this.a=a;
+ this.b=b;
+ }
+
+ public int hashCode() {
+ return a.canonicalvalue^(b.canonicalvalue<<1);
+ }
+ public boolean equals(Object o) {
+ ReachOperation ro=(ReachOperation)o;
+ return ro.a.canonicalvalue==a.canonicalvalue&&
+ ro.b.canonicalvalue==b.canonicalvalue;
+ }
+}
\ No newline at end of file
-package Analysis.DisjointAnalysis;
+package Analysis.Disjoint;
import IR.*;
import IR.Flat.*;
Iterator itr = iterator();
while( itr.hasNext() ) {
- ReachState ttsThis = (ReachTupleSet) itr.next();
+ ReachState ttsThis = (ReachState) itr.next();
if( ttsThis.containsWithZeroes(tts) ) {
return true;
}
Iterator itr = iterator();
while( itr.hasNext() ) {
- ReachState ttsThis = (ReachTupleSet) itr.next();
+ ReachState ttsThis = (ReachState) itr.next();
if( strict ) {
if( !tts.equals(ttsThis) && tts.isSubset(ttsThis) ) {
return true;
public boolean containsTuple(ReachTuple tt) {
Iterator itr = iterator();
while( itr.hasNext() ) {
- ReachState tts = (ReachTupleSet) itr.next();
+ ReachState tts = (ReachState) itr.next();
if( tts.containsTuple(tt) ) {
return true;
}
public boolean containsTupleSetWithBoth(ReachTuple tt1, ReachTuple tt2) {
Iterator itr = iterator();
while( itr.hasNext() ) {
- ReachState tts = (ReachTupleSet) itr.next();
+ ReachState tts = (ReachState) itr.next();
if( tts.containsTuple(tt1) && tts.containsTuple(tt2) ) {
return true;
}
ReachSet rsOut = new ReachSet();
Iterator i = this.iterator();
while( i.hasNext() ) {
- ReachState tts = (ReachTupleSet) i.next();
+ ReachState tts = (ReachState) i.next();
if( rsIn.possibleReachabilities.contains(tts) ) {
rsOut.possibleReachabilities.add(tts);
}
Iterator i = this.iterator();
while( i.hasNext() ) {
- ReachState tts = (ReachTupleSet) i.next();
+ ReachState tts = (ReachState) i.next();
if( tts.containsTuple( ttB ) ) {
rsOut.possibleReachabilities.add( tts.remove(ttA) );
} else {
Iterator i = this.iterator();
while( i.hasNext() ) {
- ReachState tts = (ReachTupleSet) i.next();
+ ReachState tts = (ReachState) i.next();
boolean changeFound = false;
Iterator itrO = this.iterator();
while( itrO.hasNext() ) {
- ReachState o = (ReachTupleSet) itrO.next();
+ ReachState o = (ReachState) itrO.next();
Iterator itrR = rsIn.iterator();
while( itrR.hasNext() ) {
- ReachState r = (ReachTupleSet) itrR.next();
+ ReachState r = (ReachState) itrR.next();
- ReachState theUnion = new ReachTupleSet().makeCanonical();
+ ReachState theUnion = new ReachState().makeCanonical();
Iterator itrRelement = r.iterator();
while( itrRelement.hasNext() ) {
Iterator itrS = this.iterator();
while( itrS.hasNext() ) {
- ReachState tts = (ReachTupleSet) itrS.next();
+ ReachState tts = (ReachState) itrS.next();
rsOut.possibleReachabilities.add(tts.ageTokens(as) );
}
Iterator itrS = this.iterator();
while( itrS.hasNext() ) {
- ReachState tts = (ReachTupleSet) itrS.next();
+ ReachState tts = (ReachState) itrS.next();
rsOut.possibleReachabilities.add(tts.unshadowTokens(as) );
}
Iterator itrS = this.iterator();
while( itrS.hasNext() ) {
- ReachState tts = (ReachTupleSet) itrS.next();
+ ReachState tts = (ReachState) itrS.next();
rsOut.possibleReachabilities.add(tts.toShadowTokens(as) );
}
Iterator itrB = this.iterator();
while( itrB.hasNext() ) {
- ReachState ttsB = (ReachTupleSet) itrB.next();
+ ReachState ttsB = (ReachState) itrB.next();
boolean subsetExists = false;
Iterator itrA = rsIn.iterator();
while( itrA.hasNext() && !subsetExists ) {
- ReachState ttsA = (ReachTupleSet) itrA.next();
+ ReachState ttsA = (ReachState) itrA.next();
if( ttsA.isSubset(ttsB) ) {
subsetExists = true;
if( numDimensions > 3 ) {
// for problems that are too big, punt and use less
// precise arity for reachability information
- ReachState ttsImprecise = new ReachTupleSet().makeCanonical();
+ ReachState ttsImprecise = new ReachState().makeCanonical();
Iterator<ReachState> itrThis = this.iterator();
while( itrThis.hasNext() ) {
while( digits[numDimensions] == minArity ) {
// spit out a "coordinate" made from these digits
- ReachState ttsCoordinate = new ReachTupleSet().makeCanonical();
+ ReachState ttsCoordinate = new ReachState().makeCanonical();
Iterator<ReachState> ttsItr = this.iterator();
for( int i = 0; i < numDimensions; ++i ) {
assert ttsItr.hasNext();
-package Analysis.DisjointAnalysis;
+package Analysis.Disjoint;
import IR.*;
import IR.Flat.*;
tokenTuples.add(tt);
}
- public ReachState(ReachTupleSet tts) {
+ public ReachState(ReachState tts) {
assert tts != null;
// okay to clone, ReachTuple and ReachState should be canonical
tokenTuples = (HashSet<ReachTuple>)tts.tokenTuples.clone();
if (unionhash.containsKey(ro))
return (ReachState) unionhash.get(ro).c;
else {
- ReachState ttsOut = new ReachTupleSet(this);
+ ReachState ttsOut = new ReachState(this);
ttsOut.tokenTuples.add(ttIn);
ro.c=ttsOut=ttsOut.makeCanonical();
unionhash.put(ro,ro);
}
}
- public ReachState union(ReachTupleSet ttsIn) {
+ public ReachState union(ReachState ttsIn) {
assert ttsIn != null;
ReachOperation ro=new ReachOperation(this, ttsIn);
if (unionhash.containsKey(ro)) {
return (ReachState) unionhash.get(ro).c;
} else {
- ReachState ttsOut = new ReachTupleSet(this);
+ ReachState ttsOut = new ReachState(this);
ttsOut.tokenTuples.addAll(ttsIn.tokenTuples);
ro.c=ttsOut=ttsOut.makeCanonical();
unionhash.put(ro,ro);
}
- public ReachState unionUpArity(ReachTupleSet ttsIn) {
+ public ReachState unionUpArity(ReachState ttsIn) {
assert ttsIn != null;
- ReachState ttsOut = new ReachTupleSet();
+ ReachState ttsOut = new ReachState();
Iterator<ReachTuple> ttItr = this.iterator();
while( ttItr.hasNext() ) {
public ReachState remove(ReachTuple tt) {
assert tt != null;
- ReachState ttsOut = new ReachTupleSet(this);
+ ReachState ttsOut = new ReachState(this);
ttsOut.tokenTuples.remove(tt);
return ttsOut.makeCanonical();
}
return false;
}
- ReachState tts = (ReachTupleSet) o;
+ ReachState tts = (ReachState) o;
return tokenTuples.equals(tts.tokenTuples);
}
public ReachState ageTokens(AllocSite as) {
assert as != null;
- ReachState ttsOut = new ReachTupleSet();
+ ReachState ttsOut = new ReachState();
ReachTuple ttSummary = null;
ReachTuple ttOldest = null;
public ReachState unshadowTokens(AllocSite as) {
assert as != null;
- ReachState ttsOut = new ReachTupleSet();
+ ReachState ttsOut = new ReachState();
ReachTuple ttSummary = null;
ReachTuple ttShadowSummary = null;
public ReachState toShadowTokens(AllocSite as) {
assert as != null;
- ReachState ttsOut = new ReachTupleSet().makeCanonical();
+ ReachState ttsOut = new ReachState().makeCanonical();
Iterator itrT = this.iterator();
while( itrT.hasNext() ) {
public ReachSet rewriteToken(ReachTuple tokenToRewrite,
ReachSet replacements,
boolean makeChangeSet,
- Hashtable<ReachState, HashSet<ReachTupleSet> > forChangeSet) {
+ Hashtable<ReachState, HashSet<ReachState> > forChangeSet) {
ReachSet rsOut = new ReachSet().makeCanonical();
rsOut = rsOut.add(this);
} else {
- ReachState ttsMinusToken = new ReachTupleSet(this);
+ ReachState ttsMinusToken = new ReachState(this);
ttsMinusToken.tokenTuples.remove(tokenToRewrite);
Iterator<ReachState> replaceItr = replacements.iterator();
while( replaceItr.hasNext() ) {
ReachState replacement = replaceItr.next();
- ReachState replaced = new ReachTupleSet(ttsMinusToken).makeCanonical();
+ ReachState replaced = new ReachState(ttsMinusToken).makeCanonical();
replaced = replaced.unionUpArity(replacement);
rsOut = rsOut.add(replaced);
public ReachState makeArityZeroOrMore() {
- ReachState ttsOut = new ReachTupleSet().makeCanonical();
+ ReachState ttsOut = new ReachState().makeCanonical();
Iterator<ReachTuple> itrThis = this.iterator();
while( itrThis.hasNext() ) {
-package Analysis.DisjointAnalysis;
+package Analysis.Disjoint;
import IR.*;
import IR.Flat.*;
-package Analysis.DisjointAnalysis;
+package Analysis.Disjoint;
import IR.*;
import IR.Flat.*;
protected ReachSet beta;
protected ReachSet betaNew;
- protected ReferenceSourceNode src;
- protected HeapRegionNode dst;
+ protected RefSrcNode src;
+ protected HeapRegionNode dst;
-
- public RefEdge( ReferenceSourceNode src,
- HeapRegionNode dst,
- TypeDescriptor type,
- String field,
- boolean isInitialParam,
- ReachSet beta ) {
+
+ public RefEdge( RefSrcNode src,
+ HeapRegionNode dst,
+ TypeDescriptor type,
+ String field,
+ boolean isInitialParam,
+ ReachSet beta ) {
assert type != null;
this.src = src;
public RefEdge copy() {
RefEdge copy = new RefEdge( src,
- dst,
- type,
- field,
- isInitialParam,
- beta );
+ dst,
+ type,
+ field,
+ isInitialParam,
+ beta );
return copy;
}
}
- public ReferenceSourceNode getSrc() {
+ public RefSrcNode getSrc() {
return src;
}
- public void setSrc( ReferenceSourceNode rsn ) {
+ public void setSrc( RefSrcNode rsn ) {
assert rsn != null;
src = rsn;
}
}
- public String toGraphEdgeString( boolean hideSubsetReachability,
- boolean hideEdgeTaints ) {
+ public String toGraphEdgeString( boolean hideSubsetReachability ) {
String edgeLabel = "";
- if (type != null) {
+ if( type != null ) {
edgeLabel += type.toPrettyString() + "\\n";
}
- if (field != null) {
+ if( field != null ) {
edgeLabel += field + "\\n";
}
- if (isInitialParam) {
+ if( isInitialParam ) {
edgeLabel += "*init*\\n";
}
- if( !hideEdgeTaints ) {
- edgeLabel += "*taint*=" + Integer.toBinaryString(taintIdentifier)
- + "\\n*SESE*=" + Integer.toBinaryString(SESEtaintIdentifier)
- + "\\n";
- }
-
- edgeLabel += beta.toStringEscapeNewline(hideSubsetReachability);
+ edgeLabel += beta.toStringEscapeNewline( hideSubsetReachability );
return edgeLabel;
}
public String toString() {
- if( type != null ) {
- return new String("("+src+"->"+type.toPrettyString()+" "+field+"->"+dst+")");
- }
-
- return new String("("+src+"->"+type+" "+field+"->"+dst+")");
- }
-
- public void tainedBy(Integer paramIdx){
- int newTaint=(int) Math.pow(2, paramIdx.intValue());
- taintIdentifier=taintIdentifier | newTaint;
- }
-
- public void setTaintIdentifier(int newTaint){
- taintIdentifier=newTaint;
- }
-
- public void unionTaintIdentifier(int newTaint){
- taintIdentifier=taintIdentifier | newTaint;
- }
-
- public void minusTaintIdentifier(int removedTaint){
- taintIdentifier = taintIdentifier & (~removedTaint);
- }
-
- public int getTaintIdentifier(){
- return taintIdentifier;
- }
-
- public int getSESETaintIdentifier(){
- return SESEtaintIdentifier;
- }
-
- public void setSESETaintIdentifier(int newTaint){
- SESEtaintIdentifier=newTaint;
- }
-
- public void unionSESETaintIdentifier(int newTaint){
- SESEtaintIdentifier=SESEtaintIdentifier | newTaint;
- }
-
-
+ assert type != null;
+ return new String( "("+src+
+ "->"+type.toPrettyString()+
+ " "+field+
+ "->"+dst+")"
+ );
+ }
}
-package Analysis.DisjointAnalysis;
+package Analysis.Disjoint;
import IR.*;
import IR.Flat.*;
import java.util.*;
-public abstract class ReferenceSourceNode {
+public abstract class RefSrcNode {
protected HashSet<RefEdge> referencees;
- public ReferenceSourceNode() {
+ public RefSrcNode() {
referencees = new HashSet<RefEdge>();
}
-package Analysis.DisjointAnalysis;
+package Analysis.Disjoint;
import IR.*;
import IR.Flat.*;