add options to close array boundary check in Bamboo
[IRC.git] / Robust / src / IR / Flat / BuildCode.java
index 08b6f06c312ce2583fa38c49746deed3186762b2..6cc1e6c906f7b70227ad4ad72ad29ac8dda8b072 100644 (file)
@@ -3,6 +3,7 @@ import IR.Tree.FlagExpressionNode;
 import IR.Tree.DNFFlag;
 import IR.Tree.DNFFlagAtom;
 import IR.Tree.TagExpressionList;
+import IR.Tree.OffsetNode;
 import IR.*;
 import java.util.*;
 import java.io.*;
@@ -18,6 +19,7 @@ import Analysis.Locality.LocalityAnalysis;
 import Analysis.Locality.LocalityBinding;
 import Analysis.Prefetch.*;
 
+
 public class BuildCode {
   State state;
   Hashtable temptovar;
@@ -27,6 +29,7 @@ public class BuildCode {
   Hashtable flagorder;
   int tag=0;
   String localsprefix="___locals___";
+  String fcrevert="___fcrevert___";
   String paramsprefix="___params___";
   String oidstr="___nextobject___";
   String nextobjstr="___nextobject___";
@@ -99,7 +102,7 @@ public class BuildCode {
       if (state.TASK) {
        outtask=new PrintWriter(new FileOutputStream(PREFIX+"task.h"), true);
        outtaskdefs=new PrintWriter(new FileOutputStream(PREFIX+"taskdefs.c"), true);
-       if (state.OPTIONAL){
+       if (state.OPTIONAL) {
          outoptionalarrays=new PrintWriter(new FileOutputStream(PREFIX+"optionalarrays.c"), true);
          optionalheaders=new PrintWriter(new FileOutputStream(PREFIX+"optionalstruct.h"), true);
        }
@@ -168,7 +171,7 @@ public class BuildCode {
     }
 
     /* Generate information for task with optional parameters */
-    if (state.TASK&&state.OPTIONAL){
+    if (state.TASK&&state.OPTIONAL) {
       generateOptionalArrays(outoptionalarrays, optionalheaders, state.getAnalysisResult(), state.getOptionalTaskDescriptors());
       outoptionalarrays.close();
     }
@@ -274,6 +277,9 @@ public class BuildCode {
     outmethod.println("printf(\"nmhashSearch= %d\\n\", nmhashSearch);");
     outmethod.println("printf(\"nprehashSearch= %d\\n\", nprehashSearch);");
     outmethod.println("printf(\"nRemoteReadSend= %d\\n\", nRemoteSend);");
+    outmethod.println("printf(\"nSoftAbort= %d\\n\", nSoftAbort);");
+    outmethod.println("printf(\"bytesSent= %d\\n\", bytesSent);");
+    outmethod.println("printf(\"bytesRecv= %d\\n\", bytesRecv);");
     outmethod.println("#endif\n");
     outmethod.println("}");
 
@@ -323,6 +329,9 @@ public class BuildCode {
       outmethod.println("#include \"addPrefetchEnhance.h\"");
       outmethod.println("#include \"localobjects.h\"");
     }
+    if (state.FASTCHECK) {
+      outmethod.println("#include \"localobjects.h\"");      
+    }
     if(state.MULTICORE) {
       outmethod.println("#include \"task.h\"");
     }
@@ -441,8 +450,10 @@ public class BuildCode {
        outclassdefs.println("  int isolate;");        // indicate if this object is shared or not
        outclassdefs.println("  int version;");
        outclassdefs.println("  struct ___Object___ * original;");
+       //outclassdefs.println("  int numlocks;");        // array for locks
+       outclassdefs.println("  int * lock;");
       }
-      if(state.OPTIONAL){
+      if(state.OPTIONAL) {
        outclassdefs.println("  int numfses;");
        outclassdefs.println("  int * fses;");
       }
@@ -735,6 +746,9 @@ public class BuildCode {
     outclassdefs.print("extern int nmhashSearch;\n");
     outclassdefs.print("extern int nprehashSearch;\n");
     outclassdefs.print("extern int nRemoteSend;\n");
+    outclassdefs.print("extern int nSoftAbort;\n");
+    outclassdefs.print("extern int bytesSent;\n");
+    outclassdefs.print("extern int bytesRecv;\n");
     outclassdefs.print("extern void handle();\n");
     outclassdefs.print("#endif\n");
     outclassdefs.print("int numprefetchsites = " + pa.prefetchsiteid + ";\n");
@@ -1036,12 +1050,14 @@ public class BuildCode {
       classdefout.println("  int flag;");
       if((!state.MULTICORE) || (cn.getSymbol().equals("TagDescriptor"))) {
        classdefout.println("  void * flagptr;");
-      } else if (state.MULTICORE){
+      } 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;");
+       //classdefout.println("  int numlocks;");        // array for locks
+       classdefout.println("  int * lock;");
       }
-      if (state.OPTIONAL){
+      if (state.OPTIONAL) {
        classdefout.println("  int numfses;");
        classdefout.println("  int * fses;");
       }
@@ -1298,9 +1314,9 @@ public class BuildCode {
 
     if ((state.THREAD||state.DSM)&&GENERATEPRECISEGC) {
       if (state.DSM&&lb.isAtomic())
-       output.println("checkcollect2(&"+localsprefix+",trans);");
+       output.println("if (needtocollect) checkcollect2(&"+localsprefix+",trans);");
       else
-       output.println("checkcollect(&"+localsprefix+");");
+       output.println("if (needtocollect) checkcollect(&"+localsprefix+");");
     }
 
     /* Do the actual code generation */
@@ -1395,6 +1411,7 @@ public class BuildCode {
     TempObject objecttemps=(TempObject) tempstable.get(lb!=null ? lb : md!=null ? md : task);
 
     if (objecttemps.isLocalPrim(td)||objecttemps.isParamPrim(td)) {
+      //System.out.println("generateTemp returns " + td.getSafeSymbol());
       return td.getSafeSymbol();
     }
 
@@ -1418,6 +1435,14 @@ public class BuildCode {
       generateFlatAtomicExitNode(fm, lb, (FlatAtomicExitNode) fn, output);
       return;
 
+    case FKind.FlatSESEEnterNode:
+      generateFlatSESEEnterNode(fm, lb, (FlatSESEEnterNode) fn, output);
+      return;
+
+    case FKind.FlatSESEExitNode:
+      generateFlatSESEExitNode(fm, lb, (FlatSESEExitNode) fn, output);
+      return;
+
     case FKind.FlatGlobalConvNode:
       generateFlatGlobalConvNode(fm, lb, (FlatGlobalConvNode) fn, output);
       return;
@@ -1473,9 +1498,9 @@ public class BuildCode {
     case FKind.FlatBackEdge:
       if ((state.THREAD||state.DSM)&&GENERATEPRECISEGC) {
        if(state.DSM&&locality.getAtomic(lb).get(fn).intValue()>0) {
-         output.println("checkcollect2(&"+localsprefix+",trans);");
+         output.println("if (needtocollect) checkcollect2(&"+localsprefix+",trans);");
        } else
-         output.println("checkcollect(&"+localsprefix+");");
+         output.println("if (needtocollect) checkcollect(&"+localsprefix+");");
       } else
        output.println("/* nop */");
       return;
@@ -1491,10 +1516,23 @@ public class BuildCode {
     case FKind.FlatPrefetchNode:
       generateFlatPrefetchNode(fm,lb, (FlatPrefetchNode) fn, output);
       return;
+
+    case FKind.FlatOffsetNode:
+      generateFlatOffsetNode(fm, lb, (FlatOffsetNode)fn, output);
+      return;
     }
     throw new Error();
   }
 
+  public void generateFlatOffsetNode(FlatMethod fm, LocalityBinding lb, FlatOffsetNode fofn, PrintWriter output) {
+    output.println("/* FlatOffsetNode */");
+    ClassDescriptor cn = fofn.getClassDesc();
+    FieldDescriptor fd = fofn.getField();
+    System.out.println("ClassDescriptor cn =" + cn.toString() + " FieldDescriptor fd =" + fd.toString());
+    System.out.println("TempDescriptor td =" + fofn.getDst().toString() + "Type of TempDescriptor =" + fofn.getDst().getType());
+    output.println("((struct "+cn.getSafeSymbol() +" *)0)->"+ fd.getSafeSymbol()+";");
+  }
+
   public void generateFlatPrefetchNode(FlatMethod fm, LocalityBinding lb, FlatPrefetchNode fpn, PrintWriter output) {
     if (state.PREFETCH) {
       Vector oids = new Vector();
@@ -1670,7 +1708,11 @@ public class BuildCode {
       output.println(generateTemp(fm, fgcn.getSrc(),lb)+"=(void *)transRead(trans, (unsigned int) "+generateTemp(fm, fgcn.getSrc(),lb)+");");
     } else {
       /* Need to convert to OID */
-      output.println(generateTemp(fm, fgcn.getSrc(),lb)+"=(void *)COMPOID("+generateTemp(fm, fgcn.getSrc(),lb)+");");
+      if (fgcn.doConvert()) {
+       output.println(generateTemp(fm, fgcn.getSrc(),lb)+"=(void *)COMPOID("+generateTemp(fm, fgcn.getSrc(),lb)+");");
+      } else {
+       output.println(generateTemp(fm, fgcn.getSrc(),lb)+"=NULL;");
+      }
     }
   }
 
@@ -1731,6 +1773,14 @@ public class BuildCode {
     output.println("}");
   }
 
+  public void generateFlatSESEEnterNode(FlatMethod fm,  LocalityBinding lb, FlatSESEEnterNode faen, PrintWriter output) {
+    
+  }
+
+  public void generateFlatSESEExitNode(FlatMethod fm,  LocalityBinding lb, FlatSESEExitNode faen, PrintWriter output) {
+    
+  }
+
   private void generateFlatCheckNode(FlatMethod fm,  LocalityBinding lb, FlatCheckNode fcn, PrintWriter output) {
     if (state.CONSCHECK) {
       String specname=fcn.getSpec();
@@ -1983,7 +2033,7 @@ public class BuildCode {
       String dst=generateTemp(fm,fsfn.getDst(),lb);
       if (srcglobal) {
        output.println("{");
-       output.println("int srcoid=(int)"+src+"->"+oidstr+";");
+       output.println("int srcoid=("+src+"!=NULL?((int)"+src+"->"+oidstr+"):0);");
       }
       if (statusdst.equals(LocalityAnalysis.GLOBAL)) {
        String glbdst=dst;
@@ -2025,6 +2075,18 @@ public class BuildCode {
        output.println("}");
       }
     } else {
+      if (state.FASTCHECK) {
+       String dst=generateTemp(fm, fsfn.getDst(),lb);
+       output.println("if(!"+dst+"->"+localcopystr+") {");
+       /* Link object into list */
+       if (GENERATEPRECISEGC)
+         output.println("COPY_OBJ((struct garbagelist *)&"+localsprefix+",(struct ___Object___ *)"+dst+");");
+       else
+         output.println("COPY_OBJ("+dst+");");
+       output.println(dst+"->"+nextobjstr+"="+fcrevert+";");
+       output.println(fcrevert+"=(struct ___Object___ *)"+dst+";");
+       output.println("}");
+      }
       output.println(generateTemp(fm, fsfn.getDst(),lb)+"->"+ fsfn.getField().getSafeSymbol()+"="+ generateTemp(fm,fsfn.getSrc(),lb)+";");
     }
   }
@@ -2038,7 +2100,7 @@ public class BuildCode {
     else
       type=elementtype.getSafeSymbol()+" ";
 
-    if (fen.needsBoundsCheck()) {
+    if (this.state.ARRAYBOUNDARYCHECK && fen.needsBoundsCheck()) {
       output.println("if ("+generateTemp(fm, fen.getIndex(),lb)+"< 0 || "+generateTemp(fm, fen.getIndex(),lb)+" >= "+generateTemp(fm,fen.getSrc(),lb) + "->___length___)");
       output.println("failedboundschk();");
     }
@@ -2082,8 +2144,7 @@ public class BuildCode {
     else
       type=elementtype.getSafeSymbol()+" ";
 
-
-    if (fsen.needsBoundsCheck()) {
+    if (this.state.ARRAYBOUNDARYCHECK && fsen.needsBoundsCheck()) {
       output.println("if ("+generateTemp(fm, fsen.getIndex(),lb)+"< 0 || "+generateTemp(fm, fsen.getIndex(),lb)+" >= "+generateTemp(fm,fsen.getDst(),lb) + "->___length___)");
       output.println("failedboundschk();");
     }
@@ -2115,17 +2176,30 @@ public class BuildCode {
       if (srcglobal) {
        output.println("{");
        String src=generateTemp(fm, fsen.getSrc(), lb);
-       output.println("int srcoid=(int)"+src+"->"+oidstr+";");
+       output.println("int srcoid=("+src+"!=NULL?((int)"+src+"->"+oidstr+"):0);");
        output.println("((int*)(((char *) &("+ generateTemp(fm,fsen.getDst(),lb)+"->___length___))+sizeof(int)))["+generateTemp(fm, fsen.getIndex(),lb)+"]=srcoid;");
        output.println("}");
       } else {
        output.println("(("+type +"*)(((char *) &("+ generateTemp(fm,fsen.getDst(),lb)+"->___length___))+sizeof(int)))["+generateTemp(fm, fsen.getIndex(),lb)+"]="+generateTemp(fm,fsen.getSrc(),lb)+";");
       }
-    } else
+    } else {
+      if (state.FASTCHECK) {
+       String dst=generateTemp(fm, fsen.getDst(),lb);
+       output.println("if(!"+dst+"->"+localcopystr+") {");
+       /* Link object into list */
+       if (GENERATEPRECISEGC)
+         output.println("COPY_OBJ((struct garbagelist *)&"+localsprefix+",(struct ___Object___ *)"+dst+");");
+       else
+         output.println("COPY_OBJ("+dst+");");
+       output.println(dst+"->"+nextobjstr+"="+fcrevert+";");
+       output.println(fcrevert+"=(struct ___Object___ *)"+dst+";");
+       output.println("}");
+      }
       output.println("(("+type +"*)(((char *) &("+ generateTemp(fm,fsen.getDst(),lb)+"->___length___))+sizeof(int)))["+generateTemp(fm, fsen.getIndex(),lb)+"]="+generateTemp(fm,fsen.getSrc(),lb)+";");
+    }
   }
 
-  private void generateFlatNew(FlatMethod fm, LocalityBinding lb, FlatNew fn, PrintWriter output) {
+  protected void generateFlatNew(FlatMethod fm, LocalityBinding lb, FlatNew fn, PrintWriter output) {
     if (state.DSM && locality.getAtomic(lb).get(fn).intValue()>0&&!fn.isGlobal()) {
       //Stash pointer in case of GC
       String revertptr=generateTemp(fm, reverttable.get(lb),lb);
@@ -2151,7 +2225,16 @@ public class BuildCode {
     }
     if (state.DSM && locality.getAtomic(lb).get(fn).intValue()>0&&!fn.isGlobal()) {
       String revertptr=generateTemp(fm, reverttable.get(lb),lb);
-      output.println("trans->revertlist="+revertptr+";");
+      String dst=generateTemp(fm,fn.getDst(),lb);
+      output.println(dst+"->___localcopy___=(struct ___Object___*)1;");
+      output.println(dst+"->"+nextobjstr+"="+revertptr+";");
+      output.println("trans->revertlist=(struct ___Object___ *)"+dst+";");
+    }
+    if (state.FASTCHECK) {
+      String dst=generateTemp(fm,fn.getDst(),lb);
+      output.println(dst+"->___localcopy___=(struct ___Object___*)1;");
+      output.println(dst+"->"+nextobjstr+"="+fcrevert+";");
+      output.println(fcrevert+"=(struct ___Object___ *)"+dst+";");
     }
   }
 
@@ -2200,6 +2283,16 @@ public class BuildCode {
   }
 
   private void generateFlatLiteralNode(FlatMethod fm, LocalityBinding lb, FlatLiteralNode fln, PrintWriter output) {
+    if (fln.getType().isOffset()) {
+      if (fln.getValue() instanceof OffsetNode) {
+       OffsetNode ofn = (OffsetNode) fln.getValue();
+       output.println(generateTemp(fm, fln.getDst(),lb)+
+                      " = (short) (&((struct "+ofn.getClassDesc().getSafeSymbol() +" *)0)->"+
+                      ofn.getField().getSafeSymbol()+");");
+      }
+      output.println("/* offset */");
+      return;
+    }
     if (fln.getValue()==null)
       output.println(generateTemp(fm, fln.getDst(),lb)+"=0;");
     else if (fln.getType().getSymbol().equals(TypeUtil.StringClass)) {
@@ -2519,7 +2612,7 @@ public class BuildCode {
     Hashtable<TempDescriptor, Integer> slotnumber=new Hashtable<TempDescriptor, Integer>();
     int current_slot=0;
 
-    for(Iterator vard_it = c_vard.iterator(); vard_it.hasNext();){
+    for(Iterator vard_it = c_vard.iterator(); vard_it.hasNext();) {
       VarDescriptor vard = (VarDescriptor)vard_it.next();
       TypeDescriptor typed = vard.getType();
 
@@ -2527,8 +2620,8 @@ public class BuildCode {
       HashSet fen_hashset = predicate.flags.get(vard.getSymbol());
       output.println("int predicateflags_"+predicateindex+"_OTD"+otd.getuid()+"_"+cdtemp.getSafeSymbol()+"[]={");
       int numberterms=0;
-      if (fen_hashset!=null){
-       for (Iterator fen_it = fen_hashset.iterator(); fen_it.hasNext();){
+      if (fen_hashset!=null) {
+       for (Iterator fen_it = fen_hashset.iterator(); fen_it.hasNext();) {
          FlagExpressionNode fen = (FlagExpressionNode)fen_it.next();
          if (fen!=null) {
            DNFFlag dflag=fen.getDNF();
@@ -2562,7 +2655,7 @@ public class BuildCode {
       TagExpressionList tagel = predicate.tags.get(vard.getSymbol());
       output.println("int predicatetags_"+predicateindex+"_OTD"+otd.getuid()+"_"+cdtemp.getSafeSymbol()+"[]={");
       int numtags = 0;
-      if (tagel!=null){
+      if (tagel!=null) {
        for(int j=0; j<tagel.numTags(); j++) {
          if (j!=0)
            output.println(",");
@@ -2592,7 +2685,7 @@ public class BuildCode {
 
     //generate an array that stores the entire predicate
     output.println("struct predicatemember * predicatememberarray_OTD"+otd.getuid()+"_"+cdtemp.getSafeSymbol()+"[]={");
-    for( int j = 0; j<predicateindex; j++){
+    for( int j = 0; j<predicateindex; j++) {
       if( j != predicateindex-1) output.println("&predicatemember_"+j+"_OTD"+otd.getuid()+"_"+cdtemp.getSafeSymbol()+",");
       else output.println("&predicatemember_"+j+"_OTD"+otd.getuid()+"_"+cdtemp.getSafeSymbol());
     }
@@ -2620,8 +2713,8 @@ public class BuildCode {
       Collection c_otd = ((Hashtable)optionaltaskdescriptors.get(cdtemp)).values();
       numotd = c_otd.size();
       if(maxotd<numotd) maxotd = numotd;
-      if( !c_otd.isEmpty() ){
-       for(Iterator otd_it = c_otd.iterator(); otd_it.hasNext();){
+      if( !c_otd.isEmpty() ) {
+       for(Iterator otd_it = c_otd.iterator(); otd_it.hasNext();) {
          OptionalTaskDescriptor otd = (OptionalTaskDescriptor)otd_it.next();
 
          //generate the int arrays for the predicate
@@ -2631,10 +2724,10 @@ public class BuildCode {
          //iterate through possible FSes corresponding to
          //the state when entering
 
-         for(Iterator fses = otd.enterflagstates.iterator(); fses.hasNext();){
+         for(Iterator fses = otd.enterflagstates.iterator(); fses.hasNext();) {
            FlagState fs = (FlagState)fses.next();
            int flagid=0;
-           for(Iterator flags = fs.getFlags(); flags.hasNext();){
+           for(Iterator flags = fs.getFlags(); flags.hasNext();) {
              FlagDescriptor flagd = (FlagDescriptor)flags.next();
              int id=1<<((Integer)flaginfo.get(flagd)).intValue();
              flagid|=id;
@@ -2673,9 +2766,9 @@ public class BuildCode {
 
       output.println("struct optionaltaskdescriptor * otdarray"+cdtemp.getSafeSymbol()+"[]={");
       c_otd = ((Hashtable)optionaltaskdescriptors.get(cdtemp)).values();
-      if( !c_otd.isEmpty() ){
+      if( !c_otd.isEmpty() ) {
        boolean needcomma=false;
-       for(Iterator otd_it = c_otd.iterator(); otd_it.hasNext();){
+       for(Iterator otd_it = c_otd.iterator(); otd_it.hasNext();) {
          OptionalTaskDescriptor otd = (OptionalTaskDescriptor)otd_it.next();
          if(needcomma)
            output.println(",");
@@ -2701,7 +2794,7 @@ public class BuildCode {
        //top) into an array
 
        output.println("struct optionaltaskdescriptor * optionaltaskdescriptorarray_FS"+fscounter+"_"+cdtemp.getSafeSymbol()+"[] = {");
-       for(Iterator<OptionalTaskDescriptor> mos = ordertd(availabletasks).iterator(); mos.hasNext();){
+       for(Iterator<OptionalTaskDescriptor> mos = ordertd(availabletasks).iterator(); mos.hasNext();) {
          OptionalTaskDescriptor mm = mos.next();
          if(!mos.hasNext())
            output.println("&optionaltaskdescriptor_"+mm.getuid()+"_"+cdtemp.getSafeSymbol());
@@ -2714,7 +2807,7 @@ public class BuildCode {
        //process flag information (what the flag after failure is) so we know what optionaltaskdescriptors to choose.
 
        int flagid=0;
-       for(Iterator flags = fs.getFlags(); flags.hasNext();){
+       for(Iterator flags = fs.getFlags(); flags.hasNext();) {
          FlagDescriptor flagd = (FlagDescriptor)flags.next();
          int id=1<<((Integer)flaginfo.get(flagd)).intValue();
          flagid|=id;
@@ -2726,7 +2819,7 @@ public class BuildCode {
        boolean first = true;
        Enumeration tag_enum = fs.getTags();
        output.println("int tags_FS"+fscounter+"_"+cdtemp.getSafeSymbol()+"[]={");
-       while(tag_enum.hasMoreElements()){
+       while(tag_enum.hasMoreElements()) {
          tagcounter++;
          TagDescriptor tagd = (TagDescriptor)tag_enum.nextElement();
          if(first==true)
@@ -2798,7 +2891,7 @@ public class BuildCode {
       //Build the array of fsanalysiswrappers
       output.println("struct fsanalysiswrapper * fsanalysiswrapperarray_"+cdtemp.getSafeSymbol()+"[] = {");
       boolean needcomma=false;
-      for(int i = 0; i<fscounter; i++){
+      for(int i = 0; i<fscounter; i++) {
        if (needcomma) output.print(",");
        output.println("&fsanalysiswrapper_FS"+(i+1)+"_"+cdtemp.getSafeSymbol());
        needcomma=true;