Remove the extra copy of static field in the object structures and change the classob...
authorjzhou <jzhou>
Sat, 26 Feb 2011 02:53:46 +0000 (02:53 +0000)
committerjzhou <jzhou>
Sat, 26 Feb 2011 02:53:46 +0000 (02:53 +0000)
Robust/src/IR/ClassDescriptor.java
Robust/src/IR/Flat/BuildCode.java
Robust/src/IR/Flat/BuildCodeMGC.java
Robust/src/IR/State.java
Robust/src/Runtime/bamboo/multicoreruntime.c

index 1edb3fd54d16e54cdcd8f228204982785bb18203..26e57df088aae1c7ee1532add838aacc1ee5ae8d 100644 (file)
@@ -23,6 +23,7 @@ public class ClassDescriptor extends Descriptor {
   // for interfaces
   Vector<String> 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<String>();
     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() {
index 6422e2d3542d53068d429aac0e6173ccf2e09c5d..91affcc3767aad75f6564bd45a0a3893d74de8d9 100644 (file)
@@ -48,8 +48,7 @@ public class BuildCode {
   TypeDescriptor[] arraytable;
   SafetyAnalysis sa;
   CallGraph callgraph;
-  Hashtable<String, Integer> printedfieldstbl;
-
+  Hashtable<String, ClassDescriptor> 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<String, Integer>();
+    printedfieldstbl = new Hashtable<String, ClassDescriptor>();
   }
 
   /** 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<state.numClasses(); i++) {
+      ClassDescriptor cn=cdarray[i];
+      if(cn == null) {
+        continue;
+      }
+      output.print("int supertypes" + cn.getSafeSymbol() + "[] = {");
+      boolean ncomma = false;
+      int snum = 0;
+      if((cn != null) && (cn.getSuperDesc() != null)) {
+        snum++;
+      }
+      Iterator it_sifs = cn != null? cn.getSuperInterfaces() : null;
+      while(it_sifs != null && it_sifs.hasNext()) {
+        snum++;
+        it_sifs.next();
+      }
+      output.print(snum);
+      ncomma = true;
+      if ((cn != null) && (cn.getSuperDesc()!=null)) {
+        if(ncomma) {
+          output.print(",");
+        }
+    ClassDescriptor cdsuper=cn.getSuperDesc();
+    output.print(cdsuper.getId());
+      } 
+      it_sifs = cn != null? cn.getSuperInterfaces() : null;
+      while(it_sifs != null && it_sifs.hasNext()) {
+        if(ncomma) {
+          output.print(",");
+        }
+        output.print(((ClassDescriptor)it_sifs.next()).getId());
+      }
+      
+      output.println("};");
+    }
+    output.println("int* supertypes[]={");
     boolean needcomma=false;
     for(int i=0; i<state.numClasses(); i++) {
       ClassDescriptor cn=cdarray[i];
       if (needcomma)
        output.println(",");
       needcomma=true;
-      if ((cn != null) && (cn.getSuperDesc()!=null)) {
-       ClassDescriptor cdsuper=cn.getSuperDesc();
-       output.print(cdsuper.getId());
-      } else
-       output.print("-1");
+      if(cn != null) {
+        output.print("supertypes" + cn.getSafeSymbol());
+      } else {
+        output.print(0);
+      }
     }
     output.println("};");
   }
@@ -1244,18 +1277,12 @@ public class BuildCode {
 
     for(int i=0; i<fields.size(); i++) {
       FieldDescriptor fd=(FieldDescriptor)fields.get(i);
-      String fstring = fd.isStatic() ? fd.getSafeSymbol() : fd.getSymbol();
+      String fstring = fd.getSafeSymbol();
       if(printedfieldstbl.containsKey(fstring)) {
-       if(!fd.isStatic()) {
-         int index = printedfieldstbl.get(fstring).intValue();
-         index++;
-         fd.changeSafeSymbol(index);
-         printedfieldstbl.put(fstring, index);
-       } else {
-         continue;
-       }
+        printedfieldstbl.put(fstring, cn);
+        continue;
       } else {
-       printedfieldstbl.put(fstring, 0);
+        printedfieldstbl.put(fstring, cn);
       }
       if (state.MGC && fd.getType().isClass()
           && fd.getType().getClassDesc().isEnum()) {
@@ -1271,14 +1298,12 @@ public class BuildCode {
              globaldefout.println("  struct "+fd.getType().getSafeSymbol()+ " * "+fd.getSafeSymbol()+";");
            }
          }
-         classdefout.println("  struct "+fd.getType().getSafeSymbol()+" ** "+fd.getSafeSymbol()+";");
        } else if ((state.MGC) && (fd.isVolatile())) {
          // TODO add version for normal Java later
          // static field
          if(globaldefout != null) {
            globaldefout.println("  volatile struct "+fd.getType().getSafeSymbol()+ " * "+fd.getSafeSymbol()+";");
          }
-         classdefout.println("  struct"+fd.getType().getSafeSymbol()+" ** "+fd.getSafeSymbol()+";");
        } else {
          classdefout.println("  struct "+fd.getType().getSafeSymbol()+" * "+fd.getSafeSymbol()+";");
        }
@@ -1292,14 +1317,12 @@ public class BuildCode {
            globaldefout.println("  "+fd.getType().getSafeSymbol()+ " "+fd.getSafeSymbol()+";");
          }
        }
-       classdefout.println("  "+fd.getType().getSafeSymbol()+" * "+fd.getSafeSymbol()+";");
-      } else if ((state.MGC) && (fd.isVolatile())) {
+         } else if ((state.MGC) && (fd.isVolatile())) {
        // TODO add version for normal Java later
        // static field
        if(globaldefout != null) {
          globaldefout.println("  volatile "+fd.getType().getSafeSymbol()+ " "+fd.getSafeSymbol()+";");
        }
-       classdefout.println("  "+fd.getType().getSafeSymbol()+" * "+fd.getSafeSymbol()+";");
       } else
        classdefout.println("  "+fd.getType().getSafeSymbol()+" "+fd.getSafeSymbol()+";");
     }
@@ -1605,20 +1628,6 @@ public class BuildCode {
        output.println("  }");
        output.println("");
       }
-      if((!fm.getMethod().isStaticBlock()) && (fm.getMethod().getReturnType() == null) && (cn != null)) {
-       // is a constructor, check and output initialization of the static fields
-       // here does not initialize the static fields of the class, instead it
-       // redirect the corresponding fields in the object to the global_defs_p
-       Vector fields=cn.getFieldVec();
-
-       for(int i=0; i<fields.size(); i++) {
-         FieldDescriptor fd=(FieldDescriptor)fields.get(i);
-         if(fd.isStatic()) {
-           // static field
-           output.println(generateTemp(fm,fm.getParameter(0))+"->"+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())+";");
index e2d998eb126e360549ab6453d0a2422ea54805da..9d09dd1a63d1db493b0b499f799ae82c84193a25 100644 (file)
@@ -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(" }");
         
       }
index b9bbfafbf5a74a8c762728bda5841a8f626d8596..723fb62d26a9e4fe32464659782e4c612e3d48ba 100644 (file)
@@ -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);
     }
index 75928f58653fd922c307aacc576ff831a183e82c..cd7ec4d1a0cc92660447aa52f38f705a8306be47 100644 (file)
@@ -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;
 }