--- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/meta/HotSpotGraphBuilderPlugins.java Thu Jul 25 11:44:37 2019 -0700
+++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/meta/HotSpotGraphBuilderPlugins.java Thu Jul 25 17:35:58 2019 -0400
@@ -44,6 +44,7 @@
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.nodes.CurrentJavaThreadNode;
import org.graalvm.compiler.hotspot.replacements.AESCryptSubstitutions;
@@ -106,6 +107,7 @@
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;
@@ -429,8 +431,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;
@@ -439,15 +439,11 @@
static {
if (JavaVersionUtil.JAVA_SPEC <= 8) {
- cbcEncryptName = "encrypt";
- cbcDecryptName = "decrypt";
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";
@@ -455,6 +451,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;
@@ -464,9 +473,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);