You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@harmony.apache.org by wj...@apache.org on 2006/10/26 23:30:45 UTC

svn commit: r468145 - in /incubator/harmony/enhanced/drlvm/trunk/vm: jitrino/src/codegenerator/ jitrino/src/codegenerator/ia32/ jitrino/src/dynopt/ jitrino/src/optimizer/ jitrino/src/vm/ jitrino/src/vm/drl/ vmcore/src/thread/

Author: wjwashburn
Date: Thu Oct 26 14:30:43 2006
New Revision: 468145

URL: http://svn.apache.org/viewvc?view=rev&rev=468145
Log:
HARMONY-1898 write barrier for C/C++ based GCs in Jitrino.OPT
smoke tests pass on both windowsxp and Linux w/ gcc 4.0.2


Modified:
    incubator/harmony/enhanced/drlvm/trunk/vm/jitrino/src/codegenerator/CodeGenIntfc.h
    incubator/harmony/enhanced/drlvm/trunk/vm/jitrino/src/codegenerator/ia32/Ia32InstCodeSelector.cpp
    incubator/harmony/enhanced/drlvm/trunk/vm/jitrino/src/codegenerator/ia32/Ia32InstCodeSelector.h
    incubator/harmony/enhanced/drlvm/trunk/vm/jitrino/src/dynopt/StaticProfiler.cpp
    incubator/harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/CodeGenerator.cpp
    incubator/harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/IRBuilder.cpp
    incubator/harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/hashvaluenumberer.cpp
    incubator/harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/lazyexceptionopt.cpp
    incubator/harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/memoryopt.cpp
    incubator/harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/simplifier.cpp
    incubator/harmony/enhanced/drlvm/trunk/vm/jitrino/src/vm/VMInterface.cpp
    incubator/harmony/enhanced/drlvm/trunk/vm/jitrino/src/vm/VMInterface.h
    incubator/harmony/enhanced/drlvm/trunk/vm/jitrino/src/vm/drl/DrlVMInterface.cpp
    incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/thread/object_generic.cpp

Modified: incubator/harmony/enhanced/drlvm/trunk/vm/jitrino/src/codegenerator/CodeGenIntfc.h
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/drlvm/trunk/vm/jitrino/src/codegenerator/CodeGenIntfc.h?view=diff&rev=468145&r1=468144&r2=468145
==============================================================================
--- incubator/harmony/enhanced/drlvm/trunk/vm/jitrino/src/codegenerator/CodeGenIntfc.h (original)
+++ incubator/harmony/enhanced/drlvm/trunk/vm/jitrino/src/codegenerator/CodeGenIntfc.h Thu Oct 26 14:30:43 2006
@@ -405,6 +405,11 @@
                                        CG_OpndHandle* tauBaseNonNull,
                                        CG_OpndHandle* tauAddressInRange,
                                        CG_OpndHandle* tauElemTypeChecked) = 0;
+    virtual void            tau_stRef(CG_OpndHandle* src, CG_OpndHandle* ptr, CG_OpndHandle* base, Type::Tag memType,
+                                       bool autoCompressRef, 
+                                       CG_OpndHandle* tauBaseNonNull,
+                                       CG_OpndHandle* tauAddressInRange, 
+                                       CG_OpndHandle* tauElemTypeChecked) = 0;
     // COMPRESSED_PTR note: var is already uncompressed, so compression doesn't affect it
     virtual void            stVar(CG_OpndHandle* src, uint32 varId) = 0;
 

Modified: incubator/harmony/enhanced/drlvm/trunk/vm/jitrino/src/codegenerator/ia32/Ia32InstCodeSelector.cpp
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/drlvm/trunk/vm/jitrino/src/codegenerator/ia32/Ia32InstCodeSelector.cpp?view=diff&rev=468145&r1=468144&r2=468145
==============================================================================
--- incubator/harmony/enhanced/drlvm/trunk/vm/jitrino/src/codegenerator/ia32/Ia32InstCodeSelector.cpp (original)
+++ incubator/harmony/enhanced/drlvm/trunk/vm/jitrino/src/codegenerator/ia32/Ia32InstCodeSelector.cpp Thu Oct 26 14:30:43 2006
@@ -2102,6 +2102,22 @@
     return simpleStInd((Opnd*)ptr, (Opnd*)src, memType, autoCompressRef, (Opnd*)tauBaseNonNull, (Opnd*)tauElemTypeChecked);
 }
 
