changeset 22955:60f01ca8f1bd

Factor out common deopt stub code
author Gilles Duboscq <gilles.m.duboscq@oracle.com>
date Fri, 06 Nov 2015 12:14:51 +0100
parents debc2385369b
children 26618cb3ff27
files graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/stubs/DeoptimizationStub.java graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/stubs/UncommonTrapStub.java
diffstat 2 files changed, 10 insertions(+), 92 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/stubs/DeoptimizationStub.java	Fri Nov 06 13:58:35 2015 +0100
+++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/stubs/DeoptimizationStub.java	Fri Nov 06 12:14:51 2015 +0100
@@ -129,6 +129,10 @@
 
         final Word unrollBlock = fetchUnrollInfo(registerSaver);
 
+        deoptimizationCommon(stackPointerRegister, thread, registerSaver, unrollBlock, deoptimizationUnpackDeopt());
+    }
+
+    static void deoptimizationCommon(Register stackPointerRegister, final Word thread, final long registerSaver, final Word unrollBlock, final int mode) {
         // Pop all the frames we must move/replace.
         //
         // Frame picture (youngest to oldest)
@@ -201,8 +205,6 @@
         final Word senderFp = initialInfo;
         EnterUnpackFramesStackFrameNode.enterUnpackFramesStackFrame(framePc, senderSp, senderFp, registerSaver);
 
-        // Pass unpack deopt mode to unpack frames.
-        final int mode = deoptimizationUnpackDeopt();
         unpackFrames(UNPACK_FRAMES, thread, mode);
 
         LeaveUnpackFramesStackFrameNode.leaveUnpackFramesStackFrame(registerSaver);
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/stubs/UncommonTrapStub.java	Fri Nov 06 13:58:35 2015 +0100
+++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/stubs/UncommonTrapStub.java	Fri Nov 06 12:14:51 2015 +0100
@@ -22,32 +22,19 @@
  */
 package com.oracle.graal.hotspot.stubs;
 
-import static com.oracle.graal.hotspot.HotSpotBackend.UNPACK_FRAMES;
 import static com.oracle.graal.hotspot.HotSpotBackend.Options.PreferGraalStubs;
 import static com.oracle.graal.hotspot.replacements.HotSpotReplacementsUtil.config;
-import static com.oracle.graal.hotspot.replacements.HotSpotReplacementsUtil.pageSize;
 import static com.oracle.graal.hotspot.replacements.HotSpotReplacementsUtil.readPendingDeoptimization;
 import static com.oracle.graal.hotspot.replacements.HotSpotReplacementsUtil.registerAsWord;
-import static com.oracle.graal.hotspot.replacements.HotSpotReplacementsUtil.wordSize;
 import static com.oracle.graal.hotspot.replacements.HotSpotReplacementsUtil.writePendingDeoptimization;
 import static com.oracle.graal.hotspot.replacements.HotSpotReplacementsUtil.writeRegisterAsWord;
-import jdk.vm.ci.code.Register;
-import jdk.vm.ci.code.TargetDescription;
-import jdk.vm.ci.common.JVMCIError;
-import jdk.vm.ci.meta.LocationIdentity;
 
 import com.oracle.graal.api.replacements.Fold;
-import com.oracle.graal.asm.NumUtil;
 import com.oracle.graal.compiler.common.spi.ForeignCallDescriptor;
 import com.oracle.graal.graph.Node.ConstantNodeParameter;
 import com.oracle.graal.graph.Node.NodeIntrinsic;
 import com.oracle.graal.hotspot.HotSpotForeignCallLinkage;
 import com.oracle.graal.hotspot.meta.HotSpotProviders;
-import com.oracle.graal.hotspot.nodes.EnterUnpackFramesStackFrameNode;
-import com.oracle.graal.hotspot.nodes.LeaveCurrentStackFrameNode;
-import com.oracle.graal.hotspot.nodes.LeaveDeoptimizedStackFrameNode;
-import com.oracle.graal.hotspot.nodes.LeaveUnpackFramesStackFrameNode;
-import com.oracle.graal.hotspot.nodes.PushInterpreterFrameNode;
 import com.oracle.graal.hotspot.nodes.SaveAllRegistersNode;
 import com.oracle.graal.hotspot.nodes.StubForeignCallNode;
 import com.oracle.graal.hotspot.nodes.UncommonTrapCallNode;
@@ -56,6 +43,11 @@
 import com.oracle.graal.replacements.Snippet.ConstantParameter;
 import com.oracle.graal.word.Word;
 
+import jdk.vm.ci.code.Register;
+import jdk.vm.ci.code.TargetDescription;
+import jdk.vm.ci.common.JVMCIError;
+import jdk.vm.ci.meta.LocationIdentity;
+
 /**
  * Uncommon trap stub.
  *
@@ -144,83 +136,7 @@
 
         final Word unrollBlock = UncommonTrapCallNode.uncommonTrap(registerSaver, actionAndReason);
 
-        // Pop all the frames we must move/replace.
-        //
-        // Frame picture (youngest to oldest)
-        // 1: self-frame
-        // 2: deoptimizing frame
-        // 3: caller of deoptimizing frame (could be compiled/interpreted).
-
-        // Pop self-frame.
-        LeaveCurrentStackFrameNode.leaveCurrentStackFrame(registerSaver);
-
-        // Load the initial info we should save (e.g. frame pointer).
-        final Word initialInfo = unrollBlock.readWord(deoptimizationUnrollBlockInitialInfoOffset());
-
-        // Pop deoptimized frame.
-        final int sizeOfDeoptimizedFrame = unrollBlock.readInt(deoptimizationUnrollBlockSizeOfDeoptimizedFrameOffset());
-        LeaveDeoptimizedStackFrameNode.leaveDeoptimizedStackFrame(sizeOfDeoptimizedFrame, initialInfo);
-
-        /*
-         * Stack bang to make sure there's enough room for the interpreter frames. Bang stack for
-         * total size of the interpreter frames plus shadow page size. Bang one page at a time
-         * because large sizes can bang beyond yellow and red zones.
-         * 
-         * @deprecated This code should go away as soon as JDK-8032410 hits the Graal repository.
-         */
-        final int totalFrameSizes = unrollBlock.readInt(deoptimizationUnrollBlockTotalFrameSizesOffset());
-        final int bangPages = NumUtil.roundUp(totalFrameSizes, pageSize()) / pageSize() + stackShadowPages();
-        Word stackPointer = readRegister(stackPointerRegister);
-
-        for (int i = 1; i < bangPages; i++) {
-            stackPointer.writeInt((-i * pageSize()) + stackBias(), 0, STACK_BANG_LOCATION);
-        }
-
-        // Load number of interpreter frames.
-        final int numberOfFrames = unrollBlock.readInt(deoptimizationUnrollBlockNumberOfFramesOffset());
-
-        // Load address of array of frame sizes.
-        final Word frameSizes = unrollBlock.readWord(deoptimizationUnrollBlockFrameSizesOffset());
-
-        // Load address of array of frame PCs.
-        final Word framePcs = unrollBlock.readWord(deoptimizationUnrollBlockFramePcsOffset());
-
-        /*
-         * Get the current stack pointer (sender's original SP) before adjustment so that we can
-         * save it in the skeletal interpreter frame.
-         */
-        Word senderSp = readRegister(stackPointerRegister);
-
-        // Adjust old interpreter frame to make space for new frame's extra Java locals.
-        final int callerAdjustment = unrollBlock.readInt(deoptimizationUnrollBlockCallerAdjustmentOffset());
-        writeRegister(stackPointerRegister, readRegister(stackPointerRegister).subtract(callerAdjustment));
-
-        for (int i = 0; i < numberOfFrames; i++) {
-            final Word frameSize = frameSizes.readWord(i * wordSize());
-            final Word framePc = framePcs.readWord(i * wordSize());
-
-            // Push an interpreter frame onto the stack.
-            PushInterpreterFrameNode.pushInterpreterFrame(frameSize, framePc, senderSp, initialInfo);
-
-            // Get the current stack pointer (sender SP) and pass it to next frame.
-            senderSp = readRegister(stackPointerRegister);
-        }
-
-        // Get final return address.
-        final Word framePc = framePcs.readWord(numberOfFrames * wordSize());
-
-        /*
-         * Enter a frame to call out to unpack frames. Since we changed the stack pointer to an
-         * unknown alignment we need to align it here before calling C++ code.
-         */
-        final Word senderFp = initialInfo;
-        EnterUnpackFramesStackFrameNode.enterUnpackFramesStackFrame(framePc, senderSp, senderFp, registerSaver);
-
-        // Pass uncommon trap mode to unpack frames.
-        final int mode = deoptimizationUnpackUncommonTrap();
-        unpackFrames(UNPACK_FRAMES, thread, mode);
-
-        LeaveUnpackFramesStackFrameNode.leaveUnpackFramesStackFrame(registerSaver);
+        DeoptimizationStub.deoptimizationCommon(stackPointerRegister, thread, registerSaver, unrollBlock, deoptimizationUnpackUncommonTrap());
     }
 
     /**