Skip to content

Commit 7b47cff

Browse files
committed
[Graal] Adapt JDK-8361842: Move input validation checks to Java for java.lang.StringCoding intrinsics
1 parent 6448b58 commit 7b47cff

File tree

4 files changed

+43
-9
lines changed

4 files changed

+43
-9
lines changed

compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/GraalHotSpotVMConfig.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -692,6 +692,8 @@ public boolean supportJVMTIVThreadNotification() {
692692
public final boolean deoptimizationSupportLargeAccessByteArrayVirtualization = //
693693
getConstant("Deoptimization::_support_large_access_byte_array_virtualization", Boolean.class);
694694

695+
public final boolean verifyIntrinsicChecks = getFlag("VerifyIntrinsicChecks", Boolean.class);
696+
695697
public final int l1LineSize = getFieldValue("CompilerToVM::Data::L1_line_size", Integer.class, "int", 0, "amd64".equals(osArch));
696698
public final boolean supportsAvx512SimdSort = getFieldValue("CompilerToVM::Data::supports_avx512_simd_sort", Boolean.class, "bool", false, "amd64".equals(osArch));
697699

compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/meta/HotSpotPlatformConfigurationProvider.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,10 +32,12 @@ public class HotSpotPlatformConfigurationProvider implements PlatformConfigurati
3232
private final BarrierSet barrierSet;
3333

3434
private final boolean canVirtualizeLargeByteArrayAccess;
35+
private final boolean shouldVerifyIntrinsicChecks;
3536

3637
public HotSpotPlatformConfigurationProvider(GraalHotSpotVMConfig config, BarrierSet barrierSet) {
3738
this.barrierSet = barrierSet;
3839
this.canVirtualizeLargeByteArrayAccess = config.deoptimizationSupportLargeAccessByteArrayVirtualization;
40+
this.shouldVerifyIntrinsicChecks = config.verifyIntrinsicChecks;
3941
}
4042

4143
@Override
@@ -62,4 +64,9 @@ public boolean areLocksSideEffectFree() {
6264
public BarrierSet getBarrierSet() {
6365
return barrierSet;
6466
}
67+
68+
@Override
69+
public boolean shouldVerifyIntrinsicChecks() {
70+
return shouldVerifyIntrinsicChecks;
71+
}
6572
}

compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/nodes/spi/PlatformConfigurationProvider.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,4 +82,13 @@ default boolean requiresStrictLockOrder() {
8282
default boolean areLocksSideEffectFree() {
8383
return true;
8484
}
85+
86+
/**
87+
* Callers of the intrinsics (e.g., StringCoding.countPositives) are responsible for intrinsic
88+
* input validation. Enabling this option enforces additional checks within the intrinsic
89+
* implementation.
90+
*/
91+
default boolean shouldVerifyIntrinsicChecks() {
92+
return false;
93+
}
8594
}

compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/replacements/StandardGraphBuilderPlugins.java

Lines changed: 25 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2598,13 +2598,27 @@ public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, Rec
25982598
});
25992599
}
26002600

