Initialize class objects first as in the staic blocks there might be references to...
[IRC.git] / Robust / src / IR / Flat / BuildCode.java
index d61f5b55ec170fdb7868d15dd9cf54df3804d78e..11e4b0ccde09b118164e000aa26cef623bdeb786 100644 (file)
@@ -42,7 +42,7 @@ public class BuildCode {
   public static String arraytype="ArrayObject";
   public static int flagcount = 0;
   Virtual virtualcalls;
-  TypeUtil typeutil;
+  public TypeUtil typeutil;
   protected int maxtaskparams=0;
   protected int maxcount=0;
   ClassDescriptor[] cdarray;
@@ -56,7 +56,6 @@ public class BuildCode {
   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);
@@ -218,7 +217,6 @@ public class BuildCode {
       bcx.additionalCodeGen(outmethodheader, outstructs, outmethod);
     }
 
-
     if (state.TASK) {
       /* Output code for tasks */
       outputTaskCode(outtaskdefs, outmethod);
@@ -333,23 +331,57 @@ public class BuildCode {
     // 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);
+           }
+       }
     }
   }
 
@@ -360,7 +392,7 @@ public class BuildCode {
     // 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()) + ");");
@@ -369,7 +401,7 @@ public class BuildCode {
                         + (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() + ");");
@@ -396,9 +428,8 @@ public class BuildCode {
       outmethod.println("    ((struct garbagelist *)global_defs_p)->array[i]=NULL;");
       outmethod.println("  }");
     }
-    outputStaticBlocks(outmethod);
     outputClassObjects(outmethod);
-
+    outputStaticBlocks(outmethod);
 
     additionalCodeAtTopOfMain(outmethod);
     for(BuildCodeExtension bcx: extensions) {
@@ -406,7 +437,7 @@ public class BuildCode {
     }
 
 
-    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);");
@@ -414,10 +445,13 @@ public class BuildCode {
     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("  }");
@@ -433,7 +467,7 @@ public class BuildCode {
     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__);");
@@ -536,6 +570,9 @@ public class BuildCode {
     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\"");
     }
@@ -694,7 +731,11 @@ public class BuildCode {
       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) {
@@ -708,8 +749,12 @@ public class BuildCode {
         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;");
@@ -992,7 +1037,7 @@ public class BuildCode {
     cdarray=new ClassDescriptor[state.numClasses()];
     ifarray = new ClassDescriptor[state.numInterfaces()];
     cdarray[0] = null;
-    int interfaceid = 0;
+
     while(it.hasNext()) {
       ClassDescriptor cd=(ClassDescriptor)it.next();
       if(cd.isInterface()) {
@@ -1184,7 +1229,7 @@ public class BuildCode {
     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);
@@ -1192,7 +1237,7 @@ public class BuildCode {
 
     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);
@@ -1210,7 +1255,7 @@ public class BuildCode {
       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);
@@ -1650,7 +1695,11 @@ fldloop:
       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) {
@@ -1665,8 +1714,12 @@ fldloop:
         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;");
@@ -1705,7 +1758,7 @@ fldloop:
 
   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";
@@ -1753,7 +1806,7 @@ fldloop:
       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;");
@@ -1783,7 +1836,7 @@ fldloop:
       /* 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;
       }
@@ -1808,7 +1861,7 @@ fldloop:
     }
 
     /* 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;");
@@ -1839,7 +1892,7 @@ fldloop:
     /* 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;
     }
@@ -1882,7 +1935,7 @@ fldloop:
       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;");
@@ -1898,7 +1951,7 @@ fldloop:
       }
 
       /* 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;");
@@ -1919,7 +1972,7 @@ fldloop:
       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[]");
@@ -1955,7 +2008,7 @@ fldloop:
         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");
 
@@ -2004,7 +2057,7 @@ fldloop:
       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);
@@ -2034,11 +2087,11 @@ fldloop:
       /* 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) {
-            output.println("if(gcflag) gc("+localsprefixaddr+");");
+          if (state.MULTICOREGC||state.PMC) {
+            output.println("GCCHECK("+localsprefixaddr+");");
           } else {
             output.println("if (unlikely(needtocollect)) checkcollect("+localsprefixaddr+");");
           }
@@ -2059,7 +2112,7 @@ fldloop:
       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
@@ -2093,11 +2146,11 @@ fldloop:
      * 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) {
-          output.println("if(gcflag) gc("+localsprefixaddr+");");
+        if (state.MULTICOREGC||state.PMC) {
+          output.println("GCCHECK("+localsprefixaddr+");");
         } else {
           output.println("if (unlikely(needtocollect)) checkcollect("+localsprefixaddr+");");
         }
@@ -2281,6 +2334,7 @@ fldloop:
       bcx.additionalCodePreNode(fm, fn, output);
     }
 
+
     switch(fn.kind()) {
     case FKind.FlatAtomicEnterNode:
       generateFlatAtomicEnterNode(fm, (FlatAtomicEnterNode) fn, output);
@@ -2359,7 +2413,8 @@ fldloop:
       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;
 
@@ -2400,9 +2455,9 @@ fldloop:
 
   public void generateFlatBackEdge(FlatMethod fm, FlatBackEdge fn, PrintWriter output) {
     if (((state.OOOJAVA||state.THREAD)&&GENERATEPRECISEGC)
-        || (this.state.MULTICOREGC)) {
-      if(this.state.MULTICOREGC) {
-        output.println("if (gcflag) gc("+localsprefixaddr+");");
+        || state.MULTICOREGC||state.PMC) {
+      if (state.MULTICOREGC||state.PMC) {
+        output.println("GCCHECK("+localsprefixaddr+");");
       } else {
         output.println("if (unlikely(needtocollect)) checkcollect("+localsprefixaddr+");");
       }
@@ -2528,7 +2583,7 @@ fldloop:
           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__);");
@@ -2548,7 +2603,7 @@ fldloop:
         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) {
@@ -2569,7 +2624,7 @@ fldloop:
     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);
@@ -2620,7 +2675,7 @@ fldloop:
       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;
       }
@@ -2646,12 +2701,12 @@ fldloop:
 
     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) {
@@ -2732,7 +2787,7 @@ fldloop:
             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__);");
@@ -2747,19 +2802,63 @@ fldloop:
         }
       }
       // 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);");
@@ -2779,7 +2878,7 @@ fldloop:
       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+");");
@@ -2802,7 +2901,7 @@ fldloop:
             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__);");
@@ -2817,23 +2916,56 @@ fldloop:
         }
       }
       // 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);");
@@ -2862,12 +2994,31 @@ fldloop:
       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) {
@@ -2883,24 +3034,37 @@ fldloop:
       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())+";");
+
   }
 
 
@@ -2909,13 +3073,13 @@ fldloop:
 
     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()+");");
@@ -2926,14 +3090,13 @@ fldloop:
       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())+");");
@@ -2949,10 +3112,19 @@ fldloop:
           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())
@@ -3000,11 +3172,16 @@ fldloop:
         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()+");");
       }
+      
+      for(BuildCodeExtension bcx: extensions) {
+        bcx.additionalCodeNewStringLiteral(output, generateTemp(fm, fln.getDst()));
+      }      
+
       output.println("}");
       flncount++;
     } else if (fln.getType().isBoolean()) {
@@ -3080,7 +3257,7 @@ fldloop:
       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
@@ -3103,7 +3280,7 @@ fldloop:
           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 */
@@ -3204,7 +3381,7 @@ fldloop:
         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)+");");
@@ -3216,7 +3393,7 @@ fldloop:
         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)+");");