< 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




  22  */
  23 package org.graalvm.compiler.hotspot.meta;
  24 
  25 import static org.graalvm.compiler.core.common.GraalOptions.GeneratePIC;
  26 import static org.graalvm.compiler.hotspot.meta.HotSpotAOTProfilingPlugin.Options.TieredAOT;
  27 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.JAVA_THREAD_THREAD_OBJECT_LOCATION;
  28 import static org.graalvm.compiler.java.BytecodeParserOptions.InlineDuringParsing;
  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.debug.GraalError;
  43 import org.graalvm.compiler.hotspot.GraalHotSpotVMConfig;
  44 import org.graalvm.compiler.hotspot.nodes.CurrentJavaThreadNode;
  45 import org.graalvm.compiler.hotspot.replacements.AESCryptSubstitutions;
  46 import org.graalvm.compiler.hotspot.replacements.BigIntegerSubstitutions;
  47 import org.graalvm.compiler.hotspot.replacements.CRC32Substitutions;
  48 import org.graalvm.compiler.hotspot.replacements.CallSiteTargetNode;
  49 import org.graalvm.compiler.hotspot.replacements.CipherBlockChainingSubstitutions;
  50 import org.graalvm.compiler.hotspot.replacements.ClassGetHubNode;
  51 import org.graalvm.compiler.hotspot.replacements.HotSpotClassSubstitutions;
  52 import org.graalvm.compiler.hotspot.replacements.IdentityHashCodeNode;
  53 import org.graalvm.compiler.hotspot.replacements.ObjectCloneNode;
  54 import org.graalvm.compiler.hotspot.replacements.ObjectSubstitutions;
  55 import org.graalvm.compiler.hotspot.replacements.ReflectionGetCallerClassNode;
  56 import org.graalvm.compiler.hotspot.replacements.ReflectionSubstitutions;
  57 import org.graalvm.compiler.hotspot.replacements.SHA2Substitutions;
  58 import org.graalvm.compiler.hotspot.replacements.SHA5Substitutions;
  59 import org.graalvm.compiler.hotspot.replacements.SHASubstitutions;
  60 import org.graalvm.compiler.hotspot.replacements.ThreadSubstitutions;
  61 import org.graalvm.compiler.hotspot.replacements.arraycopy.ArrayCopyNode;
  62 import org.graalvm.compiler.hotspot.word.HotSpotWordTypes;
  63 import org.graalvm.compiler.nodes.ConstantNode;
  64 import org.graalvm.compiler.nodes.DynamicPiNode;
  65 import org.graalvm.compiler.nodes.FixedGuardNode;
  66 import org.graalvm.compiler.nodes.LogicNode;
  67 import org.graalvm.compiler.nodes.NamedLocationIdentity;
  68 import org.graalvm.compiler.nodes.PiNode;
  69 import org.graalvm.compiler.nodes.ValueNode;
  70 import org.graalvm.compiler.nodes.calc.AddNode;

  71 import org.graalvm.compiler.nodes.calc.LeftShiftNode;
  72 import org.graalvm.compiler.nodes.graphbuilderconf.ForeignCallPlugin;
  73 import org.graalvm.compiler.nodes.graphbuilderconf.GraphBuilderConfiguration.Plugins;
  74 import org.graalvm.compiler.nodes.graphbuilderconf.GraphBuilderContext;
  75 import org.graalvm.compiler.nodes.graphbuilderconf.InvocationPlugin;
  76 import org.graalvm.compiler.nodes.graphbuilderconf.InvocationPlugin.Receiver;
  77 import org.graalvm.compiler.nodes.graphbuilderconf.InvocationPlugins;
  78 import org.graalvm.compiler.nodes.graphbuilderconf.InvocationPlugins.Registration;
  79 import org.graalvm.compiler.nodes.graphbuilderconf.NodeIntrinsicPluginFactory;
  80 import org.graalvm.compiler.nodes.java.InstanceOfDynamicNode;
  81 import org.graalvm.compiler.nodes.memory.HeapAccess.BarrierType;
  82 import org.graalvm.compiler.nodes.memory.address.AddressNode;
  83 import org.graalvm.compiler.nodes.memory.address.OffsetAddressNode;
  84 import org.graalvm.compiler.nodes.spi.StampProvider;
  85 import org.graalvm.compiler.nodes.util.GraphUtil;
  86 import org.graalvm.compiler.options.OptionValues;
  87 import org.graalvm.compiler.phases.tiers.CompilerConfiguration;
  88 import org.graalvm.compiler.replacements.InlineDuringParsingPlugin;
  89 import org.graalvm.compiler.replacements.MethodHandlePlugin;
  90 import org.graalvm.compiler.replacements.NodeIntrinsificationProvider;


 299      *         {@code constantPoolOop}
 300      */
 301     private static ValueNode getMetaspaceConstantPool(GraphBuilderContext b, ValueNode constantPoolOop, WordTypes wordTypes, GraalHotSpotVMConfig config) {
 302         // ConstantPool.constantPoolOop is in fact the holder class.
 303         ValueNode value = b.nullCheckedValue(constantPoolOop, DeoptimizationAction.None);
 304         ValueNode klass = b.add(ClassGetHubNode.create(value, b.getMetaAccess(), b.getConstantReflection(), false));
 305 
 306         boolean notCompressible = false;
 307         AddressNode constantsAddress = b.add(new OffsetAddressNode(klass, b.add(ConstantNode.forLong(config.instanceKlassConstantsOffset))));
 308         return WordOperationPlugin.readOp(b, wordTypes.getWordKind(), constantsAddress, INSTANCE_KLASS_CONSTANTS, BarrierType.NONE, notCompressible);
 309     }
 310 
 311     /**
 312      * Emits a node representing an element in a metaspace {@code ConstantPool}.
 313      *
 314      * @param constantPoolOop value of the {@code constantPoolOop} field in a ConstantPool value
 315      */
 316     private static boolean readMetaspaceConstantPoolElement(GraphBuilderContext b, ValueNode constantPoolOop, ValueNode index, JavaKind elementKind, WordTypes wordTypes, GraalHotSpotVMConfig config) {
 317         ValueNode constants = getMetaspaceConstantPool(b, constantPoolOop, wordTypes, config);
 318         int shift = CodeUtil.log2(wordTypes.getWordKind().getByteCount());
 319         ValueNode scaledIndex = b.add(new LeftShiftNode(index, b.add(ConstantNode.forInt(shift))));
 320         ValueNode offset = b.add(new AddNode(scaledIndex, b.add(ConstantNode.forInt(config.constantPoolSize))));
 321         AddressNode elementAddress = b.add(new OffsetAddressNode(constants, offset));
 322         boolean notCompressible = false;
 323         ValueNode elementValue = WordOperationPlugin.readOp(b, elementKind, elementAddress, NamedLocationIdentity.getArrayLocation(elementKind), BarrierType.NONE, notCompressible);
 324         b.addPush(elementKind, elementValue);
 325         return true;
 326     }
 327 
 328     private static void registerConstantPoolPlugins(InvocationPlugins plugins, WordTypes wordTypes, GraalHotSpotVMConfig config, BytecodeProvider bytecodeProvider) {
 329         Registration r = new Registration(plugins, constantPoolClass, bytecodeProvider);
 330 
 331         r.register2("getSize0", Receiver.class, Object.class, new InvocationPlugin() {
 332             @Override
 333             public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, Receiver receiver, ValueNode constantPoolOop) {
 334                 boolean notCompressible = false;
 335                 ValueNode constants = getMetaspaceConstantPool(b, constantPoolOop, wordTypes, config);
 336                 AddressNode lengthAddress = b.add(new OffsetAddressNode(constants, b.add(ConstantNode.forLong(config.constantPoolLengthOffset))));
 337                 ValueNode length = WordOperationPlugin.readOp(b, JavaKind.Int, lengthAddress, CONSTANT_POOL_LENGTH, BarrierType.NONE, notCompressible);
 338                 b.addPush(JavaKind.Int, length);
 339                 return true;
 340             }




  22  */
  23 package org.graalvm.compiler.hotspot.meta;
  24 
  25 import static org.graalvm.compiler.core.common.GraalOptions.GeneratePIC;
  26 import static org.graalvm.compiler.hotspot.meta.HotSpotAOTProfilingPlugin.Options.TieredAOT;
  27 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.JAVA_THREAD_THREAD_OBJECT_LOCATION;
  28 import static org.graalvm.compiler.java.BytecodeParserOptions.InlineDuringParsing;
  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;
  69 import org.graalvm.compiler.nodes.PiNode;
  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.java.InstanceOfDynamicNode;
  83 import org.graalvm.compiler.nodes.memory.HeapAccess.BarrierType;
  84 import org.graalvm.compiler.nodes.memory.address.AddressNode;
  85 import org.graalvm.compiler.nodes.memory.address.OffsetAddressNode;
  86 import org.graalvm.compiler.nodes.spi.StampProvider;
  87 import org.graalvm.compiler.nodes.util.GraphUtil;
  88 import org.graalvm.compiler.options.OptionValues;
  89 import org.graalvm.compiler.phases.tiers.CompilerConfiguration;
  90 import org.graalvm.compiler.replacements.InlineDuringParsingPlugin;
  91 import org.graalvm.compiler.replacements.MethodHandlePlugin;
  92 import org.graalvm.compiler.replacements.NodeIntrinsificationProvider;


 301      *         {@code constantPoolOop}
 302      */
 303     private static ValueNode getMetaspaceConstantPool(GraphBuilderContext b, ValueNode constantPoolOop, WordTypes wordTypes, GraalHotSpotVMConfig config) {
 304         // ConstantPool.constantPoolOop is in fact the holder class.
 305         ValueNode value = b.nullCheckedValue(constantPoolOop, DeoptimizationAction.None);
 306         ValueNode klass = b.add(ClassGetHubNode.create(value, b.getMetaAccess(), b.getConstantReflection(), false));
 307 
 308         boolean notCompressible = false;
 309         AddressNode constantsAddress = b.add(new OffsetAddressNode(klass, b.add(ConstantNode.forLong(config.instanceKlassConstantsOffset))));
 310         return WordOperationPlugin.readOp(b, wordTypes.getWordKind(), constantsAddress, INSTANCE_KLASS_CONSTANTS, BarrierType.NONE, notCompressible);
 311     }
 312 
 313     /**
 314      * Emits a node representing an element in a metaspace {@code ConstantPool}.
 315      *
 316      * @param constantPoolOop value of the {@code constantPoolOop} field in a ConstantPool value
 317      */
 318     private static boolean readMetaspaceConstantPoolElement(GraphBuilderContext b, ValueNode constantPoolOop, ValueNode index, JavaKind elementKind, WordTypes wordTypes, GraalHotSpotVMConfig config) {
 319         ValueNode constants = getMetaspaceConstantPool(b, constantPoolOop, wordTypes, config);
 320         int shift = CodeUtil.log2(wordTypes.getWordKind().getByteCount());
 321         ValueNode scaledIndex = b.add(new LeftShiftNode(IntegerConvertNode.convert(index, StampFactory.forKind(JavaKind.Long)), b.add(ConstantNode.forInt(shift))));
 322         ValueNode offset = b.add(new AddNode(scaledIndex, b.add(ConstantNode.forLong(config.constantPoolSize))));
 323         AddressNode elementAddress = b.add(new OffsetAddressNode(constants, offset));
 324         boolean notCompressible = false;
 325         ValueNode elementValue = WordOperationPlugin.readOp(b, elementKind, elementAddress, NamedLocationIdentity.getArrayLocation(elementKind), BarrierType.NONE, notCompressible);
 326         b.addPush(elementKind, elementValue);
 327         return true;
 328     }
 329 
 330     private static void registerConstantPoolPlugins(InvocationPlugins plugins, WordTypes wordTypes, GraalHotSpotVMConfig config, BytecodeProvider bytecodeProvider) {
 331         Registration r = new Registration(plugins, constantPoolClass, bytecodeProvider);
 332 
 333         r.register2("getSize0", Receiver.class, Object.class, new InvocationPlugin() {
 334             @Override
 335             public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, Receiver receiver, ValueNode constantPoolOop) {
 336                 boolean notCompressible = false;
 337                 ValueNode constants = getMetaspaceConstantPool(b, constantPoolOop, wordTypes, config);
 338                 AddressNode lengthAddress = b.add(new OffsetAddressNode(constants, b.add(ConstantNode.forLong(config.constantPoolLengthOffset))));
 339                 ValueNode length = WordOperationPlugin.readOp(b, JavaKind.Int, lengthAddress, CONSTANT_POOL_LENGTH, BarrierType.NONE, notCompressible);
 340                 b.addPush(JavaKind.Int, length);
 341                 return true;
 342             }


< prev index next >