Skip to content

Commit 0da3d8f

Browse files
committed
[GR-62462] Make enter- and leavestub for interpreter uninterruptible
PullRequest: graal/20124
2 parents 4fdd52a + 55e5cc8 commit 0da3d8f

File tree

32 files changed

+836
-265
lines changed

32 files changed

+836
-265
lines changed

substratevm/src/com.oracle.svm.core.genscavenge/src/com/oracle/svm/core/genscavenge/GCImpl.java

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,6 @@
5656
import com.oracle.svm.core.code.CodeInfoTable;
5757
import com.oracle.svm.core.code.RuntimeCodeInfoAccess;
5858
import com.oracle.svm.core.code.RuntimeCodeInfoMemory;
59-
import com.oracle.svm.core.deopt.DeoptimizationSlotPacking;
6059
import com.oracle.svm.core.deopt.DeoptimizedFrame;
6160
import com.oracle.svm.core.deopt.Deoptimizer;
6261
import com.oracle.svm.core.genscavenge.AlignedHeapChunk.AlignedHeader;
@@ -87,7 +86,6 @@
8786
import com.oracle.svm.core.heap.UninterruptibleObjectVisitor;
8887
import com.oracle.svm.core.heap.VMOperationInfos;
8988
import com.oracle.svm.core.imagelayer.ImageLayerBuildingSupport;
90-
import com.oracle.svm.core.interpreter.InterpreterSupport;
9189
import com.oracle.svm.core.jdk.RuntimeSupport;
9290
import com.oracle.svm.core.jfr.JfrGCWhen;
9391
import com.oracle.svm.core.jfr.JfrTicks;
@@ -797,14 +795,7 @@ private static void walkStack(IsolateThread thread, JavaStackWalk walk, ObjectRe
797795
CodeInfo codeInfo = CodeInfoAccess.unsafeConvert(frame.getIPCodeInfo());
798796

799797
if (JavaFrames.isInterpreterLeaveStub(frame)) {
800-
/*
801-
* Variable frame size is packed into the first stack slot used for argument
802-
* passing (re-use of deopt slot).
803-
*/
804-
long varStackSize = DeoptimizationSlotPacking.decodeVariableFrameSizeFromDeoptSlot(sp.readLong(0));
805-
Pointer actualSP = sp.add(Word.unsigned(varStackSize));
806-
807-
InterpreterSupport.walkInterpreterLeaveStubFrame(visitor, actualSP, sp);
798+
/* nothing to scan */
808799
} else {
809800
NonmovableArray<Byte> referenceMapEncoding = CodeInfoAccess.getStackReferenceMapEncoding(codeInfo);
810801
long referenceMapIndex = frame.getReferenceMapIndex();

substratevm/src/com.oracle.svm.core.genscavenge/src/com/oracle/svm/core/genscavenge/StackVerifier.java

Lines changed: 1 addition & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -34,13 +34,10 @@
3434
import com.oracle.svm.core.NeverInline;
3535
import com.oracle.svm.core.code.CodeInfo;
3636
import com.oracle.svm.core.code.CodeInfoTable;
37-
import com.oracle.svm.core.deopt.DeoptimizationSlotPacking;
3837
import com.oracle.svm.core.deopt.DeoptimizedFrame;
3938
import com.oracle.svm.core.heap.ObjectReferenceVisitor;
4039
import com.oracle.svm.core.heap.RestrictHeapAccess;
41-
import com.oracle.svm.core.interpreter.InterpreterSupport;
4240
import com.oracle.svm.core.snippets.KnownIntrinsics;
43-
import com.oracle.svm.core.stack.JavaFrames;
4441
import com.oracle.svm.core.stack.JavaStackWalker;
4542
import com.oracle.svm.core.stack.StackFrameVisitor;
4643
import com.oracle.svm.core.thread.VMThreads;
@@ -96,14 +93,7 @@ public void initialize(IsolateThread thread) {
9693
@RestrictHeapAccess(access = RestrictHeapAccess.Access.NO_ALLOCATION, reason = "Must not allocate while verifying the stack.")
9794
public boolean visitRegularFrame(Pointer currentSP, CodePointer currentIP, CodeInfo codeInfo) {
9895
verifyFrameReferencesVisitor.initialize(thread, currentSP, currentIP);
99-
if (JavaFrames.isInterpreterLeaveStub(currentIP)) {
100-
// This should probably be handled in JavaStackWalker GR-71827
101-
long varStackSize = DeoptimizationSlotPacking.decodeVariableFrameSizeFromDeoptSlot(currentSP.readLong(0));
102-
Pointer actualSP = currentSP.add(Word.unsigned(varStackSize));
103-
InterpreterSupport.walkInterpreterLeaveStubFrame(verifyFrameReferencesVisitor, actualSP, currentSP);
104-
} else {
105-
CodeInfoTable.visitObjectReferences(currentSP, currentIP, codeInfo, verifyFrameReferencesVisitor);
106-
}
96+
CodeInfoTable.visitObjectReferences(currentSP, currentIP, codeInfo, verifyFrameReferencesVisitor);
10797
result &= verifyFrameReferencesVisitor.result;
10898
return true;
10999
}

substratevm/src/com.oracle.svm.core.graal.aarch64/src/com/oracle/svm/core/graal/aarch64/AArch64InterpreterStubs.java

Lines changed: 52 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -24,33 +24,11 @@
2424
*/
2525
package com.oracle.svm.core.graal.aarch64;
2626

27-
import com.oracle.svm.core.c.struct.OffsetOf;
28-
import com.oracle.svm.core.deopt.DeoptimizationSlotPacking;
29-
import com.oracle.svm.core.graal.code.InterpreterAccessStubData;
30-
import com.oracle.svm.core.meta.SharedMethod;
31-
import com.oracle.svm.core.util.VMError;
32-
import jdk.graal.compiler.api.replacements.Fold;
33-
import jdk.graal.compiler.asm.Label;
34-
import jdk.graal.compiler.asm.aarch64.AArch64Address;
35-
import jdk.graal.compiler.asm.aarch64.AArch64MacroAssembler;
36-
import jdk.graal.compiler.core.common.NumUtil;
37-
import jdk.graal.compiler.lir.asm.CompilationResultBuilder;
38-
import jdk.graal.compiler.word.Word;
39-
import jdk.vm.ci.aarch64.AArch64;
40-
import jdk.vm.ci.code.Register;
41-
import jdk.vm.ci.code.RegisterValue;
42-
import jdk.vm.ci.code.StackSlot;
43-
import jdk.vm.ci.meta.AllocatableValue;
44-
import org.graalvm.nativeimage.c.struct.RawField;
45-
import org.graalvm.nativeimage.c.struct.RawStructure;
46-
import org.graalvm.nativeimage.c.struct.SizeOf;
47-
import org.graalvm.word.Pointer;
48-
import org.graalvm.word.PointerBase;
49-
27+
import static com.oracle.svm.core.Uninterruptible.CALLED_FROM_UNINTERRUPTIBLE_CODE;
28+
import static jdk.graal.compiler.asm.aarch64.AArch64Address.createImmediateAddress;
5029
import static jdk.graal.compiler.asm.aarch64.AArch64Address.AddressingMode.IMMEDIATE_POST_INDEXED;
5130
import static jdk.graal.compiler.asm.aarch64.AArch64Address.AddressingMode.IMMEDIATE_SIGNED_UNSCALED;
5231
import static jdk.graal.compiler.asm.aarch64.AArch64Address.AddressingMode.IMMEDIATE_UNSIGNED_SCALED;
53-
import static jdk.graal.compiler.asm.aarch64.AArch64Address.createImmediateAddress;
5432
import static jdk.vm.ci.aarch64.AArch64.r0;
5533
import static jdk.vm.ci.aarch64.AArch64.r1;
5634
import static jdk.vm.ci.aarch64.AArch64.r2;
@@ -69,6 +47,30 @@
6947
import static jdk.vm.ci.aarch64.AArch64.v6;
7048
import static jdk.vm.ci.aarch64.AArch64.v7;
7149

50+
import org.graalvm.nativeimage.c.struct.RawField;
51+
import org.graalvm.nativeimage.c.struct.RawStructure;
52+
import org.graalvm.nativeimage.c.struct.SizeOf;
53+
import org.graalvm.word.Pointer;
54+
import org.graalvm.word.PointerBase;
55+
56+
import com.oracle.svm.core.Uninterruptible;
57+
import com.oracle.svm.core.c.struct.OffsetOf;
58+
import com.oracle.svm.core.deopt.DeoptimizationSlotPacking;
59+
import com.oracle.svm.core.graal.code.InterpreterAccessStubData;
60+
import com.oracle.svm.core.graal.code.PreparedArgumentType;
61+
import com.oracle.svm.core.meta.SharedMethod;
62+
import com.oracle.svm.core.util.VMError;
63+
64+
import jdk.graal.compiler.api.replacements.Fold;
65+
import jdk.graal.compiler.asm.Label;
66+
import jdk.graal.compiler.asm.aarch64.AArch64Address;
67+
import jdk.graal.compiler.asm.aarch64.AArch64MacroAssembler;
68+
import jdk.graal.compiler.core.common.NumUtil;
69+
import jdk.graal.compiler.lir.asm.CompilationResultBuilder;
70+
import jdk.graal.compiler.word.Word;
71+
import jdk.vm.ci.aarch64.AArch64;
72+
import jdk.vm.ci.code.Register;
73+
7274
public class AArch64InterpreterStubs {
7375

7476
public static final Register TRAMPOLINE_ARGUMENT = AArch64.r12;
@@ -150,16 +152,12 @@ public void enter(CompilationResultBuilder crb) {
150152
super.enter(crb);
151153
AArch64MacroAssembler masm = (AArch64MacroAssembler) crb.asm;
152154

153-
/* sp points to four reserved stack slots for this stub */
155+
/* sp points to two reserved stack slots for this stub */
154156

155157
/* Pointer to InterpreterData struct */
156158
masm.str(64, r1, createImmediateAddress(64, IMMEDIATE_UNSIGNED_SCALED, sp, 0));
157159
/* Variable stack size */
158160
masm.str(64, r2, createImmediateAddress(64, IMMEDIATE_UNSIGNED_SCALED, sp, 8));
159-
/* gcReferenceMap next */
160-
masm.str(64, r3, createImmediateAddress(64, IMMEDIATE_UNSIGNED_SCALED, sp, 16));
161-
162-
/* 4th slot is for stack alignment to 0x10 */
163161

164162
masm.sub(64, sp, sp, r2 /* variable stack size */);
165163
}
@@ -260,11 +258,8 @@ public static int additionalFrameSizeEnterStub() {
260258

261259
public static int additionalFrameSizeLeaveStub() {
262260
int wordSize = 8;
263-
/*
264-
* reserve four slots for: base address of outgoing stack args, variable stack size,
265-
* gcReferenceMap, padding
266-
*/
267-
return 4 * wordSize;
261+
// reserve two slots for: base address of outgoing stack args and variable stack size.
262+
return 2 * wordSize;
268263
}
269264

270265
@RawStructure
@@ -509,7 +504,8 @@ public void setSp(Pointer data, int stackSize, Pointer stackBuffer) {
509504
}
510505

511506
@Override
512-
public long getGpArgumentAt(AllocatableValue ccArg, Pointer data, int pos) {
507+
@Uninterruptible(reason = REASON_RAW_POINTER, callerMustBe = true)
508+
public long getGpArgumentAt(PreparedArgumentType cArgType, Pointer data, int pos) {
513509
InterpreterDataAArch64 p = (InterpreterDataAArch64) data;
514510
return switch (pos) {
515511
case 0 -> p.getAbiGpArg0();
@@ -521,18 +517,19 @@ public long getGpArgumentAt(AllocatableValue ccArg, Pointer data, int pos) {
521517
case 6 -> p.getAbiGpArg6();
522518
case 7 -> p.getAbiGpArg7();
523519
default -> {
524-
StackSlot stackSlot = (StackSlot) ccArg;
520+
VMError.guarantee(cArgType.isStackSlot());
525521
Pointer spVal = Word.pointer(p.getAbiSpReg());
526-
yield spVal.readLong(stackSlot.getOffset(0));
522+
yield spVal.readLong(cArgType.getStackOffset());
527523
}
528524
};
529525
}
530526

531527
@Override
532-
public long setGpArgumentAt(AllocatableValue ccArg, Pointer data, int pos, long val) {
528+
@Uninterruptible(reason = REASON_RAW_POINTER, callerMustBe = true)
529+
public void setGpArgumentAt(PreparedArgumentType cArgType, Pointer data, int pos, long val, boolean incoming) {
533530
InterpreterDataAArch64 p = (InterpreterDataAArch64) data;
534531
if (pos >= 0 && pos <= 7) {
535-
VMError.guarantee(ccArg instanceof RegisterValue);
532+
VMError.guarantee(cArgType.isRegister());
536533
switch (pos) {
537534
case 0 -> p.setAbiGpArg0(val);
538535
case 1 -> p.setAbiGpArg1(val);
@@ -543,24 +540,21 @@ public long setGpArgumentAt(AllocatableValue ccArg, Pointer data, int pos, long
543540
case 6 -> p.setAbiGpArg6(val);
544541
case 7 -> p.setAbiGpArg7(val);
545542
}
546-
/* no GC mask required */
547-
return 0;
543+
return;
548544
}
549-
StackSlot stackSlot = (StackSlot) ccArg;
545+
VMError.guarantee(cArgType.isStackSlot());
550546

551547
Pointer spVal = Word.pointer(p.getAbiSpReg());
552-
int offset = stackSlot.getOffset(0);
548+
int offset = cArgType.getStackOffset();
553549
VMError.guarantee(spVal.isNonNull());
554-
VMError.guarantee(offset < p.getStackSize());
550+
VMError.guarantee(incoming || offset < p.getStackSize());
555551

556552
spVal.writeLong(offset, val);
557-
558-
VMError.guarantee((pos - 8) < Long.SIZE, "more than 64 stack args are not supported");
559-
return 1L << (pos - 8);
560553
}
561554

562555
@Override
563-
public long getFpArgumentAt(AllocatableValue ccArg, Pointer data, int pos) {
556+
@Uninterruptible(reason = CALLED_FROM_UNINTERRUPTIBLE_CODE, mayBeInlined = true)
557+
public long getFpArgumentAt(PreparedArgumentType cArgType, Pointer data, int pos) {
564558
InterpreterDataAArch64 p = (InterpreterDataAArch64) data;
565559
return switch (pos) {
566560
case 0 -> p.getAbiFpArg0();
@@ -572,15 +566,16 @@ public long getFpArgumentAt(AllocatableValue ccArg, Pointer data, int pos) {
572566
case 6 -> p.getAbiFpArg6();
573567
case 7 -> p.getAbiFpArg7();
574568
default -> {
575-
StackSlot stackSlot = (StackSlot) ccArg;
569+
VMError.guarantee(cArgType.isStackSlot());
576570
Pointer spVal = Word.pointer(p.getAbiSpReg());
577-
yield spVal.readLong(stackSlot.getOffset(0));
571+
yield spVal.readLong(cArgType.getStackOffset());
578572
}
579573
};
580574
}
581575

582576
@Override
583-
public void setFpArgumentAt(AllocatableValue ccArg, Pointer data, int pos, long val) {
577+
@Uninterruptible(reason = CALLED_FROM_UNINTERRUPTIBLE_CODE, mayBeInlined = true)
578+
public void setFpArgumentAt(PreparedArgumentType cArgType, Pointer data, int pos, long val) {
584579
InterpreterDataAArch64 p = (InterpreterDataAArch64) data;
585580
switch (pos) {
586581
case 0 -> p.setAbiFpArg0(val);
@@ -592,10 +587,10 @@ public void setFpArgumentAt(AllocatableValue ccArg, Pointer data, int pos, long
592587
case 6 -> p.setAbiFpArg6(val);
593588
case 7 -> p.setAbiFpArg7(val);
594589
default -> {
595-
StackSlot stackSlot = (StackSlot) ccArg;
590+
VMError.guarantee(cArgType.isStackSlot());
596591

597592
Pointer spVal = Word.pointer(p.getAbiSpReg());
598-
int offset = stackSlot.getOffset(0);
593+
int offset = cArgType.getStackOffset();
599594

600595
VMError.guarantee(spVal.isNonNull());
601596
VMError.guarantee(offset < p.getStackSize());
@@ -606,21 +601,25 @@ public void setFpArgumentAt(AllocatableValue ccArg, Pointer data, int pos, long
606601
}
607602

608603
@Override
604+
@Uninterruptible(reason = REASON_RAW_POINTER, callerMustBe = true)
609605
public long getGpReturn(Pointer data) {
610606
return ((InterpreterDataAArch64) data).getAbiGpRet();
611607
}
612608

613609
@Override
610+
@Uninterruptible(reason = REASON_RAW_POINTER, callerMustBe = true)
614611
public void setGpReturn(Pointer data, long gpReturn) {
615612
((InterpreterDataAArch64) data).setAbiGpRet(gpReturn);
616613
}
617614

618615
@Override
616+
@Uninterruptible(reason = CALLED_FROM_UNINTERRUPTIBLE_CODE, mayBeInlined = true)
619617
public long getFpReturn(Pointer data) {
620618
return ((InterpreterDataAArch64) data).getAbiFpRet();
621619
}
622620

623621
@Override
622+
@Uninterruptible(reason = CALLED_FROM_UNINTERRUPTIBLE_CODE, mayBeInlined = true)
624623
public void setFpReturn(Pointer data, long fpReturn) {
625624
((InterpreterDataAArch64) data).setAbiFpRet(fpReturn);
626625
}

0 commit comments

Comments
 (0)