diff --git a/common.json b/common.json index 1ead3fc4c98b..76b48eb7e104 100644 --- a/common.json +++ b/common.json @@ -8,7 +8,7 @@ "COMMENT.jdks": "When adding or removing JDKs keep in sync with JDKs in ci/common.jsonnet", "jdks": { - "galahad-jdk": {"name": "jpg-jdk", "version": "23", "build_id": "jdk-23+9-626", "platformspecific": true, "extrabundles": ["static-libs"]}, + "galahad-jdk": {"name": "jpg-jdk", "version": "23", "build_id": "jdk-23+10-725", "platformspecific": true, "extrabundles": ["static-libs"]}, "oraclejdk11": {"name": "jpg-jdk", "version": "11.0.11", "build_id": "jdk-11.0.11+9", "platformspecific": true, "extrabundles": ["static-libs"] }, @@ -44,13 +44,13 @@ "labsjdk-ee-21Debug": {"name": "labsjdk", "version": "ee-21.0.2+13-jvmci-23.1-b33-debug", "platformspecific": true }, "labsjdk-ee-21-llvm": {"name": "labsjdk", "version": "ee-21.0.2+13-jvmci-23.1-b33-sulong", "platformspecific": true }, - "oraclejdk-latest": {"name": "jpg-jdk", "version": "23", "build_id": "jdk-23+9", "platformspecific": true, "extrabundles": ["static-libs"]}, - "labsjdk-ce-latest": {"name": "labsjdk", "version": "ce-23+9-jvmci-b01", "platformspecific": true }, - "labsjdk-ce-latestDebug": {"name": "labsjdk", "version": "ce-23+9-jvmci-b01-debug", "platformspecific": true }, - "labsjdk-ce-latest-llvm": {"name": "labsjdk", "version": "ce-23+9-jvmci-b01-sulong", "platformspecific": true }, - "labsjdk-ee-latest": {"name": "labsjdk", "version": "ee-23+9-jvmci-b01", "platformspecific": true }, - "labsjdk-ee-latestDebug": {"name": "labsjdk", "version": "ee-23+9-jvmci-b01-debug", "platformspecific": true }, - "labsjdk-ee-latest-llvm": {"name": "labsjdk", "version": "ee-23+9-jvmci-b01-sulong", "platformspecific": true } + "oraclejdk-latest": {"name": "jpg-jdk", "version": "23", "build_id": "jdk-23+10", "platformspecific": true, "extrabundles": ["static-libs"]}, + "labsjdk-ce-latest": {"name": "labsjdk", "version": "ce-23+10-jvmci-b01", "platformspecific": true }, + "labsjdk-ce-latestDebug": {"name": "labsjdk", "version": "ce-23+10-jvmci-b01-debug", "platformspecific": true }, + "labsjdk-ce-latest-llvm": {"name": "labsjdk", "version": "ce-23+10-jvmci-b01-sulong", "platformspecific": true }, + "labsjdk-ee-latest": {"name": "labsjdk", "version": "ee-23+10-jvmci-b01", "platformspecific": true }, + "labsjdk-ee-latestDebug": {"name": "labsjdk", "version": "ee-23+10-jvmci-b01-debug", "platformspecific": true }, + "labsjdk-ee-latest-llvm": {"name": "labsjdk", "version": "ee-23+10-jvmci-b01-sulong", "platformspecific": true } }, "eclipse": { diff --git a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/asm/Assembler.java b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/asm/Assembler.java index bc3ca920311f..b667ab76a409 100644 --- a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/asm/Assembler.java +++ b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/asm/Assembler.java @@ -33,7 +33,7 @@ import jdk.vm.ci.code.Register; import jdk.vm.ci.code.StackSlot; import jdk.vm.ci.code.TargetDescription; -import jdk.vm.ci.code.site.Infopoint; +import jdk.vm.ci.code.site.Call; /** * The platform-independent base class for the assembler. @@ -271,11 +271,15 @@ public void maybeEmitIndirectTargetMarker(CompilationResultBuilder crb, Label la /** * Some platforms might require special post call code emission. - * - * @param infopoint The infopoint assoicated with the call if any */ - public void postCallNop(Infopoint infopoint) { - ensureUniquePC(); + public void postCallNop(Call call) { + if (call.debugInfo != null) { + // The nop inserted after a call is only required to distinguish + // debug info associated with the call from debug info associated + // with an instruction after the call. If the call has no debug + // info, the extra nop is not required. + ensureUniquePC(); + } } public void reset() { diff --git a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/asm/aarch64/AArch64MacroAssembler.java b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/asm/aarch64/AArch64MacroAssembler.java index b59528f617da..b4e8c1007cfa 100644 --- a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/asm/aarch64/AArch64MacroAssembler.java +++ b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/asm/aarch64/AArch64MacroAssembler.java @@ -1985,12 +1985,17 @@ public void illegal() { */ @Override public void align(int modulus) { + align(modulus, position()); + } + + /** + * Ensure that the code at {@code target} bytes offset from the current {@link #position()} is + * aligned according to {@code modulus}. + */ + public void align(int modulus, int target) { assert modulus > 0 && (modulus & 0b11) == 0 : "Modulus has to be a positive multiple of 4."; - if (position() % modulus == 0) { - return; - } - int offset = modulus - position() % modulus; - for (int i = 0; i < offset; i += 4) { + int delta = target - position(); + while ((position() + delta) % modulus != 0) { nop(); } } diff --git a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/asm/amd64/AMD64Assembler.java b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/asm/amd64/AMD64Assembler.java index 2427d2cc5453..3f7533443987 100644 --- a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/asm/amd64/AMD64Assembler.java +++ b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/asm/amd64/AMD64Assembler.java @@ -4952,8 +4952,16 @@ public void nullCheck(AMD64Address address) { @Override public void align(int modulus) { - if (position() % modulus != 0) { - nop(modulus - (position() % modulus)); + align(modulus, position()); + } + + /** + * Ensure that the code at {@code target} bytes offset from the current {@link #position()} is + * aligned according to {@code modulus}. + */ + public void align(int modulus, int target) { + if (target % modulus != 0) { + nop(modulus - (target % modulus)); } } diff --git a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/asm/amd64/AMD64MacroAssembler.java b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/asm/amd64/AMD64MacroAssembler.java index 5110aa9e2bcb..65671fe80712 100644 --- a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/asm/amd64/AMD64MacroAssembler.java +++ b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/asm/amd64/AMD64MacroAssembler.java @@ -519,7 +519,7 @@ private void alignFusedPair(Label branchTarget, boolean isShortJmp, int prevOpIn } } - private void applyMIOpAndJcc(AMD64MIOp op, OperandSize size, Register src, int imm32, ConditionFlag cc, Label branchTarget, boolean isShortJmp, boolean annotateImm, + private int applyMIOpAndJcc(AMD64MIOp op, OperandSize size, Register src, int imm32, ConditionFlag cc, Label branchTarget, boolean isShortJmp, boolean annotateImm, IntConsumer applyBeforeFusedPair) { final int bytesToEmit = getPrefixInBytes(size, src, op.srcIsByte) + OPCODE_IN_BYTES + MODRM_IN_BYTES + op.immediateSize(size); alignFusedPair(branchTarget, isShortJmp, bytesToEmit); @@ -528,12 +528,14 @@ private void applyMIOpAndJcc(AMD64MIOp op, OperandSize size, Register src, int i applyBeforeFusedPair.accept(beforeFusedPair); } op.emit(this, size, src, imm32, annotateImm); - assert beforeFusedPair + bytesToEmit == position() : Assertions.errorMessage(beforeFusedPair, bytesToEmit, position()); + final int beforeJcc = position(); + assert beforeFusedPair + bytesToEmit == beforeJcc : Assertions.errorMessage(beforeFusedPair, bytesToEmit, position()); jcc(cc, branchTarget, isShortJmp); assert ensureWithinBoundary(beforeFusedPair); + return beforeJcc; } - private void applyMIOpAndJcc(AMD64MIOp op, OperandSize size, AMD64Address src, int imm32, ConditionFlag cc, Label branchTarget, boolean isShortJmp, boolean annotateImm, + private int applyMIOpAndJcc(AMD64MIOp op, OperandSize size, AMD64Address src, int imm32, ConditionFlag cc, Label branchTarget, boolean isShortJmp, boolean annotateImm, IntConsumer applyBeforeFusedPair) { final int bytesToEmit = getPrefixInBytes(size, src) + OPCODE_IN_BYTES + addressInBytes(src) + op.immediateSize(size); alignFusedPair(branchTarget, isShortJmp, bytesToEmit); @@ -542,9 +544,11 @@ private void applyMIOpAndJcc(AMD64MIOp op, OperandSize size, AMD64Address src, i applyBeforeFusedPair.accept(beforeFusedPair); } op.emit(this, size, src, imm32, annotateImm); - assert beforeFusedPair + bytesToEmit == position() : Assertions.errorMessage(beforeFusedPair, bytesToEmit, position()); + final int beforeJcc = position(); + assert beforeFusedPair + bytesToEmit == beforeJcc : Assertions.errorMessage(beforeFusedPair, bytesToEmit, position()); jcc(cc, branchTarget, isShortJmp); assert ensureWithinBoundary(beforeFusedPair); + return beforeJcc; } private int applyRMOpAndJcc(AMD64RMOp op, OperandSize size, Register src1, Register src2, ConditionFlag cc, Label branchTarget, boolean isShortJmp) { @@ -574,106 +578,108 @@ private int applyRMOpAndJcc(AMD64RMOp op, OperandSize size, Register src1, AMD64 return beforeJcc; } - public void applyMOpAndJcc(AMD64MOp op, OperandSize size, Register dst, ConditionFlag cc, Label branchTarget, boolean isShortJmp) { + public int applyMOpAndJcc(AMD64MOp op, OperandSize size, Register dst, ConditionFlag cc, Label branchTarget, boolean isShortJmp) { final int bytesToEmit = getPrefixInBytes(size, dst, op.srcIsByte) + OPCODE_IN_BYTES + MODRM_IN_BYTES; alignFusedPair(branchTarget, isShortJmp, bytesToEmit); final int beforeFusedPair = position(); op.emit(this, size, dst); - assert beforeFusedPair + bytesToEmit == position() : Assertions.errorMessage(beforeFusedPair, bytesToEmit, position()); + final int beforeJcc = position(); + assert beforeFusedPair + bytesToEmit == beforeJcc : Assertions.errorMessage(beforeFusedPair, bytesToEmit, position()); jcc(cc, branchTarget, isShortJmp); assert ensureWithinBoundary(beforeFusedPair); + return beforeJcc; } - public final void testAndJcc(OperandSize size, Register src, int imm32, ConditionFlag cc, Label branchTarget, boolean isShortJmp) { - applyMIOpAndJcc(AMD64MIOp.TEST, size, src, imm32, cc, branchTarget, isShortJmp, false, null); + public final int testAndJcc(OperandSize size, Register src, int imm32, ConditionFlag cc, Label branchTarget, boolean isShortJmp) { + return applyMIOpAndJcc(AMD64MIOp.TEST, size, src, imm32, cc, branchTarget, isShortJmp, false, null); } - public final void testlAndJcc(Register src, int imm32, ConditionFlag cc, Label branchTarget, boolean isShortJmp) { - applyMIOpAndJcc(AMD64MIOp.TEST, OperandSize.DWORD, src, imm32, cc, branchTarget, isShortJmp, false, null); + public final int testlAndJcc(Register src, int imm32, ConditionFlag cc, Label branchTarget, boolean isShortJmp) { + return applyMIOpAndJcc(AMD64MIOp.TEST, OperandSize.DWORD, src, imm32, cc, branchTarget, isShortJmp, false, null); } - public final void testqAndJcc(Register src, int imm32, ConditionFlag cc, Label branchTarget, boolean isShortJmp) { - applyMIOpAndJcc(AMD64MIOp.TEST, OperandSize.QWORD, src, imm32, cc, branchTarget, isShortJmp, false, null); + public final int testqAndJcc(Register src, int imm32, ConditionFlag cc, Label branchTarget, boolean isShortJmp) { + return applyMIOpAndJcc(AMD64MIOp.TEST, OperandSize.QWORD, src, imm32, cc, branchTarget, isShortJmp, false, null); } - public final void testAndJcc(OperandSize size, AMD64Address src, int imm32, ConditionFlag cc, Label branchTarget, boolean isShortJmp, IntConsumer applyBeforeFusedPair) { - applyMIOpAndJcc(AMD64MIOp.TEST, size, src, imm32, cc, branchTarget, isShortJmp, false, applyBeforeFusedPair); + public final int testAndJcc(OperandSize size, AMD64Address src, int imm32, ConditionFlag cc, Label branchTarget, boolean isShortJmp, IntConsumer applyBeforeFusedPair) { + return applyMIOpAndJcc(AMD64MIOp.TEST, size, src, imm32, cc, branchTarget, isShortJmp, false, applyBeforeFusedPair); } - public final void testAndJcc(OperandSize size, Register src1, Register src2, ConditionFlag cc, Label branchTarget, boolean isShortJmp) { - applyRMOpAndJcc(AMD64RMOp.TEST, size, src1, src2, cc, branchTarget, isShortJmp); + public final int testAndJcc(OperandSize size, Register src1, Register src2, ConditionFlag cc, Label branchTarget, boolean isShortJmp) { + return applyRMOpAndJcc(AMD64RMOp.TEST, size, src1, src2, cc, branchTarget, isShortJmp); } - public final void testlAndJcc(Register src1, Register src2, ConditionFlag cc, Label branchTarget, boolean isShortJmp) { - applyRMOpAndJcc(AMD64RMOp.TEST, OperandSize.DWORD, src1, src2, cc, branchTarget, isShortJmp); + public final int testlAndJcc(Register src1, Register src2, ConditionFlag cc, Label branchTarget, boolean isShortJmp) { + return applyRMOpAndJcc(AMD64RMOp.TEST, OperandSize.DWORD, src1, src2, cc, branchTarget, isShortJmp); } - public final void testqAndJcc(Register src1, Register src2, ConditionFlag cc, Label branchTarget, boolean isShortJmp) { - applyRMOpAndJcc(AMD64RMOp.TEST, OperandSize.QWORD, src1, src2, cc, branchTarget, isShortJmp); + public final int testqAndJcc(Register src1, Register src2, ConditionFlag cc, Label branchTarget, boolean isShortJmp) { + return applyRMOpAndJcc(AMD64RMOp.TEST, OperandSize.QWORD, src1, src2, cc, branchTarget, isShortJmp); } - public final void testAndJcc(OperandSize size, Register src1, AMD64Address src2, ConditionFlag cc, Label branchTarget, boolean isShortJmp) { - applyRMOpAndJcc(AMD64RMOp.TEST, size, src1, src2, cc, branchTarget, isShortJmp, null); + public final int testAndJcc(OperandSize size, Register src1, AMD64Address src2, ConditionFlag cc, Label branchTarget, boolean isShortJmp) { + return applyRMOpAndJcc(AMD64RMOp.TEST, size, src1, src2, cc, branchTarget, isShortJmp, null); } - public final void testAndJcc(OperandSize size, Register src1, AMD64Address src2, ConditionFlag cc, Label branchTarget, boolean isShortJmp, IntConsumer applyBeforeFusedPair) { - applyRMOpAndJcc(AMD64RMOp.TEST, size, src1, src2, cc, branchTarget, isShortJmp, applyBeforeFusedPair); + public final int testAndJcc(OperandSize size, Register src1, AMD64Address src2, ConditionFlag cc, Label branchTarget, boolean isShortJmp, IntConsumer applyBeforeFusedPair) { + return applyRMOpAndJcc(AMD64RMOp.TEST, size, src1, src2, cc, branchTarget, isShortJmp, applyBeforeFusedPair); } - public final void testbAndJcc(Register src1, Register src2, ConditionFlag cc, Label branchTarget, boolean isShortJmp) { - applyRMOpAndJcc(AMD64RMOp.TESTB, OperandSize.BYTE, src1, src2, cc, branchTarget, isShortJmp); + public final int testbAndJcc(Register src1, Register src2, ConditionFlag cc, Label branchTarget, boolean isShortJmp) { + return applyRMOpAndJcc(AMD64RMOp.TESTB, OperandSize.BYTE, src1, src2, cc, branchTarget, isShortJmp); } - public final void testbAndJcc(Register src1, AMD64Address src2, ConditionFlag cc, Label branchTarget, boolean isShortJmp) { - applyRMOpAndJcc(AMD64RMOp.TESTB, OperandSize.BYTE, src1, src2, cc, branchTarget, isShortJmp, null); + public final int testbAndJcc(Register src1, AMD64Address src2, ConditionFlag cc, Label branchTarget, boolean isShortJmp) { + return applyRMOpAndJcc(AMD64RMOp.TESTB, OperandSize.BYTE, src1, src2, cc, branchTarget, isShortJmp, null); } - public final void cmpAndJcc(OperandSize size, Register src, int imm32, ConditionFlag cc, Label branchTarget, boolean isShortJmp) { - applyMIOpAndJcc(AMD64BinaryArithmetic.CMP.getMIOpcode(size, isByte(imm32)), size, src, imm32, cc, branchTarget, isShortJmp, false, null); + public final int cmpAndJcc(OperandSize size, Register src, int imm32, ConditionFlag cc, Label branchTarget, boolean isShortJmp) { + return applyMIOpAndJcc(AMD64BinaryArithmetic.CMP.getMIOpcode(size, isByte(imm32)), size, src, imm32, cc, branchTarget, isShortJmp, false, null); } - public final void cmpAndJcc(OperandSize size, Register src, int imm32, ConditionFlag cc, Label branchTarget, boolean isShortJmp, boolean annotateImm, IntConsumer applyBeforeFusedPair) { - applyMIOpAndJcc(AMD64BinaryArithmetic.CMP.getMIOpcode(size, isByte(imm32)), size, src, imm32, cc, branchTarget, isShortJmp, annotateImm, applyBeforeFusedPair); + public final int cmpAndJcc(OperandSize size, Register src, int imm32, ConditionFlag cc, Label branchTarget, boolean isShortJmp, boolean annotateImm, IntConsumer applyBeforeFusedPair) { + return applyMIOpAndJcc(AMD64BinaryArithmetic.CMP.getMIOpcode(size, isByte(imm32)), size, src, imm32, cc, branchTarget, isShortJmp, annotateImm, applyBeforeFusedPair); } - public final void cmplAndJcc(Register src, int imm32, ConditionFlag cc, Label branchTarget, boolean isShortJmp) { - applyMIOpAndJcc(AMD64BinaryArithmetic.CMP.getMIOpcode(OperandSize.DWORD, isByte(imm32)), OperandSize.DWORD, src, imm32, cc, branchTarget, isShortJmp, false, null); + public final int cmplAndJcc(Register src, int imm32, ConditionFlag cc, Label branchTarget, boolean isShortJmp) { + return applyMIOpAndJcc(AMD64BinaryArithmetic.CMP.getMIOpcode(OperandSize.DWORD, isByte(imm32)), OperandSize.DWORD, src, imm32, cc, branchTarget, isShortJmp, false, null); } - public final void cmpqAndJcc(Register src, int imm32, ConditionFlag cc, Label branchTarget, boolean isShortJmp) { - applyMIOpAndJcc(AMD64BinaryArithmetic.CMP.getMIOpcode(OperandSize.QWORD, isByte(imm32)), OperandSize.QWORD, src, imm32, cc, branchTarget, isShortJmp, false, null); + public final int cmpqAndJcc(Register src, int imm32, ConditionFlag cc, Label branchTarget, boolean isShortJmp) { + return applyMIOpAndJcc(AMD64BinaryArithmetic.CMP.getMIOpcode(OperandSize.QWORD, isByte(imm32)), OperandSize.QWORD, src, imm32, cc, branchTarget, isShortJmp, false, null); } - public final void cmpAndJcc(OperandSize size, AMD64Address src, int imm32, ConditionFlag cc, Label branchTarget, boolean isShortJmp) { - applyMIOpAndJcc(AMD64BinaryArithmetic.CMP.getMIOpcode(size, NumUtil.isByte(imm32)), size, src, imm32, cc, branchTarget, isShortJmp, false, null); + public final int cmpAndJcc(OperandSize size, AMD64Address src, int imm32, ConditionFlag cc, Label branchTarget, boolean isShortJmp) { + return applyMIOpAndJcc(AMD64BinaryArithmetic.CMP.getMIOpcode(size, NumUtil.isByte(imm32)), size, src, imm32, cc, branchTarget, isShortJmp, false, null); } - public final void cmpAndJcc(OperandSize size, AMD64Address src, int imm32, ConditionFlag cc, Label branchTarget, boolean isShortJmp, boolean annotateImm, IntConsumer applyBeforeFusedPair) { - applyMIOpAndJcc(AMD64BinaryArithmetic.CMP.getMIOpcode(size, NumUtil.isByte(imm32)), size, src, imm32, cc, branchTarget, isShortJmp, annotateImm, applyBeforeFusedPair); + public final int cmpAndJcc(OperandSize size, AMD64Address src, int imm32, ConditionFlag cc, Label branchTarget, boolean isShortJmp, boolean annotateImm, IntConsumer applyBeforeFusedPair) { + return applyMIOpAndJcc(AMD64BinaryArithmetic.CMP.getMIOpcode(size, NumUtil.isByte(imm32)), size, src, imm32, cc, branchTarget, isShortJmp, annotateImm, applyBeforeFusedPair); } - public final void cmpAndJcc(OperandSize size, Register src1, Register src2, ConditionFlag cc, Label branchTarget, boolean isShortJmp) { - applyRMOpAndJcc(AMD64BinaryArithmetic.CMP.getRMOpcode(size), size, src1, src2, cc, branchTarget, isShortJmp); + public final int cmpAndJcc(OperandSize size, Register src1, Register src2, ConditionFlag cc, Label branchTarget, boolean isShortJmp) { + return applyRMOpAndJcc(AMD64BinaryArithmetic.CMP.getRMOpcode(size), size, src1, src2, cc, branchTarget, isShortJmp); } - public final void cmpAndJcc(OperandSize size, Register src1, AMD64Address src2, ConditionFlag cc, Label branchTarget, boolean isShortJmp) { - applyRMOpAndJcc(AMD64BinaryArithmetic.CMP.getRMOpcode(size), size, src1, src2, cc, branchTarget, isShortJmp, null); + public final int cmpAndJcc(OperandSize size, Register src1, AMD64Address src2, ConditionFlag cc, Label branchTarget, boolean isShortJmp) { + return applyRMOpAndJcc(AMD64BinaryArithmetic.CMP.getRMOpcode(size), size, src1, src2, cc, branchTarget, isShortJmp, null); } - public final void cmplAndJcc(Register src1, Register src2, ConditionFlag cc, Label branchTarget, boolean isShortJmp) { - applyRMOpAndJcc(AMD64BinaryArithmetic.CMP.getRMOpcode(OperandSize.DWORD), OperandSize.DWORD, src1, src2, cc, branchTarget, isShortJmp); + public final int cmplAndJcc(Register src1, Register src2, ConditionFlag cc, Label branchTarget, boolean isShortJmp) { + return applyRMOpAndJcc(AMD64BinaryArithmetic.CMP.getRMOpcode(OperandSize.DWORD), OperandSize.DWORD, src1, src2, cc, branchTarget, isShortJmp); } public final int cmpqAndJcc(Register src1, Register src2, ConditionFlag cc, Label branchTarget, boolean isShortJmp) { return applyRMOpAndJcc(AMD64BinaryArithmetic.CMP.getRMOpcode(OperandSize.QWORD), OperandSize.QWORD, src1, src2, cc, branchTarget, isShortJmp); } - public final void cmpAndJcc(OperandSize size, Register src1, AMD64Address src2, ConditionFlag cc, Label branchTarget, boolean isShortJmp, IntConsumer applyBeforeFusedPair) { - applyRMOpAndJcc(AMD64BinaryArithmetic.CMP.getRMOpcode(size), size, src1, src2, cc, branchTarget, isShortJmp, applyBeforeFusedPair); + public final int cmpAndJcc(OperandSize size, Register src1, AMD64Address src2, ConditionFlag cc, Label branchTarget, boolean isShortJmp, IntConsumer applyBeforeFusedPair) { + return applyRMOpAndJcc(AMD64BinaryArithmetic.CMP.getRMOpcode(size), size, src1, src2, cc, branchTarget, isShortJmp, applyBeforeFusedPair); } - public final void cmplAndJcc(Register src1, AMD64Address src2, ConditionFlag cc, Label branchTarget, boolean isShortJmp) { - applyRMOpAndJcc(AMD64BinaryArithmetic.CMP.getRMOpcode(OperandSize.DWORD), OperandSize.DWORD, src1, src2, cc, branchTarget, isShortJmp, null); + public final int cmplAndJcc(Register src1, AMD64Address src2, ConditionFlag cc, Label branchTarget, boolean isShortJmp) { + return applyRMOpAndJcc(AMD64BinaryArithmetic.CMP.getRMOpcode(OperandSize.DWORD), OperandSize.DWORD, src1, src2, cc, branchTarget, isShortJmp, null); } public final int cmpqAndJcc(Register src1, AMD64Address src2, ConditionFlag cc, Label branchTarget, boolean isShortJmp) { @@ -684,7 +690,7 @@ public final int cmpqAndJcc(Register src1, AMD64Address src2, ConditionFlag cc, return applyRMOpAndJcc(AMD64BinaryArithmetic.CMP.getRMOpcode(OperandSize.QWORD), OperandSize.QWORD, src1, src2, cc, branchTarget, isShortJmp, applyBeforeFusedPair); } - public final void cmpAndJcc(OperandSize size, Register src1, Supplier src2, ConditionFlag cc, Label branchTarget) { + public final int cmpAndJcc(OperandSize size, Register src1, Supplier src2, ConditionFlag cc, Label branchTarget) { AMD64Address placeHolder = getPlaceholder(position()); final AMD64RMOp op = AMD64BinaryArithmetic.CMP.getRMOpcode(size); final int bytesToEmit = getPrefixInBytes(size, src1, op.dstIsByte, placeHolder) + OPCODE_IN_BYTES + addressInBytes(placeHolder); @@ -692,77 +698,79 @@ public final void cmpAndJcc(OperandSize size, Register src1, Supplier= 23); + public final int jvmciCountersSize = getFlag("JVMCICounterSize", Integer.class); // JDK-8231756, GR-16685 diff --git a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/JVMCIVersionCheck.java b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/JVMCIVersionCheck.java index 86c1e848dc70..8a316b5561ca 100644 --- a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/JVMCIVersionCheck.java +++ b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/JVMCIVersionCheck.java @@ -54,8 +54,8 @@ public final class JVMCIVersionCheck { private static final Map> JVMCI_MIN_VERSIONS = Map.of( "21", Map.of(DEFAULT_VENDOR_ENTRY, new Version(23, 1, 33)), "23", Map.of( - "Oracle Corporation", new Version("23+9", 1), - DEFAULT_VENDOR_ENTRY, new Version("23+9", 1))); + "Oracle Corporation", new Version("23+10", 1), + DEFAULT_VENDOR_ENTRY, new Version("23+10", 1))); private static final int NA = 0; /** * Minimum Java release supported by Graal. diff --git a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/aarch64/AArch64HotSpotBackend.java b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/aarch64/AArch64HotSpotBackend.java index 77283cb4a844..7e3d9607fa2d 100644 --- a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/aarch64/AArch64HotSpotBackend.java +++ b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/aarch64/AArch64HotSpotBackend.java @@ -27,6 +27,7 @@ import static java.lang.reflect.Modifier.isStatic; import static jdk.vm.ci.aarch64.AArch64.lr; import static jdk.vm.ci.aarch64.AArch64.r10; +import static jdk.vm.ci.aarch64.AArch64.rscratch1; import static jdk.vm.ci.aarch64.AArch64.sp; import static jdk.vm.ci.aarch64.AArch64.zr; import static jdk.vm.ci.code.ValueUtil.asRegister; @@ -353,25 +354,23 @@ public CompilationResultBuilder newCompilationResultBuilder(LIRGenerationResult @Override public void emitCode(CompilationResultBuilder crb, ResolvedJavaMethod installedCodeOwner, EntryPointDecorator entryPointDecorator) { - Label verifiedStub = new Label(); crb.buildLabelOffsets(); try { - emitCode(crb, installedCodeOwner, verifiedStub, entryPointDecorator); + emitCodeHelper(crb, installedCodeOwner, entryPointDecorator); } catch (BranchTargetOutOfBoundsException e) { // A branch estimation was wrong, now retry with conservative label ranges, this // should always work crb.setConservativeLabelRanges(); crb.resetForEmittingCode(); - verifiedStub.reset(); - emitCode(crb, installedCodeOwner, verifiedStub, entryPointDecorator); + emitCodeHelper(crb, installedCodeOwner, entryPointDecorator); } } - private void emitCode(CompilationResultBuilder crb, ResolvedJavaMethod installedCodeOwner, Label verifiedStub, EntryPointDecorator entryPointDecorator) { + private void emitCodeHelper(CompilationResultBuilder crb, ResolvedJavaMethod installedCodeOwner, EntryPointDecorator entryPointDecorator) { AArch64MacroAssembler masm = (AArch64MacroAssembler) crb.asm; FrameMap frameMap = crb.frameMap; RegisterConfig regConfig = frameMap.getRegisterConfig(); - emitCodePrefix(crb, installedCodeOwner, masm, regConfig, verifiedStub); + emitCodePrefix(crb, installedCodeOwner, masm, regConfig); if (entryPointDecorator != null) { entryPointDecorator.emitEntryPoint(crb); @@ -380,33 +379,60 @@ private void emitCode(CompilationResultBuilder crb, ResolvedJavaMethod installed emitCodeSuffix(crb, masm); } - private void emitCodePrefix(CompilationResultBuilder crb, ResolvedJavaMethod installedCodeOwner, AArch64MacroAssembler masm, RegisterConfig regConfig, Label verifiedStub) { + private void emitCodePrefix(CompilationResultBuilder crb, ResolvedJavaMethod installedCodeOwner, AArch64MacroAssembler masm, RegisterConfig regConfig) { + Label verifiedStub = new Label(); HotSpotProviders providers = getProviders(); if (installedCodeOwner != null && !isStatic(installedCodeOwner.getModifiers())) { - crb.recordMark(HotSpotMarkId.UNVERIFIED_ENTRY); - CallingConvention cc = regConfig.getCallingConvention(HotSpotCallingConventionType.JavaCallee, null, new JavaType[]{providers.getMetaAccess().lookupJavaType(Object.class)}, this); - // See definition of IC_Klass in c1_LIRAssembler_aarch64.cpp - // equal to scratch(1) careful! - Register inlineCacheKlass = AArch64HotSpotRegisterConfig.inlineCacheRegister; + JavaType[] parameterTypes = {providers.getMetaAccess().lookupJavaType(Object.class)}; + CallingConvention cc = regConfig.getCallingConvention(HotSpotCallingConventionType.JavaCallee, null, parameterTypes, this); Register receiver = asRegister(cc.getArgument(0)); int size = config.useCompressedClassPointers ? 32 : 64; AArch64Address klassAddress = masm.makeAddress(size, receiver, config.hubOffset); + if (config.icSpeculatedKlassOffset == Integer.MAX_VALUE) { + crb.recordMark(HotSpotMarkId.UNVERIFIED_ENTRY); + Register klass = rscratch1; + if (config.useCompressedClassPointers) { + masm.ldr(32, klass, klassAddress); + AArch64HotSpotMove.decodeKlassPointer(masm, klass, klass, config.getKlassEncoding()); + } else { + masm.ldr(64, klass, klassAddress); + } + // c1_LIRAssembler_aarch64.cpp: const Register IC_Klass = rscratch2; + Register inlineCacheKlass = AArch64HotSpotRegisterConfig.inlineCacheRegister; + masm.cmp(64, inlineCacheKlass, klass); - // Are r10 and r11 available scratch registers here? One would hope so. - Register klass = r10; - if (config.useCompressedClassPointers) { - masm.ldr(32, klass, klassAddress); - AArch64HotSpotMove.decodeKlassPointer(masm, klass, klass, config.getKlassEncoding()); + masm.branchConditionally(AArch64Assembler.ConditionFlag.EQ, verifiedStub); + AArch64Call.directJmp(crb, masm, getForeignCalls().lookupForeignCall(IC_MISS_HANDLER)); } else { - masm.ldr(64, klass, klassAddress); + + // JDK-8322630 (removed ICStubs) + Register data = AArch64HotSpotRegisterConfig.inlineCacheRegister; + Register tmp1 = rscratch1; + Register tmp2 = r10; // Safe to use R10 as scratch register in method prologue + ForeignCallLinkage icMissHandler = getForeignCalls().lookupForeignCall(IC_MISS_HANDLER); + + // Size of IC check sequence checked with a guarantee below. + int inlineCacheCheckSize = AArch64Call.isNearCall(icMissHandler) ? 20 : 32; + masm.align(config.codeEntryAlignment, masm.position() + inlineCacheCheckSize); + + int startICCheck = masm.position(); + crb.recordMark(HotSpotMarkId.UNVERIFIED_ENTRY); + AArch64Address icSpeculatedKlass = masm.makeAddress(size, data, config.icSpeculatedKlassOffset); + + masm.ldr(size, tmp1, klassAddress); + masm.ldr(size, tmp2, icSpeculatedKlass); + masm.cmp(size, tmp1, tmp2); + + masm.branchConditionally(AArch64Assembler.ConditionFlag.EQ, verifiedStub); + AArch64Call.directJmp(crb, masm, icMissHandler); + + int actualInlineCacheCheckSize = masm.position() - startICCheck; + if (actualInlineCacheCheckSize != inlineCacheCheckSize) { + // Code emission pattern has changed: adjust `inlineCacheCheckSize` + // initialization above accordingly. + throw new GraalError("%s != %s", actualInlineCacheCheckSize, inlineCacheCheckSize); + } } - masm.cmp(64, inlineCacheKlass, klass); - /* - * Conditional jumps have a much lower range than unconditional ones, which can be a - * problem because the miss handler could be out of range. - */ - masm.branchConditionally(AArch64Assembler.ConditionFlag.EQ, verifiedStub); - AArch64Call.directJmp(crb, masm, getForeignCalls().lookupForeignCall(IC_MISS_HANDLER)); } masm.align(config.codeEntryAlignment); masm.bind(verifiedStub); diff --git a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/aarch64/AArch64HotSpotMacroAssembler.java b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/aarch64/AArch64HotSpotMacroAssembler.java index bd4c8459c1cc..1195b67aec5e 100644 --- a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/aarch64/AArch64HotSpotMacroAssembler.java +++ b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/aarch64/AArch64HotSpotMacroAssembler.java @@ -30,8 +30,6 @@ import jdk.vm.ci.aarch64.AArch64; import jdk.vm.ci.code.TargetDescription; import jdk.vm.ci.code.site.Call; -import jdk.vm.ci.code.site.Infopoint; -import jdk.vm.ci.code.site.InfopointReason; public class AArch64HotSpotMacroAssembler extends AArch64MacroAssembler { private final GraalHotSpotVMConfig config; @@ -42,11 +40,10 @@ public AArch64HotSpotMacroAssembler(TargetDescription target, GraalHotSpotVMConf } @Override - public void postCallNop(Infopoint infopoint) { - if (config.continuationsEnabled && infopoint instanceof Call) { + public void postCallNop(Call call) { + if (config.continuationsEnabled) { // Support for loom requires custom nops after call sites that might deopt - Call call = (Call) infopoint; - if (call.debugInfo != null && call.reason == InfopointReason.CALL) { + if (call.debugInfo != null) { // Expected post call nop pattern taken from // src/hotspot/cpu/aarch64/macroAssembler_aarch64.cpp in // MacroAssembler::post_call_nop(). JVMCI will add a relocation during installation. @@ -60,6 +57,6 @@ public void postCallNop(Infopoint infopoint) { return; } } - super.postCallNop(infopoint); + super.postCallNop(call); } } diff --git a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/amd64/AMD64HotSpotBackend.java b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/amd64/AMD64HotSpotBackend.java index 7faecfd155bd..e61d201865a4 100644 --- a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/amd64/AMD64HotSpotBackend.java +++ b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/amd64/AMD64HotSpotBackend.java @@ -317,31 +317,65 @@ public void emitCode(CompilationResultBuilder crb, ResolvedJavaMethod installedC public void emitCodePrefix(ResolvedJavaMethod installedCodeOwner, CompilationResultBuilder crb, AMD64MacroAssembler asm, RegisterConfig regConfig) { HotSpotProviders providers = getProviders(); if (installedCodeOwner != null && !installedCodeOwner.isStatic()) { - crb.recordMark(HotSpotMarkId.UNVERIFIED_ENTRY); - CallingConvention cc = regConfig.getCallingConvention(HotSpotCallingConventionType.JavaCallee, null, new JavaType[]{providers.getMetaAccess().lookupJavaType(Object.class)}, this); - Register inlineCacheKlass = rax; // see definition of IC_Klass in - // c1_LIRAssembler_x86.cpp + JavaType[] parameterTypes = {providers.getMetaAccess().lookupJavaType(Object.class)}; + CallingConvention cc = regConfig.getCallingConvention(HotSpotCallingConventionType.JavaCallee, null, parameterTypes, this); Register receiver = asRegister(cc.getArgument(0)); AMD64Address src = new AMD64Address(receiver, config.hubOffset); int before; - - if (config.useCompressedClassPointers) { - Register register = r10; - Register heapBase = providers.getRegisters().getHeapBaseRegister(); - AMD64HotSpotMove.decodeKlassPointer(asm, register, heapBase, src, config); - if (config.narrowKlassBase != 0) { - // The heap base register was destroyed above, so restore it - if (config.narrowOopBase == 0L) { - asm.xorq(heapBase, heapBase); - } else { - asm.movq(heapBase, config.narrowOopBase); + if (config.icSpeculatedKlassOffset == Integer.MAX_VALUE) { + crb.recordMark(HotSpotMarkId.UNVERIFIED_ENTRY); + // c1_LIRAssembler_x86.cpp: const Register IC_Klass = rax; + Register inlineCacheKlass = rax; + + if (config.useCompressedClassPointers) { + Register register = r10; + Register heapBase = providers.getRegisters().getHeapBaseRegister(); + AMD64HotSpotMove.decodeKlassPointer(asm, register, heapBase, src, config); + if (config.narrowKlassBase != 0) { + // The heap base register was destroyed above, so restore it + if (config.narrowOopBase == 0L) { + asm.xorq(heapBase, heapBase); + } else { + asm.movq(heapBase, config.narrowOopBase); + } } + before = asm.cmpqAndJcc(inlineCacheKlass, register, ConditionFlag.NotEqual, null, false); + } else { + before = asm.cmpqAndJcc(inlineCacheKlass, src, ConditionFlag.NotEqual, null, false); } - before = asm.cmpqAndJcc(inlineCacheKlass, register, ConditionFlag.NotEqual, null, false); + crb.recordDirectCall(before, asm.position(), getForeignCalls().lookupForeignCall(IC_MISS_HANDLER), null); } else { - before = asm.cmpqAndJcc(inlineCacheKlass, src, ConditionFlag.NotEqual, null, false); + // JDK-8322630 (removed ICStubs) + Register data = rax; + Register temp = r10; + ForeignCallLinkage icMissHandler = getForeignCalls().lookupForeignCall(IC_MISS_HANDLER); + + // Size of IC check sequence checked with a guarantee below. + int inlineCacheCheckSize = 14; + asm.align(config.codeEntryAlignment, asm.position() + inlineCacheCheckSize); + + int startICCheck = asm.position(); + crb.recordMark(HotSpotMarkId.UNVERIFIED_ENTRY); + AMD64Address icSpeculatedKlass = new AMD64Address(data, config.icSpeculatedKlassOffset); + + AMD64BaseAssembler.OperandSize size; + if (config.useCompressedClassPointers) { + asm.movl(temp, src); + size = AMD64BaseAssembler.OperandSize.DWORD; + } else { + asm.movptr(temp, src); + size = AMD64BaseAssembler.OperandSize.QWORD; + } + before = asm.cmpAndJcc(size, temp, icSpeculatedKlass, ConditionFlag.NotEqual, null, false); + crb.recordDirectCall(before, asm.position(), icMissHandler, null); + + int actualInlineCacheCheckSize = asm.position() - startICCheck; + if (actualInlineCacheCheckSize != inlineCacheCheckSize) { + // Code emission pattern has changed: adjust `inlineCacheCheckSize` + // initialization above accordingly. + throw new GraalError("%s != %s", actualInlineCacheCheckSize, inlineCacheCheckSize); + } } - crb.recordDirectCall(before, asm.position(), getForeignCalls().lookupForeignCall(IC_MISS_HANDLER), null); } asm.align(config.codeEntryAlignment); diff --git a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/amd64/AMD64HotSpotMacroAssembler.java b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/amd64/AMD64HotSpotMacroAssembler.java index 0f0c312f3cb2..057c619d9c1b 100644 --- a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/amd64/AMD64HotSpotMacroAssembler.java +++ b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/amd64/AMD64HotSpotMacroAssembler.java @@ -32,8 +32,6 @@ import jdk.vm.ci.code.TargetDescription; import jdk.vm.ci.code.site.Call; -import jdk.vm.ci.code.site.Infopoint; -import jdk.vm.ci.code.site.InfopointReason; public class AMD64HotSpotMacroAssembler extends AMD64MacroAssembler { private final GraalHotSpotVMConfig config; @@ -44,11 +42,10 @@ public AMD64HotSpotMacroAssembler(GraalHotSpotVMConfig config, TargetDescription } @Override - public void postCallNop(Infopoint infopoint) { - if (config.continuationsEnabled && infopoint instanceof Call) { + public void postCallNop(Call call) { + if (config.continuationsEnabled) { // Support for loom requires custom nops after call sites that might deopt - Call call = (Call) infopoint; - if (call.debugInfo != null && call.reason == InfopointReason.CALL) { + if (call.debugInfo != null) { // Expected nop pattern taken from src/hotspot/cpu/x86/macroAssembler_x86.cpp in // MacroAssembler::post_call_nop(). JVMCI will add a relocation during installation. emitByte(0x0f); @@ -59,7 +56,7 @@ public void postCallNop(Infopoint infopoint) { return; } } - super.postCallNop(infopoint); + super.postCallNop(call); } /** diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/SecurityServicesFeature.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/SecurityServicesFeature.java index 9c29979a97c4..90751d681169 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/SecurityServicesFeature.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/SecurityServicesFeature.java @@ -81,6 +81,7 @@ import javax.security.auth.login.Configuration; import jdk.graal.compiler.options.Option; +import jdk.graal.compiler.serviceprovider.JavaVersionUtil; import org.graalvm.nativeimage.ImageSingletons; import org.graalvm.nativeimage.hosted.RuntimeJNIAccess; import org.graalvm.nativeimage.hosted.RuntimeReflection; @@ -659,7 +660,7 @@ private static boolean isValid(Service s) { private static Function> getConstructorParameterClassAccessor(ImageClassLoader loader) { Map knownEngines = ReflectionUtil.readStaticField(Provider.class, "knownEngines"); Class clazz = loader.findClassOrFail("java.security.Provider$EngineDescription"); - Field consParamClassNameField = ReflectionUtil.lookupField(clazz, "constructorParameterClassName"); + Field consParamClassField = ReflectionUtil.lookupField(clazz, JavaVersionUtil.JAVA_SPEC >= 23 ? "constructorParameterClass" : "constructorParameterClassName"); /* * The returned lambda captures the value of the Provider.knownEngines map retrieved above @@ -684,7 +685,10 @@ private static Function> getConstructorParameterClassAccessor(I if (engineDescription == null) { return null; } - String constrParamClassName = (String) consParamClassNameField.get(engineDescription); + if (JavaVersionUtil.JAVA_SPEC >= 23) { + return (Class) consParamClassField.get(engineDescription); + } + String constrParamClassName = (String) consParamClassField.get(engineDescription); if (constrParamClassName != null) { return loader.findClass(constrParamClassName).get(); } diff --git a/substratevm/src/com.oracle.svm.test/src/com/oracle/svm/test/jfr/TestJavaLevelVirtualThreadEvents.java b/substratevm/src/com.oracle.svm.test/src/com/oracle/svm/test/jfr/TestJavaLevelVirtualThreadEvents.java index 1810859671ab..1fc94bdf8207 100644 --- a/substratevm/src/com.oracle.svm.test/src/com/oracle/svm/test/jfr/TestJavaLevelVirtualThreadEvents.java +++ b/substratevm/src/com.oracle.svm.test/src/com/oracle/svm/test/jfr/TestJavaLevelVirtualThreadEvents.java @@ -36,11 +36,13 @@ import java.util.List; import java.util.Map; +import org.junit.Assume; import org.junit.Test; import com.oracle.svm.core.thread.Target_jdk_internal_vm_Continuation; import com.oracle.svm.test.jfr.events.StringEvent; +import jdk.graal.compiler.serviceprovider.JavaVersionUtil; import jdk.jfr.Recording; import jdk.jfr.consumer.RecordedEvent; import jdk.jfr.consumer.RecordedThread; @@ -54,6 +56,7 @@ public class TestJavaLevelVirtualThreadEvents extends JfrRecordingTest { @Test public void test() throws Throwable { + Assume.assumeFalse("Currently broken on JDK 23+ (GR-51526)", JavaVersionUtil.JAVA_SPEC >= 23); String[] events = new String[]{"jdk.ThreadSleep", "jdk.VirtualThreadStart", "jdk.VirtualThreadEnd", "jdk.VirtualThreadPinned", "com.jfr.String"}; Recording recording = startRecording(events); Runnable r = () -> { diff --git a/substratevm/src/com.oracle.svm.test/src/com/oracle/svm/test/jfr/TestMirrorEvents.java b/substratevm/src/com.oracle.svm.test/src/com/oracle/svm/test/jfr/TestMirrorEvents.java index c26c5ed35c4c..9a454c574b1c 100644 --- a/substratevm/src/com.oracle.svm.test/src/com/oracle/svm/test/jfr/TestMirrorEvents.java +++ b/substratevm/src/com.oracle.svm.test/src/com/oracle/svm/test/jfr/TestMirrorEvents.java @@ -30,8 +30,10 @@ import java.util.List; +import org.junit.Assume; import org.junit.Test; +import jdk.graal.compiler.serviceprovider.JavaVersionUtil; import jdk.jfr.EventType; import jdk.jfr.Recording; import jdk.jfr.consumer.RecordedEvent; @@ -45,6 +47,7 @@ public class TestMirrorEvents extends JfrRecordingTest { @Test public void test() throws Throwable { + Assume.assumeFalse("Currently broken on JDK 23+ (GR-51526)", JavaVersionUtil.JAVA_SPEC >= 23); String[] events = new String[]{"jdk.ThreadSleep", "jdk.VirtualThreadStart", "jdk.VirtualThreadEnd"}; Recording recording = startRecording(events); diff --git a/substratevm/src/com.oracle.svm.test/src/com/oracle/svm/test/jfr/TestVirtualThreadsBasic.java b/substratevm/src/com.oracle.svm.test/src/com/oracle/svm/test/jfr/TestVirtualThreadsBasic.java index c8812e4931e5..83cffffe34d6 100644 --- a/substratevm/src/com.oracle.svm.test/src/com/oracle/svm/test/jfr/TestVirtualThreadsBasic.java +++ b/substratevm/src/com.oracle.svm.test/src/com/oracle/svm/test/jfr/TestVirtualThreadsBasic.java @@ -27,8 +27,8 @@ package com.oracle.svm.test.jfr; import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; import static org.junit.Assume.assumeTrue; import java.util.Collections; @@ -37,14 +37,14 @@ import java.util.Set; import java.util.concurrent.atomic.AtomicInteger; -import jdk.jfr.Recording; -import org.junit.Test; +import org.junit.Assume; import org.junit.Before; +import org.junit.Test; import com.oracle.svm.core.jfr.JfrEvent; import jdk.graal.compiler.serviceprovider.JavaVersionUtil; - +import jdk.jfr.Recording; import jdk.jfr.consumer.RecordedClass; import jdk.jfr.consumer.RecordedEvent; import jdk.jfr.consumer.RecordedThread; @@ -68,6 +68,7 @@ public void checkJavaVersion() { @Test public void test() throws Throwable { + Assume.assumeFalse("Currently broken on JDK 23+ (GR-51526)", JavaVersionUtil.JAVA_SPEC >= 23); String[] events = new String[]{JfrEvent.JavaMonitorWait.getName()}; Recording recording = startRecording(events); diff --git a/substratevm/src/com.oracle.svm.test/src/com/oracle/svm/test/jfr/TestVirtualThreadsChunkRotation.java b/substratevm/src/com.oracle.svm.test/src/com/oracle/svm/test/jfr/TestVirtualThreadsChunkRotation.java index c9d92f52bc40..dffc0ac5b5fa 100644 --- a/substratevm/src/com.oracle.svm.test/src/com/oracle/svm/test/jfr/TestVirtualThreadsChunkRotation.java +++ b/substratevm/src/com.oracle.svm.test/src/com/oracle/svm/test/jfr/TestVirtualThreadsChunkRotation.java @@ -37,12 +37,13 @@ import java.util.Set; import java.util.concurrent.atomic.AtomicInteger; -import jdk.graal.compiler.serviceprovider.JavaVersionUtil; +import org.junit.Assume; import org.junit.Before; import org.junit.Test; import com.oracle.svm.core.jfr.JfrEvent; +import jdk.graal.compiler.serviceprovider.JavaVersionUtil; import jdk.jfr.Recording; import jdk.jfr.consumer.RecordedClass; import jdk.jfr.consumer.RecordedEvent; @@ -70,6 +71,7 @@ public void checkJavaVersion() { @Test public void test() throws Throwable { + Assume.assumeFalse("Currently broken on JDK 23+ (GR-51526)", JavaVersionUtil.JAVA_SPEC >= 23); String[] events = new String[]{JfrEvent.JavaMonitorWait.getName()}; Recording recording = startRecording(events); diff --git a/substratevm/src/com.oracle.svm.test/src/com/oracle/svm/test/jfr/TestVirtualThreadsJfrStreaming.java b/substratevm/src/com.oracle.svm.test/src/com/oracle/svm/test/jfr/TestVirtualThreadsJfrStreaming.java index ca479f2eb6cd..5536c7923f1a 100644 --- a/substratevm/src/com.oracle.svm.test/src/com/oracle/svm/test/jfr/TestVirtualThreadsJfrStreaming.java +++ b/substratevm/src/com.oracle.svm.test/src/com/oracle/svm/test/jfr/TestVirtualThreadsJfrStreaming.java @@ -34,12 +34,13 @@ import java.util.Set; import java.util.concurrent.atomic.AtomicInteger; -import jdk.graal.compiler.serviceprovider.JavaVersionUtil; +import org.junit.Assume; import org.junit.Before; import org.junit.Test; import com.oracle.svm.core.jfr.JfrEvent; +import jdk.graal.compiler.serviceprovider.JavaVersionUtil; import jdk.jfr.consumer.RecordedClass; import jdk.jfr.consumer.RecordedThread; import jdk.jfr.consumer.RecordingStream; @@ -64,6 +65,7 @@ public void checkJavaVersion() { @Test public void test() throws Throwable { + Assume.assumeFalse("Currently broken on JDK 23+ (GR-51526)", JavaVersionUtil.JAVA_SPEC >= 23); String[] events = new String[]{JfrEvent.JavaMonitorWait.getName()}; RecordingStream stream = startStream(events); diff --git a/substratevm/src/com.oracle.svm.test/src/com/oracle/svm/test/jfr/oldobject/TestOldObjectSampleEvent.java b/substratevm/src/com.oracle.svm.test/src/com/oracle/svm/test/jfr/oldobject/TestOldObjectSampleEvent.java index 31873e3da3ee..a324ccbce2f0 100644 --- a/substratevm/src/com.oracle.svm.test/src/com/oracle/svm/test/jfr/oldobject/TestOldObjectSampleEvent.java +++ b/substratevm/src/com.oracle.svm.test/src/com/oracle/svm/test/jfr/oldobject/TestOldObjectSampleEvent.java @@ -26,23 +26,29 @@ package com.oracle.svm.test.jfr.oldobject; +import jdk.graal.compiler.serviceprovider.JavaVersionUtil; +import org.junit.Assume; import org.junit.Test; public class TestOldObjectSampleEvent extends JfrOldObjectTest { + @Test public void testObjectLeak() throws Throwable { + Assume.assumeFalse("Currently broken on JDK 23+ (GR-51526)", JavaVersionUtil.JAVA_SPEC >= 23); int arrayLength = Integer.MIN_VALUE; testSampling(new TinyObject(43), arrayLength, events -> validateEvents(events, TinyObject.class, arrayLength)); } @Test public void testSmallArrayLeak() throws Throwable { + Assume.assumeFalse("Currently broken on JDK 23+ (GR-51526)", JavaVersionUtil.JAVA_SPEC >= 23); int arrayLength = 3; testSampling(new TinyObject[arrayLength], arrayLength, events -> validateEvents(events, TinyObject.class.arrayType(), arrayLength)); } @Test public void testLargeArrayLeak() throws Throwable { + Assume.assumeFalse("Currently broken on JDK 23+ (GR-51526)", JavaVersionUtil.JAVA_SPEC >= 23); int arrayLength = 1024 * 1024; testSampling(new TinyObject[arrayLength], arrayLength, events -> validateEvents(events, TinyObject.class.arrayType(), arrayLength)); }