Skip to content

Commit e897193

Browse files
committed
Move FrameAccess.savedBasePointerSize to Deoptimizer
1 parent fb3fd8f commit e897193

File tree

6 files changed

+31
-38
lines changed

6 files changed

+31
-38
lines changed

substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/FrameAccess.java

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -68,13 +68,6 @@ public static int returnAddressSize() {
6868
@Fold
6969
public abstract int stackPointerAdjustmentOnCall();
7070

71-
/**
72-
* Returns the size in bytes of the saved base pointer in the stack frame. The saved base
73-
* pointer must be located immediately after the return address (if this is not the case in a
74-
* new architecture, bigger modifications to code like the Deoptimizer is required).
75-
*/
76-
public abstract int savedBasePointerSize();
77-
7871
@Fold
7972
public static int wordSize() {
8073
return ConfigurationValues.getTarget().arch.getWordSize();

substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/aarch64/AArch64FrameAccess.java

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@
2424
*/
2525
package com.oracle.svm.core.aarch64;
2626

27-
import jdk.graal.compiler.api.replacements.Fold;
2827
import org.graalvm.nativeimage.Platform;
2928
import org.graalvm.nativeimage.Platforms;
3029
import org.graalvm.nativeimage.c.function.CodePointer;
@@ -36,6 +35,8 @@
3635
import com.oracle.svm.core.feature.AutomaticallyRegisteredImageSingleton;
3736
import com.oracle.svm.core.graal.nodes.aarch64.AArch64XPACNode;
3837

38+
import jdk.graal.compiler.api.replacements.Fold;
39+
3940
@AutomaticallyRegisteredImageSingleton(FrameAccess.class)
4041
@Platforms(Platform.AARCH64.class)
4142
public class AArch64FrameAccess extends FrameAccess {
@@ -63,13 +64,6 @@ public Pointer getReturnAddressLocation(Pointer sourceSp) {
6364
return sourceSp.subtract(returnAddressSize());
6465
}
6566

66-
@Fold
67-
@Override
68-
public int savedBasePointerSize() {
69-
// The base pointer is always saved with stp instruction on method entry
70-
return wordSize();
71-
}
72-
7367
@Override
7468
@Fold
7569
public int stackPointerAdjustmentOnCall() {

substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/amd64/AMD64FrameAccess.java

Lines changed: 2 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -24,17 +24,17 @@
2424
*/
2525
package com.oracle.svm.core.amd64;
2626

27-
import jdk.graal.compiler.api.replacements.Fold;
2827
import org.graalvm.nativeimage.Platform.AMD64;
2928
import org.graalvm.nativeimage.Platforms;
3029
import org.graalvm.nativeimage.c.function.CodePointer;
3130
import org.graalvm.word.Pointer;
3231

3332
import com.oracle.svm.core.FrameAccess;
34-
import com.oracle.svm.core.SubstrateOptions;
3533
import com.oracle.svm.core.Uninterruptible;
3634
import com.oracle.svm.core.feature.AutomaticallyRegisteredImageSingleton;
3735

36+
import jdk.graal.compiler.api.replacements.Fold;
37+
3838
@AutomaticallyRegisteredImageSingleton(FrameAccess.class)
3939
@Platforms(AMD64.class)
4040
public final class AMD64FrameAccess extends FrameAccess {
@@ -58,16 +58,6 @@ public Pointer getReturnAddressLocation(Pointer sourceSp) {
5858
return sourceSp.subtract(returnAddressSize());
5959
}
6060

61-
@Fold
62-
@Override
63-
public int savedBasePointerSize() {
64-
if (SubstrateOptions.PreserveFramePointer.getValue()) {
65-
return wordSize();
66-
} else {
67-
return 0;
68-
}
69-
}
70-
7161
@Override
7262
@Fold
7363
public int stackPointerAdjustmentOnCall() {

substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/deopt/Deoptimizer.java

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,9 @@
3333
import java.util.ArrayList;
3434

3535
import org.graalvm.nativeimage.CurrentIsolate;
36+
import org.graalvm.nativeimage.ImageSingletons;
3637
import org.graalvm.nativeimage.IsolateThread;
38+
import org.graalvm.nativeimage.Platform;
3739
import org.graalvm.nativeimage.c.function.CodePointer;
3840
import org.graalvm.word.Pointer;
3941
import org.graalvm.word.PointerBase;
@@ -82,6 +84,7 @@
8284
import com.oracle.svm.core.util.TimeUtils;
8385
import com.oracle.svm.core.util.VMError;
8486

87+
import jdk.graal.compiler.api.replacements.Fold;
8588
import jdk.graal.compiler.core.common.NumUtil;
8689
import jdk.graal.compiler.core.common.util.TypeConversion;
8790
import jdk.graal.compiler.options.Option;
@@ -611,7 +614,7 @@ private static UnsignedWord rewriteStackStub(Pointer newSp, UnsignedWord gpRetur
611614
* deoptimizeInRange(). So when this method returns we are inside the caller of
612615
* deoptimizeInRange().
613616
*/
614-
Pointer bottomSp = newSp.subtract(FrameAccess.returnAddressSize() + FrameAccess.singleton().savedBasePointerSize());
617+
Pointer bottomSp = newSp.subtract(FrameAccess.returnAddressSize() + savedBasePointerSize());
615618
frame.getTargetContent().copyToPointer(bottomSp);
616619

617620
if (DeoptimizationCounters.Options.ProfileDeoptimization.getValue()) {
@@ -621,6 +624,25 @@ private static UnsignedWord rewriteStackStub(Pointer newSp, UnsignedWord gpRetur
621624
return gpReturnValue;
622625
}
623626

627+
/**
628+
* Returns the size in bytes of the saved base pointer in the stack frame. The saved base
629+
* pointer must be located immediately after the return address (if this is not the case in a
630+
* new architecture, bigger modifications to the Deoptimizer code are required).
631+
*/
632+
@Fold
633+
static int savedBasePointerSize() {
634+
if (Platform.includedIn(Platform.AMD64.class)) {
635+
return SubstrateOptions.PreserveFramePointer.getValue() ? FrameAccess.wordSize() : 0;
636+
} else if (Platform.includedIn(Platform.AARCH64.class)) {
637+
// The base pointer is always saved with stp instruction on method entry
638+
return FrameAccess.wordSize();
639+
} else if (Platform.includedIn(Platform.RISCV64.class)) {
640+
// The base pointer is always pushed on the stack on method entry
641+
return FrameAccess.wordSize();
642+
}
643+
throw VMError.shouldNotReachHere("Unexpected platform: " + ImageSingletons.lookup(Platform.class));
644+
}
645+
624646
/**
625647
* Reads the value of a local variable in the given frame. If the local variable is a virtual
626648
* object, the object (and all other objects reachable from it) are materialized.
@@ -799,7 +821,7 @@ public static void logRecentDeoptimizationEvents(Log log) {
799821
*/
800822
private VirtualFrame constructTargetFrame(CodeInfoQueryResult targetInfo, FrameInfoQueryResult sourceFrame) {
801823
FrameInfoQueryResult targetFrame = targetInfo.getFrameInfo();
802-
int savedBasePointerSize = FrameAccess.singleton().savedBasePointerSize();
824+
int savedBasePointerSize = savedBasePointerSize();
803825
int targetFrameSize = NumUtil.safeToInt(targetInfo.getTotalFrameSize()) - FrameAccess.returnAddressSize() - savedBasePointerSize;
804826
VirtualFrame result = new VirtualFrame(targetFrame);
805827

substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jfr/sampler/AbstractJfrExecutionSampler.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -332,7 +332,7 @@ private static void doUninterruptibleStackWalk(SamplerSampleWriterData data, Poi
332332
* We are in the prologue or epilogue. Frame pointer and return address are on top
333333
* of the stack.
334334
*/
335-
callerSP = sp.add(FrameAccess.wordSize()).add(FrameAccess.singleton().savedBasePointerSize());
335+
callerSP = sp.add(FrameAccess.wordSize()).add(FrameAccess.wordSize());
336336
}
337337
} else {
338338
/* We are in the prologue or epilogue. Return address is at the top of the stack. */

substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/riscv64/RISCV64FrameAccess.java

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@
2424
*/
2525
package com.oracle.svm.core.riscv64;
2626

27-
import jdk.graal.compiler.api.replacements.Fold;
2827
import org.graalvm.nativeimage.Platform;
2928
import org.graalvm.nativeimage.Platforms;
3029
import org.graalvm.nativeimage.c.function.CodePointer;
@@ -34,6 +33,8 @@
3433
import com.oracle.svm.core.Uninterruptible;
3534
import com.oracle.svm.core.feature.AutomaticallyRegisteredImageSingleton;
3635

36+
import jdk.graal.compiler.api.replacements.Fold;
37+
3738
@AutomaticallyRegisteredImageSingleton(FrameAccess.class)
3839
@Platforms(Platform.RISCV64.class)
3940
public class RISCV64FrameAccess extends FrameAccess {
@@ -56,13 +57,6 @@ public Pointer getReturnAddressLocation(Pointer sourceSp) {
5657
return sourceSp.subtract(returnAddressSize());
5758
}
5859

59-
@Fold
60-
@Override
61-
public int savedBasePointerSize() {
62-
// The base pointer is always pushed on the stack on method entry
63-
return wordSize();
64-
}
65-
6660
@Override
6761
@Fold
6862
public int stackPointerAdjustmentOnCall() {

0 commit comments

Comments
 (0)