+void InstCodeSelector::tau_stRef(CG_OpndHandle* src,
+                                    CG_OpndHandle* ptr, 
+                                    CG_OpndHandle* base,
+                                    Type::Tag      memType, 
+                                    bool           autoCompressRef,
+                                    CG_OpndHandle* tauBaseNonNull,
+                                    CG_OpndHandle* tauAddressInRange, 
+                                    CG_OpndHandle* tauElemTypeChecked)
+{
+    Opnd* helperOpnds[] = {(Opnd*)base,(Opnd*)ptr,(Opnd*)src};
+    CallInst * callInst = irManager.newRuntimeHelperCallInst(
+                                        CompilationInterface::Helper_WriteBarrier,
+                                        3,helperOpnds,NULL);
+    appendInsts(callInst);
+}
+
 //_______________________________________________________________________________________________________________
 //  Load variable address
 

Modified: incubator/harmony/enhanced/drlvm/trunk/vm/jitrino/src/codegenerator/ia32/Ia32InstCodeSelector.h
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/drlvm/trunk/vm/jitrino/src/codegenerator/ia32/Ia32InstCodeSelector.h?view=diff&rev=468145&r1=468144&r2=468145
==============================================================================
--- incubator/harmony/enhanced/drlvm/trunk/vm/jitrino/src/codegenerator/ia32/Ia32InstCodeSelector.h (original)
+++ incubator/harmony/enhanced/drlvm/trunk/vm/jitrino/src/codegenerator/ia32/Ia32InstCodeSelector.h Thu Oct 26 14:30:43 2006
@@ -186,6 +186,10 @@
     void           tau_stElem(CG_OpndHandle* src,CG_OpndHandle* array, CG_OpndHandle* index,
                           bool autoCompressRef, CG_OpndHandle* tauBaseNonNull,
                           CG_OpndHandle* tauAddressInRange, CG_OpndHandle* tauElemTypeChecked);
+    void           tau_stRef(CG_OpndHandle* src, CG_OpndHandle* ptr, CG_OpndHandle* base, Type::Tag memType, 
+                             bool autoCompressRef, CG_OpndHandle* tauBaseNonNull,
+                             CG_OpndHandle* tauAddressInRange, CG_OpndHandle* tauElemTypeChecked);
+
     void           stVar(CG_OpndHandle* src, uint32 varId);
     CG_OpndHandle* newObj(ObjectType* objType);     
     CG_OpndHandle* newArray(ArrayType* arrayType, CG_OpndHandle* numElems);

Modified: incubator/harmony/enhanced/drlvm/trunk/vm/jitrino/src/dynopt/StaticProfiler.cpp
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/drlvm/trunk/vm/jitrino/src/dynopt/StaticProfiler.cpp?view=diff&rev=468145&r1=468144&r2=468145
==============================================================================
--- incubator/harmony/enhanced/drlvm/trunk/vm/jitrino/src/dynopt/StaticProfiler.cpp (original)
+++ incubator/harmony/enhanced/drlvm/trunk/vm/jitrino/src/dynopt/StaticProfiler.cpp Thu Oct 26 14:30:43 2006
@@ -555,8 +555,8 @@
 static double storeHeuristic(const StaticProfilerContext* c) {
     Node* node1 = c->edge1->getTargetNode();
     Node* node2 = c->edge2->getTargetNode();
-    bool node1Accepted = findInst(node1, Op_TauStInd)!=NULL;
-    bool node2Accepted = findInst(node2, Op_TauStInd)!=NULL;
+    bool node1Accepted = (findInst(node1, Op_TauStInd)!=NULL||findInst(node1, Op_TauStRef)!=NULL);
+    bool node2Accepted = (findInst(node2, Op_TauStInd)!=NULL||findInst(node2, Op_TauStRef)!=NULL);
     if (!node1Accepted && !node2Accepted) {
         return PROB_HEURISTIC_FAIL;
     }

Modified: incubator/harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/CodeGenerator.cpp
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/CodeGenerator.cpp?view=diff&rev=468145&r1=468144&r2=468145
==============================================================================
--- incubator/harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/CodeGenerator.cpp (original)
+++ incubator/harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/CodeGenerator.cpp Thu Oct 26 14:30:43 2006
@@ -1520,6 +1520,42 @@
                                                getCGInst(tauElemTypeChecked));
             }
             break;
