Initial compiler side support for tags
authorbdemsky <bdemsky>
Thu, 26 Apr 2007 19:49:35 +0000 (19:49 +0000)
committerbdemsky <bdemsky>
Thu, 26 Apr 2007 19:49:35 +0000 (19:49 +0000)
Robust/src/IR/Flat/BuildCode.java
Robust/src/IR/Flat/BuildFlat.java
Robust/src/IR/Flat/FlatMethod.java
Robust/src/IR/TaskDescriptor.java
Robust/src/IR/Tree/TagExpressionList.java

index 86a47ac2ac02e245f4f4d0c2614e22c153bcd0f7..5d49ef3b59e543d692b9cebf22b81eb44f80ca37 100644 (file)
@@ -2,6 +2,7 @@ package IR.Flat;
 import IR.Tree.FlagExpressionNode;
 import IR.Tree.DNFFlag;
 import IR.Tree.DNFFlagAtom;
+import IR.Tree.TagExpressionList;
 import IR.*;
 import java.util.*;
 import java.io.*;
@@ -151,6 +152,8 @@ public class BuildCode {
                outtask.println("int numberterms;");
                outtask.println("int *intarray;");
                outtask.println("void * queue;");
+               outtask.println("int numbertags;");
+               outtask.println("int *tagarray;");
                outtask.println("};");
 
                outtask.println("struct taskdescriptor {");
@@ -171,7 +174,6 @@ public class BuildCode {
            generateCallStructs(cn, outclassdefs, outstructs, outmethodheader);
        }
 
-
        if (state.TASK) {
            /* Map flags to integers */
            it=state.getClassSymbolTable().getDescriptorsIterator();
@@ -237,7 +239,7 @@ public class BuildCode {
                TaskDescriptor td=(TaskDescriptor)taskit.next();
                FlatMethod fm=state.getMethodFlat(td);
                generateFlatMethod(fm, outmethod);
-               generateTaskDescriptor(outtaskdefs, td);
+               generateTaskDescriptor(outtaskdefs, fm, td);
            }
 
            {
@@ -384,15 +386,16 @@ public class BuildCode {
     }
 
     /** This method outputs TaskDescriptor information */
-    void generateTaskDescriptor(PrintWriter output, TaskDescriptor task) {
+    void generateTaskDescriptor(PrintWriter output, FlatMethod fm, TaskDescriptor task) {
        for (int i=0;i<task.numParameters();i++) {
            VarDescriptor param_var=task.getParameter(i);
            TypeDescriptor param_type=task.getParamType(i);
            FlagExpressionNode param_flag=task.getFlag(param_var);
+           TagExpressionList param_tag=task.getTag(param_var);
+
            DNFFlag dflag=param_flag.getDNF();
            
            Hashtable flags=(Hashtable)flagorder.get(param_type.getClassDesc());
-                       
            output.println("int parameterdnf_"+i+"_"+task.getSafeSymbol()+"[]={");
            for(int j=0;j<dflag.size();j++) {
                if (j!=0)
@@ -413,11 +416,34 @@ public class BuildCode {
            }
            output.println("};");
 
+           output.println("int parametertag_"+i+"_"+task.getSafeSymbol()+"[]={");
+           //BUG...added next line to fix, test with any task program
+           if (param_tag!=null)
+               for(int j=0;j<param_tag.numTags();j++) {
+                   if (j!=0)
+                       output.println(",");
+                   /* for each tag we need */
+                   /* which slot it is */
+                   /* what type it is */
+                   TagVarDescriptor tvd=(TagVarDescriptor)task.getParameterTable().get(param_tag.getName(j));
+                   TempDescriptor tmp=param_tag.getTemp(j);
+                   int slot=fm.getTagInt(tmp);
+                   output.println(slot+", "+state.getTagId(tvd.getTag()));
+               }
+           output.println("};");
+
            output.println("struct parameterdescriptor parameter_"+i+"_"+task.getSafeSymbol()+"={");
            output.println("/* type */"+param_type.getClassDesc().getId()+",");
            output.println("/* number of DNF terms */"+dflag.size()+",");
            output.println("parameterdnf_"+i+"_"+task.getSafeSymbol()+",");
-           output.println("0");
+           output.println("0,");
+           //BUG, added next line to fix and else statement...test
+           //with any task program
+           if (param_tag!=null)
+               output.println("/* number of tags */"+param_tag.numTags()+",");
+           else
+               output.println("/* number of tags */ 0,");
+           output.println("parametertag_"+i+"_"+task.getSafeSymbol());
            output.println("};");
        }
 
@@ -847,9 +873,15 @@ public class BuildCode {
                    TempDescriptor temp=objectparams.getPointer(i);
                    output.println("  struct "+temp.getType().getSafeSymbol()+" * "+temp.getSafeSymbol()+";");
                }
+               for(int i=0;i<fm.numTags();i++) {
+                   TempDescriptor temp=fm.getTag(i);
+                   output.println("  struct TagDescriptor * "+temp.getSafeSymbol()+";");
+               }
+
                output.println("};\n");
-               if (objectparams.numPointers()>maxtaskparams)
-                   maxtaskparams=objectparams.numPointers();
+               if ((objectparams.numPointers()+fm.numTags())>maxtaskparams) {
+                   maxtaskparams=objectparams.numPointers()+fm.numTags();
+               }
            }
 
            /* Output temp structure */
@@ -889,7 +921,7 @@ public class BuildCode {
 
        ParamsObject objectparams=(ParamsObject)paramstable.get(md!=null?md:task);
 
-       generateHeader(md!=null?md:task,output);
+       generateHeader(fm, md!=null?md:task,output);
 
        TempObject objecttemp=(TempObject) tempstable.get(md!=null?md:task);
 
@@ -1351,7 +1383,7 @@ public class BuildCode {
        output.println("if (!"+generateTemp(fm, fcb.getTest())+") goto "+label+";");
     }
 
-    private void generateHeader(Descriptor des, PrintWriter output) {
+    private void generateHeader(FlatMethod fm, Descriptor des, PrintWriter output) {
        /* Print header */
        ParamsObject objectparams=(ParamsObject)paramstable.get(des);
        MethodDescriptor md=null;
@@ -1383,9 +1415,10 @@ public class BuildCode {
            else
                output.print("struct "+task.getSafeSymbol()+"_params * "+paramsprefix);
            printcomma=true;
-       } 
+       }
 
        if (md!=null) {
+           /* Method */
            for(int i=0;i<objectparams.numPrimitives();i++) {
                TempDescriptor temp=objectparams.getPrimitive(i);
                if (printcomma)
@@ -1397,17 +1430,25 @@ public class BuildCode {
                    output.print(temp.getType().getSafeSymbol()+" "+temp.getSafeSymbol());
            }
            output.println(") {");
-       } else if (!GENERATEPRECISEGC){
+       } else if (!GENERATEPRECISEGC) {
+           /* Imprecise Task */
            output.println("void * parameterarray[]) {");
+           /* Unpack variables */
            for(int i=0;i<objectparams.numPrimitives();i++) {
                TempDescriptor temp=objectparams.getPrimitive(i);
                output.println("struct "+temp.getType().getSafeSymbol()+" * "+temp.getSafeSymbol()+"=parameterarray["+i+"];");
            }
-           if (objectparams.numPrimitives()>maxtaskparams)
-               maxtaskparams=objectparams.numPrimitives();
+           for(int i=0;i<fm.numTags();i++) {
+               TempDescriptor temp=fm.getTag(i);
+               int offset=i+objectparams.numPrimitives();
+               output.println("struct TagDescriptor * "+temp.getSafeSymbol()+"=parameterarray["+offset+"];");
+           }
+
+           if ((objectparams.numPrimitives()+fm.numTags())>maxtaskparams)
+               maxtaskparams=objectparams.numPrimitives()+fm.numTags();
        } else output.println(") {");
     }
-
+    
     public void generateFlatFlagActionNode(FlatMethod fm, FlatFlagActionNode ffan, PrintWriter output) {
        output.println("/* FlatFlagActionNode */");
        Hashtable flagandtable=new Hashtable();
index 088e9c2e0239d639ddfcbc4c9ac8aba0aaf2510d..c52841dd09da7db1a6ce4cf77cf635b3f6efe95f 100644 (file)
@@ -44,9 +44,19 @@ public class BuildFlat {
        for(int i=0;i<td.numParameters();i++) {
            VarDescriptor paramvd=td.getParameter(i);
            fm.addParameterTemp(getTempforVar(paramvd));
-           //Don't need to get temps for tag variables
-           //If they are used, this will be done automatically
-           //If they aren't we won't pass them in
+           TagExpressionList tel=td.getTag(paramvd);
+           HashSet visitedset=new HashSet();
+           //BUG added next line to fix...to test feed in any task program
+           if (tel!=null)
+               for(int j=0;j<tel.numTags();j++) {
+                   TagVarDescriptor tvd=(TagVarDescriptor) td.getParameterTable().getFromSameScope(tel.getName(j));
+                   if (!visitedset.contains(tvd)) {
+                       visitedset.add(tvd);
+                       TempDescriptor tagtmp=getTempforVar(tvd);
+                       fm.addTagTemp(tagtmp);
+                       tel.setTemp(j, tagtmp);
+                   }
+               }
        }
 
        /* Flatten Vector of Flag Effects */
index 04f1cf76f0440fdecfcb6749b0eed2bff99ff95e..5f1793750c1b2e9596d85ea5db5655d0ae46cb62 100644 (file)
@@ -8,12 +8,16 @@ public class FlatMethod extends FlatNode {
     MethodDescriptor method;
     TaskDescriptor task;
     Vector parameterTemps;
+    Vector tagTemps;
+    Hashtable tagtointmap;
 
     FlatMethod(MethodDescriptor md, FlatNode entry) {
        method=md;
        task=null;
        method_entry=entry;
        parameterTemps=new Vector();
+       tagTemps=new Vector();
+       tagtointmap=new Hashtable();
     }
 
     FlatMethod(TaskDescriptor td, FlatNode entry) {
@@ -21,6 +25,8 @@ public class FlatMethod extends FlatNode {
        method=null;
        method_entry=entry;
        parameterTemps=new Vector();
+       tagTemps=new Vector();
+       tagtointmap=new Hashtable();
     }
 
     public String toString() {
@@ -43,6 +49,23 @@ public class FlatMethod extends FlatNode {
        return parameterTemps.size();
     }
 
+    public void addTagTemp(TempDescriptor t) {
+       tagtointmap.put(t, new Integer(tagTemps.size()));
+       tagTemps.add(t);
+    }
+
+    public int getTagInt(TempDescriptor t) {
+       return ((Integer)tagtointmap.get(t)).intValue();
+    }
+
+    public int numTags() {
+       return tagTemps.size();
+    }
+
+    public TempDescriptor getTag(int i) {
+       return (TempDescriptor) tagTemps.get(i);
+    }
+    
     public TempDescriptor getParameter(int i) {
        return (TempDescriptor) parameterTemps.get(i);
     }
index e152ecedd78aa524da3912e89cf15537d4796941..33935f6d6a3720c87e3af26a61397772b3189e21 100644 (file)
@@ -86,7 +86,9 @@ public class TaskDescriptor extends Descriptor {
     }
 
     public TagExpressionList getTag(VarDescriptor vd) {
-       return (TagExpressionList) flagstable.get(vd);
+       //BUG did lookup in wrong table (originally flagstable)...to
+       //test, use any task program
+       return (TagExpressionList) tagstable.get(vd);
     }
 
     public String toString() {
index 77eb9670bb6770703b2e11e8571b396e892c16cb..d74b60d8b07679603c4d41710ac8ffc1d1e002f6 100644 (file)
@@ -22,6 +22,16 @@ public class TagExpressionList {
        return names.size();
     }
 
+    public void setTemp(int i, TempDescriptor tmp) {
+       if (i>=temps.size())
+           temps.setSize(i+1);
+       temps.set(i, tmp);
+    }
+
+    public TempDescriptor getTemp(int i) {
+       return (TempDescriptor) temps.get(i);
+    }
+
     public String getName(int i) {
        return (String) names.get(i);
     }
@@ -30,3 +40,4 @@ public class TagExpressionList {
        return (String) types.get(i);
     }
 }
+