Code to keep track of flags in flat ir
authorbdemsky <bdemsky>
Wed, 17 May 2006 05:10:30 +0000 (05:10 +0000)
committerbdemsky <bdemsky>
Wed, 17 May 2006 05:10:30 +0000 (05:10 +0000)
Robust/src/IR/Flat/BuildFlat.java
Robust/src/IR/Flat/FKind.java
Robust/src/IR/Flat/FlatFlagActionNode.java [new file with mode: 0644]
Robust/src/IR/Flat/FlatTaskExitNode.java
Robust/src/IR/Tree/FlagEffect.java

index 471b5fe0b6a158df59abaa876484e909d0ca4040..7cead58fdeaa9dc588c6fc2a49d4f976b6e37d01 100644 (file)
@@ -33,14 +33,34 @@ public class BuildFlat {
     private void flattenTask(TaskDescriptor td) {
        BlockNode bn=state.getMethodBody(td);
        FlatNode fn=flattenBlockNode(bn).getBegin();
-       FlatMethod fm=new FlatMethod(td, fn);
+       FlatFlagActionNode ffan=new FlatFlagActionNode();
+       ffan.addNext(fn);
+       FlatMethod fm=new FlatMethod(td, ffan);
 
        for(int i=0;i<td.numParameters();i++) {
            fm.addParameterTemp(getTempforVar(td.getParameter(i)));
        }
+
+       /* Flatten Vector of Flag Effects */
+       Vector flags=td.getFlagEffects();
+       updateFlagActionNode(ffan,flags);
+
        state.addFlatCode(td,fm);
     }
 
+
+    /* This method transforms a vector of FlagEffects into the FlatFlagActionNode */
+    private void updateFlagActionNode(FlatFlagActionNode ffan, Vector flags) {
+       for(int i=0;i<flags.size();i++) {
+           FlagEffects fes=(FlagEffects)flags.get(i);
+           TempDescriptor flagtemp=getTempforVar(fes.getVar());
+           for(int j=0;j<fes.numEffects();j++) {
+               FlagEffect fe=fes.getEffect(j);
+               ffan.addFlagAction(flagtemp, fe.getFlag(), fe.getStatus());
+           }
+       }
+    }
+
     private void flattenClass(ClassDescriptor cn) {
        Iterator methodit=cn.getMethods();
        while(methodit.hasNext()) {
index 292ed6783ba582702a2e137bbf862feb2cdb8752..b15035c7ed1603c760bda2cb49745ea1a5dd6f0a 100644 (file)
@@ -14,4 +14,5 @@ public class FKind {
     public static final int FlatSetElementNode=11;
     public static final int FlatElementNode=12;
     public static final int FlatTaskExitNode=13;
+    public static final int FlatFlagActionNode=14;
 }
diff --git a/Robust/src/IR/Flat/FlatFlagActionNode.java b/Robust/src/IR/Flat/FlatFlagActionNode.java
new file mode 100644 (file)
index 0000000..39994ac
--- /dev/null
@@ -0,0 +1,38 @@
+package IR.Flat;
+import IR.FlagDescriptor;
+import java.util.Hashtable;
+import java.util.HashSet;
+import java.util.Iterator;
+
+public class FlatFlagActionNode extends FlatNode {
+    Hashtable tempflagpairs; 
+
+    public FlatFlagActionNode() {
+       tempflagpairs=new Hashtable();
+    }
+
+    public void addFlagAction(TempDescriptor td, FlagDescriptor fd, boolean status) {
+       TempFlagPair tfp=new TempFlagPair(td,fd);
+       if (tempflagpairs.containsKey(tfp)) {
+           throw new Error("Temp/Flag combination used twice: "+tfp);
+       }
+       tempflagpairs.put(tfp, new Boolean(status));
+    }
+
+    public int kind() {
+        return FKind.FlatFlagActionNode;
+    }
+
+    public TempDescriptor [] readsTemps() {
+        if (tempflagpairs.size()==0)
+            return new TempDescriptor [0];
+        else {
+           HashSet temps=new HashSet();
+           for(Iterator it=tempflagpairs.keySet().iterator();it.hasNext();) {
+               TempFlagPair tfp=(TempFlagPair)it.next();
+               temps.add(tfp.getTemp());
+           }
+            return (TempDescriptor[]) temps.toArray(new TempDescriptor [temps.size()]);
+       }
+    }
+}
index c13d9ebd3b99beb3ad37993bcc1bdc1a84236fe9..fee0f33d4c2fcce6f4ccdd784fc9d89679bf05ca 100644 (file)
@@ -7,8 +7,4 @@ public class FlatTaskExitNode extends FlatNode {
     public int kind() {
        return FKind.FlatTaskExitNode;
     }
-
-    public TempDescriptor [] readsTemps() {
-       return new TempDescriptor [0];
-    }
 }
index 78769103ab2e0b8e175a9698fafd1011a11fe926..8bc1c43e7ebf29fdd1f847980667b4a470c1de59 100644 (file)
@@ -28,6 +28,10 @@ public class FlagEffect {
        return Kind.FlagNode;
     }
 
+    public boolean getStatus() {
+       return status;
+    }
+
     public String printNode(int indent) {
        if (status)
            return name;