src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/replacements/HotSpotReplacementsUtil.java
--- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/replacements/HotSpotReplacementsUtil.java Thu Oct 17 20:27:44 2019 +0100
+++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/replacements/HotSpotReplacementsUtil.java Thu Oct 17 20:53:35 2019 +0100
@@ -51,6 +51,7 @@
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.LoadHubOrNullNode;
import org.graalvm.compiler.nodes.extended.RawLoadNode;
import org.graalvm.compiler.nodes.extended.StoreHubNode;
import org.graalvm.compiler.nodes.graphbuilderconf.IntrinsicContext;
@@ -187,6 +188,14 @@
return config.verifyOops;
}
+ /**
+ * @see GraalHotSpotVMConfig#doingUnsafeAccessOffset
+ */
+ @Fold
+ public static int doingUnsafeAccessOffset(@InjectedParameter GraalHotSpotVMConfig config) {
+ return config.doingUnsafeAccessOffset;
+ }
+
public static final LocationIdentity EXCEPTION_OOP_LOCATION = NamedLocationIdentity.mutable("ExceptionOop");
/**
@@ -769,29 +778,50 @@
@NodeIntrinsic(value = LoadHubNode.class)
public static native KlassPointer loadHubIntrinsic(Object object);
- public static final LocationIdentity CLASS_STATE_LOCATION = NamedLocationIdentity.mutable("ClassState");
+ @NodeIntrinsic(value = LoadHubOrNullNode.class)
+ public static native KlassPointer loadHubOrNullIntrinsic(Object object);
+
+ static final LocationIdentity CLASS_INIT_STATE_LOCATION = NamedLocationIdentity.mutable("ClassInitState");
+
+ static final LocationIdentity CLASS_INIT_THREAD_LOCATION = NamedLocationIdentity.mutable("ClassInitThread");
@Fold
- public static int instanceKlassInitStateOffset(@InjectedParameter GraalHotSpotVMConfig config) {
+ static int instanceKlassInitStateOffset(@InjectedParameter GraalHotSpotVMConfig config) {
return config.instanceKlassInitStateOffset;
}
@Fold
+ static int instanceKlassInitThreadOffset(@InjectedParameter GraalHotSpotVMConfig config) {
+ assert config.instanceKlassInitThreadOffset != -1;
+ return config.instanceKlassInitThreadOffset;
+ }
+
+ @Fold
public static int instanceKlassStateFullyInitialized(@InjectedParameter GraalHotSpotVMConfig config) {
return config.instanceKlassStateFullyInitialized;
}
+ @Fold
+ public static int instanceKlassStateBeingInitialized(@InjectedParameter GraalHotSpotVMConfig config) {
+ assert config.instanceKlassStateBeingInitialized != -1;
+ return config.instanceKlassStateBeingInitialized;
+ }
+
/**
*
* @param hub the hub of an InstanceKlass
* @return true is the InstanceKlass represented by hub is fully initialized
*/
public static boolean isInstanceKlassFullyInitialized(KlassPointer hub) {
- return readInstanceKlassState(hub) == instanceKlassStateFullyInitialized(INJECTED_VMCONFIG);
+ return readInstanceKlassInitState(hub) == instanceKlassStateFullyInitialized(INJECTED_VMCONFIG);
}
- private static byte readInstanceKlassState(KlassPointer hub) {
- return hub.readByte(instanceKlassInitStateOffset(INJECTED_VMCONFIG), CLASS_STATE_LOCATION);
+ static byte readInstanceKlassInitState(KlassPointer hub) {
+ return hub.readByte(instanceKlassInitStateOffset(INJECTED_VMCONFIG), CLASS_INIT_STATE_LOCATION);
+ }
+
+ static Word readInstanceKlassInitThread(KlassPointer hub) {
+ return hub.readWord(instanceKlassInitThreadOffset(INJECTED_VMCONFIG), CLASS_INIT_THREAD_LOCATION);
}
public static final LocationIdentity KLASS_MODIFIER_FLAGS_LOCATION = NamedLocationIdentity.immutable("Klass::_modifier_flags");