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!");}