From 54b8d58ee491cb73ca8294fc063f484bc8b2fbce Mon Sep 17 00:00:00 2001 From: jjenista Date: Tue, 25 Oct 2011 22:34:55 +0000 Subject: [PATCH] def reach coming along --- .../Disjoint/DefiniteReachAnalysis.java | 5 +-- .../Analysis/Disjoint/DefiniteReachState.java | 10 ++++-- .../Analysis/Disjoint/DisjointAnalysis.java | 34 ++++++++++++++++--- Robust/src/Analysis/Disjoint/ReachGraph.java | 15 ++++++-- 4 files changed, 52 insertions(+), 12 deletions(-) diff --git a/Robust/src/Analysis/Disjoint/DefiniteReachAnalysis.java b/Robust/src/Analysis/Disjoint/DefiniteReachAnalysis.java index 0ebfbdd2..6477a8f5 100644 --- a/Robust/src/Analysis/Disjoint/DefiniteReachAnalysis.java +++ b/Robust/src/Analysis/Disjoint/DefiniteReachAnalysis.java @@ -51,9 +51,10 @@ public class DefiniteReachAnalysis { TempDescriptor x, FieldDescriptor f, TempDescriptor y, - Set edgeKeysRemoved ) { + Set edgeKeysRemoved, + Set edgeKeysAdded ) { DefiniteReachState state = makeIn( fn ); - state.store( x, f, y, edgeKeysRemoved ); + state.store( x, f, y, edgeKeysRemoved, edgeKeysAdded ); fn2state.put( fn, state ); } diff --git a/Robust/src/Analysis/Disjoint/DefiniteReachState.java b/Robust/src/Analysis/Disjoint/DefiniteReachState.java index 710a6954..8006656b 100644 --- a/Robust/src/Analysis/Disjoint/DefiniteReachState.java +++ b/Robust/src/Analysis/Disjoint/DefiniteReachState.java @@ -135,6 +135,7 @@ public class DefiniteReachState { TempDescriptor y, FieldDescriptor f, Set edgeKeysForLoad ) { + loadR( x, y, f, edgeKeysForLoad ); // Rs' := (Rs - ) U {} //Rs.put( x, DefReachKnown.UNKNOWN ); @@ -143,8 +144,10 @@ public class DefiniteReachState { public void store( TempDescriptor x, FieldDescriptor f, TempDescriptor y, - Set edgeKeysRemoved ) { - storeR( x, f, y, edgeKeysRemoved ); + Set edgeKeysRemoved, + Set edgeKeysAdded ) { + + storeR( x, f, y, edgeKeysRemoved, edgeKeysAdded ); // Rs' := Rs } @@ -246,7 +249,8 @@ public class DefiniteReachState { public void storeR( TempDescriptor x, FieldDescriptor f, TempDescriptor y, - Set edgeKeysRemoved ) { + Set edgeKeysRemoved, + Set edgeKeysAdded ) { // I think this should be if there is ANY ->e' IN Eremove, then kill all // R' := (R - {->e | ->e in R, A->e' in R, e' notin Eremove}) U // {->e | e in E(x) x {f} x E(y)} diff --git a/Robust/src/Analysis/Disjoint/DisjointAnalysis.java b/Robust/src/Analysis/Disjoint/DisjointAnalysis.java index 176bba26..6bde8d8d 100644 --- a/Robust/src/Analysis/Disjoint/DisjointAnalysis.java +++ b/Robust/src/Analysis/Disjoint/DisjointAnalysis.java @@ -1304,6 +1304,7 @@ public class DisjointAnalysis implements HeapAnalysis { Set edgeKeysForLoad; Set edgeKeysRemoved; + Set edgeKeysAdded; //Stores the flatnode's reach graph at enter ReachGraph rgOnEnter = new ReachGraph(); @@ -1487,8 +1488,10 @@ public class DisjointAnalysis implements HeapAnalysis { boolean strongUpdate = false; edgeKeysRemoved = null; + edgeKeysAdded = null; if( doDefiniteReachAnalysis ) { edgeKeysRemoved = new HashSet(); + edgeKeysAdded = new HashSet(); } // before transfer func, possibly inject @@ -1514,10 +1517,19 @@ public class DisjointAnalysis implements HeapAnalysis { if( shouldAnalysisTrack(fld.getType() ) ) { // transfer func - strongUpdate = rg.assignTempXFieldFEqualToTempY(lhs, fld, rhs, fn, edgeKeysRemoved); - + strongUpdate = rg.assignTempXFieldFEqualToTempY( lhs, + fld, + rhs, + fn, + edgeKeysRemoved, + edgeKeysAdded ); if( doDefiniteReachAnalysis ) { - definiteReachAnalysis.store( fn, lhs, fld, rhs, edgeKeysRemoved ); + definiteReachAnalysis.store( fn, + lhs, + fld, + rhs, + edgeKeysRemoved, + edgeKeysAdded ); } } @@ -1588,8 +1600,10 @@ public class DisjointAnalysis implements HeapAnalysis { fdElement = getArrayField(tdElement); edgeKeysRemoved = null; + edgeKeysAdded = null; if( doDefiniteReachAnalysis ) { edgeKeysRemoved = new HashSet(); + edgeKeysAdded = new HashSet(); } // before transfer func, possibly inject @@ -1617,11 +1631,21 @@ public class DisjointAnalysis implements HeapAnalysis { // transfer func, BUT // skip this node if it cannot create new reachability paths if( !arrayReferencees.doesNotCreateNewReaching(fsen) ) { - rg.assignTempXFieldFEqualToTempY(lhs, fdElement, rhs, fn, edgeKeysRemoved); + rg.assignTempXFieldFEqualToTempY( lhs, + fdElement, + rhs, + fn, + edgeKeysRemoved, + edgeKeysAdded ); } if( doDefiniteReachAnalysis ) { - definiteReachAnalysis.store( fn, lhs, fdElement, rhs, edgeKeysRemoved ); + definiteReachAnalysis.store( fn, + lhs, + fdElement, + rhs, + edgeKeysRemoved, + edgeKeysAdded ); } } diff --git a/Robust/src/Analysis/Disjoint/ReachGraph.java b/Robust/src/Analysis/Disjoint/ReachGraph.java index 8d5038c0..d231593b 100644 --- a/Robust/src/Analysis/Disjoint/ReachGraph.java +++ b/Robust/src/Analysis/Disjoint/ReachGraph.java @@ -426,7 +426,8 @@ public class ReachGraph { fdStringBytesField, tdStrLiteralBytes, null, - null); + null, + null ); } @@ -593,7 +594,8 @@ public class ReachGraph { FieldDescriptor f, TempDescriptor y, FlatNode currentProgramPoint, - Set edgeKeysRemoved + Set edgeKeysRemoved, + Set edgeKeysAdded ) { VariableNode lnX = getVariableNodeFromTemp(x); @@ -716,6 +718,15 @@ public class ReachGraph { continue; } + // for definite reach analysis only + if( edgeKeysAdded != null ) { + assert f != null; + edgeKeysAdded.add( new EdgeKey( hrnX.getID(), + hrnY.getID(), + f ) + ); + } + // prepare the new reference edge hrnX.f -> hrnY TypeDescriptor tdNewEdge = mostSpecificType(y.getType(), -- 2.34.1