changes.
[IRC.git] / Robust / src / Analysis / SSJava / BuildLattice.java
index 264699c3767c0757e50887ff0b6978b2b6c3db40..b3cdd8ae29bfb01f5560f334673beabbce6e1af4 100644 (file)
@@ -7,6 +7,7 @@ import java.util.Map;
 import java.util.Set;
 
 import IR.Descriptor;
+import IR.MethodDescriptor;
 import Util.Pair;
 
 public class BuildLattice {
@@ -14,8 +15,13 @@ public class BuildLattice {
   public static int seed = 0;
   private LocationInference infer;
 
+  private final HNode topNode;
+  private final HNode bottomNode;
+
   public BuildLattice(LocationInference infer) {
     this.infer = infer;
+    topNode = new HNode(infer.ssjava.TOP);
+    bottomNode = new HNode(infer.ssjava.BOTTOM);
   }
 
   public SSJavaLattice<String> buildLattice(Descriptor desc) {
@@ -23,7 +29,30 @@ public class BuildLattice {
     HierarchyGraph inputGraph = infer.getSkeletonCombinationHierarchyGraph(desc);
     LocationSummary locSummary = infer.getLocationSummary(desc);
 
-    BasisSet basisSet = inputGraph.computeBasisSet();
+    Set<HNode> nodeSetWithCompositeLocation = new HashSet<HNode>();
+    if (desc instanceof MethodDescriptor) {
+      FlowGraph flowGraph = infer.getFlowGraph((MethodDescriptor) desc);
+
+      for (Iterator iterator = inputGraph.getNodeSet().iterator(); iterator.hasNext();) {
+        HNode hnode = (HNode) iterator.next();
+        Descriptor hnodeDesc = hnode.getDescriptor();
+        if (hnodeDesc != null) {
+          NTuple<Descriptor> descTuple = new NTuple<Descriptor>();
+          descTuple.add(hnodeDesc);
+
+          if (flowGraph.contains(descTuple)) {
+            FlowNode flowNode = flowGraph.getFlowNode(descTuple);
+            if (flowNode.getCompositeLocation() != null) {
+              nodeSetWithCompositeLocation.add(hnode);
+            }
+          }
+
+        }
+      }
+
+    }
+
+    BasisSet basisSet = inputGraph.computeBasisSet(nodeSetWithCompositeLocation);
     debug_print(inputGraph);
 
     Family family = generateFamily(basisSet);
@@ -47,25 +76,39 @@ public class BuildLattice {
       Set<Integer> higher = (Set<Integer>) iterator.next();
 
       String higherName = generateElementName(basisSet, inputGraph, mapFToLocName, higher);
-      locSummary.addMapHNodeNameToLocationName(higherName, higherName);
 
       HNode higherNode = inputGraph.getHNode(higherName);
       if (higherNode != null && higherNode.isSharedNode()) {
         lattice.addSharedLoc(higherName);
       }
+      Set<Descriptor> descSet = inputGraph.getDescSetOfNode(higherNode);
+      // System.out.println("higherName=" + higherName + "  higherNode=" + higherNode + "  descSet="
+      // + descSet);
+      for (Iterator iterator2 = descSet.iterator(); iterator2.hasNext();) {
+        Descriptor d = (Descriptor) iterator2.next();
+        locSummary.addMapHNodeNameToLocationName(d.getSymbol(), higherName);
+      }
+      // locSummary.addMapHNodeNameToLocationName(higherName, higherName);
 
       Set<Set<Integer>> lowerSet = mapImSucc.get(higher);
       for (Iterator iterator2 = lowerSet.iterator(); iterator2.hasNext();) {
         Set<Integer> lower = (Set<Integer>) iterator2.next();
 
         String lowerName = generateElementName(basisSet, inputGraph, mapFToLocName, lower);
-        locSummary.addMapHNodeNameToLocationName(lowerName, lowerName);
-
-        HNode lowerNode = inputGraph.getHNode(higherName);
+        HNode lowerNode = inputGraph.getHNode(lowerName);
         if (lowerNode != null && lowerNode.isSharedNode()) {
           lattice.addSharedLoc(lowerName);
         }
 
+        Set<Descriptor> lowerDescSet = inputGraph.getDescSetOfNode(lowerNode);
+        // System.out.println("lowerName=" + lowerName + "  lowerNode=" + lowerNode + "  descSet="
+        // + lowerDescSet);
+        for (Iterator iterator3 = lowerDescSet.iterator(); iterator3.hasNext();) {
+          Descriptor d = (Descriptor) iterator3.next();
+          locSummary.addMapHNodeNameToLocationName(d.getSymbol(), lowerName);
+        }
+        // locSummary.addMapHNodeNameToLocationName(lowerName, lowerName);
+
         if (higher.size() == 0) {
           // empty case
           lattice.put(lowerName);
@@ -118,8 +161,10 @@ public class BuildLattice {
     Set<HNode> nodeSet = simpleGraph.getNodeSet();
 
     Map<TripleItem, String> mapIntermediateLoc = new HashMap<TripleItem, String>();
+
     for (Iterator iterator = nodeSet.iterator(); iterator.hasNext();) {
       HNode node = (HNode) iterator.next();
+      // System.out.println("node=" + node);
       if (node.isSkeleton() && (!visited.contains(node))) {
         visited.add(node);
 
@@ -130,30 +175,28 @@ public class BuildLattice {
           if (!outNode.isSkeleton()) {
             if (outNode.isCombinationNode()) {
               // expand the combination node 'outNode'
-              System.out.println("-COMBINATION NODE=" + outNode);
               // here we need to expand the corresponding combination location in the lattice
               HNode combinationNodeInSCGraph = getCombinationNodeInSCGraph(desc, outNode);
 
               Set<HNode> combineSkeletonNodeSet =
                   simpleGraph.getCombineSetByCombinationNode(outNode);
 
-              System.out.println("combineSkeletonNodeSet=" + combineSkeletonNodeSet);
+              // System.out.println("combineSkeletonNodeSet=" + combineSkeletonNodeSet);
 
               Set<HNode> combinationNodeSet =
                   simpleGraph.getCombinationNodeSetByCombineNodeSet(combineSkeletonNodeSet);
 
-              System.out.println("combinationNodeSet=" + combinationNodeSet);
+              // System.out.println("combinationNodeSet=" + combinationNodeSet);
 
               Set<HNode> endNodeSetFromSimpleGraph =
                   simpleGraph.getDirectlyReachableSkeletonCombinationNodeFrom(outNode,
                       combinationNodeSet);
-              System.out.println("-endNodeSetFromSimpleGraph=" + endNodeSetFromSimpleGraph);
+              // System.out.println("-endNodeSetFromSimpleGraph=" + endNodeSetFromSimpleGraph);
               Set<HNode> endCombNodeSet = new HashSet<HNode>();
               for (Iterator iterator3 = endNodeSetFromSimpleGraph.iterator(); iterator3.hasNext();) {
                 HNode endNode = (HNode) iterator3.next();
                 endCombNodeSet.add(getCombinationNodeInSCGraph(desc, endNode));
               }
-              System.out.println("-endCombNodeSet=" + endCombNodeSet);
               visited.add(outNode);
 
               // follows the straight line up to another skeleton/combination node
@@ -162,13 +205,11 @@ public class BuildLattice {
                     removeTransitivelyReachToNode(desc, combinationNodeInSCGraph, endCombNodeSet);
                 recurDFS(desc, lattice, combinationNodeInSCGraph, endCombNodeSet, visited,
                     mapIntermediateLoc, 1, locSummary, outNode);
-                // recurDFS(desc, lattice, combinationNodeInSCGraph, endCombNodeSet, visited,
-                // mapIntermediateLoc, 1, locSummary, outNode);
               }
 
             } else {
               // we have a node that is neither combination or skeleton node
-              System.out.println("skeleton node=" + node + "  outNode=" + outNode);
+              // System.out.println("%%%skeleton node=" + node + "  outNode=" + outNode);
               HNode startNode = scGraph.getCurrentHNode(node);
 
               // if (node.getDescriptor() != null) {
@@ -183,21 +224,25 @@ public class BuildLattice {
               Set<HNode> endNodeSetFromSimpleGraph =
                   simpleGraph.getDirectlyReachableSkeletonCombinationNodeFrom(outNode, null);
 
-              System.out.println("endNodeSetFromSimpleGraph=" + endNodeSetFromSimpleGraph
-                  + "   from=" + outNode);
+              // System.out.println("endNodeSetFromSimpleGraph=" + endNodeSetFromSimpleGraph
+              // + "   from=" + outNode);
               Set<HNode> endCombNodeSet = new HashSet<HNode>();
               for (Iterator iterator3 = endNodeSetFromSimpleGraph.iterator(); iterator3.hasNext();) {
                 HNode endNode = (HNode) iterator3.next();
                 endCombNodeSet.add(getCombinationNodeInSCGraph(desc, endNode));
               }
-
+              // System.out.println("endCombNodeSet=" + endCombNodeSet);
               visited.add(outNode);
               if (endCombNodeSet.size() > 0) {
                 // follows the straight line up to another skeleton/combination node
                 endCombNodeSet = removeTransitivelyReachToNode(desc, startNode, endCombNodeSet);
-                recurDFSNormalNode(desc, lattice, startNode, endCombNodeSet, visited,
-                    mapIntermediateLoc, 1, locSummary, outNode);
+              } else if (endCombNodeSet.size() == 0) {
+                // the outNode is (directly/transitively) connected to the bottom node
+                // therefore, we just add a dummy bottom HNode to the endCombNodeSet.
+                endCombNodeSet.add(bottomNode);
               }
+              recurDFSNormalNode(desc, lattice, startNode, endCombNodeSet, visited,
+                  mapIntermediateLoc, 1, locSummary, outNode);
             }
 
           }
@@ -205,19 +250,34 @@ public class BuildLattice {
         }
       } else if (!node.isSkeleton() && !node.isCombinationNode() && !node.isMergeNode()
           && !visited.contains(node)) {
-        // an intermediate node 'node' is located between "TOP" location and a skeleton node
 
-        Set<HNode> outNodeSet = simpleGraph.getOutgoingNodeSet(node);
-        Set<String> belowSkeletonLocNameSet = new HashSet<String>();
-        for (Iterator iterator2 = outNodeSet.iterator(); iterator2.hasNext();) {
-          HNode outNode = (HNode) iterator2.next();
-          if (outNode.isSkeleton()) {
-            belowSkeletonLocNameSet.add(scGraph.getCurrentHNode(outNode).getName());
+        // an intermediate node 'node' may be located between "TOP" location and a skeleton node
+        int sizeIncomingNode = simpleGraph.getIncomingNodeSet(node).size();
+
+        if (sizeIncomingNode == 0) {
+          // this node will be directly connected to the TOP location
+          // start adding the following nodes from this node
+
+          Set<HNode> endNodeSetFromSimpleGraph =
+              simpleGraph.getDirectlyReachableSkeletonCombinationNodeFrom(node, null);
+
+          Set<HNode> endCombNodeSet = new HashSet<HNode>();
+          for (Iterator iterator3 = endNodeSetFromSimpleGraph.iterator(); iterator3.hasNext();) {
+            HNode endNode = (HNode) iterator3.next();
+            endCombNodeSet.add(getCombinationNodeInSCGraph(desc, endNode));
           }
+
+          HNode startNode = topNode;
+          visited.add(startNode);
+          if (endCombNodeSet.size() > 0) {
+            // follows the straight line up to another skeleton/combination node
+            // endCombNodeSet = removeTransitivelyReachToNode(desc, node, endCombNodeSet);
+            recurDFSNormalNode(desc, lattice, startNode, endCombNodeSet, visited,
+                mapIntermediateLoc, 1, locSummary, node);
+          }
+
         }
-        String newLocName = "ILOC" + (seed++);
-        lattice.insertNewLocationBetween(lattice.getTopItem(), belowSkeletonLocNameSet, newLocName);
-        locSummary.addMapHNodeNameToLocationName(node.getName(), newLocName);
+
       }
     }
 
@@ -241,12 +301,13 @@ public class BuildLattice {
       } else {
         HNode newEndNode =
             getDirectlyReachableNodeFromStartNodeReachToEndNode(scGraph, startNode, endNode);
-        System.out.println("#### old END NODE=" + endNode + " --->" + newEndNode);
+        // System.out.println("#### old END NODE=" + endNode + " --->" + newEndNode);
         newEndNodeSet.add(newEndNode);
       }
     }
 
-    System.out.println("removeTransitivelyReachToNode=" + endNodeSet + "  newSet=" + newEndNodeSet);
+    // System.out.println("removeTransitivelyReachToNode=" + endNodeSet + "  newSet=" +
+    // newEndNodeSet);
 
     return newEndNodeSet;
 
@@ -268,7 +329,7 @@ public class BuildLattice {
       if (inNode.equals(startNode)) {
         connected.add(curNode);
       } else {
-        System.out.println("inNode=" + inNode);
+        // System.out.println("inNode=" + inNode);
         recurDirectlyReachableNodeFromStartNodeReachToEndNode(scGraph, startNode, inNode, connected);
       }
     }
@@ -280,7 +341,7 @@ public class BuildLattice {
       int idx, LocationSummary locSummary, HNode curNode) {
 
     TripleItem item = new TripleItem(startNode, endNodeSet, idx);
-    System.out.println("item=" + item);
+    // System.out.println("item=" + item);
     if (!mapIntermediateLoc.containsKey(item)) {
       // need to create a new intermediate location in the lattice
       String newLocName = "ILOC" + (seed++);
@@ -305,9 +366,15 @@ public class BuildLattice {
     }
 
     String locName = mapIntermediateLoc.get(item);
-    locSummary.addMapHNodeNameToLocationName(curNode.getName(), locName);
-
     HierarchyGraph graph = infer.getSimpleHierarchyGraph(desc);
+
+    Set<Descriptor> descSet = graph.getDescSetOfNode(curNode);
+    for (Iterator iterator = descSet.iterator(); iterator.hasNext();) {
+      Descriptor d = (Descriptor) iterator.next();
+      locSummary.addMapHNodeNameToLocationName(d.getSymbol(), locName);
+    }
+    // locSummary.addMapHNodeNameToLocationName(curNode.getName(), locName);
+
     Set<HNode> outSet = graph.getOutgoingNodeSet(curNode);
     for (Iterator iterator2 = outSet.iterator(); iterator2.hasNext();) {
       HNode outNode = (HNode) iterator2.next();
@@ -350,13 +417,17 @@ public class BuildLattice {
 
     }
 
+    HierarchyGraph graph = infer.getSimpleHierarchyGraph(desc);
     String locName = mapIntermediateLoc.get(item);
-    locSummary.addMapHNodeNameToLocationName(curNode.getName(), locName);
+    Set<Descriptor> descSet = graph.getDescSetOfNode(curNode);
+    for (Iterator iterator = descSet.iterator(); iterator.hasNext();) {
+      Descriptor d = (Descriptor) iterator.next();
+      locSummary.addMapHNodeNameToLocationName(d.getSymbol(), locName);
+    }
 
-    System.out.println("-TripleItem=" + item);
-    System.out.println("-curNode=" + curNode.getName() + " locName=" + locName);
+    // System.out.println("-TripleItem=" + item);
+    // System.out.println("-curNode=" + curNode.getName() + " locName=" + locName);
 
-    HierarchyGraph graph = infer.getSimpleHierarchyGraph(desc);
     Set<HNode> outSet = graph.getOutgoingNodeSet(curNode);
     for (Iterator iterator2 = outSet.iterator(); iterator2.hasNext();) {
       HNode outNode = (HNode) iterator2.next();
@@ -439,7 +510,7 @@ public class BuildLattice {
       resetCount(mapFtoCount, family);
     }
 
-    System.out.println("mapImSucc=" + mapImSucc);
+    // System.out.println("mapImSucc=" + mapImSucc);
 
     return mapImSucc;
   }
@@ -504,8 +575,8 @@ public class BuildLattice {
 
   private void debug_print(HierarchyGraph inputGraph) {
     System.out.println("\nBuild Lattice:" + inputGraph.getName());
-    System.out.println("Node2Index:\n" + inputGraph.getMapHNodeToUniqueIndex());
-    System.out.println("Node2Basis:\n" + inputGraph.getMapHNodeToBasis());
+    // System.out.println("Node2Index:\n" + inputGraph.getMapHNodeToUniqueIndex());
+    // System.out.println("Node2Basis:\n" + inputGraph.getMapHNodeToBasis());
   }
 
 }
@@ -549,14 +620,21 @@ class TripleItem {
   }
 
   public int hashCode() {
-    return higherNode.hashCode() + lowerNodeSet.hashCode() + idx;
+
+    int h = 0;
+    if (higherNode != null) {
+      h = higherNode.hashCode();
+    }
+
+    return h + lowerNodeSet.hashCode() + idx;
   }
 
   public boolean equals(Object obj) {
 
     if (obj instanceof TripleItem) {
       TripleItem in = (TripleItem) obj;
-      if (higherNode.equals(in.higherNode) && lowerNodeSet.equals(in.lowerNodeSet) && idx == in.idx) {
+      if ((higherNode == null || (higherNode != null && higherNode.equals(in.higherNode)))
+          && lowerNodeSet.equals(in.lowerNodeSet) && idx == in.idx) {
         return true;
       }
     }