Index: build/make/deploy.xml =================================================================== --- build/make/deploy.xml (revision 488511) +++ build/make/deploy.xml (working copy) @@ -51,6 +51,7 @@ bin/default:gc_gen + bin/default:gc_gen Index: vm/jitrino/src/codegenerator/ia32/Ia32InstCodeSelector.cpp =================================================================== --- vm/jitrino/src/codegenerator/ia32/Ia32InstCodeSelector.cpp (revision 488511) +++ vm/jitrino/src/codegenerator/ia32/Ia32InstCodeSelector.cpp (working copy) @@ -2885,6 +2885,7 @@ case CompilationInterface::Helper_NewVector_UsingVtable: case CompilationInterface::Helper_ObjMonitorEnter: case CompilationInterface::Helper_ObjMonitorExit: + case CompilationInterface::Helper_WriteBarrier: { dstOpnd = retType==NULL ? NULL: irManager.newOpnd(retType); CallInst * callInst=irManager.newRuntimeHelperCallInst(callId, numArgs, (Opnd**)args, dstOpnd); Index: vm/jitrino/src/codegenerator/ia32/Ia32Printer.cpp =================================================================== --- vm/jitrino/src/codegenerator/ia32/Ia32Printer.cpp (revision 488511) +++ vm/jitrino/src/codegenerator/ia32/Ia32Printer.cpp (working copy) @@ -1186,6 +1186,11 @@ assert(irManager->getLiveAtEntry(node)->isEqual(*lsCurrent)); +#ifdef _DEBUG + BitSet* entrySet = irManager->getLiveAtEntry(node); + assert(entrySet->isEqual(*lsCurrent)); +#endif + StlVector opndsAll(mm); for (uint32 i=0, n=irManager->getOpndCount(); i= flags.wb_hotnessPercentToInline) { + helperInliners.push_back(new (tmpMM) WriteBarrierHelperInliner(this, tmpMM, cc, inst)); + } + break; + default: break; } } @@ -268,7 +280,7 @@ //add all methods with pragma inline into the list. const Nodes& nodesInRegion = regionToInline->getIRManager().getFlowGraph().getNodes(); for (Nodes::const_iterator it = nodesInRegion.begin(), end = nodesInRegion.end(); it!=end; ++it) { - Node* node = *it; + Node* node = *it; for (Inst* inst = (Inst*)node->getFirstInst(); inst!=NULL; inst = inst->getNextInst()) { if (inst->isMethodCall()) { MethodCallInst* methodCall = inst->asMethodCallInst(); @@ -448,5 +460,48 @@ #endif } +void WriteBarrierHelperInliner::doInline() { +#if defined (_EM64T_) || defined (_IPF_) + return; +#else + assert(inst->getOpcode() == Op_TauStRef); + + Opnd* srcOpnd = inst->getSrc(0); + Opnd* ptrOpnd = inst->getSrc(1); + Opnd* objBaseOpnd = inst->getSrc(2); + assert(srcOpnd->getType()->isObject()); + assert(ptrOpnd->getType()->isPtr()); + assert(objBaseOpnd->getType()->isObject()); + Opnd* tauSafeOpnd = opndManager->createSsaTmpOpnd(typeManager->getTauType()); + instFactory->makeTauSafe(tauSafeOpnd)->insertBefore(inst); + Opnd* args[3] = {objBaseOpnd, ptrOpnd, srcOpnd}; + MethodCallInst* call = instFactory->makeDirectCall(opndManager->getNullOpnd(), tauSafeOpnd, tauSafeOpnd, 3, args, method)->asMethodCallInst(); + call->insertBefore(inst); + inst->unlink(); + + if (call != call->getNode()->getLastInst()) { + cfg->splitNodeAtInstruction(call, true, true, instFactory->makeLabel()); + } + + //every call must have exception edge -> add it + if (call->getNode()->getExceptionEdge() == NULL) { + Node* node = call->getNode(); + Node* dispatchNode = node->getUnconditionalEdgeTarget()->getExceptionEdgeTarget(); + if (dispatchNode == NULL) { + dispatchNode = cfg->getUnwindNode(); + if (dispatchNode == NULL) { + dispatchNode = cfg->createDispatchNode(instFactory->makeLabel()); + cfg->setUnwindNode(dispatchNode); + cfg->addEdge(dispatchNode, cfg->getExitNode()); + } + } + cfg->addEdge(node, dispatchNode); + } + + inlineVMHelper(call); +#endif +} + + }//namespace Index: vm/jitrino/src/optimizer/inliner.cpp =================================================================== --- vm/jitrino/src/optimizer/inliner.cpp (revision 488511) +++ vm/jitrino/src/optimizer/inliner.cpp (working copy) @@ -516,7 +516,15 @@ { Opnd* dst = inst->getDst(); Opnd* src = callInst->getSrc(j+2); // omit taus - Inst* copy = _instFactory.makeCopy(dst, src); + Inst* copy = NULL; + // todo: make translators isMagicClass and convertMagic2HIRType methods public + // use these methods here + if (dst->getType()->isUnmanagedPtr()==src->getType()->isUnmanagedPtr()) { + copy = _instFactory.makeCopy(dst, src); + } else { + Modifier mod = Modifier(Overflow_None)|Modifier(Exception_Never)|Modifier(Strict_No); + copy = _instFactory.makeConv(mod, dst->getType()->tag, dst, src); + } copy->insertBefore(inst); inst->unlink(); inst = copy; Index: vm/jitrino/src/optimizer/Inst.cpp =================================================================== --- vm/jitrino/src/optimizer/Inst.cpp (revision 488511) +++ vm/jitrino/src/optimizer/Inst.cpp (working copy) @@ -1876,8 +1876,8 @@ // conversion Inst* InstFactory::makeConv(Modifier mod, Type::Tag toType, Opnd* dst, Opnd* src) { Opcode opcode = Op_Conv; - if (dst->getType()->isUnmanagedPtr() && src->getType()->isObject() - || dst->getType()->isObject() && src->getType()->isUnmanagedPtr()) + if ((dst->getType()->isUnmanagedPtr() && src->getType()->isObject()) + || (dst->getType()->isObject() && src->getType()->isUnmanagedPtr())) { opcode = Op_ConvUnmanaged; } Index: vm/jitrino/src/translator/java/JavaByteCodeTranslator.cpp =================================================================== --- vm/jitrino/src/translator/java/JavaByteCodeTranslator.cpp (revision 488511) +++ vm/jitrino/src/translator/java/JavaByteCodeTranslator.cpp (working copy) @@ -3973,6 +3973,12 @@ return; } + if (!strcmp(mname,"writeBarrier")) { + assert(numArgs == 3); + irBuilder.genVMHelperCall(CompilationInterface::Helper_WriteBarrier, resType, numArgs, srcOpnds); + return; + } + assert(0); } Index: vm/vmcore/src/kernel_classes/javasrc/org/apache/harmony/drlvm/VMHelper.java =================================================================== --- vm/vmcore/src/kernel_classes/javasrc/org/apache/harmony/drlvm/VMHelper.java (revision 488511) +++ vm/vmcore/src/kernel_classes/javasrc/org/apache/harmony/drlvm/VMHelper.java (working copy) @@ -38,6 +38,7 @@ public static void monitorExit(Object obj) {fail();} + public static void writeBarrier(Address objBase, Address objSlot, Address source) {fail();} protected static void fail() {throw new RuntimeException("Not supported!");}