From ba7deb524db925b3944324203018ad445699774d Mon Sep 17 00:00:00 2001 From: Yudi Zheng Date: Mon, 17 Feb 2025 15:34:26 +0100 Subject: [PATCH 1/2] Adapt JDK-8349860: Make Class.isArray(), Class.isInterface() and Class.isPrimitive() non-native --- .../meta/HotSpotGraphBuilderPlugins.java | 59 +++++++++++-------- .../StandardGraphBuilderPlugins.java | 18 +++--- .../SubstrateGraphBuilderPlugins.java | 16 ++++- 3 files changed, 59 insertions(+), 34 deletions(-) diff --git a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/meta/HotSpotGraphBuilderPlugins.java b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/meta/HotSpotGraphBuilderPlugins.java index c8d50b8aa728..21b55f49f511 100644 --- a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/meta/HotSpotGraphBuilderPlugins.java +++ b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/meta/HotSpotGraphBuilderPlugins.java @@ -66,6 +66,7 @@ import java.math.BigInteger; import java.util.zip.CRC32; +import jdk.graal.compiler.nodes.extended.ClassIsArrayNode; import org.graalvm.nativeimage.ImageInfo; import org.graalvm.word.LocationIdentity; @@ -387,33 +388,41 @@ public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, Rec return true; } }); - } - r.register(new InvocationPlugin("isInterface", Receiver.class) { - @Override - public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, Receiver receiver) { - try (HotSpotInvocationPluginHelper helper = new HotSpotInvocationPluginHelper(b, targetMethod, config)) { - ValueNode klass = helper.readKlassFromClass(receiver.get(true)); - // Primitive Class case returns false - ValueNode klassNonNull = helper.emitNullReturnGuard(klass, ConstantNode.forBoolean(false), GraalDirectives.UNLIKELY_PROBABILITY); - ValueNode accessFlags = helper.readKlassAccessFlags(klassNonNull); - // return (Klass::_access_flags & Modifier.INTERFACE) == 0 ? false : true - LogicNode test = IntegerTestNode.create(accessFlags, ConstantNode.forInt(Modifier.INTERFACE), NodeView.DEFAULT); - helper.emitFinalReturn(JavaKind.Boolean, ConditionalNode.create(test, ConstantNode.forBoolean(false), ConstantNode.forBoolean(true), NodeView.DEFAULT)); + r.register(new InvocationPlugin("isInterface", Receiver.class) { + @Override + public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, Receiver receiver) { + try (HotSpotInvocationPluginHelper helper = new HotSpotInvocationPluginHelper(b, targetMethod, config)) { + ValueNode klass = helper.readKlassFromClass(receiver.get(true)); + // Primitive Class case returns false + ValueNode klassNonNull = helper.emitNullReturnGuard(klass, ConstantNode.forBoolean(false), GraalDirectives.UNLIKELY_PROBABILITY); + ValueNode accessFlags = helper.readKlassAccessFlags(klassNonNull); + // return (Klass::_access_flags & Modifier.INTERFACE) == 0 ? false : true + LogicNode test = IntegerTestNode.create(accessFlags, ConstantNode.forInt(Modifier.INTERFACE), NodeView.DEFAULT); + helper.emitFinalReturn(JavaKind.Boolean, ConditionalNode.create(test, ConstantNode.forBoolean(false), ConstantNode.forBoolean(true), NodeView.DEFAULT)); + } + return true; } - return true; - } - }); - r.register(new InvocationPlugin("isPrimitive", Receiver.class) { - @Override - public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, Receiver receiver) { - try (HotSpotInvocationPluginHelper helper = new HotSpotInvocationPluginHelper(b, targetMethod, config)) { - ValueNode klass = helper.readKlassFromClass(receiver.get(true)); - LogicNode isNull = b.add(IsNullNode.create(klass)); - b.addPush(JavaKind.Boolean, ConditionalNode.create(isNull, b.add(forBoolean(true)), b.add(forBoolean(false)), NodeView.DEFAULT)); + }); + r.register(new InvocationPlugin("isPrimitive", Receiver.class) { + @Override + public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, Receiver receiver) { + try (HotSpotInvocationPluginHelper helper = new HotSpotInvocationPluginHelper(b, targetMethod, config)) { + ValueNode klass = helper.readKlassFromClass(receiver.get(true)); + LogicNode isNull = b.add(IsNullNode.create(klass)); + b.addPush(JavaKind.Boolean, ConditionalNode.create(isNull, b.add(forBoolean(true)), b.add(forBoolean(false)), NodeView.DEFAULT)); + } + return true; } - return true; - } - }); + }); + r.register(new InvocationPlugin("isArray", Receiver.class) { + @Override + public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, Receiver receiver) { + LogicNode isArray = b.add(ClassIsArrayNode.create(b.getConstantReflection(), receiver.get(true))); + b.addPush(JavaKind.Boolean, ConditionalNode.create(isArray, NodeView.DEFAULT)); + return true; + } + }); + } r.register(new InvocationPlugin("getSuperclass", Receiver.class) { @Override public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, Receiver receiver) { diff --git a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/replacements/StandardGraphBuilderPlugins.java b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/replacements/StandardGraphBuilderPlugins.java index 2bd5dc7a698e..e72faa60b2d2 100644 --- a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/replacements/StandardGraphBuilderPlugins.java +++ b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/replacements/StandardGraphBuilderPlugins.java @@ -1391,14 +1391,16 @@ public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, Rec return true; } }); - r.register(new InvocationPlugin("isArray", Receiver.class) { - @Override - public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, Receiver receiver) { - LogicNode isArray = b.add(ClassIsArrayNode.create(b.getConstantReflection(), receiver.get(true))); - b.addPush(JavaKind.Boolean, ConditionalNode.create(isArray, NodeView.DEFAULT)); - return true; - } - }); + if (JavaVersionUtil.JAVA_SPEC == 21) { + r.register(new InvocationPlugin("isArray", Receiver.class) { + @Override + public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, Receiver receiver) { + LogicNode isArray = b.add(ClassIsArrayNode.create(b.getConstantReflection(), receiver.get(true))); + b.addPush(JavaKind.Boolean, ConditionalNode.create(isArray, NodeView.DEFAULT)); + return true; + } + }); + } r.register(new InvocationPlugin("cast", Receiver.class, Object.class) { @Override public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, Receiver receiver, ValueNode object) { diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/snippets/SubstrateGraphBuilderPlugins.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/snippets/SubstrateGraphBuilderPlugins.java index 4de0ba6d0f06..8c7bef1eb279 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/snippets/SubstrateGraphBuilderPlugins.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/snippets/SubstrateGraphBuilderPlugins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -122,9 +122,11 @@ import jdk.graal.compiler.nodes.NodeView; import jdk.graal.compiler.nodes.PiNode; import jdk.graal.compiler.nodes.ValueNode; +import jdk.graal.compiler.nodes.calc.ConditionalNode; import jdk.graal.compiler.nodes.calc.NarrowNode; import jdk.graal.compiler.nodes.calc.ZeroExtendNode; import jdk.graal.compiler.nodes.extended.BytecodeExceptionNode; +import jdk.graal.compiler.nodes.extended.ClassIsArrayNode; import jdk.graal.compiler.nodes.extended.LoadHubNode; import jdk.graal.compiler.nodes.graphbuilderconf.GraphBuilderContext; import jdk.graal.compiler.nodes.graphbuilderconf.InvocationPlugin; @@ -159,6 +161,7 @@ import jdk.graal.compiler.replacements.nodes.MacroNode.MacroParams; import jdk.graal.compiler.replacements.nodes.VectorizedHashCodeNode; import jdk.graal.compiler.replacements.nodes.VectorizedMismatchNode; +import jdk.graal.compiler.serviceprovider.JavaVersionUtil; import jdk.graal.compiler.word.WordCastNode; import jdk.vm.ci.code.Architecture; import jdk.vm.ci.meta.DeoptimizationAction; @@ -1093,6 +1096,17 @@ public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, Rec return false; } }); + if (JavaVersionUtil.JAVA_SPEC > 21) { + // In JDK 21, the same plugin is registered in StandardGraphBuilderPlugins + r.register(new InvocationPlugin("isArray", Receiver.class) { + @Override + public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, Receiver receiver) { + LogicNode isArray = b.add(ClassIsArrayNode.create(b.getConstantReflection(), receiver.get(true))); + b.addPush(JavaKind.Boolean, ConditionalNode.create(isArray, NodeView.DEFAULT)); + return true; + } + }); + } registerClassDesiredAssertionStatusPlugin(plugins); } From 78771d31d349b99bdce4b006bcb18e9bec4cbd6b Mon Sep 17 00:00:00 2001 From: Yudi Zheng Date: Mon, 17 Feb 2025 15:35:50 +0100 Subject: [PATCH 2/2] Update galahad jdk. --- common.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common.json b/common.json index 7a08d2915bc0..7a9361b43d5d 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": "25", "build_id": "jdk-25+10-1066", "platformspecific": true, "extrabundles": ["static-libs"]}, + "galahad-jdk": {"name": "jpg-jdk", "version": "25", "build_id": "jdk-25+12-1270", "platformspecific": true, "extrabundles": ["static-libs"]}, "oraclejdk17": {"name": "jpg-jdk", "version": "17.0.7", "build_id": "jdk-17.0.7+8", "platformspecific": true, "extrabundles": ["static-libs"]}, "labsjdk-ce-17": {"name": "labsjdk", "version": "ce-17.0.7+4-jvmci-23.1-b02", "platformspecific": true },