< prev index next >

src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/replacements/HotSpotReplacementsUtil.java

Print this page

        

*** 25,35 **** package org.graalvm.compiler.hotspot.replacements; import static org.graalvm.compiler.hotspot.GraalHotSpotVMConfigBase.INJECTED_METAACCESS; import static org.graalvm.compiler.hotspot.GraalHotSpotVMConfigBase.INJECTED_VMCONFIG; import static org.graalvm.compiler.hotspot.meta.HotSpotForeignCallsProviderImpl.VERIFY_OOP; ! import static org.graalvm.compiler.hotspot.replacements.UnsafeAccess.UNSAFE; import org.graalvm.compiler.api.replacements.Fold; import org.graalvm.compiler.api.replacements.Fold.InjectedParameter; import org.graalvm.compiler.core.common.SuppressFBWarnings; import org.graalvm.compiler.core.common.spi.ForeignCallDescriptor; --- 25,36 ---- package org.graalvm.compiler.hotspot.replacements; import static org.graalvm.compiler.hotspot.GraalHotSpotVMConfigBase.INJECTED_METAACCESS; import static org.graalvm.compiler.hotspot.GraalHotSpotVMConfigBase.INJECTED_VMCONFIG; import static org.graalvm.compiler.hotspot.meta.HotSpotForeignCallsProviderImpl.VERIFY_OOP; ! ! import java.lang.ref.Reference; import org.graalvm.compiler.api.replacements.Fold; import org.graalvm.compiler.api.replacements.Fold.InjectedParameter; import org.graalvm.compiler.core.common.SuppressFBWarnings; import org.graalvm.compiler.core.common.spi.ForeignCallDescriptor;
*** 38,59 **** import org.graalvm.compiler.debug.GraalError; import org.graalvm.compiler.graph.Node.ConstantNodeParameter; import org.graalvm.compiler.graph.Node.NodeIntrinsic; import org.graalvm.compiler.graph.spi.CanonicalizerTool; import org.graalvm.compiler.hotspot.GraalHotSpotVMConfig; - import org.graalvm.compiler.nodes.ComputeObjectAddressNode; import org.graalvm.compiler.hotspot.word.KlassPointer; import org.graalvm.compiler.nodes.CanonicalizableLocation; import org.graalvm.compiler.nodes.CompressionNode; import org.graalvm.compiler.nodes.ConstantNode; import org.graalvm.compiler.nodes.NamedLocationIdentity; import org.graalvm.compiler.nodes.NodeView; import org.graalvm.compiler.nodes.ValueNode; import org.graalvm.compiler.nodes.extended.ForeignCallNode; import org.graalvm.compiler.nodes.extended.LoadHubNode; import org.graalvm.compiler.nodes.extended.RawLoadNode; import org.graalvm.compiler.nodes.extended.StoreHubNode; import org.graalvm.compiler.nodes.memory.Access; import org.graalvm.compiler.nodes.memory.address.AddressNode; import org.graalvm.compiler.nodes.memory.address.OffsetAddressNode; import org.graalvm.compiler.nodes.type.StampTool; import org.graalvm.compiler.replacements.ReplacementsUtil; --- 39,61 ---- import org.graalvm.compiler.debug.GraalError; import org.graalvm.compiler.graph.Node.ConstantNodeParameter; import org.graalvm.compiler.graph.Node.NodeIntrinsic; import org.graalvm.compiler.graph.spi.CanonicalizerTool; import org.graalvm.compiler.hotspot.GraalHotSpotVMConfig; import org.graalvm.compiler.hotspot.word.KlassPointer; import org.graalvm.compiler.nodes.CanonicalizableLocation; import org.graalvm.compiler.nodes.CompressionNode; + import org.graalvm.compiler.nodes.ComputeObjectAddressNode; import org.graalvm.compiler.nodes.ConstantNode; import org.graalvm.compiler.nodes.NamedLocationIdentity; import org.graalvm.compiler.nodes.NodeView; import org.graalvm.compiler.nodes.ValueNode; import org.graalvm.compiler.nodes.extended.ForeignCallNode; import org.graalvm.compiler.nodes.extended.LoadHubNode; import org.graalvm.compiler.nodes.extended.RawLoadNode; import org.graalvm.compiler.nodes.extended.StoreHubNode; + import org.graalvm.compiler.nodes.graphbuilderconf.IntrinsicContext; import org.graalvm.compiler.nodes.memory.Access; import org.graalvm.compiler.nodes.memory.address.AddressNode; import org.graalvm.compiler.nodes.memory.address.OffsetAddressNode; import org.graalvm.compiler.nodes.type.StampTool; import org.graalvm.compiler.replacements.ReplacementsUtil;
*** 68,78 **** --- 70,83 ---- import jdk.vm.ci.hotspot.HotSpotMetaspaceConstant; import jdk.vm.ci.hotspot.HotSpotResolvedObjectType; import jdk.vm.ci.meta.Assumptions; import jdk.vm.ci.meta.Assumptions.AssumptionResult; import jdk.vm.ci.meta.JavaKind; + import jdk.vm.ci.meta.MetaAccessProvider; + import jdk.vm.ci.meta.ResolvedJavaField; import jdk.vm.ci.meta.ResolvedJavaType; + import jdk.vm.ci.meta.UnresolvedJavaType; //JaCoCo Exclude /** * A collection of methods used in HotSpot snippets, substitutions and stubs.
*** 131,153 **** } return read; } } public static HotSpotJVMCIRuntime runtime() { return HotSpotJVMCIRuntime.runtime(); } @Fold public static int getHeapWordSize(@InjectedParameter GraalHotSpotVMConfig injectedVMConfig) { return injectedVMConfig.heapWordSize; } @Fold ! public static GraalHotSpotVMConfig config(@InjectedParameter GraalHotSpotVMConfig config) { ! assert config != null; ! return config; } @Fold public static boolean useTLAB(@InjectedParameter GraalHotSpotVMConfig config) { return config.useTLAB; --- 136,179 ---- } return read; } } + public static ResolvedJavaType methodHolderClass(@Fold.InjectedParameter IntrinsicContext context) { + return context.getOriginalMethod().getDeclaringClass(); + } + + static ResolvedJavaType getType(@Fold.InjectedParameter IntrinsicContext context, String typeName) { + try { + UnresolvedJavaType unresolved = UnresolvedJavaType.create(typeName); + return unresolved.resolve(methodHolderClass(context)); + } catch (LinkageError e) { + throw new GraalError(e); + } + } + + static int getFieldOffset(ResolvedJavaType type, String fieldName) { + for (ResolvedJavaField field : type.getInstanceFields(true)) { + if (field.getName().equals(fieldName)) { + return field.getOffset(); + } + } + throw new GraalError("missing field " + fieldName); + } + public static HotSpotJVMCIRuntime runtime() { return HotSpotJVMCIRuntime.runtime(); } @Fold public static int getHeapWordSize(@InjectedParameter GraalHotSpotVMConfig injectedVMConfig) { return injectedVMConfig.heapWordSize; } @Fold ! public static int klassLayoutHelperNeutralValue(@InjectedParameter GraalHotSpotVMConfig config) { ! return config.klassLayoutHelperNeutralValue; } @Fold public static boolean useTLAB(@InjectedParameter GraalHotSpotVMConfig config) { return config.useTLAB;
*** 197,213 **** @Fold static int threadPendingExceptionOffset(@InjectedParameter GraalHotSpotVMConfig config) { return config.pendingExceptionOffset; } - public static final LocationIdentity OBJECT_RESULT_LOCATION = NamedLocationIdentity.mutable("ObjectResult"); - - @Fold - static int objectResultOffset(@InjectedParameter GraalHotSpotVMConfig config) { - return config.threadObjectResultOffset; - } - /** * @see GraalHotSpotVMConfig#threadExceptionOopOffset */ public static Object readExceptionOop(Word thread) { return thread.readObject(threadExceptionOopOffset(INJECTED_VMCONFIG), EXCEPTION_OOP_LOCATION); --- 223,232 ----
*** 260,280 **** @SuppressFBWarnings(value = "NP_NULL_PARAM_DEREF_NONVIRTUAL", justification = "foldable method parameters are injected") public static Object getPendingException(Word thread) { return thread.readObject(threadPendingExceptionOffset(INJECTED_VMCONFIG), PENDING_EXCEPTION_LOCATION); } - /** - * Gets and clears the object result from a runtime call stored in a thread local. - * - * @return the object that was in the thread local - */ - public static Object getAndClearObjectResult(Word thread) { - Object result = thread.readObject(objectResultOffset(INJECTED_VMCONFIG), OBJECT_RESULT_LOCATION); - thread.writeObject(objectResultOffset(INJECTED_VMCONFIG), null, OBJECT_RESULT_LOCATION); - return result; - } - /* * As far as Java code is concerned this can be considered immutable: it is set just after the * JavaThread is created, before it is published. After that, it is never changed. */ public static final LocationIdentity JAVA_THREAD_THREAD_OBJECT_LOCATION = NamedLocationIdentity.immutable("JavaThread::_threadObj"); --- 279,288 ----
*** 305,316 **** public static int wordSize() { return runtime().getHostJVMCIBackend().getCodeCache().getTarget().wordSize; } @Fold ! public static int pageSize() { ! return UNSAFE.pageSize(); } public static final LocationIdentity PROTOTYPE_MARK_WORD_LOCATION = NamedLocationIdentity.mutable("PrototypeMarkWord"); @Fold --- 313,324 ---- public static int wordSize() { return runtime().getHostJVMCIBackend().getCodeCache().getTarget().wordSize; } @Fold ! public static int pageSize(@InjectedParameter GraalHotSpotVMConfig config) { ! return config.vmPageSize; } public static final LocationIdentity PROTOTYPE_MARK_WORD_LOCATION = NamedLocationIdentity.mutable("PrototypeMarkWord"); @Fold
*** 346,355 **** --- 354,413 ---- } return read; } }; + @Fold + public static int allocatePrefetchStyle(@InjectedParameter GraalHotSpotVMConfig config) { + return config.allocatePrefetchStyle; + } + + @Fold + public static int allocatePrefetchLines(@InjectedParameter GraalHotSpotVMConfig config) { + return config.allocatePrefetchLines; + } + + @Fold + public static int allocatePrefetchDistance(@InjectedParameter GraalHotSpotVMConfig config) { + return config.allocatePrefetchDistance; + } + + @Fold + public static int allocateInstancePrefetchLines(@InjectedParameter GraalHotSpotVMConfig config) { + return config.allocateInstancePrefetchLines; + } + + @Fold + public static int allocatePrefetchStepSize(@InjectedParameter GraalHotSpotVMConfig config) { + return config.allocatePrefetchStepSize; + } + + @Fold + public static int invocationCounterIncrement(@InjectedParameter GraalHotSpotVMConfig config) { + return config.invocationCounterIncrement; + } + + @Fold + public static int invocationCounterOffset(@InjectedParameter GraalHotSpotVMConfig config) { + return config.invocationCounterOffset; + } + + @Fold + public static int backedgeCounterOffset(@InjectedParameter GraalHotSpotVMConfig config) { + return config.backedgeCounterOffset; + } + + @Fold + public static int invocationCounterShift(@InjectedParameter GraalHotSpotVMConfig config) { + return config.invocationCounterShift; + } + + @Fold + public static int stackBias(@InjectedParameter GraalHotSpotVMConfig config) { + return config.stackBias; + } + @NodeIntrinsic(value = KlassLayoutHelperNode.class) public static native int readLayoutHelper(KlassPointer object); /** * Checks if class {@code klass} is an array.
*** 363,373 **** /* * The less-than check only works if both values are ints. We use local variables to make * sure these are still ints and haven't changed. */ final int layoutHelper = readLayoutHelper(klassNonNull); ! final int layoutHelperNeutralValue = config(INJECTED_VMCONFIG).klassLayoutHelperNeutralValue; return (layoutHelper < layoutHelperNeutralValue); } public static final LocationIdentity ARRAY_KLASS_COMPONENT_MIRROR = NamedLocationIdentity.immutable("ArrayKlass::_component_mirror"); --- 421,431 ---- /* * The less-than check only works if both values are ints. We use local variables to make * sure these are still ints and haven't changed. */ final int layoutHelper = readLayoutHelper(klassNonNull); ! final int layoutHelperNeutralValue = klassLayoutHelperNeutralValue(INJECTED_VMCONFIG); return (layoutHelper < layoutHelperNeutralValue); } public static final LocationIdentity ARRAY_KLASS_COMPONENT_MIRROR = NamedLocationIdentity.immutable("ArrayKlass::_component_mirror");
*** 516,551 **** /** * Idiom for making {@link GraalHotSpotVMConfig} a constant. */ @Fold ! public static GraalHotSpotVMConfig getConfig(@InjectedParameter GraalHotSpotVMConfig config) { ! return config; } /** ! * Calls {@link #arrayAllocationSize(int, int, int, GraalHotSpotVMConfig)} using an injected VM ! * configuration object. */ public static int arrayAllocationSize(int length, int headerSize, int log2ElementSize) { ! return arrayAllocationSize(length, headerSize, log2ElementSize, getConfig(INJECTED_VMCONFIG)); } /** * Computes the size of the memory chunk allocated for an array. This size accounts for the * array header size, body size and any padding after the last element to satisfy object * alignment requirements. * * @param length the number of elements in the array * @param headerSize the size of the array header * @param log2ElementSize log2 of the size of an element in the array ! * @param config the VM configuration providing the ! * {@linkplain GraalHotSpotVMConfig#objectAlignment object alignment requirement} * @return the size of the memory chunk */ ! public static int arrayAllocationSize(int length, int headerSize, int log2ElementSize, GraalHotSpotVMConfig config) { ! int alignment = config.objectAlignment; int size = (length << log2ElementSize) + headerSize + (alignment - 1); int mask = ~(alignment - 1); return size & mask; } --- 574,608 ---- /** * Idiom for making {@link GraalHotSpotVMConfig} a constant. */ @Fold ! public static int objectAlignment(@InjectedParameter GraalHotSpotVMConfig config) { ! return config.objectAlignment; } /** ! * Calls {@link #arrayAllocationSize(int, int, int, int)} using an injected VM configuration ! * object. */ public static int arrayAllocationSize(int length, int headerSize, int log2ElementSize) { ! return arrayAllocationSize(length, headerSize, log2ElementSize, objectAlignment(INJECTED_VMCONFIG)); } /** * Computes the size of the memory chunk allocated for an array. This size accounts for the * array header size, body size and any padding after the last element to satisfy object * alignment requirements. * * @param length the number of elements in the array * @param headerSize the size of the array header * @param log2ElementSize log2 of the size of an element in the array ! * @param alignment the {@linkplain GraalHotSpotVMConfig#objectAlignment object alignment ! * requirement} * @return the size of the memory chunk */ ! public static int arrayAllocationSize(int length, int headerSize, int log2ElementSize, int alignment) { int size = (length << log2ElementSize) + headerSize + (alignment - 1); int mask = ~(alignment - 1); return size & mask; }
*** 784,799 **** public static long gcTotalCollectionsAddress(@InjectedParameter GraalHotSpotVMConfig config) { return config.gcTotalCollectionsAddress(); } @Fold ! public static long referentOffset() { ! try { ! return UNSAFE.objectFieldOffset(java.lang.ref.Reference.class.getDeclaredField("referent")); ! } catch (Exception e) { ! throw new GraalError(e); ! } } public static final LocationIdentity OBJ_ARRAY_KLASS_ELEMENT_KLASS_LOCATION = new HotSpotOptimizingLocationIdentity("ObjArrayKlass::_element_klass") { @Override public ValueNode canonicalizeRead(ValueNode read, AddressNode location, ValueNode object, CanonicalizerTool tool) { --- 841,852 ---- public static long gcTotalCollectionsAddress(@InjectedParameter GraalHotSpotVMConfig config) { return config.gcTotalCollectionsAddress(); } @Fold ! public static long referentOffset(@InjectedParameter MetaAccessProvider metaAccessProvider) { ! return getFieldOffset(metaAccessProvider.lookupJavaType(Reference.class), "referent"); } public static final LocationIdentity OBJ_ARRAY_KLASS_ELEMENT_KLASS_LOCATION = new HotSpotOptimizingLocationIdentity("ObjArrayKlass::_element_klass") { @Override public ValueNode canonicalizeRead(ValueNode read, AddressNode location, ValueNode object, CanonicalizerTool tool) {
< prev index next >