From: jzhou <jzhou>
Date: Fri, 18 Feb 2011 01:45:00 +0000 (+0000)
Subject: Bug fixes for MGC
X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=b45849b72c165a7585cd46e12dfdf0da5511bfc9;p=IRC.git

Bug fixes for MGC
---

diff --git a/Robust/src/IR/Flat/BuildCode.java b/Robust/src/IR/Flat/BuildCode.java
index a85621ae..26290be7 100644
--- a/Robust/src/IR/Flat/BuildCode.java
+++ b/Robust/src/IR/Flat/BuildCode.java
@@ -66,6 +66,9 @@ public class BuildCode {
   DiscoverConflicts recorddc;
   DCWrapper delaycomp;
   CallGraph callgraph;
+  Hashtable<String, ClassDescriptor> printedfieldstbl;
+  Hashtable<ClassDescriptor, Hashtable<String, ClassDescriptor>> cd2fieldstbl;
+  Hashtable<ClassDescriptor, Vector<FieldDescriptor>> cd2shadowfields;
 
 
   public BuildCode(State st, Hashtable temptovar, TypeUtil typeutil, SafetyAnalysis sa, PrefetchAnalysis pa) {
@@ -111,6 +114,9 @@ public class BuildCode {
       recorddc=new DiscoverConflicts(locality, st, typeanalysis, delaycomp.getCannotDelayMap(), true, true, null);
       recorddc.doAnalysis();
     }
+    printedfieldstbl = new Hashtable<String, ClassDescriptor>();
+    cd2fieldstbl = new Hashtable<ClassDescriptor, Hashtable<String, ClassDescriptor>>();
+    cd2shadowfields = new Hashtable<ClassDescriptor, Vector<FieldDescriptor>>();
   }
 
   /** The buildCode method outputs C code for all the methods.  The Flat
@@ -658,22 +664,22 @@ public class BuildCode {
 
     outstructs.println("#define STRINGARRAYTYPE "+
                        (state.getArrayNumber(
-                          (new TypeDescriptor(typeutil.getClass(TypeUtil.StringClass))).makeArray(state))+state.numClasses()));
+                          (new TypeDescriptor(typeutil.getClass(TypeUtil.StringClass))).makeArray(state, true))+state.numClasses()));
 
     outstructs.println("#define OBJECTARRAYTYPE "+
                        (state.getArrayNumber(
-                          (new TypeDescriptor(typeutil.getClass(TypeUtil.ObjectClass))).makeArray(state))+state.numClasses()));
+                          (new TypeDescriptor(typeutil.getClass(TypeUtil.ObjectClass))).makeArray(state, true))+state.numClasses()));
 
 
     outstructs.println("#define STRINGTYPE "+typeutil.getClass(TypeUtil.StringClass).getId());
     outstructs.println("#define CHARARRAYTYPE "+
-                       (state.getArrayNumber((new TypeDescriptor(TypeDescriptor.CHAR)).makeArray(state))+state.numClasses()));
+                       (state.getArrayNumber((new TypeDescriptor(TypeDescriptor.CHAR)).makeArray(state, true))+state.numClasses()));
 
     outstructs.println("#define BYTEARRAYTYPE "+
-                       (state.getArrayNumber((new TypeDescriptor(TypeDescriptor.BYTE)).makeArray(state))+state.numClasses()));
+                       (state.getArrayNumber((new TypeDescriptor(TypeDescriptor.BYTE)).makeArray(state, true))+state.numClasses()));
 
     outstructs.println("#define BYTEARRAYARRAYTYPE "+
-                       (state.getArrayNumber((new TypeDescriptor(TypeDescriptor.BYTE)).makeArray(state).makeArray(state))+state.numClasses()));
+                       (state.getArrayNumber((new TypeDescriptor(TypeDescriptor.BYTE)).makeArray(state, true).makeArray(state, true))+state.numClasses()));
 
     outstructs.println("#define NUMCLASSES "+state.numClasses());
     int totalClassSize = state.numClasses() + state.numArrays();
@@ -682,7 +688,7 @@ public class BuildCode {
       outstructs.println("#define STARTUPTYPE "+typeutil.getClass(TypeUtil.StartupClass).getId());
       outstructs.println("#define TAGTYPE "+typeutil.getClass(TypeUtil.TagClass).getId());
       outstructs.println("#define TAGARRAYTYPE "+
-                         (state.getArrayNumber(new TypeDescriptor(typeutil.getClass(TypeUtil.TagClass)).makeArray(state))+state.numClasses()));
+                         (state.getArrayNumber(new TypeDescriptor(typeutil.getClass(TypeUtil.TagClass)).makeArray(state, true))+state.numClasses()));
     }
   }
 
@@ -762,6 +768,7 @@ public class BuildCode {
     }
 
     printClassStruct(typeutil.getClass(TypeUtil.ObjectClass), outclassdefs, outglobaldefs);
+    printedfieldstbl.clear();
 
     if (state.STMARRAY) {
       outclassdefs.println("  int lowindex;");
@@ -821,6 +828,7 @@ public class BuildCode {
       }
     }
     printClassStruct(typeutil.getClass(TypeUtil.ObjectClass), outclassdefs, outglobaldefs);
+    printedfieldstbl.clear();
     outclassdefs.println("};\n");
     }
     
@@ -1491,25 +1499,69 @@ public class BuildCode {
   /** Force consistent field ordering between inherited classes. */
 
   private void printClassStruct(ClassDescriptor cn, PrintWriter classdefout, PrintWriter globaldefout) {
-
+    
     ClassDescriptor sp=cn.getSuperDesc();
     if (sp!=null)
-      printClassStruct(sp, classdefout, globaldefout);
+      printClassStruct(sp, classdefout, /*globaldefout*/null);
+    
+    // TODO: what about here are multiple inherited fields with the same name?
+    SymbolTable sitbl = cn.getSuperInterfaceTable();
+    Iterator it_sifs = sitbl.getDescriptorsIterator();
+    if(state.MGC) {
+      while(it_sifs.hasNext()) {
+        ClassDescriptor si = (ClassDescriptor)it_sifs.next();
+        printClassStruct(si, classdefout, /*globaldefout*/null);
+      }
+    }
+    
+    Vector shadow_fields = null;
 
     if (!fieldorder.containsKey(cn)) {
       Vector fields=new Vector();
       fieldorder.put(cn,fields);
+      shadow_fields = new Vector();
+      cd2shadowfields.put(cn, shadow_fields);
+      
       Vector fieldvec=cn.getFieldVec();
       for(int i=0;i<fieldvec.size();i++) {
 	FieldDescriptor fd=(FieldDescriptor)fieldvec.get(i);
-	if ((sp==null||!sp.getFieldTable().contains(fd.getSymbol())))
-	  fields.add(fd);
+    if(state.MGC) {
+      if((sp != null) && sp.getFieldTable().contains(fd.getSymbol())) {
+        shadow_fields.add(fd);
+      } else {
+        it_sifs = sitbl.getDescriptorsIterator();
+        boolean hasprinted = false;
+        while(it_sifs.hasNext()) {
+          ClassDescriptor si = (ClassDescriptor)it_sifs.next();
+          if(si.getFieldTable().contains(fd.getSymbol())) {
+            hasprinted = true;
+            break;
+          }
+        }
+        if(hasprinted) {
+          // this field has been defined in the super class
+          shadow_fields.add(fd);
+        } else {
+          fields.add(fd);
+        }
+      }
+    } else {
+      if ((sp==null) || (!sp.getFieldTable().contains(fd.getSymbol())))
+        fields.add(fd);
+    }
       }
     }
     Vector fields=(Vector)fieldorder.get(cn);
+    shadow_fields=cd2shadowfields.get(cn);
 
     for(int i=0; i<fields.size(); i++) {
       FieldDescriptor fd=(FieldDescriptor)fields.get(i);
+      if(printedfieldstbl.containsKey(fd.getSymbol())) {
+        printedfieldstbl.put(fd.getSymbol(), cn);
+        continue;
+      } else {
+        printedfieldstbl.put(fd.getSymbol(), cn);
+      }
       if (state.MGC && fd.getType().isClass()
           && fd.getType().getClassDesc().isEnum()) {
         classdefout.println("  int " + fd.getSafeSymbol() + ";");
@@ -1517,16 +1569,20 @@ public class BuildCode {
         if ((state.MGC) && (fd.isStatic())) {
           // TODO add version for normal Java later
           // static field
-          if(fd.isVolatile()) {
-            globaldefout.println("  volatile struct "+fd.getType().getSafeSymbol()+ " * "+cn.getSafeSymbol()+fd.getSafeSymbol()+";");
-          } else {
-            globaldefout.println("  struct "+fd.getType().getSafeSymbol()+ " * "+cn.getSafeSymbol()+fd.getSafeSymbol()+";");
+          if(globaldefout != null) {
+            if(fd.isVolatile()) {
+              globaldefout.println("  volatile struct "+fd.getType().getSafeSymbol()+ " * "+cn.getSafeSymbol()+fd.getSafeSymbol()+";");
+            } else {
+              globaldefout.println("  struct "+fd.getType().getSafeSymbol()+ " * "+cn.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
-          globaldefout.println("  volatile struct "+fd.getType().getSafeSymbol()+ " * "+cn.getSafeSymbol()+fd.getSafeSymbol()+";");
+          if(globaldefout != null) {
+            globaldefout.println("  volatile struct "+fd.getType().getSafeSymbol()+ " * "+cn.getSafeSymbol()+fd.getSafeSymbol()+";");
+          }
           classdefout.println("  struct"+fd.getType().getSafeSymbol()+" ** "+fd.getSafeSymbol()+";");
         } else {
 	classdefout.println("  struct "+fd.getType().getSafeSymbol()+" * "+fd.getSafeSymbol()+";");
@@ -1534,20 +1590,61 @@ public class BuildCode {
       } else if ((state.MGC) && (fd.isStatic())) {
         // TODO add version for normal Java later
         // static field
-        if(fd.isVolatile()) {
-          globaldefout.println("  volatile "+fd.getType().getSafeSymbol()+ " "+cn.getSafeSymbol()+fd.getSafeSymbol()+";");
-        } else {
-          globaldefout.println("  "+fd.getType().getSafeSymbol()+ " "+cn.getSafeSymbol()+fd.getSafeSymbol()+";");
+        if(globaldefout != null) {
+          if(fd.isVolatile()) {
+            globaldefout.println("  volatile "+fd.getType().getSafeSymbol()+ " "+cn.getSafeSymbol()+fd.getSafeSymbol()+";");
+          } else {
+            globaldefout.println("  "+fd.getType().getSafeSymbol()+ " "+cn.getSafeSymbol()+fd.getSafeSymbol()+";");
+          }
         }
         classdefout.println("  "+fd.getType().getSafeSymbol()+" * "+fd.getSafeSymbol()+";");
       } else if ((state.MGC) && (fd.isVolatile())) {
         // TODO add version for normal Java later
         // static field
-        globaldefout.println("  volatile "+fd.getType().getSafeSymbol()+ " "+cn.getSafeSymbol()+fd.getSafeSymbol()+";");
+        if(globaldefout != null) {
+          globaldefout.println("  volatile "+fd.getType().getSafeSymbol()+ " "+cn.getSafeSymbol()+fd.getSafeSymbol()+";");
+        }
         classdefout.println("  "+fd.getType().getSafeSymbol()+" * "+fd.getSafeSymbol()+";");
       } else
 	classdefout.println("  "+fd.getType().getSafeSymbol()+" "+fd.getSafeSymbol()+";");
     }
+    
+    // check the shadow fields, for those static shadow fields, need to add a 
+    // corresponding field in the global_defs_p structure
+    for(int i=0; i<shadow_fields.size(); i++) {
+      FieldDescriptor fd=(FieldDescriptor)shadow_fields.get(i);
+      if ((state.MGC) && (fd.isStatic()) && (globaldefout != null)) {
+        if (fd.getType().isClass()||fd.getType().isArray()) { 
+          // TODO add version for normal Java later
+          // static field
+          if(fd.isVolatile()) {
+            globaldefout.println("  volatile struct "+fd.getType().getSafeSymbol()+ " * "+cn.getSafeSymbol()+fd.getSafeSymbol()+";");
+          } else {
+            globaldefout.println("  struct "+fd.getType().getSafeSymbol()+ " * "+cn.getSafeSymbol()+fd.getSafeSymbol()+";");
+          }
+        } else {
+          // TODO add version for normal Java later
+          // static field
+          if(fd.isVolatile()) {
+            globaldefout.println("  volatile "+fd.getType().getSafeSymbol()+ " "+cn.getSafeSymbol()+fd.getSafeSymbol()+";");
+          } else {
+            globaldefout.println("  "+fd.getType().getSafeSymbol()+ " "+cn.getSafeSymbol()+fd.getSafeSymbol()+";");
+          }
+        } 
+      } else if ((state.MGC) && (fd.isVolatile()) && (globaldefout != null)) {
+        // TODO add version for normal Java later
+        // static field
+        if (fd.getType().isClass()||fd.getType().isArray()) { 
+          // TODO add version for normal Java later
+          // static field
+          globaldefout.println("  volatile struct "+fd.getType().getSafeSymbol()+ " * "+cn.getSafeSymbol()+fd.getSafeSymbol()+";");
+        } else {
+          // TODO add version for normal Java later
+          // static field
+          globaldefout.println("  volatile "+fd.getType().getSafeSymbol()+ " "+cn.getSafeSymbol()+fd.getSafeSymbol()+";");
+        } 
+      }
+    }
   }
 
 
@@ -1631,6 +1728,8 @@ public class BuildCode {
       }
     }
     printClassStruct(cn, classdefout, globaldefout);
+    cd2fieldstbl.put(cn, printedfieldstbl);
+    printedfieldstbl = new Hashtable<String, ClassDescriptor>();
     classdefout.println("};\n");
 
     if (state.DSM||state.SINGLETM) {
@@ -1682,7 +1781,11 @@ public class BuildCode {
       output.println("  void * next;");      
       for(int i=0; i<objectparams.numPointers(); i++) {
 	TempDescriptor temp=objectparams.getPointer(i);
-	output.println("  struct "+temp.getType().getSafeSymbol()+" * "+temp.getSafeSymbol()+";");
+    if(state.MGC && temp.getType().isClass() && temp.getType().getClassDesc().isEnum()) {
+      output.println("  int " + temp.getSafeSymbol() + ";");
+    } else {
+      output.println("  struct "+temp.getType().getSafeSymbol()+" * "+temp.getSafeSymbol()+";");
+    }
       }
       output.println("};\n");
     }
@@ -1723,7 +1826,9 @@ public class BuildCode {
     }
     /* First the return type */
     if (md.getReturnType()!=null) {
-      if (md.getReturnType().isClass()||md.getReturnType().isArray())
+      if(state.MGC && md.getReturnType().isClass() && md.getReturnType().getClassDesc().isEnum()) {
+        headersout.println("  int ");
+      } else if (md.getReturnType().isClass()||md.getReturnType().isArray())
 	headersout.print("struct " + md.getReturnType().getSafeSymbol()+" * ");
       else
 	headersout.print(md.getReturnType().getSafeSymbol()+" ");
@@ -1752,7 +1857,9 @@ public class BuildCode {
       if (printcomma)
 	headersout.print(", ");
       printcomma=true;
-      if (temp.getType().isClass()||temp.getType().isArray())
+      if(state.MGC && temp.getType().isClass() && temp.getType().getClassDesc().isEnum()) {
+        headersout.print("int " + temp.getSafeSymbol());
+      } else if (temp.getType().isClass()||temp.getType().isArray())
 	headersout.print("struct " + temp.getType().getSafeSymbol()+" * "+temp.getSafeSymbol());
       else
 	headersout.print(temp.getType().getSafeSymbol()+" "+temp.getSafeSymbol());
@@ -2014,13 +2121,18 @@ public class BuildCode {
       // 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=(Vector)fieldorder.get(cn);
+      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),lb)+"->"+fd.getSafeSymbol()+"=&(global_defs_p->"+cn.getSafeSymbol()+fd.getSafeSymbol()+");");
+          // decide the exact class/interface that defines the field
+          ClassDescriptor fdcn = 
+            cd2fieldstbl.get(cn).get(fd.getSymbol());
+
+          // static field
+          output.println(generateTemp(fm,fm.getParameter(0),lb)+"->"+fd.getSafeSymbol()+"=&(global_defs_p->"+fdcn.getSafeSymbol()+fd.getSafeSymbol()+");");
         }
       }
     }
@@ -3009,9 +3121,6 @@ public class BuildCode {
           // its static blocks have been executed
           output.println("#ifdef MGC_STATIC_INIT_CHECK");
           output.println("if(global_defs_p->" + cn.getSafeSymbol()+"static_block_exe_flag == 0) {");
-          if(cn.getNumStaticFields() != 0) {
-            // TODO add static field initialization here
-          }
           if(cn.getNumStaticBlocks() != 0) {
             MethodDescriptor t_md = (MethodDescriptor)cn.getMethodTable().get("staticblocks");
             output.println("  "+cn.getSafeSymbol()+t_md.getSafeSymbol()+"_"+t_md.getSafeMethodDescriptor()+"();");
@@ -3084,7 +3193,9 @@ public class BuildCode {
     } else {
       //yes
       output.print("((");
-      if (md.getReturnType().isClass()||md.getReturnType().isArray())
+      if (state.MGC && md.getReturnType().isClass() && md.getReturnType().getClassDesc().isEnum()) {
+        output.print("int ");
+      } else if (md.getReturnType().isClass()||md.getReturnType().isArray())
 	output.print("struct " + md.getReturnType().getSafeSymbol()+" * ");
       else
 	output.print(md.getReturnType().getSafeSymbol()+" ");
@@ -3105,7 +3216,9 @@ public class BuildCode {
 	if (printcomma)
 	  output.print(", ");
 	printcomma=true;
-	if (temp.getType().isClass()||temp.getType().isArray())
+    if (state.MGC && temp.getType().isClass() && temp.getType().getClassDesc().isEnum()) {
+      output.print("int ");
+    } else if (temp.getType().isClass()||temp.getType().isArray())
 	  output.print("struct " + temp.getType().getSafeSymbol()+" * ");
 	else
 	  output.print(temp.getType().getSafeSymbol());
@@ -3136,7 +3249,9 @@ public class BuildCode {
     }
 	if (needcomma)
 	  output.print(",");
-	if (ptd.isClass()&&!ptd.isArray())
+    if(state.MGC && ptd.isClass() && ptd.getClassDesc().isEnum()) {
+      // do nothing 
+    } else if (ptd.isClass()&&!ptd.isArray())
 	  output.print("(struct "+ptd.getSafeSymbol()+" *) ");
 	output.print(generateTemp(fm,fc.getThis(),lb));
 	needcomma=true;
@@ -3152,7 +3267,9 @@ public class BuildCode {
 	  output.print(", ");
 
 	TypeDescriptor ptd=md.getParamType(i);
-	if (ptd.isClass()&&!ptd.isArray())
+    if (state.MGC && ptd.isClass() && ptd.getClassDesc().isEnum()) {
+      // do nothing
+    } else if (ptd.isClass()&&!ptd.isArray())
 	  output.print("(struct "+ptd.getSafeSymbol()+" *) ");
 	output.print(generateTemp(fm, targ,lb));
 	needcomma=true;
@@ -3283,13 +3400,16 @@ public class BuildCode {
           }
         }
         // redirect to the global_defs_p structure
-        if((ffn.getField().isStatic()) || (ffn.getSrc().getType().isStatic())) {
+        if((ffn.getField().isStatic()) || (ffn.getSrc().getType().isClassNameRef())) {
+          // decide the exact class/interface that defines the field
+          ClassDescriptor fdcn = 
+            cd2fieldstbl.get(ffn.getSrc().getType().getClassDesc()).get(ffn.getField().getSymbol());
+
           // reference to the static field with Class name
-          output.println(generateTemp(fm, ffn.getDst(),lb)+"=global_defs_p->"+ ffn.getSrc().getType().getClassDesc().getSafeSymbol()+ffn.getField().getSafeSymbol()+";");
+          output.println(generateTemp(fm, ffn.getDst(),lb)+"=global_defs_p->"+ fdcn.getSafeSymbol()+ffn.getField().getSafeSymbol()+";");
         } else {
           output.println(generateTemp(fm, ffn.getDst(),lb)+"=*"+ generateTemp(fm,ffn.getSrc(),lb)+"->"+ ffn.getField().getSafeSymbol()+";");
         }
-        //output.println(generateTemp(fm, ffn.getDst(),lb)+"=global_defs_p->"+ffn.getSrc().getType().getClassDesc().getSafeSymbol()+"->"+ ffn.getField().getSafeSymbol()+";");
       } else if (ffn.getField().isEnum()) {
           // an Enum value, directly replace the field access as int
           output.println(generateTemp(fm, ffn.getDst(), lb) + "=" + ffn.getField().enumValue() + ";");
@@ -3432,9 +3552,13 @@ public class BuildCode {
           }
         }
         // redirect to the global_defs_p structure
-        if(fsfn.getDst().getType().isStatic()) {
+        if(fsfn.getDst().getType().isClassNameRef()) {
           // reference to the static field with Class name
-          output.println("global_defs_p->" + fsfn.getDst().getType().getClassDesc().getSafeSymbol() + fsfn.getField().getSafeSymbol()+"="+ generateTemp(fm,fsfn.getSrc(),lb)+";");
+          // decide the exact class/interface that defines the field
+          ClassDescriptor fdcn = 
+            cd2fieldstbl.get(fsfn.getDst().getType().getClassDesc()).get(fsfn.getField().getSymbol());
+          
+          output.println("global_defs_p->" + fdcn.getSafeSymbol() + fsfn.getField().getSafeSymbol()+"="+ generateTemp(fm,fsfn.getSrc(),lb)+";");
         } else {
           output.println("*"+generateTemp(fm, fsfn.getDst(),lb)+"->"+ fsfn.getField().getSafeSymbol()+"="+ generateTemp(fm,fsfn.getSrc(),lb)+";");
         }
@@ -3451,7 +3575,9 @@ public class BuildCode {
     TypeDescriptor elementtype=fen.getSrc().getType().dereference();
     String type="";
 
-    if (elementtype.isArray()||elementtype.isClass())
+    if (state.MGC && elementtype.isClass() && elementtype.getClassDesc().isEnum()) {
+      type="int ";
+    } else if (elementtype.isArray()||elementtype.isClass())
       type="void *";
     else
       type=elementtype.getSafeSymbol()+" ";
@@ -3516,7 +3642,9 @@ public class BuildCode {
     TypeDescriptor elementtype=fsen.getDst().getType().dereference();
     String type="";
 
-    if (elementtype.isArray()||elementtype.isClass())
+    if (state.MGC && elementtype.isClass() && elementtype.getClassDesc().isEnum()) {
+      type="int ";
+    } else if (elementtype.isArray()||elementtype.isClass() || (state.MGC && elementtype.isNull()))
       type="void *";
     else
       type=elementtype.getSafeSymbol()+" ";
@@ -3724,6 +3852,8 @@ public class BuildCode {
     /* TODO: Do type check here */
     if (fcn.getType().isArray()) {
       output.println(generateTemp(fm,fcn.getDst(),lb)+"=(struct ArrayObject *)"+generateTemp(fm,fcn.getSrc(),lb)+";");
+    } else if (state.MGC && fcn.getType().isClass() && fcn.getType().getClassDesc().isEnum()) {
+      output.println(generateTemp(fm,fcn.getDst(),lb)+"=(int)"+generateTemp(fm,fcn.getSrc(),lb)+";");
     } else if (fcn.getType().isClass())
       output.println(generateTemp(fm,fcn.getDst(),lb)+"=(struct "+fcn.getType().getSafeSymbol()+" *)"+generateTemp(fm,fcn.getSrc(),lb)+";");
     else
@@ -3822,7 +3952,9 @@ public class BuildCode {
     ClassDescriptor cn=md!=null ? md.getClassDesc() : null;
 
     if (md!=null&&md.getReturnType()!=null) {
-      if (md.getReturnType().isClass()||md.getReturnType().isArray())
+      if (state.MGC && md.getReturnType().isClass() && md.getReturnType().getClassDesc().isEnum()) {
+        output.print("int ");
+      } else if (md.getReturnType().isClass()||md.getReturnType().isArray())
 	output.print("struct " + md.getReturnType().getSafeSymbol()+" * ");
       else
 	output.print(md.getReturnType().getSafeSymbol()+" ");
@@ -3856,7 +3988,9 @@ public class BuildCode {
 	if (printcomma)
 	  output.print(", ");
 	printcomma=true;
-	if (temp.getType().isClass()||temp.getType().isArray())
+    if(state.MGC && temp.getType().isClass() && temp.getType().getClassDesc().isEnum()) {
+      output.print("int " + temp.getSafeSymbol());
+    } else if (temp.getType().isClass()||temp.getType().isArray())
 	  output.print("struct "+temp.getType().getSafeSymbol()+" * "+temp.getSafeSymbol());
 	else
 	  output.print(temp.getType().getSafeSymbol()+" "+temp.getSafeSymbol());
@@ -3868,7 +4002,11 @@ public class BuildCode {
       /* Unpack variables */
       for(int i=0; i<objectparams.numPrimitives(); i++) {
 	TempDescriptor temp=objectparams.getPrimitive(i);
-	output.println("struct "+temp.getType().getSafeSymbol()+" * "+temp.getSafeSymbol()+"=parameterarray["+i+"];");
+    if(state.MGC && temp.getType().isClass() && temp.getType().getClassDesc().isEnum()) {
+      output.print("int " + temp.getSafeSymbol() + "=parameterarray["+i+"];");
+    } else {
+      output.println("struct "+temp.getType().getSafeSymbol()+" * "+temp.getSafeSymbol()+"=parameterarray["+i+"];");
+    }
       }
       for(int i=0; i<fm.numTags(); i++) {
 	TempDescriptor temp=fm.getTag(i);
diff --git a/Robust/src/IR/Flat/BuildCodeMGC.java b/Robust/src/IR/Flat/BuildCodeMGC.java
index 0784bece..77ca64e0 100644
--- a/Robust/src/IR/Flat/BuildCodeMGC.java
+++ b/Robust/src/IR/Flat/BuildCodeMGC.java
@@ -177,9 +177,6 @@ public class BuildCodeMGC extends BuildCode {
       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");
         if(t_md != null) {
           outmethod.println("   {");
diff --git a/Robust/src/IR/Flat/BuildCodeMultiCore.java b/Robust/src/IR/Flat/BuildCodeMultiCore.java
index d2d59b45..6ca8e8b8 100644
--- a/Robust/src/IR/Flat/BuildCodeMultiCore.java
+++ b/Robust/src/IR/Flat/BuildCodeMultiCore.java
@@ -624,7 +624,9 @@ public class BuildCodeMultiCore extends BuildCode {
       TypeDescriptor type=td.getType();
       if (type.isNull())
 	output.println("   void * "+td.getSafeSymbol()+";");
-      else if (type.isClass()||type.isArray())
+      else if (state.MGC && type.isClass() && type.getClassDesc().isEnum()) {
+        output.println("   int " + td.getSafeSymbol()+";");
+      } else if (type.isClass()||type.isArray())
 	output.println("   struct "+type.getSafeSymbol()+" * "+td.getSafeSymbol()+";");
       else
 	output.println("   "+type.getSafeSymbol()+" "+td.getSafeSymbol()+";");
diff --git a/Robust/src/IR/Flat/BuildFlat.java b/Robust/src/IR/Flat/BuildFlat.java
index 7cbb6100..e466fec3 100644
--- a/Robust/src/IR/Flat/BuildFlat.java
+++ b/Robust/src/IR/Flat/BuildFlat.java
@@ -450,7 +450,11 @@ public class BuildFlat {
     TempDescriptor thisarg=null;
 
     if (min.getExpression()!=null) {
-      thisarg=TempDescriptor.tempFactory("thisarg",min.getExpression().getType());
+      TypeDescriptor mtd = min.getExpression().getType();
+      if(state.MGC && mtd.isClass() && mtd.getClassDesc().isEnum()) {
+        mtd = new TypeDescriptor(TypeDescriptor.INT);
+      }
+      thisarg=TempDescriptor.tempFactory("thisarg", mtd);
       NodePair np=flattenExpressionNode(min.getExpression(),thisarg);
       first=np.getBegin();
       last=np.getEnd();
@@ -459,7 +463,11 @@ public class BuildFlat {
     //Build arguments
     for(int i=0; i<min.numArgs(); i++) {
       ExpressionNode en=min.getArg(i);
-      TempDescriptor td=TempDescriptor.tempFactory("arg",en.getType());
+      TypeDescriptor etd = en.getType();
+      if(state.MGC && etd.isClass() && etd.getClassDesc().isEnum()) {
+        etd = new TypeDescriptor(TypeDescriptor.INT);
+      }
+      TempDescriptor td=TempDescriptor.tempFactory("arg", etd);
       temps[i]=td;
       NodePair np=flattenExpressionNode(en, td);
       if (first==null)
@@ -487,7 +495,7 @@ public class BuildFlat {
 
   private NodePair flattenFieldAccessNode(FieldAccessNode fan,TempDescriptor out_temp) {
     TempDescriptor tmp=null;
-    if(fan.getExpression().getType().isStatic()) {
+    if(fan.getExpression().getType().isClassNameRef()) {
       // static field dereference with class name
       tmp = new TempDescriptor(fan.getExpression().getType().getClassDesc().getSymbol(), fan.getExpression().getType());
       FlatFieldNode fn=new FlatFieldNode(fan.getField(),tmp,out_temp);
@@ -561,7 +569,7 @@ public class BuildFlat {
       ExpressionNode en=fan.getExpression();
       TempDescriptor dst_tmp=null;
       NodePair np_baseexp=null;
-      if(en.getType().isStatic()) {
+      if(en.getType().isClassNameRef()) {
         // static field dereference with class name
         dst_tmp = new TempDescriptor(en.getType().getClassDesc().getSymbol(), en.getType());
         FlatNop nop=new FlatNop();
@@ -690,7 +698,7 @@ public class BuildFlat {
 	ExpressionNode en=fan.getExpression();
     TempDescriptor dst_tmp=null;
     NodePair np_baseexp=null;
-    if(en.getType().isStatic()) {
+    if(en.getType().isClassNameRef()) {
       // static field dereference with class name
       dst_tmp = new TempDescriptor(en.getType().getClassDesc().getSymbol(), en.getType());
       FlatNop nop=new FlatNop();
@@ -751,8 +759,17 @@ public class BuildFlat {
 	    //If it is a preinc we need to store the initial value
 	    TempDescriptor src_tmp2=pre ? TempDescriptor.tempFactory("src",an.getDest().getType()) : out_temp;
 	    TempDescriptor tmp=TempDescriptor.tempFactory("srctmp3_",an.getDest().getType());
+        
+        TempDescriptor ftmp= null;
+        if(state.MGC && (nn.getClassDesc() != null)) {
+          // this is a static field
+          ftmp = new TempDescriptor(nn.getClassDesc().getSymbol(), nn.getClassType());
+
+        } else {
+          ftmp=getTempforVar(nn.getVar());
+        }
+        FlatFieldNode ffn=new FlatFieldNode(nn.getField(), ftmp, src_tmp2);
 
-	    FlatFieldNode ffn=new FlatFieldNode(nn.getField(), getTempforVar(nn.getVar()), src_tmp2);
 	    if (first==null)
 	      first=ffn;
 	    else {
@@ -1371,7 +1388,9 @@ public class BuildFlat {
       first = fcen;
     }
     fcen.addNext(npblock.getBegin());
-    npblock.getEnd().addNext(fcex);
+    if(npblock.getEnd() != null) {
+      npblock.getEnd().addNext(fcex);
+    }
     return new NodePair(first, fcex);
   }
 
diff --git a/Robust/src/IR/Tree/BuildIR.java b/Robust/src/IR/Tree/BuildIR.java
index 7d7121e5..a22eaaa9 100644
--- a/Robust/src/IR/Tree/BuildIR.java
+++ b/Robust/src/IR/Tree/BuildIR.java
@@ -583,7 +583,7 @@ public class BuildIR {
       TypeDescriptor td=parseTypeDescriptor(nn.getChild("basetype"));
       Integer numdims=(Integer)nn.getChild("dims").getLiteral();
       for(int i=0; i<numdims.intValue(); i++)
-	td=td.makeArray(state);
+	td=td.makeArray(state, true);
       return td;
     } else {
       System.out.println(pn.PPrint(2, true));
@@ -634,7 +634,7 @@ public class BuildIR {
       ParseNode tmp=vardecl;
       TypeDescriptor arrayt=t;
       while (tmp.getChild("single")==null) {
-	arrayt=arrayt.makeArray(state);
+	arrayt=arrayt.makeArray(state, true);
 	tmp=tmp.getChild("array");
       }
       String identifier=tmp.getChild("single").getTerminal();
@@ -765,7 +765,7 @@ public class BuildIR {
       if (pn.getChild("dims_opt").getLiteral()!=null)
 	num=((Integer)pn.getChild("dims_opt").getLiteral()).intValue();
       for(int i=0; i<(args.size()+num); i++)
-	td=td.makeArray(state);
+	td=td.makeArray(state, true);
       CreateObjectNode con=new CreateObjectNode(td, isglobal, disjointId);
       for(int i=0; i<args.size(); i++) {
 	con.addArgument((ExpressionNode)args.get(i));
@@ -777,7 +777,7 @@ public class BuildIR {
       if (pn.getChild("dims_opt").getLiteral()!=null)
     num=((Integer)pn.getChild("dims_opt").getLiteral()).intValue();
       for(int i=0; i<num; i++)
-    td=td.makeArray(state);
+    td=td.makeArray(state, true);
       CreateObjectNode con=new CreateObjectNode(td, false, null);
       // TODO array initializers
       ParseNode ipn = pn.getChild("initializer");     
@@ -1084,7 +1084,7 @@ public class BuildIR {
 	ParseNode tmp=vardecl;
 	TypeDescriptor arrayt=t;
 	while (tmp.getChild("single")==null) {
-	  arrayt=arrayt.makeArray(state);
+	  arrayt=arrayt.makeArray(state, true);
 	  tmp=tmp.getChild("array");
 	}
 	String identifier=tmp.getChild("single").getTerminal();
@@ -1278,7 +1278,7 @@ public class BuildIR {
 
 	ParseNode tmp=paramn;
 	while (tmp.getChild("single")==null) {
-	  type=type.makeArray(state);
+	  type=type.makeArray(state, true);
 	  tmp=tmp.getChild("array");
 	}
 	String paramname=tmp.getChild("single").getTerminal();
diff --git a/Robust/src/IR/Tree/MethodInvokeNode.java b/Robust/src/IR/Tree/MethodInvokeNode.java
index 0ace6405..8c9bcd79 100644
--- a/Robust/src/IR/Tree/MethodInvokeNode.java
+++ b/Robust/src/IR/Tree/MethodInvokeNode.java
@@ -60,6 +60,10 @@ public class MethodInvokeNode extends ExpressionNode {
   public void addArgument(ExpressionNode en) {
     argumentlist.add(en);
   }
+  
+  public void setArgument(ExpressionNode en, int index) {
+    argumentlist.setElementAt(en, index);
+  }
 
   public int numArgs() {
     return argumentlist.size();
diff --git a/Robust/src/IR/Tree/NameNode.java b/Robust/src/IR/Tree/NameNode.java
index 1785b23a..40487d0c 100644
--- a/Robust/src/IR/Tree/NameNode.java
+++ b/Robust/src/IR/Tree/NameNode.java
@@ -69,18 +69,22 @@ public class NameNode extends ExpressionNode {
       return fd.getType();
     } else if (isTag())
       return new TypeDescriptor(TypeDescriptor.TAG);
-    else if(cd != null) {
+    else if(vd != null) {
+      return ((VarDescriptor)vd).getType();
+    } if(cd != null) {
       TypeDescriptor tp = new TypeDescriptor(cd);
-      tp.setStatic();
+      tp.setClassNameRef();
       return tp;
-    } else
-      return ((VarDescriptor)vd).getType();
+    } else {
+      return null;
+    }
+      
   }
   
   public TypeDescriptor getClassType() {
     if(cd != null) {
       TypeDescriptor tp = new TypeDescriptor(cd);
-      tp.setStatic();
+      tp.setClassNameRef();
       return tp;
     } else
       return null;
diff --git a/Robust/src/IR/Tree/SemanticCheck.java b/Robust/src/IR/Tree/SemanticCheck.java
index 8c1b5cb0..0607af89 100644
--- a/Robust/src/IR/Tree/SemanticCheck.java
+++ b/Robust/src/IR/Tree/SemanticCheck.java
@@ -33,6 +33,9 @@ public class SemanticCheck {
       //Set superclass link up
       if (cd.getSuper()!=null) {
 	cd.setSuper(getClass(cd.getSuper()));
+    if(cd.getSuperDesc().isInterface()) {
+      throw new Error("Error! Class " + cd.getSymbol() + " extends interface " + cd.getSuper());
+    }
 	// Link together Field, Method, and Flag tables so classes
 	// inherit these from their superclasses
 	cd.getFieldTable().setParent(cd.getSuperDesc().getFieldTable());
@@ -46,6 +49,9 @@ public class SemanticCheck {
         Vector<String> sifv = cd.getSuperInterface();
         for(int i = 0; i < sifv.size(); i++) {
           ClassDescriptor superif = getClass(sifv.elementAt(i));
+          if(!superif.isInterface()) {
+            throw new Error("Error! Class " + cd.getSymbol() + " implements non-interface " + superif.getSymbol());
+          }
           cd.addSuperInterfaces(superif);
           cd.getFieldTable().addParentIF(superif.getFieldTable());
           cd.getMethodTable().addParentIF(superif.getMethodTable());
@@ -64,7 +70,7 @@ public class SemanticCheck {
 	checkMethod(cd,md);
     hasConstructor |= md.isConstructor();
       }
-      if(!hasConstructor) {
+      if((!hasConstructor) && (!cd.isEnum())) {
         // add a default constructor for this class
         MethodDescriptor md = new MethodDescriptor(new Modifiers(Modifiers.PUBLIC),
             cd.getSymbol(), false);
@@ -603,7 +609,7 @@ public class SemanticCheck {
       fd=(FieldDescriptor) ltd.getClassDesc().getFieldTable().get(fieldname);
     if(state.MGC) {
       // TODO add version for normal Java later
-    if(ltd.isStatic()) {
+    if(ltd.isClassNameRef()) {
       // the field access is using a class name directly
       if(ltd.getClassDesc().isEnum()) {
         int value = ltd.getClassDesc().getEnumConstant(fieldname);
@@ -890,8 +896,8 @@ public class SemanticCheck {
       }
     }
     if(out_type != null) {
-      out_type = out_type.makeArray(state);
-      out_type.setStatic();
+      out_type = out_type.makeArray(state, false);
+      //out_type.setStatic();
     }
     ain.setType(out_type);
   }
@@ -1228,7 +1234,12 @@ NextMethod:
 	continue;
       for(int i=0; i<min.numArgs(); i++) {
 	if (!typeutil.isSuperorType(currmd.getParamType(i),tdarray[i]))
-	  continue NextMethod;
+      if(state.MGC && ((!tdarray[i].isArray() &&( tdarray[i].isInt() || tdarray[i].isLong())) 
+          && currmd.getParamType(i).isClass() && currmd.getParamType(i).getClassDesc().getSymbol().equals("Object"))) {
+        // primitive parameters vs object
+      } else {
+        continue NextMethod;
+      }
       }
       /* Method okay so far */
       if (bestmd==null)
@@ -1256,6 +1267,32 @@ NextMethod:
 	checkExpressionNode(md, nametable, min.getExpression(), null);
       }
     }
+    
+    if(state.MGC) {
+      /* Check if we need to wrap primitive paratmeters to objects */
+      for(int i=0; i<min.numArgs(); i++) {
+        if(!tdarray[i].isArray() && (tdarray[i].isInt() || tdarray[i].isLong())
+            && min.getMethod().getParamType(i).isClass() && min.getMethod().getParamType(i).getClassDesc().getSymbol().equals("Object")) {
+          // Shall wrap this primitive parameter as a object
+          ExpressionNode exp = min.getArg(i);
+          TypeDescriptor ptd = null;
+          NameDescriptor nd=null;
+          if(exp.getType().isInt()) {
+            nd = new NameDescriptor("Integer");
+            ptd = state.getTypeDescriptor(nd);
+          } else if(exp.getType().isLong()) {
+            nd = new NameDescriptor("Long");
+            ptd = state.getTypeDescriptor(nd);
+          }
+          boolean isglobal = false;
+          String disjointId = null;
+          CreateObjectNode con=new CreateObjectNode(ptd, isglobal, disjointId);
+          con.addArgument(exp);
+          checkExpressionNode(md, nametable, con, null);
+          min.setArgument(con, i);
+        }
+      }
+    }
   }
 
 
@@ -1341,8 +1378,11 @@ NextMethod:
 	  throw new Error();
 	righttype=lefttype=new TypeDescriptor(TypeDescriptor.BOOLEAN);
       } else if (ltd.isPtr()||rtd.isPtr()) {
-	if (!(ltd.isPtr()&&rtd.isPtr()))
-	  throw new Error();
+	if (!(ltd.isPtr()&&rtd.isPtr())) {
+      if(!rtd.isEnum()) {
+        throw new Error();
+      }
+    }
 	righttype=rtd;
 	lefttype=ltd;
       } else if (ltd.isDouble()||rtd.isDouble())
diff --git a/Robust/src/IR/TypeDescriptor.java b/Robust/src/IR/TypeDescriptor.java
index ff7efd91..1ca43623 100644
--- a/Robust/src/IR/TypeDescriptor.java
+++ b/Robust/src/IR/TypeDescriptor.java
@@ -25,7 +25,7 @@ public class TypeDescriptor extends Descriptor {
   int arraycount;
   private int type;
   ClassDescriptor class_desc;
-  boolean isStatic = false;
+  boolean isClassNameRef = false;
 
   public boolean equals(Object o) {
     if (o instanceof TypeDescriptor) {
@@ -36,6 +36,8 @@ public class TypeDescriptor extends Descriptor {
 	return false;
       if (t.arraycount!=arraycount)
 	return false;
+      if (t.isClassNameRef != this.isClassNameRef)
+        return false;
       return true;
     }
     return false;
@@ -51,12 +53,12 @@ public class TypeDescriptor extends Descriptor {
     return true;
   }
   
-  public boolean isStatic() {
-    return this.isStatic;
+  public boolean isClassNameRef() {
+    return this.isClassNameRef;
   }
   
-  public void setStatic() {
-    this.isStatic = true;
+  public void setClassNameRef() {
+    this.isClassNameRef = true;
   }
 
   public int hashCode() {
@@ -80,12 +82,14 @@ public class TypeDescriptor extends Descriptor {
 	    name.equals("Objectwrapper"));
   }
 
-  public TypeDescriptor makeArray(State state) {
+  public TypeDescriptor makeArray(State state, boolean addflag) {
     TypeDescriptor td=new TypeDescriptor(getSymbol());
     td.arraycount=arraycount+1;
     td.type=type;
     td.class_desc=class_desc;
-    state.addArrayType(td);
+    if(addflag) {
+      state.addArrayType(td);
+    }
     return td;
   }
 
@@ -117,9 +121,9 @@ public class TypeDescriptor extends Descriptor {
   public String getSafeSymbol() {
     if (isArray())
       return IR.Flat.BuildCode.arraytype;
-    else if (isClass())
+    else if (isClass()) {
       return class_desc.getSafeSymbol();
-    else if (isByte())
+    } else if (isByte())
       return "char";
     else if (isChar())
       return "short";
@@ -145,9 +149,9 @@ public class TypeDescriptor extends Descriptor {
   public String getRepairSymbol() {
     if (isArray())
       return IR.Flat.BuildCode.arraytype;
-    else if (isClass())
+    else if (isClass()) {
       return class_desc.getSymbol();
-    else if (isByte())
+    } else if (isByte())
       return "byte";
     else if (isChar())
       return "short";
@@ -235,11 +239,11 @@ public class TypeDescriptor extends Descriptor {
   }
 
   public boolean isPtr() {
-    return (isClass()||isNull()||isTag()||isArray());
+    return ((isClass()&&!isEnum())||isNull()||isTag()||isArray());
   }
 
   public boolean isIntegerType() {
-    return (isInt()||isLong()||isShort()||isChar()||isByte());
+    return (isInt()||isLong()||isShort()||isChar()||isByte()||isEnum());
   }
 
   public void setClassDescriptor(ClassDescriptor cd) {
@@ -250,6 +254,15 @@ public class TypeDescriptor extends Descriptor {
     return ((type>=BYTE)&&(type<=DOUBLE));
   }
 
+  public boolean isEnum() {
+    if(this.type != CLASS) {
+      return false;
+    } else if(this.class_desc != null){
+      return this.class_desc.isEnum();
+    }
+    return false;
+  }
+  
   public boolean isClass() {
     return type==CLASS;
   }
@@ -267,7 +280,7 @@ public class TypeDescriptor extends Descriptor {
     this.type=CLASS;
     this.class_desc=null;
     this.arraycount=0;
-    this.isStatic =false;
+    this.isClassNameRef =false;
   }
 
   public TypeDescriptor(String st) {
@@ -275,7 +288,7 @@ public class TypeDescriptor extends Descriptor {
     this.type=CLASS;
     this.class_desc=null;
     this.arraycount=0;
-    this.isStatic =false;
+    this.isClassNameRef =false;
   }
 
   public ClassDescriptor getClassDesc() {
@@ -287,14 +300,14 @@ public class TypeDescriptor extends Descriptor {
     this.type=CLASS;
     this.class_desc=cd;
     this.arraycount=0;
-    this.isStatic =false;
+    this.isClassNameRef =false;
   }
 
   public TypeDescriptor(int t) {
     super(decodeInt(t));
     this.type=t;
     this.arraycount=0;
-    this.isStatic =false;
+    this.isClassNameRef =false;
   }
 
   public String toString() {
diff --git a/Robust/src/IR/TypeUtil.java b/Robust/src/IR/TypeUtil.java
index 1eda9aa4..3cd80b86 100644
--- a/Robust/src/IR/TypeUtil.java
+++ b/Robust/src/IR/TypeUtil.java
@@ -149,8 +149,15 @@ public class TypeUtil {
     if (md1.numParameters()!=md2.numParameters())
       throw new Error();
     for(int i=0; i<md1.numParameters(); i++) {
-      if (!this.isSuperorType(md2.getParamType(i), md1.getParamType(i)))
-	return false;
+      if (!this.isSuperorType(md2.getParamType(i), md1.getParamType(i))) {
+        if(state.MGC && ((!md1.getParamType(i).isArray() && 
+            (md1.getParamType(i).isInt() || md1.getParamType(i).isLong() || md1.getParamType(i).isDouble() || md1.getParamType(i).isFloat()))
+            && md2.getParamType(i).isClass() && md2.getParamType(i).getClassDesc().getSymbol().equals("Object"))) {
+          // primitive parameters vs Object
+        } else {
+          return false;
+        }
+      }
     }
     if (md1.getReturnType()==null||md2.getReturnType()==null) {
 	if (md1.getReturnType()!=md2.getReturnType())
diff --git a/Robust/src/Tests/EnumTest.java b/Robust/src/Tests/EnumTest.java
index aa9f50e8..514e0758 100644
--- a/Robust/src/Tests/EnumTest.java
+++ b/Robust/src/Tests/EnumTest.java
@@ -17,7 +17,7 @@ public class EnumTest {
     System.out.println(howHot);
     
     EnumTest et = new EnumTest();
-    et.howHot = Spiciness1.MEDIUM;
+    et.howHot = Spiciness1.MEDIUM; // EnumTest.Spiciness1.MEDIUM;
     System.out.println(et.howHot);
   }
 } /* Output:
diff --git a/Robust/src/buildscript b/Robust/src/buildscript
index 3cd43eeb..7e04cd90 100755
--- a/Robust/src/buildscript
+++ b/Robust/src/buildscript
@@ -732,6 +732,11 @@ fi
 
 # Setup class path
 
+if $MGCFLAG
+then
+#base multicore gc files
+JAVAOPTS="$JAVAOPTS -classlibrary $ROBUSTROOT/ClassLibrary/MGC/ -classlibrary $ROBUSTROOT/ClassLibrary/MGC/gnu/"
+else
 if $RECOVERFLAG
 then
 if $FASTCHECK
@@ -754,14 +759,11 @@ elif $THREADFLAG
 then
 #threading java stuff
 JAVAOPTS="$JAVAOPTS -classlibrary $ROBUSTROOT/ClassLibrary/JavaThread"
-elif $MGCFLAG
-then
-#base multicore gc files
-JAVAOPTS="$JAVAOPTS -classlibrary $ROBUSTROOT/ClassLibrary/MGC -classlibrary $ROBUSTROOT/ClassLibrary/MGC/gnu"
 fi
 #base java stuff
 JAVAOPTS="$JAVAOPTS -classlibrary $ROBUSTROOT/ClassLibrary/Java"
 fi
+fi
 
 # Build bristlecone/java sources