29 import static org.graalvm.compiler.serviceprovider.JDK9Method.Java8OrEarlier;
30
31 import java.lang.invoke.ConstantCallSite;
32 import java.lang.invoke.MutableCallSite;
33 import java.lang.invoke.VolatileCallSite;
34 import java.lang.reflect.Method;
35 import java.lang.reflect.Modifier;
36 import java.math.BigInteger;
37 import java.util.zip.CRC32;
38
39 import org.graalvm.compiler.api.replacements.SnippetReflectionProvider;
40 import org.graalvm.compiler.bytecode.BytecodeProvider;
41 import org.graalvm.compiler.core.common.spi.ForeignCallsProvider;
42 import org.graalvm.compiler.core.common.type.StampFactory;
43 import org.graalvm.compiler.debug.GraalError;
44 import org.graalvm.compiler.hotspot.GraalHotSpotVMConfig;
45 import org.graalvm.compiler.hotspot.nodes.CurrentJavaThreadNode;
46 import org.graalvm.compiler.hotspot.replacements.AESCryptSubstitutions;
47 import org.graalvm.compiler.hotspot.replacements.BigIntegerSubstitutions;
48 import org.graalvm.compiler.hotspot.replacements.CRC32Substitutions;
49 import org.graalvm.compiler.hotspot.replacements.CallSiteTargetNode;
50 import org.graalvm.compiler.hotspot.replacements.CipherBlockChainingSubstitutions;
51 import org.graalvm.compiler.hotspot.replacements.ClassGetHubNode;
52 import org.graalvm.compiler.hotspot.replacements.HotSpotClassSubstitutions;
53 import org.graalvm.compiler.hotspot.replacements.IdentityHashCodeNode;
54 import org.graalvm.compiler.hotspot.replacements.ObjectCloneNode;
55 import org.graalvm.compiler.hotspot.replacements.ObjectSubstitutions;
56 import org.graalvm.compiler.hotspot.replacements.ReflectionGetCallerClassNode;
57 import org.graalvm.compiler.hotspot.replacements.ReflectionSubstitutions;
58 import org.graalvm.compiler.hotspot.replacements.SHA2Substitutions;
59 import org.graalvm.compiler.hotspot.replacements.SHA5Substitutions;
60 import org.graalvm.compiler.hotspot.replacements.SHASubstitutions;
61 import org.graalvm.compiler.hotspot.replacements.ThreadSubstitutions;
62 import org.graalvm.compiler.hotspot.replacements.arraycopy.ArrayCopyNode;
63 import org.graalvm.compiler.hotspot.word.HotSpotWordTypes;
64 import org.graalvm.compiler.nodes.ConstantNode;
65 import org.graalvm.compiler.nodes.DynamicPiNode;
66 import org.graalvm.compiler.nodes.FixedGuardNode;
67 import org.graalvm.compiler.nodes.LogicNode;
68 import org.graalvm.compiler.nodes.NamedLocationIdentity;
148 plugins.setProfilingPlugin(new HotSpotAOTProfilingPlugin());
149 }
150 }
151
152 invocationPlugins.defer(new Runnable() {
153
154 @Override
155 public void run() {
156 BytecodeProvider replacementBytecodeProvider = replacements.getDefaultReplacementBytecodeProvider();
157 registerObjectPlugins(invocationPlugins, options, replacementBytecodeProvider);
158 registerClassPlugins(plugins, config, replacementBytecodeProvider);
159 registerSystemPlugins(invocationPlugins, foreignCalls);
160 registerThreadPlugins(invocationPlugins, metaAccess, wordTypes, config, replacementBytecodeProvider);
161 if (!GeneratePIC.getValue(options)) {
162 registerCallSitePlugins(invocationPlugins);
163 }
164 registerReflectionPlugins(invocationPlugins, replacementBytecodeProvider);
165 registerConstantPoolPlugins(invocationPlugins, wordTypes, config, replacementBytecodeProvider);
166 registerAESPlugins(invocationPlugins, config, replacementBytecodeProvider);
167 registerCRC32Plugins(invocationPlugins, config, replacementBytecodeProvider);
168 registerBigIntegerPlugins(invocationPlugins, config, replacementBytecodeProvider);
169 registerSHAPlugins(invocationPlugins, config, replacementBytecodeProvider);
170 registerUnsafePlugins(invocationPlugins, replacementBytecodeProvider);
171 StandardGraphBuilderPlugins.registerInvocationPlugins(metaAccess, snippetReflection, invocationPlugins, replacementBytecodeProvider, true);
172
173 for (NodeIntrinsicPluginFactory factory : GraalServices.load(NodeIntrinsicPluginFactory.class)) {
174 factory.registerPlugins(invocationPlugins, nodeIntrinsificationProvider);
175 }
176 }
177 });
178 return plugins;
179 }
180
181 private static void registerObjectPlugins(InvocationPlugins plugins, OptionValues options, BytecodeProvider bytecodeProvider) {
182 Registration r = new Registration(plugins, Object.class, bytecodeProvider);
183 if (!GeneratePIC.getValue(options)) {
184 // FIXME: clone() requires speculation and requires a fix in here (to check that
185 // b.getAssumptions() != null), and in ReplacementImpl.getSubstitution() where there is
186 // an instantiation of IntrinsicGraphBuilder using a constructor that sets
187 // AllowAssumptions to YES automatically. The former has to inherit the assumptions
513 if (config.useSHA512Intrinsics()) {
514 assert config.sha512ImplCompress != 0L;
515 Registration r = new Registration(plugins, "sun.security.provider.SHA5", bytecodeProvider);
516 r.registerMethodSubstitution(SHA5Substitutions.class, SHA5Substitutions.implCompressName, "implCompress0", Receiver.class, byte[].class, int.class);
517 }
518 }
519
520 private static void registerCRC32Plugins(InvocationPlugins plugins, GraalHotSpotVMConfig config, BytecodeProvider bytecodeProvider) {
521 if (config.useCRC32Intrinsics) {
522 Registration r = new Registration(plugins, CRC32.class, bytecodeProvider);
523 r.registerMethodSubstitution(CRC32Substitutions.class, "update", int.class, int.class);
524 if (Java8OrEarlier) {
525 r.registerMethodSubstitution(CRC32Substitutions.class, "updateBytes", int.class, byte[].class, int.class, int.class);
526 r.registerMethodSubstitution(CRC32Substitutions.class, "updateByteBuffer", int.class, long.class, int.class, int.class);
527 } else {
528 r.registerMethodSubstitution(CRC32Substitutions.class, "updateBytes0", int.class, byte[].class, int.class, int.class);
529 r.registerMethodSubstitution(CRC32Substitutions.class, "updateByteBuffer0", int.class, long.class, int.class, int.class);
530 }
531 }
532 }
533 }
|
29 import static org.graalvm.compiler.serviceprovider.JDK9Method.Java8OrEarlier;
30
31 import java.lang.invoke.ConstantCallSite;
32 import java.lang.invoke.MutableCallSite;
33 import java.lang.invoke.VolatileCallSite;
34 import java.lang.reflect.Method;
35 import java.lang.reflect.Modifier;
36 import java.math.BigInteger;
37 import java.util.zip.CRC32;
38
39 import org.graalvm.compiler.api.replacements.SnippetReflectionProvider;
40 import org.graalvm.compiler.bytecode.BytecodeProvider;
41 import org.graalvm.compiler.core.common.spi.ForeignCallsProvider;
42 import org.graalvm.compiler.core.common.type.StampFactory;
43 import org.graalvm.compiler.debug.GraalError;
44 import org.graalvm.compiler.hotspot.GraalHotSpotVMConfig;
45 import org.graalvm.compiler.hotspot.nodes.CurrentJavaThreadNode;
46 import org.graalvm.compiler.hotspot.replacements.AESCryptSubstitutions;
47 import org.graalvm.compiler.hotspot.replacements.BigIntegerSubstitutions;
48 import org.graalvm.compiler.hotspot.replacements.CRC32Substitutions;
49 import org.graalvm.compiler.hotspot.replacements.CRC32CSubstitutions;
50 import org.graalvm.compiler.hotspot.replacements.CallSiteTargetNode;
51 import org.graalvm.compiler.hotspot.replacements.CipherBlockChainingSubstitutions;
52 import org.graalvm.compiler.hotspot.replacements.ClassGetHubNode;
53 import org.graalvm.compiler.hotspot.replacements.HotSpotClassSubstitutions;
54 import org.graalvm.compiler.hotspot.replacements.IdentityHashCodeNode;
55 import org.graalvm.compiler.hotspot.replacements.ObjectCloneNode;
56 import org.graalvm.compiler.hotspot.replacements.ObjectSubstitutions;
57 import org.graalvm.compiler.hotspot.replacements.ReflectionGetCallerClassNode;
58 import org.graalvm.compiler.hotspot.replacements.ReflectionSubstitutions;
59 import org.graalvm.compiler.hotspot.replacements.SHA2Substitutions;
60 import org.graalvm.compiler.hotspot.replacements.SHA5Substitutions;
61 import org.graalvm.compiler.hotspot.replacements.SHASubstitutions;
62 import org.graalvm.compiler.hotspot.replacements.ThreadSubstitutions;
63 import org.graalvm.compiler.hotspot.replacements.arraycopy.ArrayCopyNode;
64 import org.graalvm.compiler.hotspot.word.HotSpotWordTypes;
65 import org.graalvm.compiler.nodes.ConstantNode;
66 import org.graalvm.compiler.nodes.DynamicPiNode;
67 import org.graalvm.compiler.nodes.FixedGuardNode;
68 import org.graalvm.compiler.nodes.LogicNode;
69 import org.graalvm.compiler.nodes.NamedLocationIdentity;
149 plugins.setProfilingPlugin(new HotSpotAOTProfilingPlugin());
150 }
151 }
152
153 invocationPlugins.defer(new Runnable() {
154
155 @Override
156 public void run() {
157 BytecodeProvider replacementBytecodeProvider = replacements.getDefaultReplacementBytecodeProvider();
158 registerObjectPlugins(invocationPlugins, options, replacementBytecodeProvider);
159 registerClassPlugins(plugins, config, replacementBytecodeProvider);
160 registerSystemPlugins(invocationPlugins, foreignCalls);
161 registerThreadPlugins(invocationPlugins, metaAccess, wordTypes, config, replacementBytecodeProvider);
162 if (!GeneratePIC.getValue(options)) {
163 registerCallSitePlugins(invocationPlugins);
164 }
165 registerReflectionPlugins(invocationPlugins, replacementBytecodeProvider);
166 registerConstantPoolPlugins(invocationPlugins, wordTypes, config, replacementBytecodeProvider);
167 registerAESPlugins(invocationPlugins, config, replacementBytecodeProvider);
168 registerCRC32Plugins(invocationPlugins, config, replacementBytecodeProvider);
169 registerCRC32CPlugins(invocationPlugins, config, replacementBytecodeProvider);
170 registerBigIntegerPlugins(invocationPlugins, config, replacementBytecodeProvider);
171 registerSHAPlugins(invocationPlugins, config, replacementBytecodeProvider);
172 registerUnsafePlugins(invocationPlugins, replacementBytecodeProvider);
173 StandardGraphBuilderPlugins.registerInvocationPlugins(metaAccess, snippetReflection, invocationPlugins, replacementBytecodeProvider, true);
174
175 for (NodeIntrinsicPluginFactory factory : GraalServices.load(NodeIntrinsicPluginFactory.class)) {
176 factory.registerPlugins(invocationPlugins, nodeIntrinsificationProvider);
177 }
178 }
179 });
180 return plugins;
181 }
182
183 private static void registerObjectPlugins(InvocationPlugins plugins, OptionValues options, BytecodeProvider bytecodeProvider) {
184 Registration r = new Registration(plugins, Object.class, bytecodeProvider);
185 if (!GeneratePIC.getValue(options)) {
186 // FIXME: clone() requires speculation and requires a fix in here (to check that
187 // b.getAssumptions() != null), and in ReplacementImpl.getSubstitution() where there is
188 // an instantiation of IntrinsicGraphBuilder using a constructor that sets
189 // AllowAssumptions to YES automatically. The former has to inherit the assumptions
515 if (config.useSHA512Intrinsics()) {
516 assert config.sha512ImplCompress != 0L;
517 Registration r = new Registration(plugins, "sun.security.provider.SHA5", bytecodeProvider);
518 r.registerMethodSubstitution(SHA5Substitutions.class, SHA5Substitutions.implCompressName, "implCompress0", Receiver.class, byte[].class, int.class);
519 }
520 }
521
522 private static void registerCRC32Plugins(InvocationPlugins plugins, GraalHotSpotVMConfig config, BytecodeProvider bytecodeProvider) {
523 if (config.useCRC32Intrinsics) {
524 Registration r = new Registration(plugins, CRC32.class, bytecodeProvider);
525 r.registerMethodSubstitution(CRC32Substitutions.class, "update", int.class, int.class);
526 if (Java8OrEarlier) {
527 r.registerMethodSubstitution(CRC32Substitutions.class, "updateBytes", int.class, byte[].class, int.class, int.class);
528 r.registerMethodSubstitution(CRC32Substitutions.class, "updateByteBuffer", int.class, long.class, int.class, int.class);
529 } else {
530 r.registerMethodSubstitution(CRC32Substitutions.class, "updateBytes0", int.class, byte[].class, int.class, int.class);
531 r.registerMethodSubstitution(CRC32Substitutions.class, "updateByteBuffer0", int.class, long.class, int.class, int.class);
532 }
533 }
534 }
535
536 private static void registerCRC32CPlugins(InvocationPlugins plugins, GraalHotSpotVMConfig config, BytecodeProvider bytecodeProvider) {
537 if (config.useCRC32CIntrinsics) {
538 Registration r = new Registration(plugins, "java.util.zip.CRC32C", bytecodeProvider);
539 r.registerMethodSubstitution(CRC32CSubstitutions.class, "updateBytes", int.class, byte[].class, int.class, int.class);
540 r.registerMethodSubstitution(CRC32CSubstitutions.class, "updateDirectByteBuffer", int.class, long.class, int.class, int.class);
541 }
542 }
543 }
|