+        case Op_TauStRef:
+            {
+                assert(inst->getNumSrcOperands() == 6);
+
+                Opnd *src = inst->getSrc(0);
+                Opnd *ptr = inst->getSrc(1);
+                Opnd *base = inst->getSrc(2);
+
+                Opnd *tauNonNullBase = inst->getSrc(3);
+                Opnd *tauTypeHasField = inst->getSrc(4);
+                Opnd *tauFieldTypeChecked = inst->getSrc(5);
+
+                assert(tauNonNullBase->getType()->tag == Type::Tau);
+                assert(tauTypeHasField->getType()->tag == Type::Tau);
+                assert(tauFieldTypeChecked->getType()->tag == Type::Tau);
+
+                AutoCompressModifier acmod = inst->getAutoCompressModifier();
+                StoreModifier UNUSED stmod = inst->getStoreModifier();
+
+                bool autocompress = (acmod == AutoCompress_Yes);
+                Type::Tag type = inst->getType();
+                if (acmod == AutoCompress_Yes) {
+                    assert(Type::isReference(type));
+                    assert(!Type::isCompressedReference(type));
+                }
+                assert(stmod == Store_WriteBarrier);
+                instructionCallback.tau_stRef(getCGInst(src),
+                                        getCGInst(ptr),
+                                        getCGInst(base),
+                                        type,
+                                        autocompress,
+                                        getCGInst(tauNonNullBase),
+                                        getCGInst(tauTypeHasField),
+                                        getCGInst(tauFieldTypeChecked));
+            }
+            break;
         case Op_TauCheckBounds:
             {
                 assert(inst->getNumSrcOperands() == 2);

Modified: incubator/harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/IRBuilder.cpp
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/IRBuilder.cpp?view=diff&rev=468145&r1=468144&r2=468145
==============================================================================
--- incubator/harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/IRBuilder.cpp (original)
+++ incubator/harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/IRBuilder.cpp Thu Oct 26 14:30:43 2006
@@ -2498,17 +2498,16 @@
                      !type->isCompressedReference());
     Modifier compressMod = Modifier(compress ? AutoCompress_Yes
                                     : AutoCompress_No);
-
     if (irBuilderFlags.insertWriteBarriers) {
         appendInst(instFactory->makeTauStRef((Modifier(Store_WriteBarrier)|
                                              compressMod),
-                                            type->tag, src, objectbase, ptr,
+                                            type->tag, src, ptr, objectbase,
                                             tauBaseNonNull, tauAddressInRange, 
                                             tauElemTypeChecked));
     } else {
         appendInst(instFactory->makeTauStRef((Modifier(Store_NoWriteBarrier)|
                                              compressMod),
-                                            type->tag, src, objectbase, ptr,
+                                            type->tag, src, ptr, objectbase,
                                             tauBaseNonNull, tauAddressInRange, 
                                             tauElemTypeChecked));
     }
