X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=Robust%2Fsrc%2FIR%2FFlat%2FBuildCode.java;h=11e4b0ccde09b118164e000aa26cef623bdeb786;hb=04ff08dbf682fdda4e70d940174fe18268aa806c;hp=d61f5b55ec170fdb7868d15dd9cf54df3804d78e;hpb=a49872987651a8037fd84b193134e0818adda149;p=IRC.git diff --git a/Robust/src/IR/Flat/BuildCode.java b/Robust/src/IR/Flat/BuildCode.java index d61f5b55..11e4b0cc 100644 --- a/Robust/src/IR/Flat/BuildCode.java +++ b/Robust/src/IR/Flat/BuildCode.java @@ -42,7 +42,7 @@ public class BuildCode { public static String arraytype="ArrayObject"; public static int flagcount = 0; Virtual virtualcalls; - TypeUtil typeutil; + public TypeUtil typeutil; protected int maxtaskparams=0; protected int maxcount=0; ClassDescriptor[] cdarray; @@ -56,7 +56,6 @@ public class BuildCode { JavaBuilder javabuilder; String strObjType; - int boundschknum = 0; public BuildCode(State st, Hashtable temptovar, TypeUtil typeutil, CallGraph callgraph, JavaBuilder javabuilder) { this(st, temptovar, typeutil, null, callgraph, javabuilder); @@ -218,7 +217,6 @@ public class BuildCode { bcx.additionalCodeGen(outmethodheader, outstructs, outmethod); } - if (state.TASK) { /* Output code for tasks */ outputTaskCode(outtaskdefs, outmethod); @@ -333,23 +331,57 @@ public class BuildCode { // execute all the static blocks and all the static field initializations SymbolTable sctbl = this.state.getSClassSymbolTable(); Iterator it_sclasses = sctbl.getDescriptorsIterator(); - if(it_sclasses.hasNext()) { - while(it_sclasses.hasNext()) { - ClassDescriptor t_cd = (ClassDescriptor)it_sclasses.next(); - MethodDescriptor t_md = (MethodDescriptor)t_cd.getMethodTable().get("staticblocks"); - - if(t_md != null&&callgraph.isInit(t_cd)) { - outmethod.println(" {"); - if ((GENERATEPRECISEGC) || (this.state.MULTICOREGC)) { - outmethod.print(" struct "+t_cd.getSafeSymbol()+t_md.getSafeSymbol()+"_"+t_md.getSafeMethodDescriptor()+"_params __parameterlist__={"); - outmethod.println("0, NULL};"); - outmethod.println(" "+t_cd.getSafeSymbol()+t_md.getSafeSymbol()+"_"+t_md.getSafeMethodDescriptor()+"(& __parameterlist__);"); - } else { - outmethod.println(" "+t_cd.getSafeSymbol()+t_md.getSafeSymbol()+"_"+t_md.getSafeMethodDescriptor()+"();"); - } - outmethod.println(" }"); - } - } + Vector tooutput = new Vector(); + Queue toprocess=new LinkedList(); + Vector outputs = new Vector(); + while(it_sclasses.hasNext()) { + ClassDescriptor t_cd = (ClassDescriptor)it_sclasses.next(); + if(!outputs.contains(t_cd)) { + tooutput.clear(); + tooutput.add(t_cd); + toprocess.clear(); + toprocess.add(t_cd); + while(!toprocess.isEmpty()) { + ClassDescriptor pcd = toprocess.poll(); + // check super interfaces + Iterator it_sinterfaces = pcd.getSuperInterfaces(); + while(it_sinterfaces.hasNext()) { + ClassDescriptor sint = (ClassDescriptor)it_sinterfaces.next(); + if(!outputs.contains(sint)) { + toprocess.add(sint); + if(sctbl.contains(sint.getClassName())) { + tooutput.add(sint); + } + } + } + // check super classes + ClassDescriptor supercd = pcd.getSuperDesc(); + if(supercd!=null && !outputs.contains(supercd)) { + toprocess.add(supercd); + if(sctbl.contains(supercd.getClassName())) { + tooutput.add(supercd); + } + } + } + + for(int i = tooutput.size()-1; i>=0; i--) { + ClassDescriptor output = tooutput.elementAt(i); + MethodDescriptor t_md = (MethodDescriptor)output.getMethodTable().get("staticblocks"); + + if(t_md != null&&callgraph.isInit(output)) { + outmethod.println(" {"); + if ((GENERATEPRECISEGC) || state.MULTICOREGC||state.PMC) { + outmethod.print(" struct "+output.getSafeSymbol()+t_md.getSafeSymbol()+"_"+t_md.getSafeMethodDescriptor()+"_params __parameterlist__={"); + outmethod.println("0, NULL};"); + outmethod.println(" "+output.getSafeSymbol()+t_md.getSafeSymbol()+"_"+t_md.getSafeMethodDescriptor()+"(& __parameterlist__);"); + } else { + outmethod.println(" "+output.getSafeSymbol()+t_md.getSafeSymbol()+"_"+t_md.getSafeMethodDescriptor()+"();"); + } + outmethod.println(" }"); + } + outputs.add(output); + } + } } } @@ -360,7 +392,7 @@ public class BuildCode { // create a global classobj array outmethod.println(" {"); outmethod.println(" int i = 0;"); - if ((GENERATEPRECISEGC) || (this.state.MULTICOREGC)) { + if ((GENERATEPRECISEGC) || state.MULTICOREGC||state.PMC) { outmethod.println(" struct garbagelist dummy={0,NULL};"); outmethod.println(" global_defs_p->classobjs = allocate_newarray(&dummy, OBJECTARRAYTYPE, " + (state.numClasses()+state.numArrays()+state.numInterfaces()) + ");"); @@ -369,7 +401,7 @@ public class BuildCode { + (state.numClasses()+state.numArrays()+state.numInterfaces()) + ");"); } outmethod.println(" for(i = 0; i < " + (state.numClasses()+state.numArrays()+state.numInterfaces()) + "; i++) {"); - if ((GENERATEPRECISEGC) || (this.state.MULTICOREGC)) { + if ((GENERATEPRECISEGC) || state.MULTICOREGC||state.PMC) { outmethod.println(" ((void **)(((char *) &(global_defs_p->classobjs->___length___))+sizeof(int)))[i] = allocate_new(NULL, " +typeutil.getClass(TypeUtil.ObjectClass).getId() + ");"); } else { outmethod.println(" ((void **)(((char *) &(global_defs_p->classobjs->___length___))+sizeof(int)))[i] = allocate_new(" +typeutil.getClass(TypeUtil.ObjectClass).getId() + ");"); @@ -396,9 +428,8 @@ public class BuildCode { outmethod.println(" ((struct garbagelist *)global_defs_p)->array[i]=NULL;"); outmethod.println(" }"); } - outputStaticBlocks(outmethod); outputClassObjects(outmethod); - + outputStaticBlocks(outmethod); additionalCodeAtTopOfMain(outmethod); for(BuildCodeExtension bcx: extensions) { @@ -406,7 +437,7 @@ public class BuildCode { } - if ((GENERATEPRECISEGC) || (this.state.MULTICOREGC)) { + if ((GENERATEPRECISEGC) || state.MULTICOREGC||state.PMC) { outmethod.println(" struct ArrayObject * stringarray=allocate_newarray(NULL, STRINGARRAYTYPE, argc-1);"); } else { outmethod.println(" struct ArrayObject * stringarray=allocate_newarray(STRINGARRAYTYPE, argc-1);"); @@ -414,10 +445,13 @@ public class BuildCode { outmethod.println(" for(i=1;i___length___)+sizeof(int)))[i-1]=newstring;"); outmethod.println(" }"); @@ -433,7 +467,7 @@ public class BuildCode { ClassDescriptor cd=typeutil.getMainClass(); outmethod.println(" {"); - if ((GENERATEPRECISEGC) || (this.state.MULTICOREGC)) { + if ((GENERATEPRECISEGC) || state.MULTICOREGC||state.PMC) { outmethod.print(" struct "+cd.getSafeSymbol()+md.getSafeSymbol()+"_"+md.getSafeMethodDescriptor()+"_params __parameterlist__={"); outmethod.println("1, NULL,"+"stringarray};"); outmethod.println(" "+cd.getSafeSymbol()+md.getSafeSymbol()+"_"+md.getSafeMethodDescriptor()+"(& __parameterlist__);"); @@ -536,6 +570,9 @@ public class BuildCode { if (state.main!=null) { outmethod.println("#include "); } + if (state.SSJAVA_GENCODE_PREVENT_CRASHES){ + outmethod.println("#include "); + } if (state.CONSCHECK) { outmethod.println("#include \"checkers.h\""); } @@ -694,7 +731,11 @@ public class BuildCode { outclassdefs.println(" volatile int notifycount;"); outclassdefs.println(" volatile int objlock;"); if(state.MULTICOREGC) { + //outclassdefs.println(" int marked;"); + } + if(state.PMC) { outclassdefs.println(" int marked;"); + outclassdefs.println(" void * backward;"); } } if (state.TASK) { @@ -708,8 +749,12 @@ public class BuildCode { outclassdefs.println(" int mutex;"); outclassdefs.println(" volatile int lockcount;"); if(state.MULTICOREGC) { - outclassdefs.println(" int marked;"); + //outclassdefs.println(" int marked;"); } + if(state.PMC) { + outclassdefs.println(" int marked;"); + outclassdefs.println(" void * backward;"); + } } if(state.OPTIONAL) { outclassdefs.println(" int numfses;"); @@ -992,7 +1037,7 @@ public class BuildCode { cdarray=new ClassDescriptor[state.numClasses()]; ifarray = new ClassDescriptor[state.numInterfaces()]; cdarray[0] = null; - int interfaceid = 0; + while(it.hasNext()) { ClassDescriptor cd=(ClassDescriptor)it.next(); if(cd.isInterface()) { @@ -1184,7 +1229,7 @@ public class BuildCode { for(int i=0; i" + cn.getSafeSymbol()+"static_block_exe_flag == 0) {"); if(cn.getNumStaticBlocks() != 0) { MethodDescriptor t_md = (MethodDescriptor)cn.getMethodTable().get("staticblocks"); - if ((GENERATEPRECISEGC) || (this.state.MULTICOREGC)) { + if ((GENERATEPRECISEGC) || state.MULTICOREGC||state.PMC) { output.print(" struct "+cn.getSafeSymbol()+t_md.getSafeSymbol()+"_"+t_md.getSafeMethodDescriptor()+"_params __parameterlist__={"); output.println("0, NULL};"); output.println(" "+cn.getSafeSymbol()+t_md.getSafeSymbol()+"_"+t_md.getSafeMethodDescriptor()+"(& __parameterlist__);"); @@ -2548,7 +2603,7 @@ fldloop: output.println("int monitorenterline = __LINE__;"); } // call MonitorEnter/MonitorExit on a class obj - if ((GENERATEPRECISEGC) || (this.state.MULTICOREGC)) { + if ((GENERATEPRECISEGC) || state.MULTICOREGC||state.PMC) { output.print(" struct "+cn.getSafeSymbol()+md.getSafeSymbol()+"_"+md.getSafeMethodDescriptor()+"_params __parameterlist__={"); output.println("1," + localsprefixaddr + ", ((void **)(((char *) &(global_defs_p->classobjs->___length___))+sizeof(int)))[" + fc.getThis().getType().getClassDesc().getId() + "]};"); if(md.getSymbol().equals("MonitorEnter") && state.OBJECTLOCKDEBUG) { @@ -2569,7 +2624,7 @@ fldloop: if(md.getSymbol().equals("MonitorEnter")) { output.println("int monitorenterline = __LINE__;"); } - if (GENERATEPRECISEGC || state.MULTICOREGC) { + if (GENERATEPRECISEGC || state.MULTICOREGC||state.PMC) { output.print(" struct "+cn.getSafeSymbol()+md.getSafeSymbol()+"_"+mdstring+"_params __parameterlist__={"); output.print(objectparams.numPointers()); output.print(", "+localsprefixaddr); @@ -2620,7 +2675,7 @@ fldloop: output.print("(*)("); boolean printcomma=false; - if ((GENERATEPRECISEGC) || (this.state.MULTICOREGC)) { + if ((GENERATEPRECISEGC) || state.MULTICOREGC||state.PMC) { output.print("struct "+cn.getSafeSymbol()+md.getSafeSymbol()+"_"+mdstring+"_params * "); printcomma=true; } @@ -2646,12 +2701,12 @@ fldloop: output.print("("); boolean needcomma=false; - if ((GENERATEPRECISEGC) || (this.state.MULTICOREGC)) { + if ((GENERATEPRECISEGC) || state.MULTICOREGC||state.PMC) { output.print("&__parameterlist__"); needcomma=true; } - if (!GENERATEPRECISEGC && !this.state.MULTICOREGC) { + if (!GENERATEPRECISEGC && !state.MULTICOREGC&&!state.PMC) { if (fc.getThis()!=null) { TypeDescriptor ptd=null; if(md.getThis() != null) { @@ -2732,7 +2787,7 @@ fldloop: output.println("if(global_defsprim_p->" + cn.getSafeSymbol()+"static_block_exe_flag == 0) {"); if(cn.getNumStaticBlocks() != 0) { MethodDescriptor t_md = (MethodDescriptor)cn.getMethodTable().get("staticblocks"); - if ((GENERATEPRECISEGC) || (this.state.MULTICOREGC)) { + if ((GENERATEPRECISEGC) || state.MULTICOREGC||state.PMC) { output.print(" struct "+cn.getSafeSymbol()+t_md.getSafeSymbol()+"_"+t_md.getSafeMethodDescriptor()+"_params __parameterlist__={"); output.println("0, NULL};"); output.println(" "+cn.getSafeSymbol()+t_md.getSafeSymbol()+"_"+t_md.getSafeMethodDescriptor()+"(& __parameterlist__);"); @@ -2747,19 +2802,63 @@ fldloop: } } // redirect to the global_defs_p structure - if (ffn.getField().getType().isPtr()) - output.println(generateTemp(fm, ffn.getDst())+"=global_defs_p->"+ffn.getField().getSafeSymbol()+";"); - else - output.println(generateTemp(fm, ffn.getDst())+"=global_defsprim_p->"+ffn.getField().getSafeSymbol()+";"); + if(state.SSJAVA_GENCODE_PREVENT_CRASHES){ + if (ffn.getField().getType().isPtr()){ + output.println("if ( global_defs_p == NULL) {"); + output.println("printf(\"SSJAVA: Dereferencing NULL Pointer at file:%s, func:%s, line:%d \\n\", __FILE__, __func__, __LINE__);"); + output.println(generateTemp(fm, ffn.getDst())+"= NULL;"); + }else{ + output.println("if ( global_defsprim_p == NULL) {"); + output.println("printf(\"SSJAVA: Dereferencing NULL Pointer at file:%s, func:%s, line:%d \\n\", __FILE__, __func__, __LINE__);"); + output.println(generateTemp(fm, ffn.getDst())+"= 0;"); + } + output.println("}else{"); + if (ffn.getField().getType().isPtr()) + output.println(generateTemp(fm, ffn.getDst())+"=global_defs_p->"+ffn.getField().getSafeSymbol()+";"); + else + output.println(generateTemp(fm, ffn.getDst())+"=global_defsprim_p->"+ffn.getField().getSafeSymbol()+";"); + output.println("}"); + }else{ + if (ffn.getField().getType().isPtr()) + output.println(generateTemp(fm, ffn.getDst())+"=global_defs_p->"+ffn.getField().getSafeSymbol()+";"); + else + output.println(generateTemp(fm, ffn.getDst())+"=global_defsprim_p->"+ffn.getField().getSafeSymbol()+";"); + } } else if (ffn.getField().isEnum()) { // an Enum value, directly replace the field access as int output.println(generateTemp(fm, ffn.getDst()) + "=" + ffn.getField().enumValue() + ";"); + } else if(state.SSJAVA_GENCODE_PREVENT_CRASHES){ + output.println("if (" + generateTemp(fm,ffn.getSrc()) + " == NULL) {"); + output.println("printf(\"SSJAVA: Dereferencing NULL Pointer at file:%s, func:%s, line:%d \\n\", __FILE__, __func__, __LINE__);"); + if(ffn.getDst().getType().isPrimitive()){ + output.println(generateTemp(fm, ffn.getDst())+"= 0;"); + }else{ + output.println(generateTemp(fm, ffn.getDst())+"= NULL;"); + } + output.println("}else{"); + output.println(generateTemp(fm, ffn.getDst())+"="+ generateTemp(fm,ffn.getSrc())+"->"+ ffn.getField().getSafeSymbol()+";"); + output.println("}"); + }else if (ffn.getField().getSymbol().equals("this")) { + // an inner class refers to itself + if( state.CAPTURE_NULL_DEREFERENCES ) { + output.println("#ifdef CAPTURE_NULL_DEREFERENCES"); + output.println("if (" + generateTemp(fm,ffn.getSrc()) + " == NULL) {"); + output.println("printf(\" NULL ptr error: %s, %s, %d \\n\", __FILE__, __func__, __LINE__);"); + if(state.MULTICOREGC||state.PMC) { + output.println("failednullptr(&___locals___);"); + } else { + output.println("failednullptr(NULL);"); + } + output.println("}"); + output.println("#endif //CAPTURE_NULL_DEREFERENCES"); + } + output.println(generateTemp(fm, ffn.getDst())+"="+ generateTemp(fm,ffn.getSrc())+";"); } else { if( state.CAPTURE_NULL_DEREFERENCES ) { output.println("#ifdef CAPTURE_NULL_DEREFERENCES"); output.println("if (" + generateTemp(fm,ffn.getSrc()) + " == NULL) {"); output.println("printf(\" NULL ptr error: %s, %s, %d \\n\", __FILE__, __func__, __LINE__);"); - if(state.MULTICOREGC) { + if(state.MULTICOREGC||state.PMC) { output.println("failednullptr(&___locals___);"); } else { output.println("failednullptr(NULL);"); @@ -2779,7 +2878,7 @@ fldloop: String dst=generateTemp(fm, fsfn.getDst()); output.println("if(!"+dst+"->"+localcopystr+") {"); /* Link object into list */ - if (GENERATEPRECISEGC || this.state.MULTICOREGC) + if (GENERATEPRECISEGC || state.MULTICOREGC||state.PMC) output.println("COPY_OBJ((struct garbagelist *)"+localsprefixaddr+",(struct ___Object___ *)"+dst+");"); else output.println("COPY_OBJ("+dst+");"); @@ -2802,7 +2901,7 @@ fldloop: output.println("if(global_defsprim_p->" + cn.getSafeSymbol()+"static_block_exe_flag == 0) {"); if(cn.getNumStaticBlocks() != 0) { MethodDescriptor t_md = (MethodDescriptor)cn.getMethodTable().get("staticblocks"); - if ((GENERATEPRECISEGC) || (this.state.MULTICOREGC)) { + if ((GENERATEPRECISEGC) || state.MULTICOREGC||state.PMC) { output.print(" struct "+cn.getSafeSymbol()+t_md.getSafeSymbol()+"_"+t_md.getSafeMethodDescriptor()+"_params __parameterlist__={"); output.println("0, NULL};"); output.println(" "+cn.getSafeSymbol()+t_md.getSafeSymbol()+"_"+t_md.getSafeMethodDescriptor()+"(& __parameterlist__);"); @@ -2817,23 +2916,56 @@ fldloop: } } // redirect to the global_defs_p structure - if (fsfn.getField().getType().isPtr()) { - if (fsfn.getField().getType()!=fsfn.getSrc().getType()) - output.println("global_defs_p->" + - fsfn.getField().getSafeSymbol()+"=(struct "+ fsfn.getField().getType().getSafeSymbol()+" *)"+generateTemp(fm,fsfn.getSrc())+";"); - else - output.println("global_defs_p->" + + if(state.SSJAVA_GENCODE_PREVENT_CRASHES){ + if (fsfn.getField().getType().isPtr()) { + output.println("if ( global_defs_p == NULL) {"); + output.println("printf(\"SSJAVA: Discard a write due to dereferencing NULL Pointer at file:%s, func:%s, line:%d \\n\", __FILE__, __func__, __LINE__);"); + output.println("}else{"); + if (fsfn.getField().getType()!=fsfn.getSrc().getType()){ + output.println("global_defs_p->" + + fsfn.getField().getSafeSymbol()+"=(struct "+ fsfn.getField().getType().getSafeSymbol()+" *)"+generateTemp(fm,fsfn.getSrc())+";"); + }else{ + output.println("global_defs_p->" + + fsfn.getField().getSafeSymbol()+"="+ generateTemp(fm,fsfn.getSrc())+";"); + } + output.println("}"); + } else{ + output.println("if ( global_defsprim_p == NULL) {"); + output.println("printf(\"SSJAVA: Discard a write due to dereferencing NULL Pointer at file:%s, func:%s, line:%d \\n\", __FILE__, __func__, __LINE__);"); + output.println("}else{"); + output.println("global_defsprim_p->" + fsfn.getField().getSafeSymbol()+"="+ generateTemp(fm,fsfn.getSrc())+";"); - } else - output.println("global_defsprim_p->" + + output.println("}"); + } + }else{ + if (fsfn.getField().getType().isPtr()) { + if (fsfn.getField().getType()!=fsfn.getSrc().getType()) + output.println("global_defs_p->" + + fsfn.getField().getSafeSymbol()+"=(struct "+ fsfn.getField().getType().getSafeSymbol()+" *)"+generateTemp(fm,fsfn.getSrc())+";"); + else + output.println("global_defs_p->" + + fsfn.getField().getSafeSymbol()+"="+ generateTemp(fm,fsfn.getSrc())+";"); + } else + output.println("global_defsprim_p->" + + fsfn.getField().getSafeSymbol()+"="+ generateTemp(fm,fsfn.getSrc())+";"); + } + } else if(state.SSJAVA_GENCODE_PREVENT_CRASHES){ + output.println("if (" + generateTemp(fm,fsfn.getDst()) + " == NULL) {"); + output.println("printf(\"SSJAVA: Dereferencing NULL Pointer at file:%s, func:%s, line:%d \\n\", __FILE__, __func__, __LINE__);"); + output.println("}else{"); + if (fsfn.getSrc().getType().isPtr()&&fsfn.getSrc().getType()!=fsfn.getField().getType()) + output.println(generateTemp(fm, fsfn.getDst())+"->"+ + fsfn.getField().getSafeSymbol()+"=(struct "+ fsfn.getField().getType().getSafeSymbol()+"*)"+generateTemp(fm,fsfn.getSrc())+";"); + else + output.println(generateTemp(fm, fsfn.getDst())+"->"+ fsfn.getField().getSafeSymbol()+"="+ generateTemp(fm,fsfn.getSrc())+";"); + output.println("}"); } else { - if( state.CAPTURE_NULL_DEREFERENCES ) { output.println("#ifdef CAPTURE_NULL_DEREFERENCES"); output.println("if (" + generateTemp(fm,fsfn.getDst()) + " == NULL) {"); output.println("printf(\" NULL ptr error: %s, %s, %d \\n\", __FILE__, __func__, __LINE__);"); - if(state.MULTICOREGC) { + if(state.MULTICOREGC||state.PMC) { output.println("failednullptr(&___locals___);"); } else { output.println("failednullptr(NULL);"); @@ -2862,12 +2994,31 @@ fldloop: type="void *"; else type=elementtype.getSafeSymbol()+" "; - - if (this.state.ARRAYBOUNDARYCHECK && fen.needsBoundsCheck()) { - output.println("if (unlikely(((unsigned int)"+generateTemp(fm, fen.getIndex())+") >= "+generateTemp(fm,fen.getSrc()) + "->___length___))"); - output.println("failedboundschk(" + (boundschknum++) + ");"); + + if(state.SSJAVA_GENCODE_PREVENT_CRASHES){ + output.println("if (" + generateTemp(fm,fen.getSrc()) + " == NULL) {"); + output.println("printf(\"SSJAVA: Dereferencing NULL Pointer at file:%s, func:%s, line:%d \\n\", __FILE__, __func__, __LINE__);"); + output.println("}else{"); + output.println("if (unlikely( ((unsigned int)"+generateTemp(fm, fen.getIndex())+") >= "+generateTemp(fm,fen.getSrc()) + "->___length___)){"); + output.println("printf(\"SSJAVA: Array out of bounds at file:%s, func:%s, line:%d \\n\", __FILE__, __func__, __LINE__);"); + if(fen.getDst().getType().isPrimitive()){ + output.println(generateTemp(fm, fen.getDst())+"= 0;"); + }else{ + output.println(generateTemp(fm, fen.getDst())+"= NULL;"); + } + output.println("}else{"); + output.println(generateTemp(fm, fen.getDst())+"=(("+ type+"*)(((char *) &("+ generateTemp(fm,fen.getSrc())+"->___length___))+sizeof(int)))["+generateTemp(fm, fen.getIndex())+"];"); + output.println("}"); + output.println("}"); + }else{ + if (this.state.ARRAYBOUNDARYCHECK && fen.needsBoundsCheck()) { + output.println("if (unlikely(((unsigned int)"+generateTemp(fm, fen.getIndex())+") >= "+generateTemp(fm,fen.getSrc()) + "->___length___))"); + output.println("failedboundschk(__LINE__, " +generateTemp(fm, fen.getIndex()) +", "+ generateTemp(fm, fen.getSrc()) + ");"); + } + output.println(generateTemp(fm, fen.getDst())+"=(("+ type+"*)(((char *) &("+ generateTemp(fm,fen.getSrc())+"->___length___))+sizeof(int)))["+generateTemp(fm, fen.getIndex())+"];"); } - output.println(generateTemp(fm, fen.getDst())+"=(("+ type+"*)(((char *) &("+ generateTemp(fm,fen.getSrc())+"->___length___))+sizeof(int)))["+generateTemp(fm, fen.getIndex())+"];"); + + } protected void generateFlatSetElementNode(FlatMethod fm, FlatSetElementNode fsen, PrintWriter output) { @@ -2883,24 +3034,37 @@ fldloop: type="void *"; else type=elementtype.getSafeSymbol()+" "; - - if (this.state.ARRAYBOUNDARYCHECK && fsen.needsBoundsCheck()) { - output.println("if (unlikely(((unsigned int)"+generateTemp(fm, fsen.getIndex())+") >= "+generateTemp(fm,fsen.getDst()) + "->___length___))"); - output.println("failedboundschk(" + (boundschknum++) + ");"); - } - if (state.FASTCHECK) { - String dst=generateTemp(fm, fsen.getDst()); - output.println("if(!"+dst+"->"+localcopystr+") {"); - /* Link object into list */ - if (GENERATEPRECISEGC || this.state.MULTICOREGC) - output.println("COPY_OBJ((struct garbagelist *)"+localsprefixaddr+",(struct ___Object___ *)"+dst+");"); - else - output.println("COPY_OBJ("+dst+");"); - output.println(dst+"->"+nextobjstr+"="+fcrevert+";"); - output.println(fcrevert+"=(struct ___Object___ *)"+dst+";"); + + if(state.SSJAVA_GENCODE_PREVENT_CRASHES){ + output.println("if ("+generateTemp(fm,fsen.getDst())+"==NULL){"); + output.println("printf(\"SSJAVA: Dereferencing NULL Pointer at file:%s, func:%s, line:%d \\n\", __FILE__, __func__, __LINE__);"); + output.println("}else{"); + output.println("if (unlikely(((unsigned int)"+generateTemp(fm, fsen.getIndex())+") >= "+generateTemp(fm,fsen.getDst()) + "->___length___)){"); + output.println("printf(\"SSJAVA: Discard a write due to array out of bounds at file:%s, func:%s, line:%d \\n\", __FILE__, __func__, __LINE__);"); + output.println("}else{"); + output.println("(("+type +"*)(((char *) &("+ generateTemp(fm,fsen.getDst())+"->___length___))+sizeof(int)))["+generateTemp(fm, fsen.getIndex())+"]="+generateTemp(fm,fsen.getSrc())+";"); + output.println("}"); output.println("}"); + }else{ + if (this.state.ARRAYBOUNDARYCHECK && fsen.needsBoundsCheck()) { + output.println("if (unlikely(((unsigned int)"+generateTemp(fm, fsen.getIndex())+") >= "+generateTemp(fm,fsen.getDst()) + "->___length___))"); + output.println("failedboundschk(__LINE__, " +generateTemp(fm, fsen.getIndex()) +", "+ generateTemp(fm, fsen.getDst()) + ");"); + } + if (state.FASTCHECK) { + String dst=generateTemp(fm, fsen.getDst()); + output.println("if(!"+dst+"->"+localcopystr+") {"); + /* Link object into list */ + if (GENERATEPRECISEGC || state.MULTICOREGC||state.PMC) + output.println("COPY_OBJ((struct garbagelist *)"+localsprefixaddr+",(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())+"->___length___))+sizeof(int)))["+generateTemp(fm, fsen.getIndex())+"]="+generateTemp(fm,fsen.getSrc())+";"); } - output.println("(("+type +"*)(((char *) &("+ generateTemp(fm,fsen.getDst())+"->___length___))+sizeof(int)))["+generateTemp(fm, fsen.getIndex())+"]="+generateTemp(fm,fsen.getSrc())+";"); + } @@ -2909,13 +3073,13 @@ fldloop: if (fn.getType().isArray()) { int arrayid=state.getArrayNumber(fn.getType())+state.numClasses(); - if ((GENERATEPRECISEGC) || (this.state.MULTICOREGC)) { + if ((GENERATEPRECISEGC) || state.MULTICOREGC||state.PMC) { output.println(generateTemp(fm,fn.getDst())+"=allocate_newarray("+localsprefixaddr+", "+arrayid+", "+generateTemp(fm, fn.getSize())+");"); } else { output.println(generateTemp(fm,fn.getDst())+"=allocate_newarray("+arrayid+", "+generateTemp(fm, fn.getSize())+");"); } } else { - if ((GENERATEPRECISEGC) || (this.state.MULTICOREGC)) { + if ((GENERATEPRECISEGC) || state.MULTICOREGC||state.PMC) { output.println(generateTemp(fm,fn.getDst())+"=allocate_new("+localsprefixaddr+", "+fn.getType().getClassDesc().getId()+");"); } else { output.println(generateTemp(fm,fn.getDst())+"=allocate_new("+fn.getType().getClassDesc().getId()+");"); @@ -2926,14 +3090,13 @@ fldloop: output.println(dst+"->"+nextobjstr+"="+fcrevert+";"); output.println(fcrevert+"=(struct ___Object___ *)"+dst+";"); } - for(BuildCodeExtension bcx: extensions) { bcx.additionalCodeNewObject(output, dst, fn); } } protected void generateFlatTagDeclaration(FlatMethod fm, FlatTagDeclaration fn, PrintWriter output) { - if ((GENERATEPRECISEGC) || (this.state.MULTICOREGC)) { + if ((GENERATEPRECISEGC) || state.MULTICOREGC||state.PMC) { output.println(generateTemp(fm,fn.getDst())+"=allocate_tag("+localsprefixaddr+", "+state.getTagId(fn.getType())+");"); } else { output.println(generateTemp(fm,fn.getDst())+"=allocate_tag("+state.getTagId(fn.getType())+");"); @@ -2949,10 +3112,19 @@ fldloop: output.println(generateTemp(fm, fon.getDest())+" = ((unsigned int)"+generateTemp(fm, fon.getLeft())+")>>"+generateTemp(fm,fon.getRight())+";"); } else { - if (fon.getLeft().getType().isPtr()&&fon.getLeft().getType()!=fon.getRight().getType()&&!fon.getRight().getType().isNull()) - output.println(generateTemp(fm, fon.getDest())+" = (struct "+fon.getRight().getType().getSafeSymbol()+"*)"+generateTemp(fm, fon.getLeft())+fon.getOp().toString()+generateTemp(fm,fon.getRight())+";"); - else + if(state.SSJAVA_GENCODE_PREVENT_CRASHES && fon.getOp().getOp()==Operation.DIV){ + output.println("if (unlikely("+generateTemp(fm,fon.getRight())+"==0)){"); + output.println("printf(\"SSJAVA: Divided by zero at file:%s, func:%s, line:%d \\n\", __FILE__, __func__, __LINE__);"); + output.println(generateTemp(fm, fon.getDest())+" = 0;"); + output.println("}else{"); output.println(generateTemp(fm, fon.getDest())+" = "+generateTemp(fm, fon.getLeft())+fon.getOp().toString()+generateTemp(fm,fon.getRight())+";"); + output.println("}"); + }else{ + if (fon.getLeft().getType().isPtr()&&fon.getLeft().getType()!=fon.getRight().getType()&&!fon.getRight().getType().isNull()) + output.println(generateTemp(fm, fon.getDest())+" = (struct "+fon.getRight().getType().getSafeSymbol()+"*)"+generateTemp(fm, fon.getLeft())+fon.getOp().toString()+generateTemp(fm,fon.getRight())+";"); + else + output.println(generateTemp(fm, fon.getDest())+" = "+generateTemp(fm, fon.getLeft())+fon.getOp().toString()+generateTemp(fm,fon.getRight())+";"); + } } } else if (fon.getOp().getOp()==Operation.ASSIGN) if (fon.getDest().getType().isPtr()&&fon.getDest().getType()!=fon.getLeft().getType()) @@ -3000,11 +3172,16 @@ fldloop: output.print(((int)str.charAt(i))); } output.println("};"); - if ((GENERATEPRECISEGC) || (this.state.MULTICOREGC)) { + if ((GENERATEPRECISEGC) || state.MULTICOREGC||state.PMC) { output.println(generateTemp(fm, fln.getDst())+"=NewStringShort("+localsprefixaddr+", str"+flncount+", "+((String)fln.getValue()).length()+");"); } else { output.println(generateTemp(fm, fln.getDst())+"=NewStringShort(str"+flncount+" ,"+((String)fln.getValue()).length()+");"); } + + for(BuildCodeExtension bcx: extensions) { + bcx.additionalCodeNewStringLiteral(output, generateTemp(fm, fln.getDst())); + } + output.println("}"); flncount++; } else if (fln.getType().isBoolean()) { @@ -3080,7 +3257,7 @@ fldloop: output.print(task.getSafeSymbol()+"("); boolean printcomma=false; - if ((GENERATEPRECISEGC) || (this.state.MULTICOREGC)) { + if ((GENERATEPRECISEGC) || state.MULTICOREGC||state.PMC) { if (md!=null) { output.print("struct "+cn.getSafeSymbol()+md.getSafeSymbol()+"_"+mdstring+"_params * "+paramsprefix); } else @@ -3103,7 +3280,7 @@ fldloop: output.print(temp.getType().getSafeSymbol()+" "+temp.getSafeSymbol()); } output.println(") {"); - } else if (!GENERATEPRECISEGC && !this.state.MULTICOREGC) { + } else if (!GENERATEPRECISEGC && !state.MULTICOREGC && ! state.PMC) { /* Imprecise Task */ output.println("void * parameterarray[]) {"); /* Unpack variables */ @@ -3204,7 +3381,7 @@ fldloop: Iterator tagit=tagtmps.iterator(); while(tagit.hasNext()) { TempDescriptor tagtmp=(TempDescriptor)tagit.next(); - if ((GENERATEPRECISEGC) || (this.state.MULTICOREGC)) + if ((GENERATEPRECISEGC) || state.MULTICOREGC||state.PMC) output.println("tagclear("+localsprefixaddr+", (struct ___Object___ *)"+generateTemp(fm, temp)+", "+generateTemp(fm,tagtmp)+");"); else output.println("tagclear((struct ___Object___ *)"+generateTemp(fm, temp)+", "+generateTemp(fm,tagtmp)+");"); @@ -3216,7 +3393,7 @@ fldloop: Iterator tagit=tagtmps.iterator(); while(tagit.hasNext()) { TempDescriptor tagtmp=(TempDescriptor)tagit.next(); - if ((GENERATEPRECISEGC) || (this.state.MULTICOREGC)) + if ((GENERATEPRECISEGC) || state.MULTICOREGC||state.PMC) output.println("tagset("+localsprefixaddr+", (struct ___Object___ *)"+generateTemp(fm, temp)+", "+generateTemp(fm,tagtmp)+");"); else output.println("tagset((struct ___Object___ *)"+generateTemp(fm, temp)+", "+generateTemp(fm,tagtmp)+");");