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);
bcx.additionalCodeGen(outmethodheader, outstructs, outmethod);
}
-
if (state.TASK) {
/* Output code for tasks */
outputTaskCode(outtaskdefs, outmethod);
// 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<ClassDescriptor> tooutput = new Vector<ClassDescriptor>();
+ Queue<ClassDescriptor> toprocess=new LinkedList<ClassDescriptor>();
+ Vector<ClassDescriptor> outputs = new Vector<ClassDescriptor>();
+ 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);
+ }
+ }
}
}
// 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()) + ");");
+ (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() + ");");
outmethod.println(" ((struct garbagelist *)global_defs_p)->array[i]=NULL;");
outmethod.println(" }");
}
- outputStaticBlocks(outmethod);
outputClassObjects(outmethod);
-
+ outputStaticBlocks(outmethod);
additionalCodeAtTopOfMain(outmethod);
for(BuildCodeExtension bcx: extensions) {
}
- 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);");
outmethod.println(" for(i=1;i<argc;i++) {");
outmethod.println(" int length=strlen(argv[i]);");
- if ((GENERATEPRECISEGC) || (this.state.MULTICOREGC)) {
- outmethod.println(" struct ___String___ *newstring=NewString(NULL, argv[i], length);");
+ ClassDescriptor stringclass=typeutil.getClass(TypeUtil.StringClass);
+ String stringclassstring="struct "+stringclass.getSafeSymbol();
+
+ if ((GENERATEPRECISEGC) || state.MULTICOREGC||state.PMC) {
+ outmethod.println(" "+stringclassstring+" *newstring=NewString(NULL, argv[i], length);");
} else {
- outmethod.println(" struct ___String___ *newstring=NewString(argv[i], length);");
+ outmethod.println(" "+stringclassstring+" *newstring=NewString(argv[i], length);");
}
outmethod.println(" ((void **)(((char *)& stringarray->___length___)+sizeof(int)))[i-1]=newstring;");
outmethod.println(" }");
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__);");
if (state.main!=null) {
outmethod.println("#include <string.h>");
}
+ if (state.SSJAVA_GENCODE_PREVENT_CRASHES){
+ outmethod.println("#include <stdio.h>");
+ }
if (state.CONSCHECK) {
outmethod.println("#include \"checkers.h\"");
}
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) {
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;");
for(int i=0; i<fm.numParameters(); i++) {
TempDescriptor temp=fm.getParameter(i);
TypeDescriptor type=temp.getType();
- if (type.isPtr()&&((GENERATEPRECISEGC) || (this.state.MULTICOREGC)))
+ if (type.isPtr()&&((GENERATEPRECISEGC) || state.MULTICOREGC||state.PMC))
objectparams.addPtr(temp);
else
objectparams.addPrim(temp);
for(int i=0; i<fm.numTags(); i++) {
TempDescriptor temp=fm.getTag(i);
- if ((GENERATEPRECISEGC) || (this.state.MULTICOREGC))
+ if ((GENERATEPRECISEGC) || state.MULTICOREGC||state.PMC)
objectparams.addPtr(temp);
else
objectparams.addPrim(temp);
for(int i=0; i<writes.length; i++) {
TempDescriptor temp=writes[i];
TypeDescriptor type=temp.getType();
- if (type.isPtr()&&((GENERATEPRECISEGC) || (this.state.MULTICOREGC)))
+ if (type.isPtr()&&((GENERATEPRECISEGC) || state.MULTICOREGC||state.PMC))
objecttemps.addPtr(temp);
else
objecttemps.addPrim(temp);
classdefout.println(" volatile int notifycount;");
classdefout.println(" volatile int objlock;");
if(state.MULTICOREGC) {
+ //classdefout.println(" int marked;");
+ }
+ if(state.PMC) {
classdefout.println(" int marked;");
+ classdefout.println(" void * backward;");
}
}
if (state.TASK) {
classdefout.println(" int mutex;");
classdefout.println(" volatile int lockcount;");
if(state.MULTICOREGC) {
- classdefout.println(" int marked;");
+ //classdefout.println(" int marked;");
}
+ if(state.PMC) {
+ classdefout.println(" int marked;");
+ classdefout.println(" void * backward;");
+ }
}
if (state.OPTIONAL) {
classdefout.println(" int numfses;");
protected void generateMethodParam(ClassDescriptor cn, MethodDescriptor md, PrintWriter output) {
/* Output parameter structure */
- if ((GENERATEPRECISEGC) || (this.state.MULTICOREGC)) {
+ if ((GENERATEPRECISEGC) || state.MULTICOREGC||state.PMC) {
if(md.isInvokedByStatic() && !md.isStaticBlock() && !md.getModifiers().isNative()) {
// generate the staticinit version
String mdstring = md.getSafeMethodDescriptor() + "staticinit";
String mdstring = md.getSafeMethodDescriptor() + "staticinit";
/* Output temp structure */
- if ((GENERATEPRECISEGC) || (this.state.MULTICOREGC)) {
+ if ((GENERATEPRECISEGC) || state.MULTICOREGC||state.PMC) {
output.println("struct "+cn.getSafeSymbol()+md.getSafeSymbol()+"_"+mdstring+"_locals {");
output.println(" int size;");
output.println(" void * next;");
/* Next the method name */
headersout.print(cn.getSafeSymbol()+md.getSafeSymbol()+"_"+mdstring+"(");
printcomma=false;
- if ((GENERATEPRECISEGC) || (this.state.MULTICOREGC)) {
+ if ((GENERATEPRECISEGC) || state.MULTICOREGC||state.PMC) {
headersout.print("struct "+cn.getSafeSymbol()+md.getSafeSymbol()+"_"+mdstring+"_params * "+paramsprefix);
printcomma=true;
}
}
/* Output temp structure */
- if ((GENERATEPRECISEGC) || (this.state.MULTICOREGC)) {
+ if ((GENERATEPRECISEGC) || state.MULTICOREGC||state.PMC) {
output.println("struct "+cn.getSafeSymbol()+md.getSafeSymbol()+"_"+md.getSafeMethodDescriptor()+"_locals {");
output.println(" int size;");
output.println(" void * next;");
/* Next the method name */
headersout.print(cn.getSafeSymbol()+md.getSafeSymbol()+"_"+md.getSafeMethodDescriptor()+"(");
printcomma=false;
- if ((GENERATEPRECISEGC) || (this.state.MULTICOREGC)) {
+ if ((GENERATEPRECISEGC) || state.MULTICOREGC||state.PMC) {
headersout.print("struct "+cn.getSafeSymbol()+md.getSafeSymbol()+"_"+md.getSafeMethodDescriptor()+"_params * "+paramsprefix);
printcomma=true;
}
TempObject objecttemps=(TempObject) tempstable.get(task);
/* Output parameter structure */
- if ((GENERATEPRECISEGC) || (this.state.MULTICOREGC)) {
+ if ((GENERATEPRECISEGC) || state.MULTICOREGC||state.PMC) {
output.println("struct "+task.getSafeSymbol()+"_params {");
output.println(" int size;");
output.println(" void * next;");
}
/* Output temp structure */
- if ((GENERATEPRECISEGC) || (this.state.MULTICOREGC)) {
+ if ((GENERATEPRECISEGC) || state.MULTICOREGC||state.PMC) {
output.println("struct "+task.getSafeSymbol()+"_locals {");
output.println(" int size;");
output.println(" void * next;");
headersout.print("void " + task.getSafeSymbol()+"(");
boolean printcomma=false;
- if ((GENERATEPRECISEGC) || (this.state.MULTICOREGC)) {
+ if ((GENERATEPRECISEGC) || state.MULTICOREGC||state.PMC) {
headersout.print("struct "+task.getSafeSymbol()+"_params * "+paramsprefix);
} else
headersout.print("void * parameterarray[]");
outmethod.print(md.getReturnType().getSafeSymbol()+" retval=");
}
outmethod.print("Java_");
- outmethod.print(cd.getPackage().replace('.','_'));
+ outmethod.print(cd.getPackage().replace('.','_')+"_"+cd.getClassName().replace('.','_'));
outmethod.print("_"+md.getSymbol()+"(");
outmethod.print("JNI_vtable, rec");
generateHeader(fm, md!=null?md:task,output);
TempObject objecttemp=(TempObject) tempstable.get(md!=null?md:task);
- if ((GENERATEPRECISEGC) || (this.state.MULTICOREGC)) {
+ if ((GENERATEPRECISEGC) || state.MULTICOREGC||state.PMC) {
output.print(" struct "+cn.getSafeSymbol()+md.getSafeSymbol()+"_"+mdstring+"_locals "+localsprefix+"={");
output.print(objecttemp.numPointers()+",");
output.print(paramsprefix);
/* Check to see if we need to do a GC if this is a
* multi-threaded program...*/
- if (((state.OOOJAVA||state.THREAD)&&GENERATEPRECISEGC) || state.MULTICOREGC) {
+ if (((state.OOOJAVA||state.THREAD)&&GENERATEPRECISEGC) || state.MULTICOREGC||state.PMC) {
//Don't bother if we aren't in recursive methods...The loops case will catch it
if (callgraph.getAllMethods(md).contains(md)) {
- if (this.state.MULTICOREGC) {
+ if (state.MULTICOREGC||state.PMC) {
output.println("GCCHECK("+localsprefixaddr+");");
} else {
output.println("if (unlikely(needtocollect)) checkcollect("+localsprefixaddr+");");
mgcstaticinit = true;
}
- if ((GENERATEPRECISEGC) || (this.state.MULTICOREGC)) {
+ if ((GENERATEPRECISEGC) || state.MULTICOREGC||state.PMC) {
if (md!=null)
output.print(" struct "+cn.getSafeSymbol()+md.getSafeSymbol()+"_"+md.getSafeMethodDescriptor()+"_locals "+localsprefix+"={");
else
* multi-threaded program...*/
if (((state.OOOJAVA||state.THREAD)&&GENERATEPRECISEGC)
- || this.state.MULTICOREGC) {
+ || state.MULTICOREGC||state.PMC) {
//Don't bother if we aren't in recursive methods...The loops case will catch it
if (callgraph.getAllMethods(md).contains(md)) {
- if (this.state.MULTICOREGC) {
+ if (state.MULTICOREGC||state.PMC) {
output.println("GCCHECK("+localsprefixaddr+");");
} else {
output.println("if (unlikely(needtocollect)) checkcollect("+localsprefixaddr+");");
bcx.additionalCodePreNode(fm, fn, output);
}
+
switch(fn.kind()) {
case FKind.FlatAtomicEnterNode:
generateFlatAtomicEnterNode(fm, (FlatAtomicEnterNode) fn, output);
break;
case FKind.FlatGenReachNode:
- // this node is just for generating a reach graph
+ case FKind.FlatGenDefReachNode:
+ // these nodes are just for generating analysis data
// in disjointness analysis at a particular program point
break;
public void generateFlatBackEdge(FlatMethod fm, FlatBackEdge fn, PrintWriter output) {
if (((state.OOOJAVA||state.THREAD)&&GENERATEPRECISEGC)
- || (this.state.MULTICOREGC)) {
- if(this.state.MULTICOREGC) {
+ || state.MULTICOREGC||state.PMC) {
+ if (state.MULTICOREGC||state.PMC) {
output.println("GCCHECK("+localsprefixaddr+");");
} else {
output.println("if (unlikely(needtocollect)) checkcollect("+localsprefixaddr+");");
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__);");
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) {
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);
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;
}
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) {
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__);");
}
}
// 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);");
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+");");
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__);");
}
}
// 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);");
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) {
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())+";");
+
}
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()+");");
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())+");");
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())
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()+");");
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
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 */
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)+");");
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)+");");