# HG changeset patch # User Gilles Duboscq # Date 1396531581 -7200 # Node ID be6fc21b25f8d77c4391bac28478be2c89ae3291 # Parent eabad1ea62ce31e77b5676b508578c323fbfb981 Add possibility to have HotSpot linkages which are LEAF but still require a last_java_sp diff -r eabad1ea62ce -r be6fc21b25f8 graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotLIRGenerator.java --- a/graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotLIRGenerator.java Thu Apr 03 14:54:08 2014 +0200 +++ b/graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotLIRGenerator.java Thu Apr 03 15:26:21 2014 +0200 @@ -189,7 +189,8 @@ @Override public Variable emitForeignCall(ForeignCallLinkage linkage, DeoptimizingNode info, Value... args) { - boolean destroysRegisters = linkage.destroysRegisters(); + HotSpotForeignCallLinkage hotspotLinkage = (HotSpotForeignCallLinkage) linkage; + boolean destroysRegisters = hotspotLinkage.destroysRegisters(); AMD64SaveRegistersOp save = null; StackSlot[] savedRegisterLocations = null; @@ -210,15 +211,20 @@ } Variable result; + DeoptimizingNode deoptInfo = null; + if (hotspotLinkage.canDeoptimize()) { + deoptInfo = info; + assert deoptInfo != null || getStub() != null; + assert hotspotLinkage.needsJavaFrameAnchor(); + } - if (linkage.canDeoptimize()) { - assert info != null || ((AMD64HotSpotLIRGenerationResult) getResult()).getStub() != null; + if (hotspotLinkage.needsJavaFrameAnchor()) { Register thread = getProviders().getRegisters().getThreadRegister(); append(new AMD64HotSpotCRuntimeCallPrologueOp(config.threadLastJavaSpOffset(), thread)); - result = super.emitForeignCall(linkage, info, args); + result = super.emitForeignCall(hotspotLinkage, deoptInfo, args); append(new AMD64HotSpotCRuntimeCallEpilogueOp(config.threadLastJavaSpOffset(), config.threadLastJavaFpOffset(), thread)); } else { - result = super.emitForeignCall(linkage, info, args); + result = super.emitForeignCall(hotspotLinkage, deoptInfo, args); } if (destroysRegisters) { diff -r eabad1ea62ce -r be6fc21b25f8 graal/com.oracle.graal.hotspot.sparc/src/com/oracle/graal/hotspot/sparc/SPARCHotSpotLIRGenerator.java --- a/graal/com.oracle.graal.hotspot.sparc/src/com/oracle/graal/hotspot/sparc/SPARCHotSpotLIRGenerator.java Thu Apr 03 14:54:08 2014 +0200 +++ b/graal/com.oracle.graal.hotspot.sparc/src/com/oracle/graal/hotspot/sparc/SPARCHotSpotLIRGenerator.java Thu Apr 03 15:26:21 2014 +0200 @@ -80,18 +80,23 @@ @Override public Variable emitForeignCall(ForeignCallLinkage linkage, DeoptimizingNode info, Value... args) { + HotSpotForeignCallLinkage hotspotLinkage = (HotSpotForeignCallLinkage) linkage; Variable result; + DeoptimizingNode deoptInfo = null; + if (hotspotLinkage.canDeoptimize()) { + deoptInfo = info; + assert deoptInfo != null || getStub() != null; + } - if (linkage.canDeoptimize()) { - assert info != null || getStub() != null; + if (hotspotLinkage.needsJavaFrameAnchor()) { HotSpotRegistersProvider registers = getProviders().getRegisters(); Register thread = registers.getThreadRegister(); Register stackPointer = registers.getStackPointerRegister(); append(new SPARCHotSpotCRuntimeCallPrologueOp(config.threadLastJavaSpOffset(), thread, stackPointer)); - result = super.emitForeignCall(linkage, info, args); + result = super.emitForeignCall(hotspotLinkage, deoptInfo, args); append(new SPARCHotSpotCRuntimeCallEpilogueOp(config.threadLastJavaSpOffset(), config.threadLastJavaPcOffset(), config.threadJavaFrameAnchorFlagsOffset(), thread)); } else { - result = super.emitForeignCall(linkage, null, args); + result = super.emitForeignCall(hotspotLinkage, deoptInfo, args); } return result; diff -r eabad1ea62ce -r be6fc21b25f8 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/HotSpotForeignCallLinkage.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/HotSpotForeignCallLinkage.java Thu Apr 03 14:54:08 2014 +0200 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/HotSpotForeignCallLinkage.java Thu Apr 03 15:26:21 2014 +0200 @@ -58,6 +58,7 @@ public enum Transition { LEAF_NOFP, LEAF, + LEAF_SP, NOT_LEAF; } @@ -110,7 +111,7 @@ /** * Creates a {@link HotSpotForeignCallLinkage}. - * + * * @param descriptor the descriptor of the call * @param address the address of the code to call * @param effect specifies if the call destroys or preserves all registers (apart from @@ -264,4 +265,8 @@ public boolean mayContainFP() { return transition != Transition.LEAF_NOFP; } + + public boolean needsJavaFrameAnchor() { + return canDeoptimize() || transition == Transition.LEAF_SP; + } }