bug fixed in taskanalysis. we missed self edges if the task just returned w/o settin...
authorbdemsky <bdemsky>
Thu, 24 May 2007 07:02:08 +0000 (07:02 +0000)
committerbdemsky <bdemsky>
Thu, 24 May 2007 07:02:08 +0000 (07:02 +0000)
Robust/src/Analysis/TaskStateAnalysis/Allocations.java
Robust/src/Analysis/TaskStateAnalysis/FlagState.java
Robust/src/Analysis/TaskStateAnalysis/TaskAnalysis.java
Robust/src/IR/Flat/BuildCode.java
Robust/src/IR/Flat/BuildFlat.java
Robust/src/IR/Flat/FlatMethod.java
Robust/src/Interface/WebInterface.java
Robust/src/Makefile

index 0e2750039889d868bdcd230b329c5f6b2adff142..760a7a6b67cd862895fdba5be01d41a89b456ad5 100644 (file)
@@ -1,7 +1,7 @@
 package Analysis.TaskStateAnalysis;
 import Util.*;
 
-public class Allocations {
+public class Allocations extends Namer {
     public Allocations() {}
 
     public String nodeLabel(GraphNode gn) {
index b32c02653ed97411baaa10130a7053879bcf70a5..3c862ce5b73b7c5add1da7ea88f4d6c25fa30f00 100644 (file)
@@ -246,7 +246,7 @@ public class FlagState extends GraphNode {
                }
        }
        if (label==null)
-           return "";
+           return " ";
        return label;
     }
     
index 7d98537aae5f953137800e4a1acf6e8171d1b508..b723e1b8a7b6de4c3e315efef1c931faab8f8e2f 100644 (file)
@@ -119,12 +119,14 @@ public class TaskAnalysis {
        ClassDescriptor startupobject=typeutil.getClass(TypeUtil.StartupClass);
        
        sourcenodes=(Hashtable<FlagState,FlagState>)flagstates.get(startupobject);
-       
        FlagState fsstartup=new FlagState(startupobject);
+       
+       
        FlagDescriptor[] fd=(FlagDescriptor[])flags.get(startupobject);
        
        fsstartup=fsstartup.setFlag(fd[0],true);
-       
+       fsstartup.setAsSourceNode();
+
        sourcenodes.put(fsstartup,fsstartup);
        toprocess.add(fsstartup);
        
@@ -212,13 +214,21 @@ private void analyseTasks(FlagState fs) {
            }
        }
        
+       Stack nodestack=new Stack();
+       HashSet discovered=new HashSet();
+       nodestack.push(fm);
+       discovered.add(fm);
        //Iterating through the nodes
-       Set nodeset=fm.getNodeSet();
        
-       for(Iterator nodeit=nodeset.iterator();nodeit.hasNext();) {
-           FlatNode fn1 = (FlatNode) nodeit.next();
+       while(!nodestack.isEmpty()) {
+           FlatNode fn1 = (FlatNode) nodestack.pop();
            
-           if (fn1.kind()==FKind.FlatFlagActionNode) {
+           if (fn1.kind()==FKind.FlatReturnNode) {
+               /* Self edge */
+               FEdge newedge=new FEdge(fs, taskname);
+               fs.addEdge(newedge);
+               continue;
+           } else if (fn1.kind()==FKind.FlatFlagActionNode) {
                FlatFlagActionNode ffan=(FlatFlagActionNode)fn1;
                if (ffan.getTaskType() == FlatFlagActionNode.PRE) {
                    if (ffan.getTempFlagPairs().hasNext()||ffan.getTempTagPairs().hasNext())
@@ -243,6 +253,15 @@ private void analyseTasks(FlagState fs) {
                        //FEdge newedge=new FEdge(fs_taskexit,td);
                        fs.addEdge(newedge);
                    }
+                   continue;
+               }
+           }
+           /* Queue other nodes past this one */
+           for(int i=0;i<fn1.numNext();i++) {
+               FlatNode fnext=fn1.getNext(i);
+               if (!discovered.contains(fnext)) {
+                   discovered.add(fnext);
+                   nodestack.push(fnext);
                }
            }
        }
index ed2f50f2d6cd3bac4a31c87e147bb059115b0035..9fbcb4c9714c5c1106bf8a88569df59c8241752f 100644 (file)
@@ -981,7 +981,7 @@ public class BuildCode {
        HashSet visited=new HashSet();
        int labelindex=0;
        Hashtable nodetolabel=new Hashtable();
-       tovisit.add(fm.methodEntryNode());
+       tovisit.add(fm.getNext(0));
        FlatNode current_node=null;
 
        //Assign labels 1st
@@ -1012,7 +1012,7 @@ public class BuildCode {
        //Do the actual code generation
        tovisit=new HashSet();
        visited=new HashSet();
-       tovisit.add(fm.methodEntryNode());
+       tovisit.add(fm.getNext(0));
        while(current_node!=null||!tovisit.isEmpty()) {
            if (current_node==null) {
                current_node=(FlatNode)tovisit.iterator().next();
index 08101573549cfd4c3d769f1e70206d9e3fab2fa3..578e4a3217bf15de7b0c7ca98a0eceea89f2488f 100644 (file)
@@ -35,11 +35,18 @@ public class BuildFlat {
     
     private void flattenTask(TaskDescriptor td) {
        BlockNode bn=state.getMethodBody(td);
-       FlatNode fn=flattenBlockNode(bn).getBegin();
+       NodePair np=flattenBlockNode(bn);
+       FlatNode fn=np.getBegin();
+       if (np.getEnd().kind()!=FKind.FlatReturnNode) {
+           FlatReturnNode rnflat=new FlatReturnNode(null);
+           np.getEnd().addNext(rnflat);
+       }
+
        FlatFlagActionNode ffan=new FlatFlagActionNode(FlatFlagActionNode.PRE);
        ffan.addNext(fn);
 
-       FlatMethod fm=new FlatMethod(td, ffan);
+       FlatMethod fm=new FlatMethod(td);
+       fm.addNext(ffan);
 
        HashSet visitedset=new HashSet();
 
@@ -108,10 +115,16 @@ public class BuildFlat {
                    MethodDescriptor memdex=(MethodDescriptor)typeutil.getClass("Object").getMethodTable().get("MonitorExit");
                    FlatCall fcunlock=new FlatCall(memdex, null, thistd, new TempDescriptor[0]);
                    np.getEnd().addNext(fcunlock);
+                   FlatReturnNode rnflat=new FlatReturnNode(null);
+                   fcunlock.addNext(rnflat);
                }
+           } else if (np.getEnd().kind()!=FKind.FlatReturnNode) {
+               FlatReturnNode rnflat=new FlatReturnNode(null);
+               np.getEnd().addNext(rnflat);
            }
 
-           FlatMethod fm=new FlatMethod(currmd, fn);
+           FlatMethod fm=new FlatMethod(currmd);
+           fm.addNext(fn);
            if (!currmd.isStatic())
                fm.addParameterTemp(getTempforParam(currmd.getThis()));
            for(int i=0;i<currmd.numParameters();i++) {
index 6f4b390154609f0e360679929c3f613099fc5546..be3c8182877704b38da955111c77576b073a4458 100644 (file)
@@ -4,26 +4,23 @@ import IR.TaskDescriptor;
 import java.util.*;
 
 public class FlatMethod extends FlatNode {
-    FlatNode method_entry;
     MethodDescriptor method;
     TaskDescriptor task;
     Vector parameterTemps;
     Vector tagTemps;
     Hashtable tagtointmap;
 
-    FlatMethod(MethodDescriptor md, FlatNode entry) {
+    FlatMethod(MethodDescriptor md) {
        method=md;
        task=null;
-       method_entry=entry;
        parameterTemps=new Vector();
        tagTemps=new Vector();
        tagtointmap=new Hashtable();
     }
 
-    FlatMethod(TaskDescriptor td, FlatNode entry) {
+    FlatMethod(TaskDescriptor td) {
        task=td;
        method=null;
-       method_entry=entry;
        parameterTemps=new Vector();
        tagTemps=new Vector();
        tagtointmap=new Hashtable();
@@ -74,16 +71,12 @@ public class FlatMethod extends FlatNode {
        return (TempDescriptor) parameterTemps.get(i);
     }
 
-    public FlatNode methodEntryNode() {
-       return method_entry;
-    }
-
     /** This method returns a set of the nodes in this flat representation */
 
     public Set getNodeSet() {
        HashSet tovisit=new HashSet();
        HashSet visited=new HashSet();
-       tovisit.add(method_entry);
+       tovisit.add(this);
        while(!tovisit.isEmpty()) {
            FlatNode fn=(FlatNode)tovisit.iterator().next();
            tovisit.remove(fn);
@@ -106,7 +99,7 @@ public class FlatMethod extends FlatNode {
        HashSet visited=new HashSet();
        int labelindex=0;
        Hashtable nodetolabel=new Hashtable();
-       tovisit.add(method_entry);
+       tovisit.add(this);
        FlatNode current_node=null;
        //Assign labels 1st
        //Node needs a label if it is
@@ -135,7 +128,7 @@ public class FlatMethod extends FlatNode {
        //Do the actual printing
        tovisit=new HashSet();
        visited=new HashSet();
-       tovisit.add(method_entry);
+       tovisit.add(this);
        while(current_node!=null||!tovisit.isEmpty()) {
            if (current_node==null) {
                current_node=(FlatNode)tovisit.iterator().next();
index 7a97ed00fb820257ae74fb74c476225698ba3ad8..9b62ce3d79aeef78c37f37687e01bf5aaa2c0b42 100644 (file)
@@ -103,7 +103,7 @@ public class WebInterface {
                taskmap.put("/"+cd.getSymbol()+".html", cd);
            }
            if (taskgraph.getTaskNodes(cd)!=null) {
-               pw.println("<a href=\""+cd.getSymbol()+"-t.html\">"+ cd.getSymbol() +"</a>");
+               pw.println("<a href=\""+cd.getSymbol()+"-t.html\">Task Graph "+ cd.getSymbol() +"</a>");
                pw.println("<br>");
                taskgraphmap.put("/"+cd.getSymbol()+"-t.html", cd);
            }
index 68fbe05fff6f26ea2a01ea2122904f4d4c03d9c6..ee3dbb193b73f856e98de7248591c30541ff6c69 100644 (file)
@@ -47,6 +47,7 @@ IR/Tree/TagEffect.class IR/Tree/TagExpressionList.class                       \
 IR/Tree/TaskExitNode.class IR/Tree/TreeNode.class                      \
 IR/Tree/Walkable.class Analysis/TaskStateAnalysis/FEdge.class          \
 Analysis/TaskStateAnalysis/FlagState.class                             \
+Analysis/TaskStateAnalysis/Allocations.class                           \
 Analysis/TaskStateAnalysis/TEdge.class                                 \
 Analysis/TaskStateAnalysis/TagAnalysis.class                           \
 Analysis/TaskStateAnalysis/TagBinding.class                            \
@@ -78,7 +79,7 @@ javadoc:
        javadoc -classpath ../cup:.:$(CLASSPATH) -sourcepath . -private -d javadoc Lex Util IR IR.Tree IR.Flat Analysis Analysis.CallGraph Analysis.Flag Analysis.TaskStateAnalysis Main 
 
 clean:
-       rm IR/*.class IR/Tree/*.class Main/*.class Lex/*.class Parse/*.class Parse/Sym.java Parse/Parser.java IR/Flat/*.class classdefs.h methodheaders.h methods.c structdefs.h virtualtable.h task.h taskdefs.c taskdefs.h Analysis/*.class Analysis/Flag/*.class Analysis/CallGraph/*.class  Analysis/TaskStateAnalysis/*.class Util/Relation/*.class
+       rm IR/*.class IR/Tree/*.class Main/*.class Lex/*.class Parse/*.class Parse/Sym.java Parse/Parser.java IR/Flat/*.class classdefs.h methodheaders.h methods.c structdefs.h virtualtable.h task.h taskdefs.c taskdefs.h Analysis/*.class Analysis/Flag/*.class Analysis/CallGraph/*.class  Analysis/TaskStateAnalysis/*.class Util/Relation/*.class Interface/*.class
 
 cleandoc:
        rm -rf javadoc
\ No newline at end of file