Bug fix: in some cases we really do want the heap region inherent reach set to have...
[IRC.git] / Robust / src / Analysis / Disjoint / ReachGraph.java
index 86550e67b7c553ec6606bb03f8f3a84affe56b4a..b397af059f50d6def646f02a40de1d2022e79e92 100644 (file)
@@ -871,8 +871,8 @@ public class ReachGraph {
 
     // after tokens have been aged, reset newest node's reachability
     // and a brand new node has a "true" predicate
-    hrn0.setAlpha(hrn0.getInherent() );
-    hrn0.setPreds(predsTrue);
+    hrn0.setAlpha( Canonical.changePredsTo( hrn0.getInherent(), predsTrue ) );
+    hrn0.setPreds( predsTrue);
   }
 
 
@@ -1786,8 +1786,10 @@ public class ReachGraph {
 
     // caller edges from arg vars, and the matching param index
     // because these become a special edge in callee
-    Hashtable<RefEdge, Integer> reachableCallerArgEdges2paramIndex =
-      new Hashtable<RefEdge, Integer>();
+    // NOTE! One argument may be passed in as more than one parameter,
+    // so map to a set of parameter indices!
+    Hashtable< RefEdge, Set<Integer> > reachableCallerArgEdges2paramIndices =
+      new Hashtable< RefEdge, Set<Integer> >();
 
     // caller edges from local vars or callee-unreachable nodes
     // (out-of-context sources) to callee-reachable nodes
@@ -1821,8 +1823,17 @@ public class ReachGraph {
           if( reCaller.getSrc() instanceof HeapRegionNode ) {
             reachableCallerEdges.add(reCaller);
           } else {
+
             if( rsnCaller.equals(vnArgCaller) ) {
-              reachableCallerArgEdges2paramIndex.put(reCaller, i);
+              Set<Integer> pIndices = 
+                reachableCallerArgEdges2paramIndices.get( reCaller );
+
+              if( pIndices == null ) {
+                pIndices = new HashSet<Integer>();
+                reachableCallerArgEdges2paramIndices.put( reCaller, pIndices );
+              }
+              pIndices.add( i );
+
             } else {
               oocCallerEdges.add(reCaller);
             }
@@ -1837,6 +1848,7 @@ public class ReachGraph {
     } // end iterating over parameters as starting points
 
 
+
     // now collect out-of-callee-context IDs and
     // map them to whether the ID is out of the caller
     // context as well
@@ -1931,18 +1943,15 @@ public class ReachGraph {
 
     // add param edges to callee graph
     Iterator argEdges =
-      reachableCallerArgEdges2paramIndex.entrySet().iterator();
+      reachableCallerArgEdges2paramIndices.entrySet().iterator();
     while( argEdges.hasNext() ) {
-      Map.Entry me    = (Map.Entry)argEdges.next();
-      RefEdge reArg = (RefEdge)   me.getKey();
-      Integer index = (Integer)   me.getValue();
+      Map.Entry    me    = (Map.Entry)    argEdges.next();
+      RefEdge      reArg = (RefEdge)      me.getKey();
+      Set<Integer> pInxs = (Set<Integer>) me.getValue();
 
-      VariableNode vnCaller  = (VariableNode) reArg.getSrc();
+      VariableNode   vnCaller  = (VariableNode) reArg.getSrc();
       TempDescriptor argCaller = vnCaller.getTempDescriptor();
 
-      TempDescriptor paramCallee = fmCallee.getParameter(index);
-      VariableNode vnCallee    = rg.getVariableNodeFromTemp(paramCallee);
-
       HeapRegionNode hrnDstCaller = reArg.getDst();
       HeapRegionNode hrnDstCallee = rg.id2hrn.get(hrnDstCaller.getID() );
       assert hrnDstCallee != null;
@@ -1962,24 +1971,30 @@ public class ReachGraph {
       ExistPredSet preds =
         ExistPredSet.factory(pred);
 
-      RefEdge reCallee =
-        new RefEdge(vnCallee,
-                    hrnDstCallee,
-                    reArg.getType(),
-                    reArg.getField(),
-                    toCalleeContext(reArg.getBeta(),
-                                    preds,
-                                    oocHrnIdOoc2callee
-                                    ),
-                    preds,
-                    toCalleeContext(reArg.getTaints(),
-                                    preds)
-                    );
+      for( Integer index: pInxs ) {
 
-      rg.addRefEdge(vnCallee,
-                    hrnDstCallee,
-                    reCallee
-                    );
+        TempDescriptor paramCallee = fmCallee.getParameter(index);
+        VariableNode vnCallee    = rg.getVariableNodeFromTemp(paramCallee);
+
+        RefEdge reCallee =
+          new RefEdge(vnCallee,
+                      hrnDstCallee,
+                      reArg.getType(),
+                      reArg.getField(),
+                      toCalleeContext(reArg.getBeta(),
+                                      preds,
+                                      oocHrnIdOoc2callee
+                                      ),
+                      preds,
+                      toCalleeContext(reArg.getTaints(),
+                                      preds)
+                      );
+        
+        rg.addRefEdge(vnCallee,
+                      hrnDstCallee,
+                      reCallee
+                      );
+      }
     }
 
     // add in-context edges to callee graph
@@ -2245,8 +2260,8 @@ public class ReachGraph {
   private static boolean resolveMethodDebugDOTwriteLabels     = true;
   private static boolean resolveMethodDebugDOTselectTemps     = true;
   private static boolean resolveMethodDebugDOTpruneGarbage    = true;
-  private static boolean resolveMethodDebugDOThideReach       = true;
-  private static boolean resolveMethodDebugDOThideSubsetReach = true;
+  private static boolean resolveMethodDebugDOThideReach       = false;
+  private static boolean resolveMethodDebugDOThideSubsetReach = false;
   private static boolean resolveMethodDebugDOThidePreds       = false;
   private static boolean resolveMethodDebugDOThideEdgeTaints  = true;
 
@@ -2355,6 +2370,8 @@ public class ReachGraph {
         continue;
       }
 
+
+
       // since the node is coming over, find out which reach
       // states on it should come over, too
       assert calleeNode2calleeStatesSatisfied.get(hrnCallee) == null;