< prev index next >

src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/meta/HotSpotGraphBuilderPlugins.java

Print this page




  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()) {


< prev index next >