added dsmdebug file for debugging using macros and setting flags in buildscript
[IRC.git] / Robust / src / IR / Flat / BuildCode.java
index 848e81e1e17dd0f9bb8e215b65dcb788b626895f..8781ff4e3ca832db40545acb02f3d86ce2a20c59 100644 (file)
@@ -6,6 +6,7 @@ import IR.Tree.TagExpressionList;
 import IR.*;
 import java.util.*;
 import java.io.*;
+
 import Util.Relation;
 import Analysis.TaskStateAnalysis.FlagState;
 import Analysis.TaskStateAnalysis.FlagComparator;
@@ -36,7 +37,6 @@ public class BuildCode {
     public static int flagcount = 0;
     Virtual virtualcalls;
     TypeUtil typeutil;
-    //private int maxtaskparams=0;
     protected int maxtaskparams=0;
     private int maxcount=0;
     ClassDescriptor[] cdarray;
@@ -45,17 +45,19 @@ public class BuildCode {
     Hashtable<TempDescriptor, TempDescriptor> backuptable;
     Hashtable<LocalityBinding, TempDescriptor> reverttable;
     SafetyAnalysis sa;
+    PrefetchAnalysis pa;
 
-    public BuildCode(State st, Hashtable temptovar, TypeUtil typeutil, SafetyAnalysis sa) {
-       this(st, temptovar, typeutil, null, sa);
+    public BuildCode(State st, Hashtable temptovar, TypeUtil typeutil, SafetyAnalysis sa, PrefetchAnalysis pa) {
+       this(st, temptovar, typeutil, null, sa, pa);
     }
 
-    public BuildCode(State st, Hashtable temptovar, TypeUtil typeutil, LocalityAnalysis locality) {
-       this(st, temptovar, typeutil, locality, null);
+    public BuildCode(State st, Hashtable temptovar, TypeUtil typeutil, LocalityAnalysis locality, PrefetchAnalysis pa) {
+       this(st, temptovar, typeutil, locality, null, pa);
     }
 
-    public BuildCode(State st, Hashtable temptovar, TypeUtil typeutil, LocalityAnalysis locality, SafetyAnalysis sa) {
+    public BuildCode(State st, Hashtable temptovar, TypeUtil typeutil, LocalityAnalysis locality, SafetyAnalysis sa, PrefetchAnalysis pa) {
        this.sa=sa;
+       this.pa=pa;
        state=st;
        this.temptovar=temptovar;
        paramstable=new Hashtable();
@@ -192,6 +194,9 @@ public class BuildCode {
     private void outputMainMethod(PrintWriter outmethod) {
        outmethod.println("int main(int argc, const char *argv[]) {");
        outmethod.println("  int i;");
+    outmethod.println("#ifdef TRANSSTATS \n");
+    outmethod.println("handle();\n");
+    outmethod.println("#endif\n");
        if (state.THREAD||state.DSM) {
            outmethod.println("initializethreads();");
        }
@@ -261,8 +266,17 @@ public class BuildCode {
                outmethod.println("pthread_exit(NULL);");
        }
 
-
+    outmethod.println("#ifdef TRANSSTATS \n");
+    outmethod.println("printf(\"******  Transaction Stats   ******\\n\");");
+    outmethod.println("printf(\"numTransAbort= %d\\n\", numTransAbort);");
+    outmethod.println("printf(\"numTransCommit= %d\\n\", numTransCommit);");
+    outmethod.println("printf(\"nchashSearch= %d\\n\", nchashSearch);");
+    outmethod.println("printf(\"nmhashSearch= %d\\n\", nmhashSearch);");
+    outmethod.println("printf(\"nprehashSearch= %d\\n\", nprehashSearch);");
+    outmethod.println("printf(\"nRemoteReadSend= %d\\n\", nRemoteSend);");
+    outmethod.println("#endif\n");
        outmethod.println("}");
+
     }
 
     /* This method outputs code for each task. */
@@ -301,12 +315,12 @@ public class BuildCode {
      * objets and array that stores supertype and then the code for
      * the Java methods.. */
 
-    //private void outputMethods(PrintWriter outmethod) {
     protected void outputMethods(PrintWriter outmethod) {
        outmethod.println("#include \"methodheaders.h\"");
        outmethod.println("#include \"virtualtable.h\"");
-       outmethod.println("#include <runtime.h>");
+       outmethod.println("#include \"runtime.h\"");
        if (state.DSM) {
+           outmethod.println("#include \"addPrefetchEnhance.h\"");
            outmethod.println("#include \"localobjects.h\"");
        }
        if(state.MULTICORE) {
@@ -356,7 +370,6 @@ public class BuildCode {
        } 
     }
 
-    //private void outputStructs(PrintWriter outstructs) {
     protected void outputStructs(PrintWriter outstructs) {
        outstructs.println("#ifndef STRUCTDEFS_H");
        outstructs.println("#define STRUCTDEFS_H");
@@ -399,7 +412,6 @@ public class BuildCode {
        }
     }
 
-    //private void outputClassDeclarations(PrintWriter outclassdefs) {
     protected void outputClassDeclarations(PrintWriter outclassdefs) {
        if (state.THREAD||state.DSM)
            outclassdefs.println("#include <pthread.h>");
@@ -425,10 +437,11 @@ public class BuildCode {
            outclassdefs.println("  int flag;");
            if(!state.MULTICORE) {
                outclassdefs.println("  void * flagptr;");
-           } /*else {
-               outclassdefs.println("  int corenum;");
-               outclassdefs.println("  int flagptr;");
-           }*/
+           } else {
+               outclassdefs.println("  int isolate;"); // indicate if this object is shared or not
+               outclassdefs.println("  int version;");
+               outclassdefs.println("  struct ___Object___ * original;");
+           }
            if(state.OPTIONAL){
                outclassdefs.println("  int numfses;");
                outclassdefs.println("  int * fses;");
@@ -461,7 +474,7 @@ public class BuildCode {
        outtask.println("struct taskdescriptor {");
        outtask.println("void * taskptr;");
        outtask.println("int numParameters;");
-       outtask.println("int numTotal;");
+       outtask.println("  int numTotal;");
        outtask.println("struct parameterdescriptor **descriptorarray;");
        outtask.println("char * name;");
        outtask.println("};");
@@ -617,8 +630,7 @@ public class BuildCode {
 
     /** The buildVirtualTables method outputs the virtual dispatch
      * tables for methods. */
-
-    //private void buildVirtualTables(PrintWriter outvirtual) {
+    
     protected void buildVirtualTables(PrintWriter outvirtual) {
        Iterator classit=state.getClassSymbolTable().getDescriptorsIterator();
        while(classit.hasNext()) {
@@ -715,7 +727,19 @@ public class BuildCode {
      * information. */
 
     private void generateSizeArray(PrintWriter outclassdefs) {
-       outclassdefs.print("int classsize[]={");
+      outclassdefs.print("extern struct prefetchCountStats * evalPrefetch;\n");
+      outclassdefs.print("#ifdef TRANSSTATS \n");
+      outclassdefs.print("extern int numTransAbort;\n");
+      outclassdefs.print("extern int numTransCommit;\n");
+      outclassdefs.print("extern int nchashSearch;\n");
+      outclassdefs.print("extern int nmhashSearch;\n");
+      outclassdefs.print("extern int nprehashSearch;\n");
+      outclassdefs.print("extern int nRemoteSend;\n");
+      outclassdefs.print("extern void handle();\n");
+      outclassdefs.print("#endif\n");
+      outclassdefs.print("int numprefetchsites = " + pa.prefetchsiteid + ";\n");
+
+      outclassdefs.print("int classsize[]={");
        Iterator it=state.getClassSymbolTable().getDescriptorsIterator();
        cdarray=new ClassDescriptor[state.numClasses()];
        while(it.hasNext()) {
@@ -757,7 +781,6 @@ public class BuildCode {
      * These objects tell the compiler which temps need to be
      * allocated.  */
 
-    //private void generateTempStructs(FlatMethod fm, LocalityBinding lb) {
     protected void generateTempStructs(FlatMethod fm, LocalityBinding lb) {
        MethodDescriptor md=fm.getMethod();
        TaskDescriptor task=fm.getTask();
@@ -965,7 +988,6 @@ public class BuildCode {
     /* Map flags to integers consistently between inherited
      * classes. */
 
-    //private void mapFlags(ClassDescriptor cn) {
     protected void mapFlags(ClassDescriptor cn) {
        ClassDescriptor sp=cn.getSuperDesc();
        if (sp!=null)
@@ -1000,7 +1022,6 @@ public class BuildCode {
      * passed in (when PRECISE GC is enabled) and (2) function
      * prototypes for the methods */
 
-    //private void generateCallStructs(ClassDescriptor cn, PrintWriter classdefout, PrintWriter output, PrintWriter headersout) {
     protected void generateCallStructs(ClassDescriptor cn, PrintWriter classdefout, PrintWriter output, PrintWriter headersout) {
        /* Output class structure */
        classdefout.println("struct "+cn.getSafeSymbol()+" {");
@@ -1015,9 +1036,11 @@ public class BuildCode {
            classdefout.println("  int flag;");
            if((!state.MULTICORE) || (cn.getSymbol().equals("TagDescriptor"))) {
                classdefout.println("  void * flagptr;");
-           } /*else {
-               classdefout.println("  int flagptr;");
-           }*/
+           } else if (state.MULTICORE){
+               classdefout.println("  int isolate;"); // indicate if this object is shared or not
+               classdefout.println("  int version;");
+               classdefout.println("  struct ___Object___ * original;");
+           }
            if (state.OPTIONAL){
                classdefout.println("  int numfses;");
                classdefout.println("  int * fses;");
@@ -1334,7 +1357,6 @@ public class BuildCode {
 
     /** This method assigns labels to FlatNodes */
 
-    //private Hashtable<FlatNode, Integer> assignLabels(FlatMethod fm) {
     protected Hashtable<FlatNode, Integer> assignLabels(FlatMethod fm) {
        HashSet tovisit=new HashSet();
        HashSet visited=new HashSet();
@@ -1368,7 +1390,6 @@ public class BuildCode {
 
 
     /** Generate text string that corresponds to the TempDescriptor td. */
-    //private String generateTemp(FlatMethod fm, TempDescriptor td, LocalityBinding lb) {
     protected String generateTemp(FlatMethod fm, TempDescriptor td, LocalityBinding lb) {
        MethodDescriptor md=fm.getMethod();
        TaskDescriptor task=fm.getTask();
@@ -1388,7 +1409,6 @@ public class BuildCode {
        throw new Error();
     }
 
-    //private void generateFlatNode(FlatMethod fm, LocalityBinding lb, FlatNode fn, PrintWriter output) {
     protected void generateFlatNode(FlatMethod fm, LocalityBinding lb, FlatNode fn, PrintWriter output) {
        switch(fn.kind()) {
        case FKind.FlatAtomicEnterNode:
@@ -1481,8 +1501,11 @@ public class BuildCode {
                return;
            output.println("{");
            output.println("/* prefetch */");
+        output.println("/* prefetchid_" + fpn.siteid + " */");
            output.println("void * prefptr;");
            output.println("int tmpindex;");
+
+        output.println("if((evalPrefetch["+fpn.siteid+"].operMode) || (evalPrefetch["+fpn.siteid+"].retrycount <= 0)) {");
            /*Create C code for oid array */
            output.print("   unsigned int oidarray_[] = {");
            boolean needcomma=false;
@@ -1516,7 +1539,13 @@ public class BuildCode {
            }
            output.println("};");
            /* make the prefetch call to Runtime */
-           output.println("   prefetch("+tuplecount+", oidarray_, endoffsetarry_, fieldarry_);");
+        output.println("   if(!evalPrefetch["+fpn.siteid+"].operMode) {"); 
+           output.println("     evalPrefetch["+fpn.siteid+"].retrycount = RETRYINTERVAL;");
+           output.println("   }");
+           output.println("   prefetch("+fpn.siteid+" ,"+tuplecount+", oidarray_, endoffsetarry_, fieldarry_);");
+           output.println(" } else {");
+           output.println("   evalPrefetch["+fpn.siteid+"].retrycount--;");
+           output.println(" }");
            output.println("}");
        }   
     }   
@@ -1903,7 +1932,9 @@ public class BuildCode {
            } else if (status==LocalityAnalysis.EITHER) {
                //Code is reading from a null pointer
                output.println("if ("+generateTemp(fm, ffn.getSrc(),lb)+") {");
+               output.println("#ifndef RAW");
                output.println("printf(\"BIG ERROR\\n\");exit(-1);}");
+               output.println("#endif");
                //This should throw a suitable null pointer error
                output.println(generateTemp(fm, ffn.getDst(),lb)+"="+ generateTemp(fm,ffn.getSrc(),lb)+"->"+ ffn.getField().getSafeSymbol()+";");
            } else
@@ -1955,7 +1986,9 @@ public class BuildCode {
            } else if (statusdst.equals(LocalityAnalysis.EITHER)) {
                //writing to a null...bad
                output.println("if ("+dst+") {");
+               output.println("#ifndef RAW");
                output.println("printf(\"BIG ERROR 2\\n\");exit(-1);}");
+               output.println("#endif");
                if (srcglobal)
                    output.println(dst+"->"+ fsfn.getField().getSafeSymbol()+"=srcoid;");
                else
@@ -1998,7 +2031,9 @@ public class BuildCode {
            } else if (status==LocalityAnalysis.EITHER) {
                //Code is reading from a null pointer
                output.println("if ("+generateTemp(fm, fen.getSrc(),lb)+") {");
+               output.println("#ifndef RAW");
                output.println("printf(\"BIG ERROR\\n\");exit(-1);}");
+               output.println("#endif");
                //This should throw a suitable null pointer error
                output.println(generateTemp(fm, fen.getDst(),lb)+"=(("+ type+"*)(((char *) &("+ generateTemp(fm,fen.getSrc(),lb)+"->___length___))+sizeof(int)))["+generateTemp(fm, fen.getIndex(),lb)+"];");
            } else
@@ -2170,17 +2205,17 @@ public class BuildCode {
            output.println(generateTemp(fm, fln.getDst(),lb)+"="+fln.getValue()+";");
     }
 
-    private void generateFlatReturnNode(FlatMethod fm, LocalityBinding lb, FlatReturnNode frn, PrintWriter output) {
+    protected void generateFlatReturnNode(FlatMethod fm, LocalityBinding lb, FlatReturnNode frn, PrintWriter output) {
        if (frn.getReturnTemp()!=null) {
            if (frn.getReturnTemp().getType().isPtr())
                output.println("return (struct "+fm.getMethod().getReturnType().getSafeSymbol()+"*)"+generateTemp(fm, frn.getReturnTemp(), lb)+";");
            else
                output.println("return "+generateTemp(fm, frn.getReturnTemp(), lb)+";");
-       } else
+       } else {
            output.println("return;");
+       }
     }
 
-    //private void generateFlatCondBranch(FlatMethod fm, LocalityBinding lb, FlatCondBranch fcb, String label, PrintWriter output) {
     protected void generateFlatCondBranch(FlatMethod fm, LocalityBinding lb, FlatCondBranch fcb, String label, PrintWriter output) {
        output.println("if (!"+generateTemp(fm, fcb.getTest(),lb)+") goto "+label+";");
     }
@@ -2371,11 +2406,6 @@ public class BuildCode {
                ormask=((Integer)flagortable.get(temp)).intValue();
            if (flagandtable.containsKey(temp))
                andmask=((Integer)flagandtable.get(temp)).intValue();
-           /*if (ffan.getTaskType()==FlatFlagActionNode.NEWOBJECT) {
-               output.println("flagorandinit("+generateTemp(fm, temp, lb)+", 0x"+Integer.toHexString(ormask)+", 0x"+Integer.toHexString(andmask)+");");
-           } else {
-               output.println("flagorand("+generateTemp(fm, temp, lb)+", 0x"+Integer.toHexString(ormask)+", 0x"+Integer.toHexString(andmask)+");");
-           }*/
            generateFlagOrAnd(ffan, fm, lb, temp, output, ormask, andmask);
            generateObjectDistribute(ffan, fm, lb, temp, output);
        }
@@ -2794,6 +2824,9 @@ public class BuildCode {
        
        return l;
     }
+    
+    protected void outputTransCode(PrintWriter output) {
+    }
 }