--- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/meta/HotSpotGraphBuilderPlugins.java Thu Oct 17 20:27:44 2019 +0100
+++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/meta/HotSpotGraphBuilderPlugins.java Thu Oct 17 20:53:35 2019 +0100
@@ -30,7 +30,6 @@
import static org.graalvm.compiler.hotspot.meta.HotSpotAOTProfilingPlugin.Options.TieredAOT;
import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.JAVA_THREAD_THREAD_OBJECT_LOCATION;
import static org.graalvm.compiler.java.BytecodeParserOptions.InlineDuringParsing;
-import static org.graalvm.compiler.serviceprovider.JavaVersionUtil.Java8OrEarlier;
import java.lang.invoke.ConstantCallSite;
import java.lang.invoke.MutableCallSite;
@@ -45,7 +44,9 @@
import org.graalvm.compiler.core.common.type.ObjectStamp;
import org.graalvm.compiler.core.common.type.StampFactory;
import org.graalvm.compiler.core.common.type.TypeReference;
+import org.graalvm.compiler.debug.GraalError;
import org.graalvm.compiler.hotspot.GraalHotSpotVMConfig;
+import org.graalvm.compiler.hotspot.HotSpotGraalRuntimeProvider;
import org.graalvm.compiler.hotspot.nodes.CurrentJavaThreadNode;
import org.graalvm.compiler.hotspot.replacements.AESCryptSubstitutions;
import org.graalvm.compiler.hotspot.replacements.ArraysSupportSubstitutions;
@@ -101,11 +102,13 @@
import org.graalvm.compiler.replacements.StandardGraphBuilderPlugins;
import org.graalvm.compiler.replacements.arraycopy.ArrayCopyNode;
import org.graalvm.compiler.serviceprovider.GraalServices;
+import org.graalvm.compiler.serviceprovider.JavaVersionUtil;
import org.graalvm.compiler.word.WordOperationPlugin;
import org.graalvm.compiler.word.WordTypes;
import jdk.internal.vm.compiler.word.LocationIdentity;
import jdk.vm.ci.code.CodeUtil;
+import jdk.vm.ci.hotspot.VMIntrinsicMethod;
import jdk.vm.ci.meta.ConstantReflectionProvider;
import jdk.vm.ci.meta.DeoptimizationAction;
import jdk.vm.ci.meta.JavaKind;
@@ -126,10 +129,17 @@
* @param foreignCalls
* @param options
*/
- public static Plugins create(CompilerConfiguration compilerConfiguration, GraalHotSpotVMConfig config, HotSpotWordTypes wordTypes, MetaAccessProvider metaAccess,
- ConstantReflectionProvider constantReflection, SnippetReflectionProvider snippetReflection, ForeignCallsProvider foreignCalls, ReplacementsImpl replacements,
+ public static Plugins create(HotSpotGraalRuntimeProvider graalRuntime,
+ CompilerConfiguration compilerConfiguration,
+ GraalHotSpotVMConfig config,
+ HotSpotWordTypes wordTypes,
+ MetaAccessProvider metaAccess,
+ ConstantReflectionProvider constantReflection,
+ SnippetReflectionProvider snippetReflection,
+ ForeignCallsProvider foreignCalls,
+ ReplacementsImpl replacements,
OptionValues options) {
- InvocationPlugins invocationPlugins = new HotSpotInvocationPlugins(config, compilerConfiguration);
+ InvocationPlugins invocationPlugins = new HotSpotInvocationPlugins(graalRuntime, config, compilerConfiguration);
Plugins plugins = new Plugins(invocationPlugins);
NodeIntrinsificationProvider nodeIntrinsificationProvider = new NodeIntrinsificationProvider(metaAccess, snippetReflection, foreignCalls, wordTypes);
@@ -147,10 +157,14 @@
}
if (GeneratePIC.getValue(options)) {
- plugins.setClassInitializationPlugin(new HotSpotClassInitializationPlugin());
+ plugins.setClassInitializationPlugin(new HotSpotAOTClassInitializationPlugin());
if (TieredAOT.getValue(options)) {
plugins.setProfilingPlugin(new HotSpotAOTProfilingPlugin());
}
+ } else {
+ if (config.instanceKlassInitThreadOffset != -1) {
+ plugins.setClassInitializationPlugin(new HotSpotJITClassInitializationPlugin());
+ }
}
invocationPlugins.defer(new Runnable() {
@@ -175,7 +189,7 @@
registerGHASHPlugins(invocationPlugins, config, metaAccess, foreignCalls);
registerCounterModePlugins(invocationPlugins, config, replacementBytecodeProvider);
registerBase64Plugins(invocationPlugins, config, metaAccess, foreignCalls);
- registerUnsafePlugins(invocationPlugins, replacementBytecodeProvider);
+ registerUnsafePlugins(invocationPlugins, config, replacementBytecodeProvider);
StandardGraphBuilderPlugins.registerInvocationPlugins(metaAccess, snippetReflection, invocationPlugins, replacementBytecodeProvider, true, false);
registerArrayPlugins(invocationPlugins, replacementBytecodeProvider);
registerStringPlugins(invocationPlugins, replacementBytecodeProvider);
@@ -240,7 +254,7 @@
@Override
public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, Receiver receiver) {
ValueNode callSite = receiver.get();
- ValueNode folded = CallSiteTargetNode.tryFold(GraphUtil.originalValue(callSite), b.getMetaAccess(), b.getAssumptions());
+ ValueNode folded = CallSiteTargetNode.tryFold(GraphUtil.originalValue(callSite, true), b.getMetaAccess(), b.getAssumptions());
if (folded != null) {
b.addPush(JavaKind.Object, folded);
} else {
@@ -276,15 +290,16 @@
r.registerMethodSubstitution(ReflectionSubstitutions.class, "getClassAccessFlags", Class.class);
}
- private static void registerUnsafePlugins(InvocationPlugins plugins, BytecodeProvider replacementBytecodeProvider) {
+ private static void registerUnsafePlugins(InvocationPlugins plugins, GraalHotSpotVMConfig config, BytecodeProvider replacementBytecodeProvider) {
Registration r;
- if (Java8OrEarlier) {
+ if (JavaVersionUtil.JAVA_SPEC <= 8) {
r = new Registration(plugins, Unsafe.class, replacementBytecodeProvider);
} else {
r = new Registration(plugins, "jdk.internal.misc.Unsafe", replacementBytecodeProvider);
}
- r.registerMethodSubstitution(HotSpotUnsafeSubstitutions.class, HotSpotUnsafeSubstitutions.copyMemoryName, "copyMemory", Receiver.class, Object.class, long.class, Object.class, long.class,
- long.class);
+ String substituteMethodName = config.doingUnsafeAccessOffset != Integer.MAX_VALUE ? "copyMemoryGuarded" : "copyMemory";
+ r.registerMethodSubstitution(HotSpotUnsafeSubstitutions.class, HotSpotUnsafeSubstitutions.copyMemoryName, substituteMethodName, Receiver.class, Object.class, long.class, Object.class,
+ long.class, long.class);
}
private static final LocationIdentity INSTANCE_KLASS_CONSTANTS = NamedLocationIdentity.immutable("InstanceKlass::_constants");
@@ -403,7 +418,7 @@
}
private static void registerStringPlugins(InvocationPlugins plugins, BytecodeProvider bytecodeProvider) {
- if (!Java8OrEarlier) {
+ if (JavaVersionUtil.JAVA_SPEC > 8) {
final Registration utf16r = new Registration(plugins, "java.lang.StringUTF16", bytecodeProvider);
utf16r.registerMethodSubstitution(StringUTF16Substitutions.class, "toBytes", char[].class, int.class, int.class);
utf16r.registerMethodSubstitution(StringUTF16Substitutions.class, "getChars", byte[].class, int.class, int.class, char[].class, int.class);
@@ -428,8 +443,6 @@
r.registerMethodSubstitution(ThreadSubstitutions.class, "isInterrupted", Receiver.class, boolean.class);
}
- public static final String cbcEncryptName;
- public static final String cbcDecryptName;
public static final String aesEncryptName;
public static final String aesDecryptName;
@@ -437,16 +450,12 @@
public static final String constantPoolClass;
static {
- if (Java8OrEarlier) {
- cbcEncryptName = "encrypt";
- cbcDecryptName = "decrypt";
+ if (JavaVersionUtil.JAVA_SPEC <= 8) {
aesEncryptName = "encryptBlock";
aesDecryptName = "decryptBlock";
reflectionClass = "sun.reflect.Reflection";
constantPoolClass = "sun.reflect.ConstantPool";
} else {
- cbcEncryptName = "implEncrypt";
- cbcDecryptName = "implDecrypt";
aesEncryptName = "implEncryptBlock";
aesDecryptName = "implDecryptBlock";
reflectionClass = "jdk.internal.reflect.Reflection";
@@ -454,6 +463,19 @@
}
}
+ public static boolean cbcUsesImplNames(GraalHotSpotVMConfig config) {
+ for (VMIntrinsicMethod intrinsic : config.getStore().getIntrinsics()) {
+ if ("com/sun/crypto/provider/CipherBlockChaining".equals(intrinsic.declaringClass)) {
+ if ("encrypt".equals(intrinsic.name)) {
+ return false;
+ } else if ("implEncrypt".equals(intrinsic.name)) {
+ return true;
+ }
+ }
+ }
+ throw GraalError.shouldNotReachHere();
+ }
+
private static void registerAESPlugins(InvocationPlugins plugins, GraalHotSpotVMConfig config, BytecodeProvider bytecodeProvider) {
if (config.useAESIntrinsics) {
assert config.aescryptEncryptBlockStub != 0L;
@@ -463,9 +485,15 @@
String arch = config.osArch;
String decryptSuffix = arch.equals("sparc") ? "WithOriginalKey" : "";
Registration r = new Registration(plugins, "com.sun.crypto.provider.CipherBlockChaining", bytecodeProvider);
+
+ boolean implNames = cbcUsesImplNames(config);
+ String cbcEncryptName = implNames ? "implEncrypt" : "encrypt";
+ String cbcDecryptName = implNames ? "implDecrypt" : "decrypt";
+
r.registerMethodSubstitution(CipherBlockChainingSubstitutions.class, cbcEncryptName, Receiver.class, byte[].class, int.class, int.class, byte[].class, int.class);
r.registerMethodSubstitution(CipherBlockChainingSubstitutions.class, cbcDecryptName, cbcDecryptName + decryptSuffix, Receiver.class, byte[].class, int.class, int.class, byte[].class,
int.class);
+
r = new Registration(plugins, "com.sun.crypto.provider.AESCrypt", bytecodeProvider);
r.registerMethodSubstitution(AESCryptSubstitutions.class, aesEncryptName, Receiver.class, byte[].class, int.class, byte[].class, int.class);
r.registerMethodSubstitution(AESCryptSubstitutions.class, aesDecryptName, aesDecryptName + decryptSuffix, Receiver.class, byte[].class, int.class, byte[].class, int.class);
@@ -476,7 +504,7 @@
Registration r = new Registration(plugins, BigInteger.class, bytecodeProvider);
if (config.useMultiplyToLenIntrinsic()) {
assert config.multiplyToLen != 0L;
- if (Java8OrEarlier) {
+ if (JavaVersionUtil.JAVA_SPEC <= 8) {
r.registerMethodSubstitution(BigIntegerSubstitutions.class, "multiplyToLen", "multiplyToLenStatic", int[].class, int.class, int[].class, int.class,
int[].class);
} else {
@@ -503,7 +531,7 @@
boolean useSha256 = config.useSHA256Intrinsics();
boolean useSha512 = config.useSHA512Intrinsics();
- if (!Java8OrEarlier && (useSha1 || useSha256 || useSha512)) {
+ if (JavaVersionUtil.JAVA_SPEC > 8 && (useSha1 || useSha256 || useSha512)) {
Registration r = new Registration(plugins, "sun.security.provider.DigestBase", bytecodeProvider);
r.registerMethodSubstitution(DigestBaseSubstitutions.class, "implCompressMultiBlock0", Receiver.class, byte[].class, int.class, int.class);
}
@@ -602,7 +630,7 @@
if (config.useCRC32Intrinsics) {
Registration r = new Registration(plugins, CRC32.class, bytecodeProvider);
r.registerMethodSubstitution(CRC32Substitutions.class, "update", int.class, int.class);
- if (Java8OrEarlier) {
+ if (JavaVersionUtil.JAVA_SPEC <= 8) {
r.registerMethodSubstitution(CRC32Substitutions.class, "updateBytes", int.class, byte[].class, int.class, int.class);
r.registerMethodSubstitution(CRC32Substitutions.class, "updateByteBuffer", int.class, long.class, int.class, int.class);
} else {