Found a bug in OwnershipGraph.java when writing out the .dot file. If
authorjjenista <jjenista>
Wed, 28 Nov 2007 22:24:28 +0000 (22:24 +0000)
committerjjenista <jjenista>
Wed, 28 Nov 2007 22:24:28 +0000 (22:24 +0000)
a heap region that is listed as a heap root, such as an incoming parameter,
and some other heap region creates a reference to it, then it will be
traversed twice, once from it's own heap root starting point, and once when
the referencing heap region's heap root is traversed.  Altered the graph
writing code to use a shared hashset to decide if a heap region has been
visited.

Robust/src/Analysis/OwnershipAnalysis/OwnershipGraph.java
Robust/src/Tests/OwnershipAnalysisTest/test01/makefile

index 108540401b06c6802083ef90adf5586557177b48..bccf240a9142ade7c4518e303da8beea157ca437 100644 (file)
@@ -85,8 +85,7 @@ public class OwnershipGraph {
            OwnershipHeapRegionNode ohrnSrc = null;
            Iterator srcRegionsItr = srcln.iteratorToReachableRegions();
            while( srcRegionsItr.hasNext() ) {
-               ohrnSrc = (OwnershipHeapRegionNode)srcRegionsItr.next();
-               
+               ohrnSrc = (OwnershipHeapRegionNode)srcRegionsItr.next();               
                ohrn.addReachableRegion( ohrnSrc );
            }
        }       
@@ -404,12 +403,14 @@ public class OwnershipGraph {
        BufferedWriter bw = new BufferedWriter( new FileWriter( graphName+".dot" ) );
        bw.write( "digraph "+graphName+" {\n" );
 
+       HashSet<OwnershipHeapRegionNode> visited = new HashSet<OwnershipHeapRegionNode>();
+
        Set s = heapRoots.entrySet();
        Iterator i = s.iterator();
        while( i.hasNext() ) {
            Map.Entry me = (Map.Entry) i.next();
            OwnershipHeapRegionNode ohrn = (OwnershipHeapRegionNode) me.getValue();
-           traverseHeapNodesTop( VISIT_OHRN_WRITE_FULL, ohrn, bw, null );
+           traverseHeapNodes( VISIT_OHRN_WRITE_FULL, ohrn, bw, null, visited );
        }
 
        s = td2ln.entrySet();
@@ -435,6 +436,8 @@ public class OwnershipGraph {
        BufferedWriter bw = new BufferedWriter( new FileWriter( graphName+".dot" ) );
        bw.write( "graph "+graphName+" {\n" );
 
+       HashSet<OwnershipHeapRegionNode> visited = new HashSet<OwnershipHeapRegionNode>();
+
        // find linked regions
        for( int i = 0; i < analysisRegionLabels.size(); ++i ) {
            TempDescriptor td = analysisRegionLabels.get( i );
@@ -446,7 +449,7 @@ public class OwnershipGraph {
            while( heapRegionsItr.hasNext() ) {
                ohrn = (OwnershipHeapRegionNode)heapRegionsItr.next();
 
-               traverseHeapNodesTop( VISIT_OHRN_WRITE_CONDENSED, ohrn, bw, td );
+               traverseHeapNodes( VISIT_OHRN_WRITE_CONDENSED, ohrn, bw, td, visited );
            }
        }
 
@@ -464,6 +467,7 @@ public class OwnershipGraph {
        bw.close();
     }
 
+    /*
     protected void traverseHeapNodesTop(  int mode,
                                          OwnershipHeapRegionNode ohrn,
                                          BufferedWriter bw,
@@ -472,6 +476,7 @@ public class OwnershipGraph {
        HashSet<OwnershipHeapRegionNode> visited = new HashSet<OwnershipHeapRegionNode>();
        traverseHeapNodes( mode, ohrn, bw, td, visited );
     }
+    */
 
     protected void traverseHeapNodes( int mode,
                                      OwnershipHeapRegionNode ohrn,
index 72b2f27e8ac38f97d279597440217af7af8b3973..2ff00ccb26ee4c0344948ad4abe9a0105095f32e 100644 (file)
@@ -8,7 +8,9 @@ BSFLAGS= -recover -flatirtasks -ownership -enable-assertions
 all: view
 
 view: PNGs
-       eog *.png &
+       eog *flatIRGraph*.png &
+       eog *FN*.png &
+       eog *Ownership*.png &
 
 PNGs: DOTs
        rm -f *Startup*.dot