@@ -2534,7 +2533,7 @@
                                : genTauSafe()); // safe, not an object
     if (irBuilderFlags.expandMemAddrs) { // do not expand ldField of stack values
         Opnd *ptr = genLdFieldAddr(type, base, fieldDesc);
-        if (irBuilderFlags.insertWriteBarriers) {
+        if (irBuilderFlags.insertWriteBarriers && src->getType()->isObject()) {
             genTauStRef(type, base, ptr, src, 
                         tauBaseNonNull, 
                         tauBaseTypeIsOk,
@@ -2625,7 +2624,7 @@
         } else {
             ptr = genLdElemAddr(elemType, array, index);
         }
-        if (irBuilderFlags.insertWriteBarriers) {
+        if (irBuilderFlags.insertWriteBarriers && elemType->isObject()) {
             genTauStRef(elemType, array, ptr, src, tauNullChecked, tauAddressInRange,
                         tauElemTypeChecked);
         } else {

Modified: incubator/harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/hashvaluenumberer.cpp
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/hashvaluenumberer.cpp?view=diff&rev=468145&r1=468144&r2=468145
==============================================================================
--- incubator/harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/hashvaluenumberer.cpp (original)
+++ incubator/harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/hashvaluenumberer.cpp Thu Oct 26 14:30:43 2006
@@ -300,7 +300,7 @@
                         if (memOpt) memOpt->remMemInst(inst);
                         return res;
                     }
-                } else if (res->getOpcode() == Op_TauStInd) {
+                } else if (res->getOpcode() == Op_TauStInd ||res->getOpcode() == Op_TauStRef) {
                     if ((!memOpt) || memOpt->hasDefReachesUse(res, inst)) {
                         if (memOpt) memOpt->remMemInst(inst);
                         return res->getSrc(0)->getInst();
@@ -349,7 +349,7 @@
                                 if (memOpt) memOpt->remMemInst(inst);
                                 dataOpnd = res->getDst();
                             }
-                        } else if (res->getOpcode() == Op_TauStInd) {
+                        } else if (res->getOpcode() == Op_TauStInd ||res->getOpcode() == Op_TauStRef) {
                             if ((!memOpt) || memOpt->hasDefReachesUse(res, inst)) {
                                 if (memOpt) memOpt->remMemInst(inst);
                                 dataOpnd = res->getSrc(0);
@@ -641,12 +641,48 @@
         }
     }
     Inst* caseTauStRef(Inst* inst) {
-        if (memOpt) {
-            assert(0); // dunno what to do here.
+        bool is_final = false;
+        bool is_volatile = false;
+        {
+            Inst *ptrInst = inst->getSrc(1)->getInst();
+            if ((ptrInst->getOpcode() == Op_LdFieldAddr) ) {
+                FieldAccessInst *faInst = ptrInst->asFieldAccessInst();
+                FieldDesc *fd = faInst->getFieldDesc();
+                is_volatile = fd->isVolatile();
+                if (fd->isInitOnly()) {
+                    is_final = true;
+                    // first check for System stream final fields which vary
+                    NamedType *td = fd->getParentType();
+                    if (strncmp(td->getName(),"java/lang/System",20)==0) {
+                        const char *fdname = fd->getName();
+                        if ((strncmp(fdname,"in",5)==0) ||
+                            (strncmp(fdname,"out",5)==0) ||
+                            (strncmp(fdname,"err",5)==0)) {
+                            is_final = false;
+                        }
+                    }
+                }
+            }
+        }
+        if ((cse_final && is_final) || (memOpt && !is_volatile)) {
+            Opnd *addrOp = inst->getSrc(1);
+            Type::Tag typetag = inst->getType();
+            Operation op(Op_TauLdInd, typetag);
+            if (Log::isEnabled()) {
+                Log::out() << "StRef hashing Ldind : "
+                           << (int) op.encodeForHashing()
+                           << ", "
+                           << (int) addrOp->getId()
+                           << ::std::endl;
+            }
+            Modifier m(Modifier(inst->getAutoCompressModifier()) | Modifier(Speculative_No));
+            setHashToInst(inst, getKey(Operation(Op_TauLdInd, inst->getType(), m),
+                                       addrOp->getId()));
             return inst;
         } else {
             return caseDefault(inst);
         }
+
     }
 
     // checks 

Modified: incubator/harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/lazyexceptionopt.cpp
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/lazyexceptionopt.cpp?view=diff&rev=468145&r1=468144&r2=468145
==============================================================================
--- incubator/harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/lazyexceptionopt.cpp (original)
+++ incubator/harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/lazyexceptionopt.cpp Thu Oct 26 14:30:43 2006
@@ -1037,12 +1037,26 @@
                 if (inst_src1->getOpcode()==Op_LdFieldAddr ) 
                     return checkField(inst_src1);
             }
-            return true; 
+            return true;
+        case Op_TauStRef:
+            {
+                Inst* inst_src1 = inst->getSrc(1)->getInst();
+#ifdef _DEBUG
+                if (Log::isEnabled()) {
+                    Log::out() << "    stref: "; 
+                    inst->print(Log::out()); Log::out()  << std::endl;
+                    Log::out() << "           "; 
+                    inst_src1->print(Log::out()); Log::out()  << std::endl;
+                }
+#endif
+                if (inst_src1->getOpcode()==Op_LdFieldAddr ) 
+                    return checkField(inst_src1);
+            }
+            return true;
         case Op_TauStField:
             return true; // 
         case Op_TauStElem:
         case Op_TauStStatic:
-        case Op_TauStRef:
         case Op_TauCheckBounds:
         case Op_TauCheckLowerBound:
         case Op_TauCheckUpperBound:

Modified: incubator/harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/memoryopt.cpp
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/memoryopt.cpp?view=diff&rev=468145&r1=468144&r2=468145
==============================================================================
--- incubator/harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/memoryopt.cpp (original)
+++ incubator/harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/memoryopt.cpp Thu Oct 26 14:30:43 2006
@@ -747,6 +747,12 @@
         }
         break;
 
+    case Op_TauStRef:
+        {
+            thePass->effectWrite(n, i, i->getSrc(1));
+        }
+        break;
+
     case Op_TauCheckElemType:
         {
             thePass->effectReadVtable(n, i, i->getSrc(0)); // array
@@ -971,8 +977,8 @@
     case Op_PredBranch:
         break;
 
-    case Op_TauStRef:
-        assert(0); 
+    //case Op_TauStRef:
+    //    assert(0); 
 
     case Op_TauLdField:
     case Op_LdStatic:
@@ -2404,6 +2410,7 @@
     case Op_TauStField:
     case Op_TauStStatic:
     case Op_TauStElem:
+    case Op_TauStRef:
         // maybe eliminate inst;
         break;
     default:
@@ -2433,6 +2440,21 @@
                     }
                 }
                 break;
+
+            case Op_TauStRef:
+                {
+                    Opnd *usingAddr = usingInst->getSrc(1);
+                    Opnd *thisAddr = inst->getSrc(1);
+                    if ((usingAddr == thisAddr) &&
+                        (getBitWidth(usingInst->getType()) >=
+                         getBitWidth(inst->getType()))) {
+                         // eliminate inst;
+                        thePass->remMemInst(inst);
+                        inst->unlink();
+                    }
+                }
+                break;
+
             case Op_TauStField:
                 {
                     Opnd *usingBase = usingInst->getSrc(1);

Modified: incubator/harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/simplifier.cpp
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/simplifier.cpp?view=diff&rev=468145&r1=468144&r2=468145
==============================================================================
--- incubator/harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/simplifier.cpp (original)
+++ incubator/harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/simplifier.cpp Thu Oct 26 14:30:43 2006
@@ -3428,7 +3428,7 @@
     Modifier mod = inst->getModifier();
     assert(inst->getNumSrcOperands() == 6);
     Opnd *src = inst->getSrc(0);
-    Opnd *pointer = inst->getSrc(2);
+    Opnd *pointer = inst->getSrc(1);
 
     Type *ptrType = pointer->getType();
     assert(ptrType->isPtr());

Modified: incubator/harmony/enhanced/drlvm/trunk/vm/jitrino/src/vm/VMInterface.cpp
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/drlvm/trunk/vm/jitrino/src/vm/VMInterface.cpp?view=diff&rev=468145&r1=468144&r2=468145
==============================================================================
--- incubator/harmony/enhanced/drlvm/trunk/vm/jitrino/src/vm/VMInterface.cpp (original)
+++ incubator/harmony/enhanced/drlvm/trunk/vm/jitrino/src/vm/VMInterface.cpp Thu Oct 26 14:30:43 2006
@@ -103,6 +103,7 @@
     DECL_HELPER_ITEM(GetSuspReqFlag),
     DECL_HELPER_ITEM(MethodEntry),
     DECL_HELPER_ITEM(MethodExit),
+    DECL_HELPER_ITEM(WriteBarrier),
 #undef DECL_HELPER_ITEM
 };
 static const unsigned runtime_helpers_names_count = sizeof(runtime_helpers_names)/sizeof(runtime_helpers_names[0]);

Modified: incubator/harmony/enhanced/drlvm/trunk/vm/jitrino/src/vm/VMInterface.h
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/drlvm/trunk/vm/jitrino/src/vm/VMInterface.h?view=diff&rev=468145&r1=468144&r2=468145
==============================================================================
--- incubator/harmony/enhanced/drlvm/trunk/vm/jitrino/src/vm/VMInterface.h (original)
+++ incubator/harmony/enhanced/drlvm/trunk/vm/jitrino/src/vm/VMInterface.h Thu Oct 26 14:30:43 2006
@@ -374,6 +374,7 @@
         Helper_GetTLSBase,    // int *           = f()
         Helper_MethodEntry, // f(MethodHandle)
         Helper_MethodExit,   // f(MethodHandle, void* ret_value)
+        Helper_WriteBarrier,
         Num_Helpers
     };
     //

