From c43e03b4ce43fbcd03c25a3b471398e3025dec69 Mon Sep 17 00:00:00 2001 From: jjenista Date: Fri, 10 Apr 2009 18:25:09 +0000 Subject: [PATCH] stable, not fully functional --- Robust/src/Analysis/MLP/MLPAnalysis.java | 126 +++++++++++++---------- Robust/src/Tests/mlp/tinyTest/makefile | 4 +- 2 files changed, 73 insertions(+), 57 deletions(-) diff --git a/Robust/src/Analysis/MLP/MLPAnalysis.java b/Robust/src/Analysis/MLP/MLPAnalysis.java index 1f3611ad..f4ca377a 100644 --- a/Robust/src/Analysis/MLP/MLPAnalysis.java +++ b/Robust/src/Analysis/MLP/MLPAnalysis.java @@ -16,10 +16,10 @@ public class MLPAnalysis { private CallGraph callGraph; private OwnershipAnalysis ownAnalysis; - - private Stack seseStack; private Set seseRoots; + private Hashtable< FlatNode, Stack > seseStacks; + private Hashtable< FlatNode, Set > pointResults; @@ -37,9 +37,8 @@ public class MLPAnalysis { this.ownAnalysis = ownAnalysis; // initialize analysis data structures - seseStack = new Stack (); - seseRoots = new HashSet(); - + seseRoots = new HashSet(); + seseStacks = new Hashtable< FlatNode, Stack >(); pointResults = new Hashtable< FlatNode, Set >(); @@ -88,14 +87,21 @@ public class MLPAnalysis { Set flatNodesToVisit = new HashSet(); flatNodesToVisit.add( fm ); - Set visited = new HashSet(); + Set visited = new HashSet(); + + Stack seseStackFirst = new Stack(); + seseStacks.put( fm, seseStackFirst ); while( !flatNodesToVisit.isEmpty() ) { Iterator fnItr = flatNodesToVisit.iterator(); FlatNode fn = fnItr.next(); - System.out.println( " considering "+fn ); + Stack seseStack = seseStacks.get( fn ); + assert seseStack != null; + + //System.out.println( " considering "+fn ); + /* // only analyze sese exit nodes when all the nodes between // it and its matching enter have been analyzed if( !seseStack.empty() && @@ -104,13 +110,14 @@ public class MLPAnalysis { // not ready for this exit node yet, just grab another fn = fnItr.next(); } + */ flatNodesToVisit.remove( fn ); visited.add( fn ); - System.out.println( " visiting "+fn ); + //System.out.println( " visiting "+fn ); - analyzeFlatNode( fn, true, null, null ); + analyzeFlatNodeForward( fn, seseStack ); // initialize for backward computation in next step pointResults.put( fn, new HashSet() ); @@ -120,6 +127,8 @@ public class MLPAnalysis { if( !visited.contains( nn ) ) { flatNodesToVisit.add( nn ); + + seseStacks.put( nn, (Stack)seseStack.clone() ); } } } @@ -148,16 +157,16 @@ public class MLPAnalysis { merge = mergeVSTsets( merge, pointResults.get( nn ) ); } - Set curr = analyzeFlatNode( fn, false, merge, fsen ); + Set curr = analyzeFlatNodeBackward( fn, merge, fsen ); // if a new result, schedule backward nodes for analysis if( !prev.equals( curr ) ) { - System.out.println( " "+fn+":" ); - System.out.println( " prev ="+prev ); - System.out.println( " merge="+merge ); - System.out.println( " curr ="+curr ); - System.out.println( "" ); + //System.out.println( " "+fn+":" ); + //System.out.println( " prev ="+prev ); + //System.out.println( " merge="+merge ); + //System.out.println( " curr ="+curr ); + //System.out.println( "" ); pointResults.put( fn, curr ); @@ -181,37 +190,52 @@ public class MLPAnalysis { } - private Set analyzeFlatNode( FlatNode fn, - boolean buildForest, - Set vstSet, - FlatSESEEnterNode currentSESE ) { - - // use node type to decide what alterations to make - // to the ownership graph + private void analyzeFlatNodeForward( FlatNode fn, + Stack seseStack ) { switch( fn.kind() ) { case FKind.FlatSESEEnterNode: { FlatSESEEnterNode fsen = (FlatSESEEnterNode) fn; - if( buildForest ) { - if( seseStack.empty() ) { - seseRoots.add( fsen ); - } else { - seseStack.peek().addChild( fsen ); - } - seseStack.push( fsen ); - System.out.println( " pushed "+fsen ); + if( seseStack.empty() ) { + seseRoots.add( fsen ); + } else { + seseStack.peek().addChild( fsen ); } + seseStack.push( fsen ); + //System.out.println( " pushed "+fsen ); } break; case FKind.FlatSESEExitNode: { FlatSESEExitNode fsexn = (FlatSESEExitNode) fn; - if( buildForest ) { - assert !seseStack.empty(); - FlatSESEEnterNode fsen = seseStack.pop(); - System.out.println( " popped "+fsen ); + assert !seseStack.empty(); + FlatSESEEnterNode fsen = seseStack.pop(); + //System.out.println( " popped "+fsen ); + } break; + + case FKind.FlatReturnNode: { + FlatReturnNode frn = (FlatReturnNode) fn; + if( !seseStack.empty() ) { + throw new Error( "Error: return statement enclosed within "+seseStack.peek() ); } + } break; + + } + } + + + private Set analyzeFlatNodeBackward( FlatNode fn, + Set vstSet, + FlatSESEEnterNode currentSESE ) { + switch( fn.kind() ) { + + case FKind.FlatSESEEnterNode: { + FlatSESEEnterNode fsen = (FlatSESEEnterNode) fn; + } break; + + case FKind.FlatSESEExitNode: { + FlatSESEExitNode fsexn = (FlatSESEExitNode) fn; //FlatSESEEnterNode fsen = fsexn.getFlatEnter(); //assert fsen == seseStack.pop(); @@ -231,21 +255,20 @@ public class MLPAnalysis { case FKind.FlatSetFieldNode: case FKind.FlatElementNode: case FKind.FlatSetElementNode: { - if( !buildForest ) { - // handle effects of statement in reverse, writes then reads - TempDescriptor [] writeTemps = fn.writesTemps(); - for( int i = 0; i < writeTemps.length; ++i ) { - vstSet = killTemp( vstSet, writeTemps[i] ); - } - TempDescriptor [] readTemps = fn.readsTemps(); - for( int i = 0; i < readTemps.length; ++i ) { - Set vstNew = new HashSet(); - vstNew.add( new VariableSourceToken( currentSESE, - readTemps[i], - new Integer( 0 ) ) ); - vstSet = mergeVSTsets( vstSet, vstNew ); - } + // handle effects of statement in reverse, writes then reads + TempDescriptor [] writeTemps = fn.writesTemps(); + for( int i = 0; i < writeTemps.length; ++i ) { + vstSet = killTemp( vstSet, writeTemps[i] ); + } + + TempDescriptor [] readTemps = fn.readsTemps(); + for( int i = 0; i < readTemps.length; ++i ) { + Set vstNew = new HashSet(); + vstNew.add( new VariableSourceToken( currentSESE, + readTemps[i], + new Integer( 0 ) ) ); + vstSet = mergeVSTsets( vstSet, vstNew ); } } break; @@ -286,13 +309,6 @@ public class MLPAnalysis { } break; */ - case FKind.FlatReturnNode: { - FlatReturnNode frn = (FlatReturnNode) fn; - if( buildForest && !seseStack.empty() ) { - throw new Error( "Error: return statement enclosed within "+seseStack.peek() ); - } - } break; - } // end switch diff --git a/Robust/src/Tests/mlp/tinyTest/makefile b/Robust/src/Tests/mlp/tinyTest/makefile index 7364b2c7..6a75c148 100644 --- a/Robust/src/Tests/mlp/tinyTest/makefile +++ b/Robust/src/Tests/mlp/tinyTest/makefile @@ -3,8 +3,8 @@ PROGRAM=test SOURCE_FILES=$(PROGRAM).java BUILDSCRIPT=~/research/Robust/src/buildscript -#BSFLAGS= -mlpdebug -mainclass Test -ownership -ownallocdepth 1 -ownwritedots final -enable-assertions -flatirusermethods -ownaliasfile aliases.txt #-justanalyze -recover -BSFLAGS= -mainclass Test -ownership -ownallocdepth 1 -ownwritedots final -enable-assertions -flatirusermethods -ownaliasfile aliases.txt #-justanalyze -recover +BSFLAGS= -mlpdebug -mainclass Test -ownership -ownallocdepth 1 -ownwritedots final -enable-assertions -flatirusermethods -ownaliasfile aliases.txt #-justanalyze -recover +#BSFLAGS= -mainclass Test -ownership -ownallocdepth 1 -ownwritedots final -enable-assertions -flatirusermethods -ownaliasfile aliases.txt #-justanalyze -recover all: $(PROGRAM).bin -- 2.34.1