2601+
private static void generateStringRangeCheck(GraphBuilderContext b, InvocationPluginHelper helper, ValueNode array, ValueNode off, ValueNode len) {
2602+
helper.intrinsicRangeCheck(off, Condition.LT, ConstantNode.forInt(0));
2603+
helper.intrinsicRangeCheck(len, Condition.LT, ConstantNode.forInt(0));
2604+
2605+
ValueNode arrayLength = b.add(new ArrayLengthNode(array));
2606+
ValueNode limit = b.add(AddNode.create(off, len, NodeView.DEFAULT));
2607+
helper.intrinsicRangeCheck(arrayLength, Condition.LT, limit);
2608+
}
2609+
26012610
private static void registerStringCodingPlugins(InvocationPlugins plugins, Replacements replacements) {
26022611
Registration r = new Registration(plugins, "java.lang.StringCoding", replacements);
2603-
r.register(new InvocationPlugin("implEncodeISOArray", byte[].class, int.class, byte[].class, int.class, int.class) {
2612+
r.register(new InvocationPlugin("encodeISOArray0", byte[].class, int.class, byte[].class, int.class, int.class) {
26042613
@Override
26052614
public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, Receiver receiver, ValueNode sa, ValueNode sp,
26062615
ValueNode da, ValueNode dp, ValueNode len) {
26072616
try (InvocationPluginHelper helper = new InvocationPluginHelper(b, targetMethod)) {
2617+
if (b.getPlatformConfigurationProvider().shouldVerifyIntrinsicChecks()) {
2618+
generateStringRangeCheck(b, helper, sa, sp, len);
2619+
generateStringRangeCheck(b, helper, da, dp, len);
2620+
}
2621+
26082622
int charElementShift = CodeUtil.log2(b.getMetaAccess().getArrayIndexScale(JavaKind.Char));
26092623
ValueNode src = helper.arrayElementPointer(sa, JavaKind.Byte, LeftShiftNode.create(sp, ConstantNode.forInt(charElementShift), NodeView.DEFAULT));
26102624
ValueNode dst = helper.arrayElementPointer(da, JavaKind.Byte, dp);
@@ -2613,28 +2627,30 @@ public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, Rec
26132627
}
26142628
}
26152629
});
2616-
r.register(new InvocationPlugin("implEncodeAsciiArray", char[].class, int.class, byte[].class, int.class, int.class) {
2630+
r.register(new InvocationPlugin("encodeAsciiArray0", char[].class, int.class, byte[].class, int.class, int.class) {
26172631
@Override
26182632
public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, Receiver receiver, ValueNode sa, ValueNode sp,
26192633
ValueNode da, ValueNode dp, ValueNode len) {
26202634
try (InvocationPluginHelper helper = new InvocationPluginHelper(b, targetMethod)) {
2635+
if (b.getPlatformConfigurationProvider().shouldVerifyIntrinsicChecks()) {
2636+
generateStringRangeCheck(b, helper, sa, sp, len);
2637+
generateStringRangeCheck(b, helper, da, dp, len);
2638+
}
2639+
26212640
ValueNode src = helper.arrayElementPointer(sa, JavaKind.Char, sp);
26222641
ValueNode dst = helper.arrayElementPointer(da, JavaKind.Byte, dp);
26232642
b.addPush(JavaKind.Int, new EncodeArrayNode(src, dst, len, ASCII, JavaKind.Char));
26242643
return true;
26252644
}
26262645
}
26272646
});
2628-
r.register(new InvocationPlugin("countPositives", byte[].class, int.class, int.class) {
2647+
r.register(new InvocationPlugin("countPositives0", byte[].class, int.class, int.class) {
26292648
@Override
26302649
public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, Receiver receiver, ValueNode ba, ValueNode off, ValueNode len) {
26312650
try (InvocationPluginHelper helper = new InvocationPluginHelper(b, targetMethod)) {
2632-
helper.intrinsicRangeCheck(off, Condition.LT, ConstantNode.forInt(0));
2633-
helper.intrinsicRangeCheck(len, Condition.LT, ConstantNode.forInt(0));
2634-
2635-
ValueNode arrayLength = b.add(new ArrayLengthNode(ba));
2636-
ValueNode limit = b.add(AddNode.create(off, len, NodeView.DEFAULT));
2637-
helper.intrinsicRangeCheck(arrayLength, Condition.LT, limit);
2651+
if (b.getPlatformConfigurationProvider().shouldVerifyIntrinsicChecks()) {
2652+
generateStringRangeCheck(b, helper, ba, off, len);
2653+
}
26382654

26392655
ValueNode array = helper.arrayElementPointer(ba, JavaKind.Byte, off);
26402656
b.addPush(JavaKind.Int, new CountPositivesNode(array, len));

0 commit comments

Comments
 (0)