Skip to content

Commit 5de6a23

Browse files
[GR-62814] Don't use a base pointer for JIT compiled code and deopt targets.
PullRequest: graal/21490
2 parents a85fb39 + e53d83b commit 5de6a23

File tree

6 files changed

+41
-18
lines changed

6 files changed

+41
-18
lines changed

compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/lir/framemap/FrameMap.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,7 @@ protected int alignFrameSize(int size) {
182182
* be requested.
183183
*/
184184
public void finish() {
185+
GraalError.guarantee(frameSize == -1, "frame size may only be computed once");
185186
frameSize = currentFrameSize();
186187
if (frameSize > getRegisterConfig().getMaximumFrameSize()) {
187188
throw new PermanentBailoutException("Frame size (%d) exceeded maximum allowed frame size (%d).", frameSize, getRegisterConfig().getMaximumFrameSize());

substratevm/src/com.oracle.svm.core.graal.amd64/src/com/oracle/svm/core/graal/amd64/FramePointerPhase.java

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
import java.util.ArrayList;
2828

2929
import com.oracle.svm.core.SubstrateOptions;
30+
import com.oracle.svm.core.SubstrateUtil;
3031
import com.oracle.svm.core.graal.code.SubstrateBackend.SubstrateMarkId;
3132

3233
import jdk.graal.compiler.asm.amd64.AMD64MacroAssembler;
@@ -51,9 +52,13 @@
5152
*
5253
* @see LIRInstruction#modifiesStackPointer
5354
*/
54-
class FramePointerPhase extends PreAllocationOptimizationPhase {
55+
public class FramePointerPhase extends PreAllocationOptimizationPhase {
5556
@Override
5657
protected void run(TargetDescription target, LIRGenerationResult lirGenRes, PreAllocationOptimizationContext context) {
58+
if (!isSupported(lirGenRes)) {
59+
return;
60+
}
61+
5762
LIR lir = lirGenRes.getLIR();
5863
if (!modifiesStackPointer(lir)) {
5964
return;
@@ -101,6 +106,16 @@ protected void run(TargetDescription target, LIRGenerationResult lirGenRes, PreA
101106
}
102107
}
103108

109+
static boolean isSupported(LIRGenerationResult lirGenRes) {
110+
/*
111+
* JIT compilation and deopt targets are not supported, see GR-64771. For these unsupported
112+
* methods, a base pointer is not used, even if there are LIR instructions that modify the
113+
* stack pointer directly.
114+
*/
115+
SubstrateAMD64Backend.SubstrateLIRGenerationResult result = (SubstrateAMD64Backend.SubstrateLIRGenerationResult) lirGenRes;
116+
return SubstrateUtil.HOSTED && !result.getMethod().isDeoptTarget();
117+
}
118+
104119
/** Returns true if any LIR instruction modifies the stack pointer, false otherwise. */
105120
private static boolean modifiesStackPointer(LIR lir) {
106121
for (int blockId : lir.getBlocks()) {

substratevm/src/com.oracle.svm.core.graal.amd64/src/com/oracle/svm/core/graal/amd64/SubstrateAMD64Backend.java

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1151,12 +1151,9 @@ private static ForeignCallDescriptor chooseCPUFeatureVariant(ForeignCallDescript
11511151
* If a method doesn't need a frame pointer, we use the following forms:
11521152
*
11531153
* <pre>
1154-
* | needsFramePointer |
1154+
* | needsFramePointer = false |
11551155
* +---------------------------------+
1156-
* | false |
1157-
* +---------------------------------+
1158-
* | preserveFramePointer |
1159-
* +----------------+----------------+
1156+
* | preserveFramePointer = ... |
11601157
* | false | true |
11611158
* --------+----------------+----------------+
11621159
* | ; prologue | ; prologue |
@@ -1187,12 +1184,9 @@ private static ForeignCallDescriptor chooseCPUFeatureVariant(ForeignCallDescript
11871184
* If a method does need a frame pointer, we use the following forms:
11881185
*
11891186
* <pre>
1190-
* | needsFramePointer |
1191-
* +---------------------------------------------------+
1192-
* | true |
1187+
* | needsFramePointer = true |
11931188
* +---------------------------------------------------+
1194-
* | preserveFramePointer |
1195-
* +-------------------------+-------------------------+
1189+
* | preserveFramePointer = ... |
11961190
* | false | true |
11971191
* --------+-------------------------+-------------------------+
11981192
* | ; prologue | ; prologue |
@@ -1675,7 +1669,7 @@ static class SubstrateAMD64FrameMap extends AMD64FrameMap {
16751669
private boolean needsFramePointer;
16761670

16771671
/** The offset at which the frame pointer save area is located. */
1678-
private int framePointerSaveAreaOffset;
1672+
private int framePointerSaveAreaOffset = -1;
16791673

16801674
SubstrateAMD64FrameMap(CodeCacheProvider codeCache, SubstrateAMD64RegisterConfig registerConfig, ReferenceMapBuilderFactory referenceMapFactory, SharedMethod method) {
16811675
super(codeCache, registerConfig, referenceMapFactory, registerConfig.shouldUseBasePointer());
@@ -1704,6 +1698,7 @@ public void finish() {
17041698
* return address.
17051699
*/
17061700
private void allocateFramePointerSaveArea() {
1701+
assert framePointerSaveAreaOffset == -1;
17071702
int framePointerSaveAreaSize = getTarget().wordSize;
17081703
if (preserveFramePointer()) {
17091704
framePointerSaveAreaSize += returnAddressSize();
@@ -1724,6 +1719,7 @@ boolean needsFramePointer() {
17241719

17251720
int getFramePointerSaveAreaOffset() {
17261721
assert needsFramePointer() : "no frame pointer save area";
1722+
assert framePointerSaveAreaOffset != -1;
17271723
return framePointerSaveAreaOffset;
17281724
}
17291725
}

substratevm/src/com.oracle.svm.core.graal.amd64/src/com/oracle/svm/core/graal/amd64/VerifyFramePointerPhase.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,10 @@
4141
class VerifyFramePointerPhase extends FinalCodeAnalysisPhase {
4242
@Override
4343
protected void run(TargetDescription target, LIRGenerationResult lirGenRes, FinalCodeAnalysisContext context) {
44+
if (!FramePointerPhase.isSupported(lirGenRes)) {
45+
return;
46+
}
47+
4448
LIR lir = lirGenRes.getLIR();
4549
for (int blockId : lir.getBlocks()) {
4650
if (LIR.isBlockDeleted(blockId)) {

substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/graal/code/SharedCompilationResult.java

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -45,16 +45,23 @@ public int getFrameSize() {
4545
return frameSize;
4646
}
4747

48-
public void setFrameSize(int frameSize) {
49-
this.frameSize = frameSize;
48+
public void setFrameSize(int value) {
49+
assert frameSize == -1;
50+
this.frameSize = value;
51+
}
52+
53+
public boolean hasFramePointerSaveAreaOffset() {
54+
return framePointerSaveAreaOffset != -1;
5055
}
5156

5257
public int getFramePointerSaveAreaOffset() {
58+
assert hasFramePointerSaveAreaOffset();
5359
return framePointerSaveAreaOffset;
5460
}
5561

56-
public void setFramePointerSaveAreaOffset(int framePointerSaveAreaOffset) {
57-
this.framePointerSaveAreaOffset = framePointerSaveAreaOffset;
62+
public void setFramePointerSaveAreaOffset(int value) {
63+
assert !hasFramePointerSaveAreaOffset();
64+
this.framePointerSaveAreaOffset = value;
5865
}
5966

6067
public static int getCodeAlignment(CompilationResult compilation) {

substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/image/WindowsUnwindInfoFeature.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -221,8 +221,8 @@ private static void visitRanges(CompilationResult compilation, RangeVisitor visi
221221
return; /* No frame, no unwind info needed. */
222222
}
223223

224-
int framePointerSaveAreaOffset = ((SharedCompilationResult) compilation).getFramePointerSaveAreaOffset();
225-
if (framePointerSaveAreaOffset < 0) {
224+
SharedCompilationResult cr = (SharedCompilationResult) compilation;
225+
if (!cr.hasFramePointerSaveAreaOffset()) {
226226
/* There is no frame pointer, so there is only the primary range. */
227227
visitor.visit(RUNTIME_FUNCTION.PRIMARY_RANGE, START_MARK, compilation.getTargetCodeSize());
228228
return;

0 commit comments

Comments
 (0)