From: jjenista Date: Wed, 9 Nov 2011 00:34:10 +0000 (+0000) Subject: def reach has to use PointerMethod to detect CFG edges that the analysis cares about X-Git-Url: http://plrg.eecs.uci.edu/git/?p=IRC.git;a=commitdiff_plain;h=d5efb0a27c071121f4228cc40a93913f4f255b55 def reach has to use PointerMethod to detect CFG edges that the analysis cares about --- diff --git a/Robust/src/Analysis/Disjoint/DefiniteReachAnalysis.java b/Robust/src/Analysis/Disjoint/DefiniteReachAnalysis.java index 00aa4d93..8c1cf8b5 100644 --- a/Robust/src/Analysis/Disjoint/DefiniteReachAnalysis.java +++ b/Robust/src/Analysis/Disjoint/DefiniteReachAnalysis.java @@ -12,6 +12,13 @@ public class DefiniteReachAnalysis { // keep a state of definite reachability analysis for // every program point private Map fn2state; + + private static PointerMethod pm; + + public static void setPointerMethod( PointerMethod pm ) { + DefiniteReachAnalysis.pm = pm; + } + public DefiniteReachAnalysis() { // a class-wide initialization @@ -23,7 +30,7 @@ public class DefiniteReachAnalysis { public void methodEntry( FlatNode fn, Set parameters ) { - DefiniteReachState state = get( fn ); + DefiniteReachState state = makeIn( fn ); state.methodEntry( parameters ); fn2state.put( fn, state ); } @@ -100,17 +107,27 @@ public class DefiniteReachAnalysis { // before the given program point by merging the out // states of the predecessor statements public DefiniteReachState makeIn( FlatNode fn ) { - if( fn.numPrev() == 0 ) { + if( pm.numPrev( fn ) == 0 ) { return new DefiniteReachState(); } - DefiniteReachState stateIn = - new DefiniteReachState( get( fn.getPrev( 0 ) ) ); + DefiniteReachState stateIn = null; - for( int i = 1; i < fn.numPrev(); ++i ) { - stateIn.merge( get( fn.getPrev( i ) ) ); - } + for( int i = 0; i < pm.numPrev( fn ); ++i ) { + if( fn2state.containsKey( pm.getPrev( fn, i ) ) ) { + if( stateIn == null ) { + // duplicate the first partial result we find + stateIn = new DefiniteReachState( get( pm.getPrev( fn, i ) ) ); + } else { + // merge other partial results into the rest + stateIn.merge( get( pm.getPrev( fn, i ) ) ); + } + } + } + + // at least one predecessor was analyzed before this + assert( stateIn != null ); return stateIn; } } diff --git a/Robust/src/Analysis/Disjoint/DisjointAnalysis.java b/Robust/src/Analysis/Disjoint/DisjointAnalysis.java index c5d03684..a27d1df9 100644 --- a/Robust/src/Analysis/Disjoint/DisjointAnalysis.java +++ b/Robust/src/Analysis/Disjoint/DisjointAnalysis.java @@ -726,8 +726,6 @@ public class DisjointAnalysis implements HeapAnalysis { mapDescriptorToReachGraph = new Hashtable(); - pm = new PointerMethod(); - fc2enclosing = new Hashtable(); } @@ -849,8 +847,11 @@ public class DisjointAnalysis implements HeapAnalysis { ReachGraph.debugCallSiteVisitCounter = 0; // count visits from 1, is incremented before first visit + pm = new PointerMethod(); + if( state.DO_DEFINITE_REACH_ANALYSIS ) { doDefiniteReachAnalysis = true; + DefiniteReachAnalysis.setPointerMethod( pm ); definiteReachAnalysis = new DefiniteReachAnalysis(); } diff --git a/Robust/src/Tests/disjoint/definite/makefile b/Robust/src/Tests/disjoint/definite/makefile index 7cebad31..462f41d4 100644 --- a/Robust/src/Tests/disjoint/definite/makefile +++ b/Robust/src/Tests/disjoint/definite/makefile @@ -6,7 +6,7 @@ BUILDSCRIPT=../../../buildscript DISJOINT= -disjoint -disjoint-k 1 -enable-assertions -do-definite-reach-analysis -BSFLAGS= -justanalyze -mainclass $(PROGRAM) -heapsize-mb 1024 -noloop -joptimize -debug +BSFLAGS= -justanalyze -mainclass $(PROGRAM) -heapsize-mb 1024 -noloop -joptimize -debug #-flatirusermethods all: diff --git a/Robust/src/Tests/disjoint/definite/test.java b/Robust/src/Tests/disjoint/definite/test.java index 5970eff5..e3ef1b1f 100644 --- a/Robust/src/Tests/disjoint/definite/test.java +++ b/Robust/src/Tests/disjoint/definite/test.java @@ -18,10 +18,11 @@ public class Test { Foo z = x; while( false ) { + gendefreach QWQ2; z = z.f; } - gendefreach QWQ2; + gendefreach QWQ3; /* gendefreach yn1;