From: bdemsky <bdemsky>
Date: Thu, 10 Mar 2011 09:23:17 +0000 (+0000)
Subject: even more bug fixes...3 test cases work
X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=cc15df28d6fec87c69472e0ee8f3952764f5fc4c;p=IRC.git

even more bug fixes...3 test cases work
---

diff --git a/Robust/src/Analysis/Pointer/BasicBlock.java b/Robust/src/Analysis/Pointer/BasicBlock.java
index b58ae1e4..2f6e9903 100644
--- a/Robust/src/Analysis/Pointer/BasicBlock.java
+++ b/Robust/src/Analysis/Pointer/BasicBlock.java
@@ -89,9 +89,10 @@ public class BasicBlock {
 	  break;
 	}
 	block.nodes.add(fn);
+	if (fn.kind()==FKind.FlatExit)
+	  exit=block;
       } while(true);
     }
-
     return new BasicBlock(map.get(fm), exit);
   }
 }
diff --git a/Robust/src/Analysis/Pointer/Delta.java b/Robust/src/Analysis/Pointer/Delta.java
index 743b8dbf..e150f02c 100644
--- a/Robust/src/Analysis/Pointer/Delta.java
+++ b/Robust/src/Analysis/Pointer/Delta.java
@@ -19,6 +19,8 @@ public class Delta {
   public Delta check() {
     for(Map.Entry<AllocNode, MySet<Edge>> entry:heapedgeadd.entrySet()) {
       AllocNode node=entry.getKey();
+      if (node==null)
+	throw new Error("null node key");
       for(Edge e:entry.getValue())
 	if (e.src!=node)
 	  throw new Error(e.src+" is not equal to "+node);
@@ -26,6 +28,8 @@ public class Delta {
 
     for(Map.Entry<TempDescriptor, MySet<Edge>> entry:varedgeadd.entrySet()) {
       TempDescriptor tmp=entry.getKey();
+      if (tmp==null)
+	throw new Error("null temp key");
       for(Edge e:entry.getValue())
 	if (e.srcvar!=tmp)
 	  throw new Error(e.srcvar+" is not equal to "+tmp);
diff --git a/Robust/src/Analysis/Pointer/Graph.java b/Robust/src/Analysis/Pointer/Graph.java
index 265153c9..6ad79aaa 100644
--- a/Robust/src/Analysis/Pointer/Graph.java
+++ b/Robust/src/Analysis/Pointer/Graph.java
@@ -18,12 +18,16 @@ public class Graph {
   public void check() {
     for(Map.Entry<AllocNode, MySet<Edge>> entry:nodeMap.entrySet()) {
       AllocNode node=entry.getKey();
+      if (node==null)
+	throw new Error("Null node key");
       for(Edge e:entry.getValue())
 	if (e.src!=node)
 	  throw new Error();
     }
     for(Map.Entry<TempDescriptor, MySet<Edge>> entry:varMap.entrySet()) {
       TempDescriptor tmp=entry.getKey();
+      if (tmp==null)
+	throw new Error("Null tmp key");
       for(Edge e:entry.getValue())
 	if (e.srcvar!=tmp)
 	  throw new Error();
diff --git a/Robust/src/Analysis/Pointer/GraphManip.java b/Robust/src/Analysis/Pointer/GraphManip.java
index a899fc5b..ea998fae 100644
--- a/Robust/src/Analysis/Pointer/GraphManip.java
+++ b/Robust/src/Analysis/Pointer/GraphManip.java
@@ -26,10 +26,13 @@ public class GraphManip {
   static MySet<Edge> getDiffEdges(Delta delta, TempDescriptor tmp) {
     MySet<Edge> edges=new MySet<Edge>();
     MySet<Edge> removeedges=delta.varedgeremove.get(tmp);
-
-    for(Edge e:delta.basevaredge.get(tmp)) {
-      if (removeedges==null||!removeedges.contains(e))
-	edges.add(e);
+    
+    MySet<Edge> baseedges=delta.basevaredge.get(tmp);
+    if (baseedges!=null) {
+      for(Edge e:baseedges) {
+	if (removeedges==null||!removeedges.contains(e))
+	  edges.add(e);
+      }
     }
     if (delta.varedgeadd.containsKey(tmp))
       for(Edge e:delta.varedgeadd.get(tmp)) {
@@ -88,11 +91,14 @@ public class GraphManip {
   static HashSet<AllocNode> getDiffNodes(Delta delta, TempDescriptor tmp) {
     HashSet<AllocNode> nodes=new HashSet<AllocNode>();
     MySet<Edge> removeedges=delta.varedgeremove.get(tmp);
+    
+    MySet<Edge> baseEdges=delta.basevaredge.get(tmp);
 
-    for(Edge e:delta.basevaredge.get(tmp)) {
-      if (removeedges==null||!removeedges.contains(e))
-	nodes.add(e.dst);
-    }
+    if (baseEdges!=null)
+      for(Edge e:baseEdges) {
+	if (removeedges==null||!removeedges.contains(e))
+	  nodes.add(e.dst);
+      }
     if (delta.varedgeadd.containsKey(tmp))
       for(Edge e:delta.varedgeadd.get(tmp)) {
 	nodes.add(e.dst);
diff --git a/Robust/src/Analysis/Pointer/Pointer.java b/Robust/src/Analysis/Pointer/Pointer.java
index af467a28..0c73bd53 100644
--- a/Robust/src/Analysis/Pointer/Pointer.java
+++ b/Robust/src/Analysis/Pointer/Pointer.java
@@ -71,7 +71,6 @@ public class Pointer {
 	startindex=ppoint.getIndex()+1;
 	delta=applyCallDelta(delta, bblock);
       }
-
       Graph graph=bbgraphMap.get(bblock);
       Graph nodeGraph=null;
       //Compute delta at exit of each node
@@ -185,6 +184,8 @@ public class Pointer {
 	/* Start with the new incoming edges */
 	MySet<Edge> newbaseedge=delta.basevaredge.get(tmp);
 	/* Remove the remove set */
+	if (newbaseedge==null)
+	  newbaseedge=new MySet<Edge>();
 	newbaseedge.removeAll(delta.varedgeremove.get(tmp));
 	/* Add in the new set*/
 	newbaseedge.addAll(delta.varedgeadd.get(tmp));
@@ -200,7 +201,7 @@ public class Pointer {
       nodeSet.addAll(delta.heapedgeremove.keySet());
       for(AllocNode node:nodeSet) {
 	/* Start with the new incoming edges */
-	MySet<Edge> newheapedge=(MySet<Edge>) delta.baseheapedge.get(node).clone();
+	MySet<Edge> newheapedge=new MySet<Edge>(delta.baseheapedge.get(node));
 	/* Remove the remove set */
 	MySet<Edge> removeset=delta.heapedgeremove.get(node);
 
@@ -244,14 +245,32 @@ public class Pointer {
     /* Now we need to propagate newdelta */
     if (!newDelta.heapedgeadd.isEmpty()||!newDelta.heapedgeremove.isEmpty()||!newDelta.varedgeadd.isEmpty()||!newDelta.addNodeAges.isEmpty()||!newDelta.addOldNodes.isEmpty()) {
       /* We have a delta to propagate */
-      Vector<BBlock> blockvector=bblock.next();
-      for(int i=0;i<blockvector.size();i++) {
-	if (i==0) {
-	  newDelta.setBlock(new PPoint(blockvector.get(i)));
-	  toprocess.add(newDelta);
-	} else {
-	  Delta d=newDelta.diffBlock(new PPoint(blockvector.get(i)));
-	  toprocess.add(d);
+
+      if (returnMap.containsKey(bblock)) {
+	//exit of call block
+	boolean first=true;
+
+	for(PPoint caller:returnMap.get(bblock)) {
+	  if (first) {
+	    newDelta.setBlock(caller);
+	    toprocess.add(newDelta);
+	    first=false;
+	  } else {
+	    Delta d=newDelta.diffBlock(caller);
+	    toprocess.add(d);
+	  }
+	}
+      } else {
+	//normal block
+	Vector<BBlock> blockvector=bblock.next();
+	for(int i=0;i<blockvector.size();i++) {
+	  if (i==0) {
+	    newDelta.setBlock(new PPoint(blockvector.get(i)));
+	    toprocess.add(newDelta);
+	  } else {
+	    Delta d=newDelta.diffBlock(new PPoint(blockvector.get(i)));
+	    toprocess.add(d);
+	  }
 	}
       }
     }
@@ -273,6 +292,7 @@ public class Pointer {
       return processSetFieldElementNode(node, delta, newgraph);
     case FKind.FlatMethod:
     case FKind.FlatExit:
+    case FKind.FlatGenReachNode:
       return processFlatNop(node, delta, newgraph);
     case FKind.FlatCall:
       return processFlatCall(bblock, index, (FlatCall) node, delta, newgraph);
@@ -405,7 +425,9 @@ public class Pointer {
 	  //Need to push existing results to current node
 	  if (returnDelta==null) {
 	    returnDelta=new Delta(null, false);
-	    buildInitDelta(bbgraphMap.get(block.getExit()), returnDelta);
+	    Vector<FlatNode> exitblocknodes=block.getExit().nodes();
+	    FlatExit fexit=(FlatExit)exitblocknodes.get(exitblocknodes.size()-1);
+	    buildInitDelta(graphMap.get(fexit), returnDelta);
 	    if (!returnDelta.heapedgeadd.isEmpty()||!returnDelta.heapedgeremove.isEmpty()||!returnDelta.varedgeadd.isEmpty()) {
 	      returnDelta.setBlock(new PPoint(callblock, callindex));
 	      toprocess.add(returnDelta);
@@ -500,7 +522,6 @@ public class Pointer {
       delta.removeEdge(e);
     }
   }
-  
 
   Delta processFlatCall(BBlock callblock, int callindex, FlatCall fcall, Delta delta, Graph graph) {
     Delta newDelta=new Delta(null, false);
@@ -610,7 +631,7 @@ public class Pointer {
     Graph oldgraph=(ppoint.getIndex()==0)?
       bbgraphMap.get(bblock):
       graphMap.get(nodes.get(ppoint.getIndex()-1));
-    
+
     //Age outside nodes if necessary
     for(Iterator<AllocNode> nodeit=delta.addNodeAges.iterator();nodeit.hasNext();) {
       AllocNode node=nodeit.next();
@@ -624,7 +645,6 @@ public class Pointer {
 	summarizeInGraph(graph, newDelta, node);
       }
     }
-    
     //Add heap edges in
     for(Map.Entry<AllocNode, MySet<Edge>> entry:delta.heapedgeadd.entrySet()) {
       for(Edge e:entry.getValue()) {
@@ -645,7 +665,6 @@ public class Pointer {
 	mergeEdge(graph, newDelta, edgetoadd);
       }
     }
-
     //Add external edges in
     for(Edge e:graph.externalEdgeSet) {
       //First did we age the source
@@ -671,15 +690,15 @@ public class Pointer {
     }
     //Add edge for return value
     if (fcall.getReturnTemp()!=null) {
-      MySet<Edge> returnedge=newDelta.varedgeadd.get(returntmp);
-      for(Edge e:returnedge) {
-	Edge newedge=e.copy();
-	newedge.srcvar=fcall.getReturnTemp();
-	if (graph.getEdges(fcall.getReturnTemp())==null||!graph.getEdges(fcall.getReturnTemp()).contains(newedge))
-	  newDelta.addEdge(newedge);
-      }
+      MySet<Edge> returnedge=delta.varedgeadd.get(returntmp);
+      if (returnedge!=null)
+	for(Edge e:returnedge) {
+	  Edge newedge=e.copy();
+	  newedge.srcvar=fcall.getReturnTemp();
+	  if (graph.getEdges(fcall.getReturnTemp())==null||!graph.getEdges(fcall.getReturnTemp()).contains(newedge))
+	    newDelta.addEdge(newedge);
+	}
     }
-
     applyDiffs(graph, newDelta);
     return newDelta;
   }
@@ -690,7 +709,7 @@ public class Pointer {
 
       if (match==null||!match.subsumes(edgetoadd)) {
 	Edge mergededge=edgetoadd.merge(match);
-	newDelta.addHeapEdge(mergededge);
+	newDelta.addEdge(mergededge);
       }
     }
   }