remove unnecessary annotations to calculate evalution numbers.
[IRC.git] / Robust / src / Analysis / SSJava / SSJavaAnalysis.java
index 84c8b3e3754c2f803f74b9078119f4c73f541efd..2d1f8ffc800af698eea65210c47079e7926dadc2 100644 (file)
@@ -26,6 +26,7 @@ import IR.ClassDescriptor;
 import IR.Descriptor;
 import IR.FieldDescriptor;
 import IR.MethodDescriptor;
+import IR.NameDescriptor;
 import IR.State;
 import IR.SymbolTable;
 import IR.TypeUtil;
@@ -110,6 +111,12 @@ public class SSJavaAnalysis {
 
   private LinkedList<MethodDescriptor> sortedDescriptors;
 
+  private Map<Location, Set<Descriptor>> mapSharedLocToDescSet;
+
+  private Map<Descriptor, SSJavaLattice<String>> mapDescToCompleteLattice;
+  public Map<Descriptor, Integer> mapNumLocsMapManual;
+  public Map<Descriptor, Integer> mapNumPathsMapManual;
+
   public SSJavaAnalysis(State state, TypeUtil tu, BuildFlat bf, CallGraph callgraph) {
     this.state = state;
     this.tu = tu;
@@ -129,32 +136,150 @@ public class SSJavaAnalysis {
     this.mapDescriptorToSetDependents = new Hashtable<Descriptor, Set<MethodDescriptor>>();
     this.sortedDescriptors = new LinkedList<MethodDescriptor>();
     this.md2pcLoc = new HashMap<MethodDescriptor, CompositeLocation>();
+    this.mapSharedLocToDescSet = new HashMap<Location, Set<Descriptor>>();
+    this.mapDescToCompleteLattice = new HashMap<Descriptor, SSJavaLattice<String>>();
+    this.mapNumLocsMapManual = new HashMap<Descriptor, Integer>();
+    this.mapNumPathsMapManual = new HashMap<Descriptor, Integer>();
   }
 
   public void doCheck() {
     doMethodAnnotationCheck();
 
-    if (state.SSJAVA) {
+    if (state.SSJAVA && !state.SSJAVAINFER) {
+      init();
       computeLinearTypeCheckMethodSet();
       doLinearTypeCheck();
     }
 
-    init();
-
     if (state.SSJAVADEBUG) {
       // debug_printAnnotationRequiredSet();
     }
     if (state.SSJAVAINFER) {
       inference();
+      System.exit(0);
     } else {
       parseLocationAnnotation();
+      debug_countNumLocations();
+      // System.exit(0);
       doFlowDownCheck();
       doDefinitelyWrittenCheck();
       doLoopCheck();
     }
+
+    for (Iterator iterator = annotationRequireSet.iterator(); iterator.hasNext();) {
+      MethodDescriptor md = (MethodDescriptor) iterator.next();
+      MethodLattice<String> locOrder = getMethodLattice(md);
+      writeLatticeDotFile(md.getClassDesc(), md, getMethodLattice(md));
+      System.out.println("~~~\t" + md.getClassDesc() + "_" + md + "\t"
+          + locOrder.getKeySet().size());
+    }
+
+  }
+
+  private void debug_countNumLocations() {
+
+    BuildLattice buildLattice = new BuildLattice();
+
+    for (Iterator iterator = cd2lattice.keySet().iterator(); iterator.hasNext();) {
+      ClassDescriptor cd = (ClassDescriptor) iterator.next();
+      SSJavaLattice<String> lattice = cd2lattice.get(cd).clone();
+      SSJavaLattice<String> completeLattice = debug_buildCompleteLattice(buildLattice, cd, lattice);
+      mapDescToCompleteLattice.put(cd, completeLattice);
+      writeLatticeDotFile(cd, null, completeLattice);
+    }
+
+    for (Iterator iterator = md2lattice.keySet().iterator(); iterator.hasNext();) {
+      MethodDescriptor md = (MethodDescriptor) iterator.next();
+      SSJavaLattice<String> lattice = md2lattice.get(md).clone();
+      SSJavaLattice<String> completeLattice = debug_buildCompleteLattice(buildLattice, md, lattice);
+      mapDescToCompleteLattice.put(md, completeLattice);
+      writeLatticeDotFile(md.getClassDesc(), md, completeLattice);
+    }
+
+    for (Iterator iterator = annotationRequireSet.iterator(); iterator.hasNext();) {
+      MethodDescriptor md = (MethodDescriptor) iterator.next();
+      SSJavaLattice<String> lattice = getMethodLattice(md).clone();
+      if (!mapDescToCompleteLattice.containsKey(md)) {
+        System.out.println("@NOT FOUND!");
+        SSJavaLattice<String> completeLattice =
+            debug_buildCompleteLattice(buildLattice, md, lattice);
+        mapDescToCompleteLattice.put(md, completeLattice);
+        writeLatticeDotFile(md.getClassDesc(), md, completeLattice);
+      }
+    }
+
+    writeNumLocsPathsCSVFile();
+
+  }
+
+  public SSJavaLattice<String> debug_buildCompleteLattice(BuildLattice buildLattice,
+      Descriptor desc, SSJavaLattice<String> lattice) {
+
+    // First, create a hierarchy graph
+    HierarchyGraph hierarchyGraph = new HierarchyGraph();
+    Set<String> keySet = lattice.getKeySet();
+
+    Map<String, Descriptor> mapLocNameToDesc = new HashMap<String, Descriptor>();
+
+    for (Iterator iterator2 = keySet.iterator(); iterator2.hasNext();) {
+      String higher = (String) iterator2.next();
+      Set<String> lowerSet = lattice.get(higher);
+      if (!mapLocNameToDesc.containsKey(higher)) {
+        mapLocNameToDesc.put(higher, new NameDescriptor(higher));
+      }
+
+      Descriptor higherDesc = mapLocNameToDesc.get(higher);
+
+      for (Iterator iterator3 = lowerSet.iterator(); iterator3.hasNext();) {
+        String lower = (String) iterator3.next();
+        if (!mapLocNameToDesc.containsKey(lower)) {
+          mapLocNameToDesc.put(lower, new NameDescriptor(lower));
+        }
+        Descriptor lowerDesc = mapLocNameToDesc.get(lower);
+        hierarchyGraph.addEdge(higherDesc, lowerDesc);
+      }
+    }
+
+    BasisSet basisSet = hierarchyGraph.computeBasisSet(new HashSet<HNode>());
+
+    SSJavaLattice<String> completeLattice = buildLattice.buildLattice(hierarchyGraph);
+
+    int numLocs = completeLattice.getKeySet().size();
+    LocationInference.numLocationsSInfer += numLocs;
+    mapNumLocsMapManual.put(desc, new Integer(numLocs));
+
+    System.out.println(desc + "::" + "lattice=" + lattice.getKeySet().size() + " complete="
+        + numLocs);
+
+    int numPaths = completeLattice.countPaths();
+    LocationInference.numLocationsSInfer += numPaths;
+    mapNumPathsMapManual.put(desc, new Integer(numPaths));
+
+    return completeLattice;
   }
 
-  private void init() {
+  public void writeNumLocsPathsCSVFile() {
+
+    try {
+      BufferedWriter bw = new BufferedWriter(new FileWriter("manualnumbers.csv"));
+
+      Set<Descriptor> keySet = mapNumLocsMapManual.keySet();
+      for (Iterator iterator = keySet.iterator(); iterator.hasNext();) {
+        Descriptor desc = (Descriptor) iterator.next();
+        int numLocs = mapNumLocsMapManual.get(desc);
+        int numPaths = mapNumPathsMapManual.get(desc);
+        bw.write(desc.getSymbol().replaceAll("[,]", "") + "," + numLocs + "," + numPaths + "\n");
+      }
+      bw.close();
+
+    } catch (IOException e) {
+      // TODO Auto-generated catch block
+      e.printStackTrace();
+    }
+
+  }
+
+  public void init() {
     // perform topological sort over the set of methods accessed by the main
     // event loop
     Set<MethodDescriptor> methodDescriptorsToAnalyze = new HashSet<MethodDescriptor>();
@@ -166,8 +291,19 @@ public class SSJavaAnalysis {
     return (LinkedList<MethodDescriptor>) sortedDescriptors.clone();
   }
 
+  public void addSharedDesc(Location loc, Descriptor fd) {
+    if (!mapSharedLocToDescSet.containsKey(loc)) {
+      mapSharedLocToDescSet.put(loc, new HashSet<Descriptor>());
+    }
+    mapSharedLocToDescSet.get(loc).add(fd);
+  }
+
+  public Set<Descriptor> getSharedDescSet(Location loc) {
+    return mapSharedLocToDescSet.get(loc);
+  }
+
   private void inference() {
-    LocationInference inferEngine = new LocationInference(this, state);
+    LocationInference inferEngine = new LocationInference(this, state, tu);
     inferEngine.inference();
   }
 
@@ -245,6 +381,8 @@ public class SSJavaAnalysis {
       }
     }
 
+    linearTypeCheckMethodSet.addAll(sortedDescriptors);
+
   }
 
   private void doLinearTypeCheck() {
@@ -300,6 +438,7 @@ public class SSJavaAnalysis {
           if (state.SSJAVADEBUG) {
             // generate lattice dot file
             writeLatticeDotFile(cd, null, locOrder);
+            System.out.println("~~~\t" + cd + "\t" + locOrder.getKeySet().size());
           }
 
         } else if (marker.equals(METHODDEFAULT)) {
@@ -307,6 +446,7 @@ public class SSJavaAnalysis {
               new MethodLattice<String>(SSJavaAnalysis.TOP, SSJavaAnalysis.BOTTOM);
           cd2methodDefault.put(cd, locOrder);
           parseMethodDefaultLatticeDefinition(cd, an.getValue(), locOrder);
+          // writeLatticeDotFile(cd, null, locOrder, "METHOD_DEFAULT");
         }
       }
 
@@ -324,7 +464,9 @@ public class SSJavaAnalysis {
                 MethodLattice<String> locOrder =
                     new MethodLattice<String>(SSJavaAnalysis.TOP, SSJavaAnalysis.BOTTOM);
                 md2lattice.put(md, locOrder);
+                System.out.println("parsing method lattice=" + md);
                 parseMethodDefaultLatticeDefinition(cd, an.getValue(), locOrder);
+                writeLatticeDotFile(cd, md, locOrder, "");
               } else if (an.getMarker().equals(TERMINATE)) {
                 // developer explicitly wants to skip loop termination analysis
                 String value = an.getValue();
@@ -345,15 +487,23 @@ public class SSJavaAnalysis {
 
   public <T> void writeLatticeDotFile(ClassDescriptor cd, MethodDescriptor md,
       SSJavaLattice<T> locOrder) {
+    writeLatticeDotFile(cd, md, locOrder, "");
+
+  }
+
+  public <T> void writeLatticeDotFile(ClassDescriptor cd, MethodDescriptor md,
+      SSJavaLattice<T> locOrder, String nameSuffix) {
 
     String fileName = "lattice_";
     if (md != null) {
       fileName +=
-          cd.getSymbol().replaceAll("[\\W_]", "") + "_" + md.getSymbol().replaceAll("[\\W_]", "");
+          cd.getSymbol().replaceAll("[\\W_]", "") + "_" + md.toString().replaceAll("[\\W_]", "");
     } else {
       fileName += cd.getSymbol().replaceAll("[\\W_]", "");
     }
 
+    fileName += nameSuffix;
+
     Set<Pair<T, T>> pairSet = locOrder.getOrderingPairSet();
 
     if (pairSet.size() > 0) {
@@ -457,7 +607,7 @@ public class SSJavaAnalysis {
         locOrder.put(higherLoc, lowerLoc);
         if (locOrder.isIntroducingCycle(higherLoc)) {
           throw new Error("Error: the order relation " + lowerLoc + " < " + higherLoc
-              + " introduces a cycle.");
+              + " introduces a cycle in the class lattice " + cd);
         }
       } else if (orderElement.contains("*")) {
         // spin loc definition