X-Git-Url: http://plrg.eecs.uci.edu/git/?a=blobdiff_plain;f=Robust%2Fsrc%2FIR%2FFlat%2FBuildCode.java;h=8781ff4e3ca832db40545acb02f3d86ce2a20c59;hb=4cb63e913202459da4fe9d01feb7c02f1b98dd6f;hp=84565ce1cae57b9d24e6533e3bcdffce3e913014;hpb=eade5b2eb06e1e068f15a25b5dc51f3fa96beb74;p=IRC.git diff --git a/Robust/src/IR/Flat/BuildCode.java b/Robust/src/IR/Flat/BuildCode.java index 84565ce1..8781ff4e 100644 --- a/Robust/src/IR/Flat/BuildCode.java +++ b/Robust/src/IR/Flat/BuildCode.java @@ -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,7 @@ 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; TypeDescriptor[] arraytable; @@ -44,17 +45,19 @@ public class BuildCode { Hashtable backuptable; Hashtable 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(); @@ -191,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();"); } @@ -260,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. */ @@ -300,13 +315,17 @@ 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 "); + outmethod.println("#include \"runtime.h\""); if (state.DSM) { + outmethod.println("#include \"addPrefetchEnhance.h\""); outmethod.println("#include \"localobjects.h\""); } + if(state.MULTICORE) { + outmethod.println("#include \"task.h\""); + } if (state.THREAD||state.DSM) outmethod.println("#include "); if (state.main!=null) { @@ -351,7 +370,7 @@ public class BuildCode { } } - private void outputStructs(PrintWriter outstructs) { + protected void outputStructs(PrintWriter outstructs) { outstructs.println("#ifndef STRUCTDEFS_H"); outstructs.println("#define STRUCTDEFS_H"); outstructs.println("#include \"classdefs.h\""); @@ -393,7 +412,7 @@ public class BuildCode { } } - private void outputClassDeclarations(PrintWriter outclassdefs) { + protected void outputClassDeclarations(PrintWriter outclassdefs) { if (state.THREAD||state.DSM) outclassdefs.println("#include "); if(state.OPTIONAL) @@ -416,7 +435,13 @@ public class BuildCode { } if (state.TASK) { outclassdefs.println(" int flag;"); - outclassdefs.println(" void * flagptr;"); + if(!state.MULTICORE) { + outclassdefs.println(" void * 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;"); @@ -449,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("};"); @@ -467,7 +492,9 @@ public class BuildCode { outrepairstructs.println(" int __type__;"); if (state.TASK) { outrepairstructs.println(" int __flag__;"); - outrepairstructs.println(" int __flagptr__;"); + if(!state.MULTICORE) { + outrepairstructs.println(" int __flagptr__;"); + } } printRepairStruct(cn, outrepairstructs); outrepairstructs.println("}\n"); @@ -512,7 +539,7 @@ public class BuildCode { } /** This method outputs TaskDescriptor information */ - void generateTaskDescriptor(PrintWriter output, FlatMethod fm, TaskDescriptor task) { + private void generateTaskDescriptor(PrintWriter output, FlatMethod fm, TaskDescriptor task) { for (int i=0;i saveset=lb!=null?locality.getTempSet(lb):null; @@ -949,7 +988,7 @@ 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) mapFlags(sp); @@ -983,7 +1022,7 @@ 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()+" {"); classdefout.println(" int type;"); @@ -995,7 +1034,13 @@ public class BuildCode { if (state.TASK) { classdefout.println(" int flag;"); - classdefout.println(" void * flagptr;"); + if((!state.MULTICORE) || (cn.getSymbol().equals("TagDescriptor"))) { + classdefout.println(" void * 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;"); @@ -1114,7 +1159,7 @@ public class BuildCode { printcomma=true; } - if (state.DSM&&lb.isAtomic()) { + if (state.DSM&&lb.isAtomic()&&!md.getModifiers().isNative()) { if (printcomma) headersout.print(", "); headersout.print("transrecord_t * trans"); @@ -1312,7 +1357,7 @@ public class BuildCode { /** This method assigns labels to FlatNodes */ - private Hashtable assignLabels(FlatMethod fm) { + protected Hashtable assignLabels(FlatMethod fm) { HashSet tovisit=new HashSet(); HashSet visited=new HashSet(); int labelindex=0; @@ -1345,7 +1390,7 @@ 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(); TempObject objecttemps=(TempObject) tempstable.get(lb!=null?lb:md!=null?md:task); @@ -1364,7 +1409,7 @@ 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: generateFlatAtomicEnterNode(fm, lb, (FlatAtomicEnterNode) fn, output); @@ -1456,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; @@ -1491,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("}"); } } @@ -1532,8 +1586,8 @@ public class BuildCode { if (maybenull) { if (!teststr.equals("")) teststr+="&&"; - teststr+="prefptr="+basestr; - basestr="((struct"+lasttype.getSafeSymbol()+"*)prefptr)->"+fd.getSafeSymbol(); + teststr+="((prefptr="+basestr+")!=NULL)"; + basestr="((struct "+lasttype.getSafeSymbol()+" *)prefptr)->"+fd.getSafeSymbol(); } else { basestr=basestr+"->"+fd.getSafeSymbol(); maybenull=true; @@ -1541,16 +1595,16 @@ public class BuildCode { lasttype=fd.getType(); } else { IndexDescriptor id=(IndexDescriptor)desc; - indexcheck="(tmpindex="; + indexcheck="((tmpindex="; for(int j=0;j=0)&&(tmpindex<((struct ArrayObject *)prefptr)->___length___)"; + indexcheck+=id.offset+")>=0)&&(tmpindex<((struct ArrayObject *)prefptr)->___length___)"; if (!teststr.equals("")) teststr+="&&"; - teststr+="(((prefptr="+basestr+")!= NULL) &&"+indexcheck; - basestr="((void **)(((char *) &(((struct ArrayObject*)prefptr)->___length___))+sizeof(int)))[tmpindex]"; + teststr+="((prefptr="+basestr+")!= NULL) &&"+indexcheck; + basestr="((void **)(((char *) &(((struct ArrayObject *)prefptr)->___length___))+sizeof(int)))[tmpindex]"; maybenull=true; lasttype=lasttype.dereference(); } @@ -1560,7 +1614,7 @@ public class BuildCode { if (teststr.equals("")) { oid="((unsigned int)"+basestr+")"; } else { - oid="(unsigned int)("+teststr+")?"+basestr+":NULL)"; + oid="((unsigned int)(("+teststr+")?"+basestr+":NULL))"; } oids.add(oid); @@ -1767,6 +1821,14 @@ public class BuildCode { output.print(temp.getType().getSafeSymbol()); } + if (state.DSM&&locality.getBinding(lb,fc).isAtomic()&&!fc.getMethod().getModifiers().isNative()) { + LocalityBinding fclb=locality.getBinding(lb, fc); + if (printcomma) + output.print(", "); + output.print("transrecord_t *"); + printcomma=true; + } + if (state.DSM) { LocalityBinding fclb=locality.getBinding(lb, fc); output.print("))virtualtable["+generateTemp(fm,fc.getThis(),lb)+"->type*"+maxcount+"+"+virtualcalls.getLocalityNumber(fclb)+"])"); @@ -1781,7 +1843,7 @@ public class BuildCode { needcomma=true; } - if (state.DSM&&locality.getBinding(lb,fc).isAtomic()) { + if (state.DSM&&locality.getBinding(lb,fc).isAtomic()&&!fc.getMethod().getModifiers().isNative()) { if (needcomma) output.print(","); output.print("trans"); @@ -1870,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 @@ -1922,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 @@ -1965,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 @@ -2016,9 +2084,7 @@ public class BuildCode { output.println(dst+"->"+nextobjstr+"="+revertptr+";"); output.println("trans->revertlist=(struct ___Object___ *)"+dst+";"); output.println("}"); - } else { - throw new Error("Unknown array type in"+fsen+" in " + fm+"\n"+(lb!=null?(lb+" "+lb.getExplanation()):"")); - } + } else throw new Error("Unknown array type"); if (srcglobal) { output.println("{"); String src=generateTemp(fm, fsen.getSrc(), lb); @@ -2139,17 +2205,18 @@ 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+";"); } @@ -2339,14 +2406,24 @@ 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); + } + } + + protected void generateFlagOrAnd(FlatFlagActionNode ffan, FlatMethod fm, LocalityBinding lb, TempDescriptor temp, + PrintWriter output, int ormask, int andmask) { + 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)+");"); } } + protected void generateObjectDistribute(FlatFlagActionNode ffan, FlatMethod fm, LocalityBinding lb, TempDescriptor temp, PrintWriter output) { + output.println("enqueueObject("+generateTemp(fm, temp, lb)+");"); + } + void generateOptionalHeader(PrintWriter headers) { //GENERATE HEADERS @@ -2747,6 +2824,9 @@ public class BuildCode { return l; } + + protected void outputTransCode(PrintWriter output) { + } }