49 import org.graalvm.compiler.nodes.NamedLocationIdentity; |
49 import org.graalvm.compiler.nodes.NamedLocationIdentity; |
50 import org.graalvm.compiler.nodes.NodeView; |
50 import org.graalvm.compiler.nodes.NodeView; |
51 import org.graalvm.compiler.nodes.ValueNode; |
51 import org.graalvm.compiler.nodes.ValueNode; |
52 import org.graalvm.compiler.nodes.extended.ForeignCallNode; |
52 import org.graalvm.compiler.nodes.extended.ForeignCallNode; |
53 import org.graalvm.compiler.nodes.extended.LoadHubNode; |
53 import org.graalvm.compiler.nodes.extended.LoadHubNode; |
|
54 import org.graalvm.compiler.nodes.extended.LoadHubOrNullNode; |
54 import org.graalvm.compiler.nodes.extended.RawLoadNode; |
55 import org.graalvm.compiler.nodes.extended.RawLoadNode; |
55 import org.graalvm.compiler.nodes.extended.StoreHubNode; |
56 import org.graalvm.compiler.nodes.extended.StoreHubNode; |
56 import org.graalvm.compiler.nodes.graphbuilderconf.IntrinsicContext; |
57 import org.graalvm.compiler.nodes.graphbuilderconf.IntrinsicContext; |
57 import org.graalvm.compiler.nodes.memory.Access; |
58 import org.graalvm.compiler.nodes.memory.Access; |
58 import org.graalvm.compiler.nodes.memory.address.AddressNode; |
59 import org.graalvm.compiler.nodes.memory.address.AddressNode; |
775 private static native KlassPointer loadKlassFromObjectIntrinsic(Object object, long offset, @ConstantNodeParameter LocationIdentity locationIdentity, @ConstantNodeParameter JavaKind wordKind); |
776 private static native KlassPointer loadKlassFromObjectIntrinsic(Object object, long offset, @ConstantNodeParameter LocationIdentity locationIdentity, @ConstantNodeParameter JavaKind wordKind); |
776 |
777 |
777 @NodeIntrinsic(value = LoadHubNode.class) |
778 @NodeIntrinsic(value = LoadHubNode.class) |
778 public static native KlassPointer loadHubIntrinsic(Object object); |
779 public static native KlassPointer loadHubIntrinsic(Object object); |
779 |
780 |
780 public static final LocationIdentity CLASS_STATE_LOCATION = NamedLocationIdentity.mutable("ClassState"); |
781 @NodeIntrinsic(value = LoadHubOrNullNode.class) |
781 |
782 public static native KlassPointer loadHubOrNullIntrinsic(Object object); |
782 @Fold |
783 |
783 public static int instanceKlassInitStateOffset(@InjectedParameter GraalHotSpotVMConfig config) { |
784 static final LocationIdentity CLASS_INIT_STATE_LOCATION = NamedLocationIdentity.mutable("ClassInitState"); |
|
785 |
|
786 static final LocationIdentity CLASS_INIT_THREAD_LOCATION = NamedLocationIdentity.mutable("ClassInitThread"); |
|
787 |
|
788 @Fold |
|
789 static int instanceKlassInitStateOffset(@InjectedParameter GraalHotSpotVMConfig config) { |
784 return config.instanceKlassInitStateOffset; |
790 return config.instanceKlassInitStateOffset; |
|
791 } |
|
792 |
|
793 @Fold |
|
794 static int instanceKlassInitThreadOffset(@InjectedParameter GraalHotSpotVMConfig config) { |
|
795 assert config.instanceKlassInitThreadOffset != -1; |
|
796 return config.instanceKlassInitThreadOffset; |
785 } |
797 } |
786 |
798 |
787 @Fold |
799 @Fold |
788 public static int instanceKlassStateFullyInitialized(@InjectedParameter GraalHotSpotVMConfig config) { |
800 public static int instanceKlassStateFullyInitialized(@InjectedParameter GraalHotSpotVMConfig config) { |
789 return config.instanceKlassStateFullyInitialized; |
801 return config.instanceKlassStateFullyInitialized; |
790 } |
802 } |
791 |
803 |
|
804 @Fold |
|
805 public static int instanceKlassStateBeingInitialized(@InjectedParameter GraalHotSpotVMConfig config) { |
|
806 assert config.instanceKlassStateBeingInitialized != -1; |
|
807 return config.instanceKlassStateBeingInitialized; |
|
808 } |
|
809 |
792 /** |
810 /** |
793 * |
811 * |
794 * @param hub the hub of an InstanceKlass |
812 * @param hub the hub of an InstanceKlass |
795 * @return true is the InstanceKlass represented by hub is fully initialized |
813 * @return true is the InstanceKlass represented by hub is fully initialized |
796 */ |
814 */ |
797 public static boolean isInstanceKlassFullyInitialized(KlassPointer hub) { |
815 public static boolean isInstanceKlassFullyInitialized(KlassPointer hub) { |
798 return readInstanceKlassState(hub) == instanceKlassStateFullyInitialized(INJECTED_VMCONFIG); |
816 return readInstanceKlassInitState(hub) == instanceKlassStateFullyInitialized(INJECTED_VMCONFIG); |
799 } |
817 } |
800 |
818 |
801 private static byte readInstanceKlassState(KlassPointer hub) { |
819 static byte readInstanceKlassInitState(KlassPointer hub) { |
802 return hub.readByte(instanceKlassInitStateOffset(INJECTED_VMCONFIG), CLASS_STATE_LOCATION); |
820 return hub.readByte(instanceKlassInitStateOffset(INJECTED_VMCONFIG), CLASS_INIT_STATE_LOCATION); |
|
821 } |
|
822 |
|
823 static Word readInstanceKlassInitThread(KlassPointer hub) { |
|
824 return hub.readWord(instanceKlassInitThreadOffset(INJECTED_VMCONFIG), CLASS_INIT_THREAD_LOCATION); |
803 } |
825 } |
804 |
826 |
805 public static final LocationIdentity KLASS_MODIFIER_FLAGS_LOCATION = NamedLocationIdentity.immutable("Klass::_modifier_flags"); |
827 public static final LocationIdentity KLASS_MODIFIER_FLAGS_LOCATION = NamedLocationIdentity.immutable("Klass::_modifier_flags"); |
806 |
828 |
807 @Fold |
829 @Fold |