17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 */
23
24
25 package org.graalvm.compiler.hotspot.meta;
26
27 import static org.graalvm.compiler.core.common.GraalOptions.GeneratePIC;
28 import static org.graalvm.compiler.hotspot.meta.HotSpotAOTProfilingPlugin.Options.TieredAOT;
29 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.JAVA_THREAD_THREAD_OBJECT_LOCATION;
30 import static org.graalvm.compiler.java.BytecodeParserOptions.InlineDuringParsing;
31 import static org.graalvm.compiler.serviceprovider.GraalServices.Java8OrEarlier;
32
33 import java.lang.invoke.ConstantCallSite;
34 import java.lang.invoke.MutableCallSite;
35 import java.lang.invoke.VolatileCallSite;
36 import java.lang.reflect.Array;
37 import java.lang.reflect.Method;
38 import java.lang.reflect.Modifier;
39 import java.math.BigInteger;
40 import java.util.zip.CRC32;
41
42 import org.graalvm.compiler.api.replacements.SnippetReflectionProvider;
43 import org.graalvm.compiler.bytecode.BytecodeProvider;
44 import org.graalvm.compiler.core.common.spi.ForeignCallsProvider;
45 import org.graalvm.compiler.core.common.type.ObjectStamp;
46 import org.graalvm.compiler.core.common.type.StampFactory;
47 import org.graalvm.compiler.core.common.type.TypeReference;
48 import org.graalvm.compiler.debug.GraalError;
49 import org.graalvm.compiler.hotspot.GraalHotSpotVMConfig;
50 import org.graalvm.compiler.hotspot.nodes.CurrentJavaThreadNode;
51 import org.graalvm.compiler.hotspot.replacements.AESCryptSubstitutions;
52 import org.graalvm.compiler.hotspot.replacements.BigIntegerSubstitutions;
53 import org.graalvm.compiler.hotspot.replacements.CRC32CSubstitutions;
54 import org.graalvm.compiler.hotspot.replacements.CRC32Substitutions;
55 import org.graalvm.compiler.hotspot.replacements.CallSiteTargetNode;
56 import org.graalvm.compiler.hotspot.replacements.CipherBlockChainingSubstitutions;
57 import org.graalvm.compiler.hotspot.replacements.ClassGetHubNode;
58 import org.graalvm.compiler.hotspot.replacements.HotSpotArraySubstitutions;
59 import org.graalvm.compiler.hotspot.replacements.HotSpotClassSubstitutions;
60 import org.graalvm.compiler.hotspot.replacements.IdentityHashCodeNode;
61 import org.graalvm.compiler.hotspot.replacements.ObjectCloneNode;
62 import org.graalvm.compiler.hotspot.replacements.ObjectSubstitutions;
63 import org.graalvm.compiler.hotspot.replacements.ReflectionGetCallerClassNode;
64 import org.graalvm.compiler.hotspot.replacements.ReflectionSubstitutions;
65 import org.graalvm.compiler.hotspot.replacements.SHA2Substitutions;
66 import org.graalvm.compiler.hotspot.replacements.SHA5Substitutions;
67 import org.graalvm.compiler.hotspot.replacements.SHASubstitutions;
68 import org.graalvm.compiler.hotspot.replacements.ThreadSubstitutions;
69 import org.graalvm.compiler.replacements.arraycopy.ArrayCopyNode;
70 import org.graalvm.compiler.hotspot.word.HotSpotWordTypes;
71 import org.graalvm.compiler.nodes.ConstantNode;
72 import org.graalvm.compiler.nodes.NamedLocationIdentity;
73 import org.graalvm.compiler.nodes.NodeView;
74 import org.graalvm.compiler.nodes.ValueNode;
75 import org.graalvm.compiler.nodes.calc.AddNode;
76 import org.graalvm.compiler.nodes.calc.IntegerConvertNode;
77 import org.graalvm.compiler.nodes.calc.LeftShiftNode;
78 import org.graalvm.compiler.nodes.graphbuilderconf.ForeignCallPlugin;
79 import org.graalvm.compiler.nodes.graphbuilderconf.GraphBuilderConfiguration.Plugins;
80 import org.graalvm.compiler.nodes.graphbuilderconf.GraphBuilderContext;
81 import org.graalvm.compiler.nodes.graphbuilderconf.InvocationPlugin;
82 import org.graalvm.compiler.nodes.graphbuilderconf.InvocationPlugin.Receiver;
83 import org.graalvm.compiler.nodes.graphbuilderconf.InvocationPlugins;
84 import org.graalvm.compiler.nodes.graphbuilderconf.InvocationPlugins.Registration;
85 import org.graalvm.compiler.nodes.graphbuilderconf.NodeIntrinsicPluginFactory;
86 import org.graalvm.compiler.nodes.memory.HeapAccess.BarrierType;
87 import org.graalvm.compiler.nodes.memory.ReadNode;
88 import org.graalvm.compiler.nodes.memory.address.AddressNode;
89 import org.graalvm.compiler.nodes.memory.address.OffsetAddressNode;
90 import org.graalvm.compiler.nodes.util.GraphUtil;
91 import org.graalvm.compiler.options.OptionValues;
92 import org.graalvm.compiler.phases.tiers.CompilerConfiguration;
93 import org.graalvm.compiler.replacements.InlineDuringParsingPlugin;
94 import org.graalvm.compiler.replacements.MethodHandlePlugin;
95 import org.graalvm.compiler.replacements.NodeIntrinsificationProvider;
96 import org.graalvm.compiler.replacements.ReplacementsImpl;
97 import org.graalvm.compiler.replacements.StandardGraphBuilderPlugins;
98 import org.graalvm.compiler.serviceprovider.GraalServices;
99 import org.graalvm.compiler.word.WordOperationPlugin;
100 import org.graalvm.compiler.word.WordTypes;
101 import jdk.internal.vm.compiler.word.LocationIdentity;
102
103 import jdk.vm.ci.code.CodeUtil;
104 import jdk.vm.ci.meta.ConstantReflectionProvider;
105 import jdk.vm.ci.meta.DeoptimizationAction;
106 import jdk.vm.ci.meta.JavaKind;
107 import jdk.vm.ci.meta.MetaAccessProvider;
108 import jdk.vm.ci.meta.ResolvedJavaMethod;
109 import sun.misc.Unsafe;
110
111 /**
112 * Defines the {@link Plugins} used when running on HotSpot.
113 */
114 public class HotSpotGraphBuilderPlugins {
115
116 /**
117 * Creates a {@link Plugins} object that should be used when running on HotSpot.
441 assert config.aescryptDecryptBlockStub != 0L;
442 assert config.cipherBlockChainingEncryptAESCryptStub != 0L;
443 assert config.cipherBlockChainingDecryptAESCryptStub != 0L;
444 String arch = config.osArch;
445 String decryptSuffix = arch.equals("sparc") ? "WithOriginalKey" : "";
446 Registration r = new Registration(plugins, "com.sun.crypto.provider.CipherBlockChaining", bytecodeProvider);
447 r.registerMethodSubstitution(CipherBlockChainingSubstitutions.class, cbcEncryptName, Receiver.class, byte[].class, int.class, int.class, byte[].class, int.class);
448 r.registerMethodSubstitution(CipherBlockChainingSubstitutions.class, cbcDecryptName, cbcDecryptName + decryptSuffix, Receiver.class, byte[].class, int.class, int.class, byte[].class,
449 int.class);
450 r = new Registration(plugins, "com.sun.crypto.provider.AESCrypt", bytecodeProvider);
451 r.registerMethodSubstitution(AESCryptSubstitutions.class, aesEncryptName, Receiver.class, byte[].class, int.class, byte[].class, int.class);
452 r.registerMethodSubstitution(AESCryptSubstitutions.class, aesDecryptName, aesDecryptName + decryptSuffix, Receiver.class, byte[].class, int.class, byte[].class, int.class);
453 }
454 }
455
456 private static void registerBigIntegerPlugins(InvocationPlugins plugins, GraalHotSpotVMConfig config, BytecodeProvider bytecodeProvider) {
457 Registration r = new Registration(plugins, BigInteger.class, bytecodeProvider);
458 if (config.useMultiplyToLenIntrinsic()) {
459 assert config.multiplyToLen != 0L;
460 if (Java8OrEarlier) {
461 try {
462 Method m = BigInteger.class.getDeclaredMethod("multiplyToLen", int[].class, int.class, int[].class, int.class, int[].class);
463 if (Modifier.isStatic(m.getModifiers())) {
464 r.registerMethodSubstitution(BigIntegerSubstitutions.class, "multiplyToLen", "multiplyToLenStatic", int[].class, int.class, int[].class, int.class,
465 int[].class);
466 } else {
467 r.registerMethodSubstitution(BigIntegerSubstitutions.class, "multiplyToLen", Receiver.class, int[].class, int.class, int[].class, int.class,
468 int[].class);
469 }
470 } catch (NoSuchMethodException | SecurityException e) {
471 throw new GraalError(e);
472 }
473 } else {
474 r.registerMethodSubstitution(BigIntegerSubstitutions.class, "implMultiplyToLen", "multiplyToLenStatic", int[].class, int.class, int[].class, int.class,
475 int[].class);
476 }
477 }
478 if (config.useMulAddIntrinsic()) {
479 r.registerMethodSubstitution(BigIntegerSubstitutions.class, "implMulAdd", int[].class, int[].class, int.class, int.class, int.class);
480 }
481 if (config.useMontgomeryMultiplyIntrinsic()) {
482 r.registerMethodSubstitution(BigIntegerSubstitutions.class, "implMontgomeryMultiply", int[].class, int[].class, int[].class, int.class, long.class, int[].class);
483 }
484 if (config.useMontgomerySquareIntrinsic()) {
485 r.registerMethodSubstitution(BigIntegerSubstitutions.class, "implMontgomerySquare", int[].class, int[].class, int.class, long.class, int[].class);
486 }
487 if (config.useSquareToLenIntrinsic()) {
488 r.registerMethodSubstitution(BigIntegerSubstitutions.class, "implSquareToLen", int[].class, int.class, int[].class, int.class);
489 }
490 }
491
492 private static void registerSHAPlugins(InvocationPlugins plugins, GraalHotSpotVMConfig config, BytecodeProvider bytecodeProvider) {
493 if (config.useSHA1Intrinsics()) {
|
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 */
23
24
25 package org.graalvm.compiler.hotspot.meta;
26
27 import static org.graalvm.compiler.core.common.GraalOptions.GeneratePIC;
28 import static org.graalvm.compiler.hotspot.meta.HotSpotAOTProfilingPlugin.Options.TieredAOT;
29 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.JAVA_THREAD_THREAD_OBJECT_LOCATION;
30 import static org.graalvm.compiler.java.BytecodeParserOptions.InlineDuringParsing;
31 import static org.graalvm.compiler.serviceprovider.GraalServices.Java8OrEarlier;
32
33 import java.lang.invoke.ConstantCallSite;
34 import java.lang.invoke.MutableCallSite;
35 import java.lang.invoke.VolatileCallSite;
36 import java.lang.reflect.Array;
37 import java.math.BigInteger;
38 import java.util.zip.CRC32;
39
40 import org.graalvm.compiler.api.replacements.SnippetReflectionProvider;
41 import org.graalvm.compiler.bytecode.BytecodeProvider;
42 import org.graalvm.compiler.core.common.spi.ForeignCallsProvider;
43 import org.graalvm.compiler.core.common.type.ObjectStamp;
44 import org.graalvm.compiler.core.common.type.StampFactory;
45 import org.graalvm.compiler.core.common.type.TypeReference;
46 import org.graalvm.compiler.hotspot.GraalHotSpotVMConfig;
47 import org.graalvm.compiler.hotspot.nodes.CurrentJavaThreadNode;
48 import org.graalvm.compiler.hotspot.replacements.AESCryptSubstitutions;
49 import org.graalvm.compiler.hotspot.replacements.BigIntegerSubstitutions;
50 import org.graalvm.compiler.hotspot.replacements.CRC32CSubstitutions;
51 import org.graalvm.compiler.hotspot.replacements.CRC32Substitutions;
52 import org.graalvm.compiler.hotspot.replacements.CallSiteTargetNode;
53 import org.graalvm.compiler.hotspot.replacements.CipherBlockChainingSubstitutions;
54 import org.graalvm.compiler.hotspot.replacements.ClassGetHubNode;
55 import org.graalvm.compiler.hotspot.replacements.HotSpotArraySubstitutions;
56 import org.graalvm.compiler.hotspot.replacements.HotSpotClassSubstitutions;
57 import org.graalvm.compiler.hotspot.replacements.IdentityHashCodeNode;
58 import org.graalvm.compiler.hotspot.replacements.ObjectCloneNode;
59 import org.graalvm.compiler.hotspot.replacements.ObjectSubstitutions;
60 import org.graalvm.compiler.hotspot.replacements.ReflectionGetCallerClassNode;
61 import org.graalvm.compiler.hotspot.replacements.ReflectionSubstitutions;
62 import org.graalvm.compiler.hotspot.replacements.SHA2Substitutions;
63 import org.graalvm.compiler.hotspot.replacements.SHA5Substitutions;
64 import org.graalvm.compiler.hotspot.replacements.SHASubstitutions;
65 import org.graalvm.compiler.hotspot.replacements.ThreadSubstitutions;
66 import org.graalvm.compiler.hotspot.word.HotSpotWordTypes;
67 import org.graalvm.compiler.nodes.ConstantNode;
68 import org.graalvm.compiler.nodes.NamedLocationIdentity;
69 import org.graalvm.compiler.nodes.NodeView;
70 import org.graalvm.compiler.nodes.ValueNode;
71 import org.graalvm.compiler.nodes.calc.AddNode;
72 import org.graalvm.compiler.nodes.calc.IntegerConvertNode;
73 import org.graalvm.compiler.nodes.calc.LeftShiftNode;
74 import org.graalvm.compiler.nodes.graphbuilderconf.ForeignCallPlugin;
75 import org.graalvm.compiler.nodes.graphbuilderconf.GraphBuilderConfiguration.Plugins;
76 import org.graalvm.compiler.nodes.graphbuilderconf.GraphBuilderContext;
77 import org.graalvm.compiler.nodes.graphbuilderconf.InvocationPlugin;
78 import org.graalvm.compiler.nodes.graphbuilderconf.InvocationPlugin.Receiver;
79 import org.graalvm.compiler.nodes.graphbuilderconf.InvocationPlugins;
80 import org.graalvm.compiler.nodes.graphbuilderconf.InvocationPlugins.Registration;
81 import org.graalvm.compiler.nodes.graphbuilderconf.NodeIntrinsicPluginFactory;
82 import org.graalvm.compiler.nodes.memory.HeapAccess.BarrierType;
83 import org.graalvm.compiler.nodes.memory.ReadNode;
84 import org.graalvm.compiler.nodes.memory.address.AddressNode;
85 import org.graalvm.compiler.nodes.memory.address.OffsetAddressNode;
86 import org.graalvm.compiler.nodes.util.GraphUtil;
87 import org.graalvm.compiler.options.OptionValues;
88 import org.graalvm.compiler.phases.tiers.CompilerConfiguration;
89 import org.graalvm.compiler.replacements.InlineDuringParsingPlugin;
90 import org.graalvm.compiler.replacements.MethodHandlePlugin;
91 import org.graalvm.compiler.replacements.NodeIntrinsificationProvider;
92 import org.graalvm.compiler.replacements.ReplacementsImpl;
93 import org.graalvm.compiler.replacements.StandardGraphBuilderPlugins;
94 import org.graalvm.compiler.replacements.arraycopy.ArrayCopyNode;
95 import org.graalvm.compiler.serviceprovider.GraalServices;
96 import org.graalvm.compiler.word.WordOperationPlugin;
97 import org.graalvm.compiler.word.WordTypes;
98 import jdk.internal.vm.compiler.word.LocationIdentity;
99
100 import jdk.vm.ci.code.CodeUtil;
101 import jdk.vm.ci.meta.ConstantReflectionProvider;
102 import jdk.vm.ci.meta.DeoptimizationAction;
103 import jdk.vm.ci.meta.JavaKind;
104 import jdk.vm.ci.meta.MetaAccessProvider;
105 import jdk.vm.ci.meta.ResolvedJavaMethod;
106 import sun.misc.Unsafe;
107
108 /**
109 * Defines the {@link Plugins} used when running on HotSpot.
110 */
111 public class HotSpotGraphBuilderPlugins {
112
113 /**
114 * Creates a {@link Plugins} object that should be used when running on HotSpot.
438 assert config.aescryptDecryptBlockStub != 0L;
439 assert config.cipherBlockChainingEncryptAESCryptStub != 0L;
440 assert config.cipherBlockChainingDecryptAESCryptStub != 0L;
441 String arch = config.osArch;
442 String decryptSuffix = arch.equals("sparc") ? "WithOriginalKey" : "";
443 Registration r = new Registration(plugins, "com.sun.crypto.provider.CipherBlockChaining", bytecodeProvider);
444 r.registerMethodSubstitution(CipherBlockChainingSubstitutions.class, cbcEncryptName, Receiver.class, byte[].class, int.class, int.class, byte[].class, int.class);
445 r.registerMethodSubstitution(CipherBlockChainingSubstitutions.class, cbcDecryptName, cbcDecryptName + decryptSuffix, Receiver.class, byte[].class, int.class, int.class, byte[].class,
446 int.class);
447 r = new Registration(plugins, "com.sun.crypto.provider.AESCrypt", bytecodeProvider);
448 r.registerMethodSubstitution(AESCryptSubstitutions.class, aesEncryptName, Receiver.class, byte[].class, int.class, byte[].class, int.class);
449 r.registerMethodSubstitution(AESCryptSubstitutions.class, aesDecryptName, aesDecryptName + decryptSuffix, Receiver.class, byte[].class, int.class, byte[].class, int.class);
450 }
451 }
452
453 private static void registerBigIntegerPlugins(InvocationPlugins plugins, GraalHotSpotVMConfig config, BytecodeProvider bytecodeProvider) {
454 Registration r = new Registration(plugins, BigInteger.class, bytecodeProvider);
455 if (config.useMultiplyToLenIntrinsic()) {
456 assert config.multiplyToLen != 0L;
457 if (Java8OrEarlier) {
458 r.registerMethodSubstitution(BigIntegerSubstitutions.class, "multiplyToLen", "multiplyToLenStatic", int[].class, int.class, int[].class, int.class,
459 int[].class);
460 } else {
461 r.registerMethodSubstitution(BigIntegerSubstitutions.class, "implMultiplyToLen", "multiplyToLenStatic", int[].class, int.class, int[].class, int.class,
462 int[].class);
463 }
464 }
465 if (config.useMulAddIntrinsic()) {
466 r.registerMethodSubstitution(BigIntegerSubstitutions.class, "implMulAdd", int[].class, int[].class, int.class, int.class, int.class);
467 }
468 if (config.useMontgomeryMultiplyIntrinsic()) {
469 r.registerMethodSubstitution(BigIntegerSubstitutions.class, "implMontgomeryMultiply", int[].class, int[].class, int[].class, int.class, long.class, int[].class);
470 }
471 if (config.useMontgomerySquareIntrinsic()) {
472 r.registerMethodSubstitution(BigIntegerSubstitutions.class, "implMontgomerySquare", int[].class, int[].class, int.class, long.class, int[].class);
473 }
474 if (config.useSquareToLenIntrinsic()) {
475 r.registerMethodSubstitution(BigIntegerSubstitutions.class, "implSquareToLen", int[].class, int.class, int[].class, int.class);
476 }
477 }
478
479 private static void registerSHAPlugins(InvocationPlugins plugins, GraalHotSpotVMConfig config, BytecodeProvider bytecodeProvider) {
480 if (config.useSHA1Intrinsics()) {
|