From 8ea6bed7a89440f619eb260ae8bf3aabdb731c59 Mon Sep 17 00:00:00 2001 From: jzhou Date: Sat, 26 Feb 2011 02:53:46 +0000 Subject: [PATCH] Remove the extra copy of static field in the object structures and change the classobj in global_defs_p as pointers. Also take interfaces into consider when do instanceof check in MGC runtime. There are still bugs to check instanceof for arrays --- Robust/src/IR/ClassDescriptor.java | 10 +- Robust/src/IR/Flat/BuildCode.java | 111 ++++++++++--------- Robust/src/IR/Flat/BuildCodeMGC.java | 5 +- Robust/src/IR/State.java | 4 +- Robust/src/Runtime/bamboo/multicoreruntime.c | 24 +++- 5 files changed, 91 insertions(+), 63 deletions(-) diff --git a/Robust/src/IR/ClassDescriptor.java b/Robust/src/IR/ClassDescriptor.java index 1edb3fd5..26e57df0 100644 --- a/Robust/src/IR/ClassDescriptor.java +++ b/Robust/src/IR/ClassDescriptor.java @@ -23,6 +23,7 @@ public class ClassDescriptor extends Descriptor { // for interfaces Vector superinterfaces; SymbolTable superIFdesc; + private boolean isInterface; // for inner classes boolean isInnerClass=false; @@ -49,11 +50,8 @@ public class ClassDescriptor extends Descriptor { fields=new SymbolTable(); fieldvec=new Vector(); methods=new SymbolTable(); - if(isInterface) { - classid = -2; - } else { - classid=UIDCount++; - } + this.isInterface = isInterface; + classid=UIDCount++; this.packagename=packagename; superinterfaces = new Vector(); superIFdesc = new SymbolTable(); @@ -282,7 +280,7 @@ public class ClassDescriptor extends Descriptor { } public boolean isInterface() { - return this.classid == -2; + return this.isInterface; } public boolean isStatic() { diff --git a/Robust/src/IR/Flat/BuildCode.java b/Robust/src/IR/Flat/BuildCode.java index 6422e2d3..91affcc3 100644 --- a/Robust/src/IR/Flat/BuildCode.java +++ b/Robust/src/IR/Flat/BuildCode.java @@ -48,8 +48,7 @@ public class BuildCode { TypeDescriptor[] arraytable; SafetyAnalysis sa; CallGraph callgraph; - Hashtable printedfieldstbl; - + Hashtable printedfieldstbl; public BuildCode(State st, Hashtable temptovar, TypeUtil typeutil) { this(st, temptovar, typeutil, null); @@ -66,7 +65,7 @@ public class BuildCode { flagorder=new Hashtable(); this.typeutil=typeutil; virtualcalls=new Virtual(state, null); - printedfieldstbl = new Hashtable(); + printedfieldstbl = new Hashtable(); } /** The buildCode method outputs C code for all the methods. The Flat @@ -545,7 +544,7 @@ public class BuildCode { } // for each class, create a global object - outglobaldefs.println(" struct ___Object___ "+cn.getSafeSymbol()+"classobj;"); + outglobaldefs.println(" struct ___Object___ *"+cn.getSafeSymbol()+"classobj;"); } } outclassdefs.println(""); @@ -654,7 +653,7 @@ public class BuildCode { outclassdefs.println("extern int classsize[];"); outclassdefs.println("extern int hasflags[];"); outclassdefs.println("extern unsigned INTPTR * pointerarray[];"); - outclassdefs.println("extern int supertypes[];"); + outclassdefs.println("extern int* supertypes[];"); outclassdefs.println(""); } @@ -836,9 +835,6 @@ public class BuildCode { classit=state.getClassSymbolTable().getDescriptorsIterator(); while(classit.hasNext()) { ClassDescriptor cd=(ClassDescriptor)classit.next(); - if(cd.isInterface()) { - continue; - } fillinRow(cd, virtualtable, cd.getId()); } @@ -903,11 +899,10 @@ public class BuildCode { Iterator it=state.getClassSymbolTable().getDescriptorsIterator(); cdarray=new ClassDescriptor[state.numClasses()]; cdarray[0] = null; + int interfaceid = 0; while(it.hasNext()) { ClassDescriptor cd=(ClassDescriptor)it.next(); - if(!cd.isInterface()) { - cdarray[cd.getId()]=cd; - } + cdarray[cd.getId()] = cd; } arraytable=new TypeDescriptor[state.numArrays()]; @@ -1120,6 +1115,9 @@ public class BuildCode { allit=cn.getFieldTable().getAllDescriptorsIterator(); while(allit.hasNext()) { FieldDescriptor fd=(FieldDescriptor)allit.next(); + if(fd.isStatic() || fd.isVolatile()) { + continue; + } TypeDescriptor type=fd.getType(); if (type.isPtr()) { output.println(","); @@ -1173,18 +1171,53 @@ public class BuildCode { /** Print out table to give us supertypes */ protected void generateSuperTypeTable(PrintWriter output) { - output.println("int supertypes[]={"); + for(int i=0; i"+fd.getSafeSymbol()+"=&(global_defs_p->"+fd.getSafeSymbol()+");"); - } - } - } } generateCode(fm.getNext(0), fm, null, output); @@ -1915,8 +1924,10 @@ public class BuildCode { public void generateFlatOffsetNode(FlatMethod fm, FlatOffsetNode fofn, PrintWriter output) { output.println("/* FlatOffsetNode */"); FieldDescriptor fd=fofn.getField(); + if(!fd.isStatic() && !fd.isVolatile()) { output.println(generateTemp(fm, fofn.getDst())+ " = (short)(int) (&((struct "+fofn.getClassType().getSafeSymbol() +" *)0)->"+ fd.getSafeSymbol()+");"); + } output.println("/* offset */"); } @@ -2029,7 +2040,7 @@ public class BuildCode { if((md.getSymbol().equals("MonitorEnter") || md.getSymbol().equals("MonitorExit")) && fc.getThis().getSymbol().equals("classobj")) { // call MonitorEnter/MonitorExit on a class obj output.println(" " + cn.getSafeSymbol()+md.getSafeSymbol()+"_" - +md.getSafeMethodDescriptor() + "((struct ___Object___*)(&global_defs_p->" + +md.getSafeMethodDescriptor() + "((struct ___Object___*)(global_defs_p->" + fc.getThis().getType().getClassDesc().getSafeSymbol() +"classobj));"); return; } @@ -2175,7 +2186,7 @@ public class BuildCode { protected void generateFlatFieldNode(FlatMethod fm, FlatFieldNode ffn, PrintWriter output) { if(state.MGC) { // TODO add version for normal Java later - if(ffn.getField().isStatic()) { + if(ffn.getField().isStatic() || ffn.getField().isVolatile()) { // static field if((fm.getMethod().isStaticBlock()) || (fm.getMethod().isInvokedByStatic())) { // is a static block or is invoked in some static block @@ -2202,7 +2213,7 @@ public class BuildCode { } } // redirect to the global_defs_p structure - if((ffn.getField().isStatic()) || (ffn.getSrc().getType().isClassNameRef())) { + if((ffn.getField().isStatic()) || (ffn.getField().isVolatile()) || (ffn.getSrc().getType().isClassNameRef())) { // reference to the static field with Class name output.println(generateTemp(fm, ffn.getDst())+"=global_defs_p->"+ffn.getField().getSafeSymbol()+";"); } else { @@ -2267,7 +2278,7 @@ public class BuildCode { } } // redirect to the global_defs_p structure - if(fsfn.getDst().getType().isClassNameRef()) { + if((fsfn.getDst().getType().isClassNameRef()) || (fsfn.getField().isStatic()) || (fsfn.getField().isVolatile())) { // reference to the static field with Class name output.println("global_defs_p->" + fsfn.getField().getSafeSymbol()+"="+ generateTemp(fm,fsfn.getSrc())+";"); diff --git a/Robust/src/IR/Flat/BuildCodeMGC.java b/Robust/src/IR/Flat/BuildCodeMGC.java index e2d998eb..9d09dd1a 100644 --- a/Robust/src/IR/Flat/BuildCodeMGC.java +++ b/Robust/src/IR/Flat/BuildCodeMGC.java @@ -313,9 +313,10 @@ NextMethod: } outmethod.println(");"); */ - outmethod.println(" global_defs_p->"+t_cd.getSafeSymbol()+"classobj.type = " + t_cd.getId() + ";"); + outmethod.println(" global_defs_p->"+t_cd.getSafeSymbol()+"classobj = allocate_new(" + typeutil.getClass(TypeUtil.ObjectClass).getId() + ");"); + outmethod.println(" global_defs_p->"+t_cd.getSafeSymbol()+"classobj->type = " + t_cd.getId() + ";"); - outmethod.println(" initlock((struct ___Object___ *)(&(global_defs_p->"+t_cd.getSafeSymbol()+"classobj)));"); + outmethod.println(" initlock((struct ___Object___ *)((global_defs_p->"+t_cd.getSafeSymbol()+"classobj)));"); outmethod.println(" }"); } diff --git a/Robust/src/IR/State.java b/Robust/src/IR/State.java index b9bbfafb..723fb62d 100644 --- a/Robust/src/IR/State.java +++ b/Robust/src/IR/State.java @@ -232,9 +232,7 @@ public class State { if (classes.contains(tdn.getSymbol())) throw new Error("Class "+tdn.getSymbol()+" defined twice"); classes.add(tdn); - if(!tdn.isInterface()) { - numclasses++; - } + numclasses++; if((tdn.numstaticfields != 0) || (tdn.numstaticblocks != 0)) { sclasses.add(tdn); } diff --git a/Robust/src/Runtime/bamboo/multicoreruntime.c b/Robust/src/Runtime/bamboo/multicoreruntime.c index 75928f58..cd7ec4d1 100644 --- a/Robust/src/Runtime/bamboo/multicoreruntime.c +++ b/Robust/src/Runtime/bamboo/multicoreruntime.c @@ -18,6 +18,7 @@ extern int classsize[]; extern int typearray[]; extern int typearray2[]; +extern int* supertypes[]; #ifdef TASK extern struct genhashtable * activetasks; @@ -34,20 +35,39 @@ int debugtask=0; int corenum = 0; #endif +int instanceofif(int otype, int type) { + if(otype == type) { + return 1; + } + int num = supertypes[otype][0]; + for(int i = 1; i < num + 1; i++) { + int t = supertypes[otype][i]; + if(instanceofif(t, type) == 1) { + return 1; + } + } + return 0; +} + int instanceof(struct ___Object___ *ptr, int type) { int i=ptr->type; - do { + /*do { if (i==type) return 1; i=typearray[i]; } while(i!=-1); - i=ptr->type; + i=ptr->type;*/ + /*if(instanceofif(i, type) == 1) { + return 1; + }*/ if (i>NUMCLASSES) { do { if (i==type) return 1; i=typearray2[i-NUMCLASSES]; } while(i!=-1); + } else { + return instanceofif(i, type); } return 0; } -- 2.34.1