Add Class object so that we can implement getClass() and can have class lock for...
authorjzhou <jzhou>
Fri, 22 Oct 2010 00:59:35 +0000 (00:59 +0000)
committerjzhou <jzhou>
Fri, 22 Oct 2010 00:59:35 +0000 (00:59 +0000)
Robust/src/IR/Flat/BuildCode.java
Robust/src/IR/Flat/BuildCodeMGC.java
Robust/src/IR/Flat/BuildFlat.java
Robust/src/Main/Main.java

index 595fffe58cbbdd15307073240ddf1228b892320d..860eae843e20775221eecb6577adba6349917aa8 100644 (file)
@@ -410,6 +410,22 @@ public class BuildCode {
     //  execute all the static blocks and all the static field initializations
     // TODO
   }
+  
+  /* This code generates code to create a Class object for each class for 
+   * getClass() method.
+   * */
+  protected void outputClassObjects(PrintWriter outmethod) {
+    // for each class, initialize its Class object
+    SymbolTable ctbl = this.state.getClassSymbolTable();
+    Iterator it_classes = ctbl.getDescriptorsIterator();
+    while(it_classes.hasNext()) {
+      ClassDescriptor t_cd = (ClassDescriptor)it_classes.next();
+      outmethod.println(" {");
+      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(" }");
+    }
+  }
 
   /* This code just generates the main C method for java programs.
    * The main C method packs up the arguments into a string array
@@ -420,6 +436,7 @@ public class BuildCode {
     outmethod.println("  int i;");
     
     outputStaticBlocks(outmethod);
+    outputClassObjects(outmethod);
 
     if (state.MLP || state.OOOJAVA) {
 
@@ -637,12 +654,11 @@ public class BuildCode {
          outmethod.println("#include \"runtime_arch.h\"");
     }
     if (state.THREAD||state.DSM||state.SINGLETM) {
-      if(state.MGC) {
-        outmethod.println("#include \"thread.h\"");
-      } else {
-        outmethod.println("#include <thread.h>");
-      }
+      outmethod.println("#include <thread.h>");
     }
+    if(state.MGC) {
+      outmethod.println("#include \"thread.h\"");
+    } 
     if (state.main!=null) {
       outmethod.println("#include <string.h>");
     }
@@ -792,6 +808,16 @@ public class BuildCode {
     while(it.hasNext()) {
       ClassDescriptor cn=(ClassDescriptor)it.next();
       outclassdefs.println("struct "+cn.getSafeSymbol()+";");
+      
+      if((cn.getNumStaticFields() != 0) || (cn.getNumStaticBlocks() != 0)) {
+        // this class has static fields/blocks, need to add a global flag to 
+        // indicate if its static fields have been initialized and/or if its
+        // static blocks have been executed
+        outglobaldefs.println("  int "+cn.getSafeSymbol()+"static_block_exe_flag;");
+      }
+      
+      // for each class, create a global object
+      outglobaldefs.println("  struct Class "+cn.getSafeSymbol()+"classobj;");
     }
     outclassdefs.println("");
     //Print out definition for array type
@@ -848,6 +874,52 @@ public class BuildCode {
 
     outclassdefs.println("  int ___length___;");
     outclassdefs.println("};\n");
+    
+    outclassdefs.println("");
+    //Print out definition for Class type 
+    outclassdefs.println("struct Class {");
+    outclassdefs.println("  int type;");
+    if(state.MLP || state.OOOJAVA ){
+      outclassdefs.println("  int oid;");
+      outclassdefs.println("  int allocsite;");
+    }
+    if (state.EVENTMONITOR) {
+      outclassdefs.println("  int objuid;");
+    }
+    if (state.THREAD) {
+      outclassdefs.println("  pthread_t tid;");
+      outclassdefs.println("  void * lockentry;");
+      outclassdefs.println("  int lockcount;");
+    }
+    if(state.MGC) {
+      outclassdefs.println("  int mutex;");  
+      outclassdefs.println("  int objlock;");
+      if(state.MULTICOREGC) {
+        outclassdefs.println("  int marked;");
+      }
+    } 
+    if (state.TASK) {
+      outclassdefs.println("  int flag;");
+      if(!state.MULTICORE) {
+        outclassdefs.println("  void * flagptr;");
+      } else {
+        outclassdefs.println("  int version;");
+        outclassdefs.println("  int * lock;");  // lock entry for this obj
+        outclassdefs.println("  int mutex;");  
+        outclassdefs.println("  int lockcount;");
+        if(state.MULTICOREGC) {
+          outclassdefs.println("  int marked;");
+        }
+      }
+      if(state.OPTIONAL) {
+        outclassdefs.println("  int numfses;");
+        outclassdefs.println("  int * fses;");
+      }
+    }
+    printClassStruct(typeutil.getClass(TypeUtil.ObjectClass), outclassdefs, outglobaldefs);
+    outclassdefs.println("};\n");
+    
+    outclassdefs.println("");
     outclassdefs.println("extern int classsize[];");
     outclassdefs.println("extern int hasflags[];");
     outclassdefs.println("extern unsigned INTPTR * pointerarray[];");
@@ -1500,13 +1572,6 @@ public class BuildCode {
       }
     }
     Vector fields=(Vector)fieldorder.get(cn);
-    
-    if((cn.getNumStaticFields() != 0) || (cn.getNumStaticBlocks() != 0)) {
-      // this class has static fields/blocks, need to add a global flag to 
-      // indicate if its static fields have been initialized and/or if its
-      // static blocks have been executed
-      globaldefout.println("  int "+cn.getSafeSymbol()+"static_block_exe_flag;");
-    }
 
     for(int i=0; i<fields.size(); i++) {
       FieldDescriptor fd=(FieldDescriptor)fields.get(i);
index d376247844cfc04516ead126225db1319ada327c..52dc69c8aa149ea0fc851b1995af7314fe725553 100644 (file)
@@ -144,6 +144,7 @@ public class BuildCodeMGC extends BuildCode {
     outmethod.println("  int i;");
     
     outputStaticBlocks(outmethod);
+    super.outputClassObjects(outmethod);
     
     if ((GENERATEPRECISEGC) || (this.state.MULTICOREGC)) {
       outmethod.println("  struct ArrayObject * stringarray=allocate_newarray(NULL, STRINGARRAYTYPE, argc-1);");
@@ -177,26 +178,28 @@ public class BuildCodeMGC extends BuildCode {
   }
   
   protected void outputStaticBlocks(PrintWriter outmethod) {
-    outmethod.println("#define MGC_STATIC_INIT_CHECK");
     // execute all the static blocks and all the static field initializations
     SymbolTable sctbl = this.state.getSClassSymbolTable();
     Iterator it_sclasses = sctbl.getDescriptorsIterator();
-    while(it_sclasses.hasNext()) {
-      ClassDescriptor t_cd = (ClassDescriptor)it_sclasses.next();
-      if(t_cd.getNumStaticFields() != 0) {
-        // TODO may need to invoke static field initialization here
+    if(it_sclasses.hasNext()) {
+      outmethod.println("#define MGC_STATIC_INIT_CHECK");
+      while(it_sclasses.hasNext()) {
+        ClassDescriptor t_cd = (ClassDescriptor)it_sclasses.next();
+        if(t_cd.getNumStaticFields() != 0) {
+          // TODO may need to invoke static field initialization here
+        }
+        MethodDescriptor t_md = (MethodDescriptor)t_cd.getMethodTable().get("staticblocks");
+        outmethod.println("   {");
+        if ((GENERATEPRECISEGC) || (this.state.MULTICOREGC)) {
+          outmethod.print("       struct "+t_cd.getSafeSymbol()+t_md.getSafeSymbol()+"_"+t_md.getSafeMethodDescriptor()+"_params __parameterlist__={");
+          outmethod.println("1, 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("   }");
       }
-      MethodDescriptor t_md = (MethodDescriptor)t_cd.getMethodTable().get("staticblocks");
-      outmethod.println("   {");
-      if ((GENERATEPRECISEGC) || (this.state.MULTICOREGC)) {
-        outmethod.print("       struct "+t_cd.getSafeSymbol()+t_md.getSafeSymbol()+"_"+t_md.getSafeMethodDescriptor()+"_params __parameterlist__={");
-        outmethod.println("1, 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("   }");
+      outmethod.println("#undef MGC_STATIC_INIT_CHECK");
     }
-    outmethod.println("#undef MGC_STATIC_INIT_CHECK");
   }
 }
index fc42219f60e9c72efa2e1b819a27c971f33e0750..6a6219e427ab0cc94bb6e10b3323fa8ecae055d1 100644 (file)
@@ -190,7 +190,7 @@ public class BuildFlat {
        curran=null;
       NodePair np=flattenBlockNode(bn);
       FlatNode fn=np.getBegin();
-      if (state.THREAD&&currmd.getModifiers().isSynchronized()) {
+      if ((state.THREAD||state.MGC)&&currmd.getModifiers().isSynchronized()) {
        MethodDescriptor memd=(MethodDescriptor)typeutil.getClass("Object").getMethodTable().get("MonitorEnter");
        TempDescriptor thistd=getTempforVar(currmd.getThis());
        FlatCall fc=new FlatCall(memd, null, thistd, new TempDescriptor[0]);
@@ -1170,7 +1170,7 @@ public class BuildFlat {
     FlatReturnNode rnflat=new FlatReturnNode(retval);
     rnflat.addNext(fe);
     FlatNode ln=rnflat;
-    if (state.THREAD&&currmd.getModifiers().isSynchronized()) {
+    if ((state.THREAD||state.MGC)&&currmd.getModifiers().isSynchronized()) {
       MethodDescriptor memd=(MethodDescriptor)typeutil.getClass("Object").getMethodTable().get("MonitorExit");
       TempDescriptor thistd=getTempforVar(currmd.getThis());
       FlatCall fc=new FlatCall(memd, null, thistd, new TempDescriptor[0]);
index 9c7b393ce7f1761fa83d4f8f54288fea99b4d25f..d33533db08962315cba8604aeb807bbf5f1442da 100644 (file)
@@ -150,7 +150,6 @@ public class Main {
         state.MULTICOREGC=true;
       else if (option.equals("-mgc")) {
         state.MGC = true;
-        state.THREAD = true;
       } else if (option.equals("-ownership"))
        state.OWNERSHIP=true;
       else if (option.equals("-ownallocdepth")) {