From afd7a5aa1f2cb7b0d7110f61978502caa93ce5b6 Mon Sep 17 00:00:00 2001 From: jjenista Date: Thu, 28 Apr 2011 18:02:42 +0000 Subject: [PATCH 1/1] run ooojava and rcrpointer that print out effects and annotate them with the source code line they come from --- Robust/src/Analysis/Disjoint/Effect.java | 73 ++++++++++++++++++- .../Analysis/Disjoint/EffectsAnalysis.java | 18 ++--- .../Disjoint/ProcessStateMachines.java | 10 +-- Robust/src/Analysis/Pointer/Pointer.java | 6 +- Robust/src/Benchmarks/oooJava/master-makefile | 2 +- 5 files changed, 90 insertions(+), 19 deletions(-) diff --git a/Robust/src/Analysis/Disjoint/Effect.java b/Robust/src/Analysis/Disjoint/Effect.java index baa3cef6..0565b6f0 100644 --- a/Robust/src/Analysis/Disjoint/Effect.java +++ b/Robust/src/Analysis/Disjoint/Effect.java @@ -1,7 +1,9 @@ package Analysis.Disjoint; -import IR.FieldDescriptor; -import IR.Flat.TempDescriptor; +import java.util.*; + +import IR.*; +import IR.Flat.*; public class Effect { @@ -19,10 +21,70 @@ public class Effect { // identify a field protected FieldDescriptor field; - public Effect(Alloc affectedAS, int type, FieldDescriptor field) { + // for debugging purposes, keep the compilation + // unit and line number of this effect--only if state + // is non-null later + protected int lineNumber; + protected ClassDescriptor compilationUnit; + protected static Hashtable fn2cd = + new Hashtable(); + + + public Effect(Alloc affectedAS, int type, FieldDescriptor field, FlatNode currentProgramPoint) { this.affectedAllocSite = affectedAS; this.type = type; this.field = field; + + + // NOTE: this line number+compilation unit is collected for debugging, + // so we don't want to spend time on this unless OOODEBUG or some new + // option controls it. Disjoint and Pointer analysis use this currently. + lineNumber = -1; + compilationUnit = null; + + // find the class the current program point belongs to + if( currentProgramPoint == null ) { + return; + } + Set visited = new HashSet(); + Set toVisit = new HashSet(); + toVisit.add( currentProgramPoint ); + + while( !toVisit.isEmpty() ) { + FlatNode fn = toVisit.iterator().next(); + toVisit.remove( fn ); + visited.add( fn ); + + // when we find a flat method, remember every node we visited + // belongs to that compilation unit + if( fn instanceof FlatMethod ) { + MethodDescriptor md = ((FlatMethod)fn).getMethod(); + if( md != null ) { + ClassDescriptor cd = md.getClassDesc(); + if( cd != null ) { + fn2cd.put( fn, cd ); + } + } + } + + if( fn2cd.containsKey( fn ) ) { + compilationUnit = fn2cd.get( fn ); + + for( FlatNode fnKnown: visited ) { + fn2cd.put( fnKnown, compilationUnit ); + } + + lineNumber = currentProgramPoint.getNumLine(); + break; + } + + for( int i = 0; i < fn.numPrev(); ++i ) { + FlatNode prev = fn.getPrev( i ); + if( !visited.contains( prev ) ) { + toVisit.add( prev ); + } + } + } } public static boolean isWrite(int effect) { @@ -115,6 +177,11 @@ public class Effect { } else { s += ", " + field.toStringBrief(); } + + if( compilationUnit != null ) { + s += ", "+compilationUnit.getSymbol()+":"+lineNumber; + } + return s + ")"; } diff --git a/Robust/src/Analysis/Disjoint/EffectsAnalysis.java b/Robust/src/Analysis/Disjoint/EffectsAnalysis.java index fbf21ea6..90d2b8e3 100644 --- a/Robust/src/Analysis/Disjoint/EffectsAnalysis.java +++ b/Robust/src/Analysis/Disjoint/EffectsAnalysis.java @@ -136,7 +136,7 @@ public class EffectsAnalysis { RefEdge edge = iterator.next(); TaintSet taintSet = edge.getTaints(); AllocSite affectedAlloc = edge.getDst().getAllocSite(); - Effect effect = new Effect(affectedAlloc, Effect.read, fld); + Effect effect = new Effect(affectedAlloc, Effect.read, fld, currentProgramPoint); for (Iterator taintSetIter = taintSet.iterator(); taintSetIter.hasNext(); ) { Taint taint = taintSetIter.next(); @@ -146,10 +146,10 @@ public class EffectsAnalysis { } public void analyzeFlatFieldNode(Set sources, FieldDescriptor fld, FlatNode currentProgramPoint) { - for (Edge edge : sources) { - TaintSet taintSet = edge.getTaints(); - Alloc affectedAlloc = edge.getDst().getAllocSite(); - Effect effect = new Effect(affectedAlloc, Effect.read, fld); + for (Edge edge:sources) { + TaintSet taintSet = edge.getTaints(); + Alloc affectedAlloc = edge.getDst().getAllocSite(); + Effect effect = new Effect(affectedAlloc, Effect.read, fld, currentProgramPoint); if (taintSet!=null) for (Taint taint : taintSet.getTaints()) { @@ -169,11 +169,11 @@ public class EffectsAnalysis { RefEdge edge = iterator.next(); TaintSet taintSet = edge.getTaints(); AllocSite affectedAlloc = edge.getDst().getAllocSite(); - Effect effect = new Effect(affectedAlloc, Effect.write, fld); - Effect effectSU = null; + Effect effect = new Effect(affectedAlloc, Effect.write, fld, currentProgramPoint); + Effect effectSU = null; if (strongUpdate) { - effectSU = new Effect(affectedAlloc, Effect.strongupdate, fld); + effectSU = new Effect(affectedAlloc, Effect.strongupdate, fld, currentProgramPoint); } for (Iterator taintSetIter = taintSet.iterator(); taintSetIter.hasNext(); ) { @@ -192,7 +192,7 @@ public class EffectsAnalysis { for (Edge edge : dstedges) { TaintSet taintSet = edge.getTaints(); Alloc affectedAlloc = edge.getDst().getAllocSite(); - Effect effect = new Effect(affectedAlloc, Effect.write, fld); + Effect effect = new Effect(affectedAlloc, Effect.write, fld, currentProgramPoint); if (taintSet!=null) for (Taint taint : taintSet.getTaints()) { add(taint, effect, currentProgramPoint); diff --git a/Robust/src/Analysis/Disjoint/ProcessStateMachines.java b/Robust/src/Analysis/Disjoint/ProcessStateMachines.java index 4c0ef14e..0c29cdd1 100644 --- a/Robust/src/Analysis/Disjoint/ProcessStateMachines.java +++ b/Robust/src/Analysis/Disjoint/ProcessStateMachines.java @@ -324,11 +324,11 @@ public class ProcessStateMachines { if( (effectType & Effect.read) != 0 && (effectType & Effect.write) != 0 ) { - allocAndFieldRW.add(new Effect(af.getFirst(), - Effect.read, - af.getSecond() - ) - ); + allocAndFieldRW.add( new Effect( af.getFirst(), + Effect.read, + af.getSecond(), + null ) + ); } } diff --git a/Robust/src/Analysis/Pointer/Pointer.java b/Robust/src/Analysis/Pointer/Pointer.java index d5454e64..c38ae5a1 100644 --- a/Robust/src/Analysis/Pointer/Pointer.java +++ b/Robust/src/Analysis/Pointer/Pointer.java @@ -216,10 +216,14 @@ nextdelta: State.logEvent("Done With Pointer Analysis"); - if (OoOJava) { effectsAnalysis.buildStateMachines.writeStateMachines(); State.logEvent("Done Writing State Machines"); + + if( state.OOODEBUG ) { + effectsAnalysis.writeEffects("effects.txt"); + State.logEvent("Done Writing Effects"); + } } } diff --git a/Robust/src/Benchmarks/oooJava/master-makefile b/Robust/src/Benchmarks/oooJava/master-makefile index a9c6aa23..456c855e 100644 --- a/Robust/src/Benchmarks/oooJava/master-makefile +++ b/Robust/src/Benchmarks/oooJava/master-makefile @@ -33,7 +33,7 @@ USECOREPROF= #-coreprof $(COREPROFOVERFLOW) \ USEOOO= -ooojava $(NUM_OOO_WORKERS) 2 -squeue #-ooodebug-disable-task-mem-pool -USERCR= -ooojava $(NUM_RCR_WORKERS) 2 -rcr -squeue +USERCR= -ooojava $(NUM_RCR_WORKERS) 2 -rcr -squeue -ooodebug OOODEBUG= -ooodebug -printlinenum RCRDEBUG= -rcr_debug -printlinenum RCRDEBUGV= -rcr_debug_verbose -printlinenum -- 2.34.1