Modified: incubator/harmony/enhanced/drlvm/trunk/vm/jitrino/src/vm/drl/DrlVMInterface.cpp
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/drlvm/trunk/vm/jitrino/src/vm/drl/DrlVMInterface.cpp?view=diff&rev=468145&r1=468144&r2=468145
==============================================================================
--- incubator/harmony/enhanced/drlvm/trunk/vm/jitrino/src/vm/drl/DrlVMInterface.cpp (original)
+++ incubator/harmony/enhanced/drlvm/trunk/vm/jitrino/src/vm/drl/DrlVMInterface.cpp Thu Oct 26 14:30:43 2006
@@ -592,6 +592,8 @@
     case Helper_ConvDtoI64:            vmHelperId = VM_RT_D2L; break;
     case Helper_MethodEntry:           vmHelperId = VM_RT_JVMTI_METHOD_ENTER_CALLBACK; break;
     case Helper_MethodExit:             vmHelperId = VM_RT_JVMTI_METHOD_EXIT_CALLBACK; break;
+    case Helper_WriteBarrier:          vmHelperId = VM_RT_GC_HEAP_WRITE_REF; break;
+
     default:
         assert(0);
     }
@@ -655,7 +657,8 @@
 CompilationInterface::VmCallingConvention 
 DrlVMCompilationInterface::getRuntimeHelperCallingConvention(RuntimeHelperId id) {
     switch(id) {
-    case Helper_NewMultiArray:         
+    case Helper_NewMultiArray:
+    case Helper_WriteBarrier:
         return CallingConvention_Cdecl;
     case Helper_ShlI64:                
     case Helper_ShrI64:                

Modified: incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/thread/object_generic.cpp
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/thread/object_generic.cpp?view=diff&rev=468145&r1=468144&r2=468145
==============================================================================
--- incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/thread/object_generic.cpp (original)
+++ incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/thread/object_generic.cpp Thu Oct 26 14:30:43 2006
@@ -151,6 +151,9 @@
         exn_raise_object(VM_Global_State::loader_env->java_lang_OutOfMemoryError);
         return NULL;
     }
+    if(gc_requires_barriers())
+        gc_heap_wrote_object(result);
+
     memcpy(result, h->object, size);
     result->set_obj_info(0);
     ObjectHandle new_handle = oh_allocate_local_handle();