diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/IsolateArgumentParser.java b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/IsolateArgumentParser.java index dc3de7d0332c..34e63d371d6a 100644 --- a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/IsolateArgumentParser.java +++ b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/IsolateArgumentParser.java @@ -59,7 +59,7 @@ import com.oracle.svm.core.imagelayer.ImageLayerBuildingSupport; import com.oracle.svm.core.layeredimagesingleton.ImageSingletonLoader; import com.oracle.svm.core.layeredimagesingleton.ImageSingletonWriter; -import com.oracle.svm.core.layeredimagesingleton.LayeredImageSingleton; +import com.oracle.svm.core.layeredimagesingleton.LayeredPersistFlags; import com.oracle.svm.core.memory.UntrackedNullableNativeMemory; import com.oracle.svm.core.option.RuntimeOptionKey; import com.oracle.svm.core.traits.BuiltinTraits.AllAccess; @@ -677,7 +677,7 @@ static class LayeredCallbacks extends SingletonLayeredCallbacksSupplier { public SingletonTrait getLayeredCallbacksTrait() { return new SingletonTrait(SingletonTraitKind.LAYERED_CALLBACKS, new SingletonLayeredCallbacks() { @Override - public LayeredImageSingleton.PersistFlags doPersist(ImageSingletonWriter writer, LayeredOptionInfo singleton) { + public LayeredPersistFlags doPersist(ImageSingletonWriter writer, LayeredOptionInfo singleton) { if (ImageLayerBuildingSupport.firstImageBuild()) { writer.writeInt("numOptions", IsolateArgumentParser.getOptionCount()); writer.writeStringList("optionNames", IsolateArgumentParser.getOptions().stream().map(OptionKey::getName).toList()); @@ -685,7 +685,7 @@ public LayeredImageSingleton.PersistFlags doPersist(ImageSingletonWriter writer, writer.writeInt("numOptions", singleton.getNumOptions()); writer.writeStringList("optionNames", singleton.optionNames); } - return LayeredImageSingleton.PersistFlags.CREATE; + return LayeredPersistFlags.CREATE; } @Override diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/RuntimeAssertionsSupport.java b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/RuntimeAssertionsSupport.java index 111b4f507b24..dd9202ecdce5 100644 --- a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/RuntimeAssertionsSupport.java +++ b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/RuntimeAssertionsSupport.java @@ -38,8 +38,7 @@ import com.oracle.svm.core.feature.AutomaticallyRegisteredImageSingleton; import com.oracle.svm.core.layeredimagesingleton.ImageSingletonLoader; import com.oracle.svm.core.layeredimagesingleton.ImageSingletonWriter; -import com.oracle.svm.core.layeredimagesingleton.LayeredImageSingleton; -import com.oracle.svm.core.layeredimagesingleton.LayeredImageSingleton.PersistFlags; +import com.oracle.svm.core.layeredimagesingleton.LayeredPersistFlags; import com.oracle.svm.core.option.APIOption; import com.oracle.svm.core.option.AccumulatingLocatableMultiOptionValue; import com.oracle.svm.core.option.HostedOptionKey; @@ -231,12 +230,12 @@ static class LayeredCallbacks extends SingletonLayeredCallbacksSupplier { public SingletonTrait getLayeredCallbacksTrait() { var action = new SingletonLayeredCallbacks() { @Override - public LayeredImageSingleton.PersistFlags doPersist(ImageSingletonWriter writer, RuntimeAssertionsSupport singleton) { + public LayeredPersistFlags doPersist(ImageSingletonWriter writer, RuntimeAssertionsSupport singleton) { persistAssertionStatus(writer, PACKAGE, singleton.packageAssertionStatus); persistAssertionStatus(writer, CLASS, singleton.classAssertionStatus); writer.writeInt(DEFAULT_ASSERTION_STATUS, singleton.defaultAssertionStatus ? 1 : 0); writer.writeInt(SYSTEM_ASSERTION_STATUS, singleton.systemAssertionStatus ? 1 : 0); - return PersistFlags.CALLBACK_ON_REGISTRATION; + return LayeredPersistFlags.CALLBACK_ON_REGISTRATION; } private void persistAssertionStatus(ImageSingletonWriter writer, String type, Map assertionStatus) { diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/SubstrateTargetDescription.java b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/SubstrateTargetDescription.java index 2459619008c9..9a9eb3404aba 100644 --- a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/SubstrateTargetDescription.java +++ b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/SubstrateTargetDescription.java @@ -33,8 +33,7 @@ import com.oracle.svm.core.code.RuntimeCodeCache; import com.oracle.svm.core.layeredimagesingleton.ImageSingletonLoader; import com.oracle.svm.core.layeredimagesingleton.ImageSingletonWriter; -import com.oracle.svm.core.layeredimagesingleton.LayeredImageSingleton; -import com.oracle.svm.core.layeredimagesingleton.LayeredImageSingleton.PersistFlags; +import com.oracle.svm.core.layeredimagesingleton.LayeredPersistFlags; import com.oracle.svm.core.traits.BuiltinTraits.AllAccess; import com.oracle.svm.core.traits.SingletonLayeredCallbacks; import com.oracle.svm.core.traits.SingletonLayeredCallbacksSupplier; @@ -77,9 +76,9 @@ static class LayeredCallbacks extends SingletonLayeredCallbacksSupplier { public SingletonTrait getLayeredCallbacksTrait() { var action = new SingletonLayeredCallbacks() { @Override - public LayeredImageSingleton.PersistFlags doPersist(ImageSingletonWriter writer, SubstrateTargetDescription singleton) { + public LayeredPersistFlags doPersist(ImageSingletonWriter writer, SubstrateTargetDescription singleton) { writer.writeStringList(RUNTIME_CHECKED_CPU_FEATURES, getCPUFeaturesList(singleton)); - return PersistFlags.CALLBACK_ON_REGISTRATION; + return LayeredPersistFlags.CALLBACK_ON_REGISTRATION; } @Override diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/c/locale/LocaleSupport.java b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/c/locale/LocaleSupport.java index 1b57b0e6b00d..8954f084003c 100644 --- a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/c/locale/LocaleSupport.java +++ b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/c/locale/LocaleSupport.java @@ -43,8 +43,7 @@ import com.oracle.svm.core.jdk.UserSystemProperty; import com.oracle.svm.core.layeredimagesingleton.ImageSingletonLoader; import com.oracle.svm.core.layeredimagesingleton.ImageSingletonWriter; -import com.oracle.svm.core.layeredimagesingleton.LayeredImageSingleton; -import com.oracle.svm.core.layeredimagesingleton.LayeredImageSingleton.PersistFlags; +import com.oracle.svm.core.layeredimagesingleton.LayeredPersistFlags; import com.oracle.svm.core.traits.BuiltinTraits.BuildtimeAccessOnly; import com.oracle.svm.core.traits.SingletonLayeredCallbacks; import com.oracle.svm.core.traits.SingletonLayeredCallbacksSupplier; @@ -220,9 +219,9 @@ static class LayeredCallbacks extends SingletonLayeredCallbacksSupplier { public SingletonTrait getLayeredCallbacksTrait() { var action = new SingletonLayeredCallbacks() { @Override - public LayeredImageSingleton.PersistFlags doPersist(ImageSingletonWriter writer, LocaleSupport singleton) { + public LayeredPersistFlags doPersist(ImageSingletonWriter writer, LocaleSupport singleton) { writer.writeString(LOCALE, getLocaleString(singleton.locale)); - return PersistFlags.CALLBACK_ON_REGISTRATION; + return LayeredPersistFlags.CALLBACK_ON_REGISTRATION; } @Override diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/code/CodeInfoEncoder.java b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/code/CodeInfoEncoder.java index dfa4ca73f8b0..c849650fea14 100644 --- a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/code/CodeInfoEncoder.java +++ b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/code/CodeInfoEncoder.java @@ -68,7 +68,7 @@ import com.oracle.svm.core.jfr.HasJfrSupport; import com.oracle.svm.core.layeredimagesingleton.ImageSingletonLoader; import com.oracle.svm.core.layeredimagesingleton.ImageSingletonWriter; -import com.oracle.svm.core.layeredimagesingleton.LayeredImageSingleton; +import com.oracle.svm.core.layeredimagesingleton.LayeredPersistFlags; import com.oracle.svm.core.meta.SharedField; import com.oracle.svm.core.meta.SharedMethod; import com.oracle.svm.core.meta.SharedType; @@ -936,11 +936,11 @@ static class LayeredCallbacks extends SingletonLayeredCallbacksSupplier { public SingletonTrait getLayeredCallbacksTrait() { return new SingletonTrait(SingletonTraitKind.LAYERED_CALLBACKS, new SingletonLayeredCallbacks() { @Override - public LayeredImageSingleton.PersistFlags doPersist(ImageSingletonWriter writer, MethodTableFirstIDTracker singleton) { + public LayeredPersistFlags doPersist(ImageSingletonWriter writer, MethodTableFirstIDTracker singleton) { int nextStartingId = singleton.nextStartingId; assert nextStartingId > 0 : nextStartingId; writer.writeInt("startingID", nextStartingId); - return LayeredImageSingleton.PersistFlags.CREATE; + return LayeredPersistFlags.CREATE; } @Override diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/code/ImageCodeInfoStorage.java b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/code/ImageCodeInfoStorage.java index 216a1591cdd5..f31fc2f208d8 100644 --- a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/code/ImageCodeInfoStorage.java +++ b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/code/ImageCodeInfoStorage.java @@ -33,10 +33,10 @@ import com.oracle.svm.core.config.ConfigurationValues; import com.oracle.svm.core.feature.AutomaticallyRegisteredFeature; import com.oracle.svm.core.feature.InternalFeature; -import com.oracle.svm.core.layeredimagesingleton.FeatureSingleton; -import com.oracle.svm.core.layeredimagesingleton.UnsavedSingleton; +import com.oracle.svm.core.traits.BuiltinTraits.BuildtimeAccessOnly; import com.oracle.svm.core.traits.BuiltinTraits.NoLayeredCallbacks; import com.oracle.svm.core.traits.BuiltinTraits.RuntimeAccessOnly; +import com.oracle.svm.core.traits.SingletonLayeredInstallationKind.Independent; import com.oracle.svm.core.traits.SingletonLayeredInstallationKind.MultiLayer; import com.oracle.svm.core.traits.SingletonTraits; @@ -81,7 +81,8 @@ public CodeInfoImpl getCodeInfo() { } @AutomaticallyRegisteredFeature -class ImageCodeInfoStorageFeature implements InternalFeature, UnsavedSingleton, FeatureSingleton { +@SingletonTraits(access = BuildtimeAccessOnly.class, layeredCallbacks = NoLayeredCallbacks.class, layeredInstallationKind = Independent.class) +class ImageCodeInfoStorageFeature implements InternalFeature { @Override public void duringSetup(DuringSetupAccess access) { ImageSingletons.add(ImageCodeInfoStorage.class, new ImageCodeInfoStorage()); diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/config/ObjectLayout.java b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/config/ObjectLayout.java index d8ae4af992e9..8a10cb42703e 100644 --- a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/config/ObjectLayout.java +++ b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/config/ObjectLayout.java @@ -38,7 +38,7 @@ import com.oracle.svm.core.config.ObjectLayout.LayeredCallbacks; import com.oracle.svm.core.layeredimagesingleton.ImageSingletonLoader; import com.oracle.svm.core.layeredimagesingleton.ImageSingletonWriter; -import com.oracle.svm.core.layeredimagesingleton.LayeredImageSingleton.PersistFlags; +import com.oracle.svm.core.layeredimagesingleton.LayeredPersistFlags; import com.oracle.svm.core.traits.BuiltinTraits.AllAccess; import com.oracle.svm.core.traits.SingletonLayeredCallbacks; import com.oracle.svm.core.traits.SingletonLayeredCallbacksSupplier; @@ -342,10 +342,10 @@ static class LayeredCallbacks extends SingletonLayeredCallbacksSupplier { public SingletonTrait getLayeredCallbacksTrait() { var action = new SingletonLayeredCallbacks() { @Override - public PersistFlags doPersist(ImageSingletonWriter writer, ObjectLayout singleton) { + public LayeredPersistFlags doPersist(ImageSingletonWriter writer, ObjectLayout singleton) { List currentValues = singleton.getCurrentValues(); writer.writeIntList("priorValues", currentValues); - return PersistFlags.CALLBACK_ON_REGISTRATION; + return LayeredPersistFlags.CALLBACK_ON_REGISTRATION; } @Override diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/graal/meta/KnownOffsets.java b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/graal/meta/KnownOffsets.java index 6efb14a46295..17b56b39d2a8 100644 --- a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/graal/meta/KnownOffsets.java +++ b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/graal/meta/KnownOffsets.java @@ -38,7 +38,7 @@ import com.oracle.svm.core.imagelayer.ImageLayerBuildingSupport; import com.oracle.svm.core.layeredimagesingleton.ImageSingletonLoader; import com.oracle.svm.core.layeredimagesingleton.ImageSingletonWriter; -import com.oracle.svm.core.layeredimagesingleton.LayeredImageSingleton; +import com.oracle.svm.core.layeredimagesingleton.LayeredPersistFlags; import com.oracle.svm.core.traits.BuiltinTraits.BuildtimeAccessOnly; import com.oracle.svm.core.traits.SingletonLayeredCallbacks; import com.oracle.svm.core.traits.SingletonLayeredCallbacksSupplier; @@ -175,9 +175,9 @@ static class LayeredCallbacks extends SingletonLayeredCallbacksSupplier { public SingletonTrait getLayeredCallbacksTrait() { return new SingletonTrait(SingletonTraitKind.LAYERED_CALLBACKS, new SingletonLayeredCallbacks() { @Override - public LayeredImageSingleton.PersistFlags doPersist(ImageSingletonWriter writer, PriorKnownOffsets singleton) { + public LayeredPersistFlags doPersist(ImageSingletonWriter writer, PriorKnownOffsets singleton) { writer.writeIntList("priorValues", Arrays.stream(singleton.priorValues).boxed().toList()); - return LayeredImageSingleton.PersistFlags.CREATE; + return LayeredPersistFlags.CREATE; } @Override diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/heap/GCCause.java b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/heap/GCCause.java index 5e235257ba55..5669a8e45f46 100644 --- a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/heap/GCCause.java +++ b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/heap/GCCause.java @@ -39,7 +39,7 @@ import com.oracle.svm.core.imagelayer.ImageLayerBuildingSupport; import com.oracle.svm.core.layeredimagesingleton.ImageSingletonLoader; import com.oracle.svm.core.layeredimagesingleton.ImageSingletonWriter; -import com.oracle.svm.core.layeredimagesingleton.LayeredImageSingleton; +import com.oracle.svm.core.layeredimagesingleton.LayeredPersistFlags; import com.oracle.svm.core.traits.BuiltinTraits.AllAccess; import com.oracle.svm.core.traits.BuiltinTraits.SingleLayer; import com.oracle.svm.core.traits.SingletonLayeredCallbacks; @@ -186,7 +186,7 @@ static class LayeredCallbacks extends SingletonLayeredCallbacksSupplier { public SingletonTrait getLayeredCallbacksTrait() { return new SingletonTrait(SingletonTraitKind.LAYERED_CALLBACKS, new SingletonLayeredCallbacks() { @Override - public LayeredImageSingleton.PersistFlags doPersist(ImageSingletonWriter writer, GCCauseFeature singleton) { + public LayeredPersistFlags doPersist(ImageSingletonWriter writer, GCCauseFeature singleton) { List gcCauses; if (ImageLayerBuildingSupport.buildingInitialLayer()) { gcCauses = GCCause.getGCCauses().stream().map(gcCause -> { @@ -202,7 +202,7 @@ public LayeredImageSingleton.PersistFlags doPersist(ImageSingletonWriter writer, } writer.writeStringList("registeredGCCauses", gcCauses); - return LayeredImageSingleton.PersistFlags.CALLBACK_ON_REGISTRATION; + return LayeredPersistFlags.CALLBACK_ON_REGISTRATION; } @Override diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/hub/ClassForNameSupport.java b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/hub/ClassForNameSupport.java index 1081acd1a355..393f555c020b 100644 --- a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/hub/ClassForNameSupport.java +++ b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/hub/ClassForNameSupport.java @@ -52,8 +52,8 @@ import com.oracle.svm.core.hub.registry.ClassRegistries; import com.oracle.svm.core.layeredimagesingleton.ImageSingletonLoader; import com.oracle.svm.core.layeredimagesingleton.ImageSingletonWriter; -import com.oracle.svm.core.layeredimagesingleton.LayeredImageSingleton; import com.oracle.svm.core.layeredimagesingleton.LayeredImageSingletonSupport; +import com.oracle.svm.core.layeredimagesingleton.LayeredPersistFlags; import com.oracle.svm.core.layeredimagesingleton.MultiLayeredImageSingleton; import com.oracle.svm.core.metadata.MetadataTracer; import com.oracle.svm.core.option.HostedOptionKey; @@ -514,7 +514,7 @@ public SingletonTrait getLayeredCallbacksTrait() { return new SingletonTrait(SingletonTraitKind.LAYERED_CALLBACKS, new SingletonLayeredCallbacks() { @Override - public LayeredImageSingleton.PersistFlags doPersist(ImageSingletonWriter writer, ClassForNameSupport singleton) { + public LayeredPersistFlags doPersist(ImageSingletonWriter writer, ClassForNameSupport singleton) { List classNames = new ArrayList<>(); List classStates = new ArrayList<>(); Set unsafeNames = new HashSet<>(singleton.previousLayerUnsafe); @@ -549,7 +549,7 @@ public LayeredImageSingleton.PersistFlags doPersist(ImageSingletonWriter writer, */ writer.writeInt(RESPECTS_CLASS_LOADER, respectClassLoader() ? 1 : 0); - return LayeredImageSingleton.PersistFlags.CREATE; + return LayeredPersistFlags.CREATE; } @Override diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/hub/LayeredReflectionMetadataSingleton.java b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/hub/LayeredReflectionMetadataSingleton.java index c46e4f7ea217..38ee64788725 100644 --- a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/hub/LayeredReflectionMetadataSingleton.java +++ b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/hub/LayeredReflectionMetadataSingleton.java @@ -38,8 +38,8 @@ import com.oracle.svm.core.imagelayer.BuildingImageLayerPredicate; import com.oracle.svm.core.layeredimagesingleton.ImageSingletonLoader; import com.oracle.svm.core.layeredimagesingleton.ImageSingletonWriter; -import com.oracle.svm.core.layeredimagesingleton.LayeredImageSingleton; import com.oracle.svm.core.layeredimagesingleton.LayeredImageSingletonSupport; +import com.oracle.svm.core.layeredimagesingleton.LayeredPersistFlags; import com.oracle.svm.core.layeredimagesingleton.MultiLayeredImageSingleton; import com.oracle.svm.core.traits.BuiltinTraits; import com.oracle.svm.core.traits.SingletonLayeredCallbacks; @@ -123,7 +123,7 @@ public SingletonTrait getLayeredCallbacksTrait() { return new SingletonTrait(SingletonTraitKind.LAYERED_CALLBACKS, new SingletonLayeredCallbacks() { @Override - public LayeredImageSingleton.PersistFlags doPersist(ImageSingletonWriter writer, LayeredReflectionMetadataSingleton singleton) { + public LayeredPersistFlags doPersist(ImageSingletonWriter writer, LayeredReflectionMetadataSingleton singleton) { List hubs = new ArrayList<>(); List classFlagsList = new ArrayList<>(); @@ -148,7 +148,7 @@ public LayeredImageSingleton.PersistFlags doPersist(ImageSingletonWriter writer, writer.writeIntList(LAYERED_REFLECTION_METADATA_HUBS, hubs); writer.writeIntList(LAYERED_REFLECTION_METADATA_CLASS_FLAGS, classFlagsList); - return LayeredImageSingleton.PersistFlags.CREATE; + return LayeredPersistFlags.CREATE; } @Override diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jdk/Resources.java b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jdk/Resources.java index 3b7fcf75fd69..bdc644f9c222 100644 --- a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jdk/Resources.java +++ b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jdk/Resources.java @@ -75,8 +75,8 @@ import com.oracle.svm.core.jdk.resources.CompressedGlobTrie.GlobTrieNode; import com.oracle.svm.core.layeredimagesingleton.ImageSingletonLoader; import com.oracle.svm.core.layeredimagesingleton.ImageSingletonWriter; -import com.oracle.svm.core.layeredimagesingleton.LayeredImageSingleton; import com.oracle.svm.core.layeredimagesingleton.LayeredImageSingletonSupport; +import com.oracle.svm.core.layeredimagesingleton.LayeredPersistFlags; import com.oracle.svm.core.layeredimagesingleton.MultiLayeredImageSingleton; import com.oracle.svm.core.metadata.MetadataTracer; import com.oracle.svm.core.traits.BuiltinTraits.AllAccess; @@ -755,7 +755,7 @@ public SingletonTrait getLayeredCallbacksTrait() { return new SingletonTrait(SingletonTraitKind.LAYERED_CALLBACKS, new SingletonLayeredCallbacks() { @Override - public LayeredImageSingleton.PersistFlags doPersist(ImageSingletonWriter writer, Resources singleton) { + public LayeredPersistFlags doPersist(ImageSingletonWriter writer, Resources singleton) { List resourceKeys = new ArrayList<>(); List resourceRegistrationStates = new ArrayList<>(); Set patterns = new HashSet<>(singleton.previousLayerPatterns); @@ -785,7 +785,7 @@ public LayeredImageSingleton.PersistFlags doPersist(ImageSingletonWriter writer, writer.writeBoolList(RESOURCE_REGISTRATION_STATES, resourceRegistrationStates); writer.writeStringList(PATTERNS, patterns.stream().toList()); - return LayeredImageSingleton.PersistFlags.CREATE; + return LayeredPersistFlags.CREATE; } @Override diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jdk/StringInternSupport.java b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jdk/StringInternSupport.java index 68036355bdd1..41387c2b2789 100644 --- a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jdk/StringInternSupport.java +++ b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jdk/StringInternSupport.java @@ -44,8 +44,8 @@ import com.oracle.svm.core.imagelayer.ImageLayerBuildingSupport; import com.oracle.svm.core.layeredimagesingleton.ImageSingletonLoader; import com.oracle.svm.core.layeredimagesingleton.ImageSingletonWriter; -import com.oracle.svm.core.layeredimagesingleton.LayeredImageSingleton; import com.oracle.svm.core.layeredimagesingleton.LayeredImageSingletonSupport; +import com.oracle.svm.core.layeredimagesingleton.LayeredPersistFlags; import com.oracle.svm.core.layeredimagesingleton.MultiLayeredImageSingleton; import com.oracle.svm.core.traits.BuiltinTraits.AllAccess; import com.oracle.svm.core.traits.BuiltinTraits.BuildtimeAccessOnly; @@ -173,14 +173,14 @@ static class LayeredCallbacks extends SingletonLayeredCallbacksSupplier { public SingletonTrait getLayeredCallbacksTrait() { return new SingletonTrait(SingletonTraitKind.LAYERED_CALLBACKS, new SingletonLayeredCallbacks() { @Override - public LayeredImageSingleton.PersistFlags doPersist(ImageSingletonWriter writer, StringInternSupport singleton) { + public LayeredPersistFlags doPersist(ImageSingletonWriter writer, StringInternSupport singleton) { // This can be switched to use constant ids in the future List newPriorInternedStrings = new ArrayList<>(singleton.internedStringsIdentityMap.size()); newPriorInternedStrings.addAll(singleton.internedStringsIdentityMap.keySet()); writer.writeStringList("internedStrings", newPriorInternedStrings); - return LayeredImageSingleton.PersistFlags.CALLBACK_ON_REGISTRATION; + return LayeredPersistFlags.CALLBACK_ON_REGISTRATION; } @Override diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jdk/SystemInOutErrSupport.java b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jdk/SystemInOutErrSupport.java index b83ce6899e79..87c85e0d22f6 100644 --- a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jdk/SystemInOutErrSupport.java +++ b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jdk/SystemInOutErrSupport.java @@ -40,7 +40,6 @@ import org.graalvm.nativeimage.Platforms; import org.graalvm.nativeimage.hosted.Feature; -import com.oracle.svm.core.layeredimagesingleton.FeatureSingleton; import com.oracle.svm.core.traits.BuiltinTraits.AllAccess; import com.oracle.svm.core.traits.BuiltinTraits.SingleLayer; import com.oracle.svm.core.traits.SingletonLayeredInstallationKind.InitialLayerOnly; @@ -148,6 +147,6 @@ public static void setErr(PrintStream err) { } @SuppressWarnings("unused") -class SystemInOutErrFeature implements Feature, FeatureSingleton { +class SystemInOutErrFeature implements Feature { /* Dummy for backward compatibility. */ } diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/layeredimagesingleton/DuplicableImageSingleton.java b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/layeredimagesingleton/DuplicableImageSingleton.java deleted file mode 100644 index 6da620076eef..000000000000 --- a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/layeredimagesingleton/DuplicableImageSingleton.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright (c) 2025, 2025, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ -package com.oracle.svm.core.layeredimagesingleton; - -/** - * A Duplicable ImageSingleton can have multiple instances of the object installed in the Image Heap - * (at most one per a layer). The specific instance referred to from a given piece of code is - * dependent on the layer in which the code was installed in. - * - * It is expected that either the installed objects (1) have no instance fields or (2) have instance - * fields which have been made layer-aware through other means (e.g. using a layered ImageHeapMap). - * - * Note this is a temporary marker and eventually all instances of {@link DuplicableImageSingleton}s - * should be removed. This marker should only be used when there is not a correctness issue with - * installing multiple instances of the singleton. Instead, the marker indicates there is merely a - * performance/memory overhead due to having multiple copies of this singleton installed (via - * different layers) within the image heap. - */ -public interface DuplicableImageSingleton extends LayeredImageSingleton { -} diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/layeredimagesingleton/FeatureSingleton.java b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/layeredimagesingleton/FeatureSingleton.java deleted file mode 100644 index 261b8b3efd87..000000000000 --- a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/layeredimagesingleton/FeatureSingleton.java +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Copyright (c) 2024, 2024, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ -package com.oracle.svm.core.layeredimagesingleton; - -import org.graalvm.nativeimage.Platform; -import org.graalvm.nativeimage.Platforms; - -import java.util.EnumSet; - -/** - * Feature singletons are hosted only and can only be accessed during build time. Further, we - * currently do not allow features to save information across layers. - */ -@Platforms(Platform.HOSTED_ONLY.class) -public interface FeatureSingleton extends UnsavedSingleton { - - @Override - default EnumSet getImageBuilderFlags() { - return LayeredImageSingletonBuilderFlags.BUILDTIME_ACCESS_ONLY; - } -} diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/layeredimagesingleton/FinalSingleton.java b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/layeredimagesingleton/FinalSingleton.java deleted file mode 100644 index 8b0117240bcc..000000000000 --- a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/layeredimagesingleton/FinalSingleton.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright (c) 2024, 2024, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ -package com.oracle.svm.core.layeredimagesingleton; - -/** - * This singleton does not allow a singleton with its key(s) to be created in subsequent layers. - */ -public interface FinalSingleton extends LayeredImageSingleton { - - @Override - default PersistFlags preparePersist(ImageSingletonWriter writer) { - return PersistFlags.FORBIDDEN; - } -} diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/layeredimagesingleton/LayeredImageSingleton.java b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/layeredimagesingleton/LayeredImageSingleton.java deleted file mode 100644 index 0c352bb17dfd..000000000000 --- a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/layeredimagesingleton/LayeredImageSingleton.java +++ /dev/null @@ -1,76 +0,0 @@ -/* - * Copyright (c) 2024, 2024, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ -package com.oracle.svm.core.layeredimagesingleton; - -import java.util.EnumSet; - -import org.graalvm.nativeimage.ImageSingletons; -import org.graalvm.nativeimage.Platform; -import org.graalvm.nativeimage.Platforms; - -import com.oracle.svm.core.traits.SingletonLayeredCallbacks; - -public interface LayeredImageSingleton { - - enum PersistFlags { - /** - * Indicates nothing should be persisted for this singleton. A different singleton can be - * linked to this key in a subsequent image layer. - */ - NOTHING, - /** - * Indicates nothing should be persisted for this singleton and that a singleton cannot be - * linked to this key in a subsequent image layer. - */ - FORBIDDEN, - /** - * Indicates in a subsequent image a new singleton should be created and linked via calling - * {@code Object createFromLoader(ImageSingletonLoader)}. - */ - CREATE, - /** - * Indicates that when and/or if this singleton is registered in the next image via - * {@link ImageSingletons#add}, then - * {@link SingletonLayeredCallbacks#onSingletonRegistration} should be called on this - * singleton. - *

- * If a singleton is registered under multiple keys, then - * {@link SingletonLayeredCallbacks#onSingletonRegistration} should only be called once and - * will have finished executing before the singleton is installed into the registry. - */ - CALLBACK_ON_REGISTRATION - } - - /* - * Returns how this singleton should be handled for the current build. The returned value must - * not change throughout execution (i.e., the returned results can be cached). - */ - @Platforms(Platform.HOSTED_ONLY.class) - EnumSet getImageBuilderFlags(); - - @Platforms(Platform.HOSTED_ONLY.class) - PersistFlags preparePersist(ImageSingletonWriter writer); - -} diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/layeredimagesingleton/LayeredImageSingletonSupport.java b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/layeredimagesingleton/LayeredImageSingletonSupport.java index 03c60bbe2364..2bb23d5402d7 100644 --- a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/layeredimagesingleton/LayeredImageSingletonSupport.java +++ b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/layeredimagesingleton/LayeredImageSingletonSupport.java @@ -48,7 +48,7 @@ static LayeredImageSingletonSupport singleton() { /** * This method is intended to be used in special situations during the building process to * access singletons which (1) are only allowed to be accessed at runtime - * ({@link LayeredImageSingletonBuilderFlags#RUNTIME_ACCESS}) and/or (2) are annotated with + * ({@link SingletonAccessFlags#RUNTIME_ACCESS_ONLY}) and/or (2) are annotated with * {@link InstallationKind#MULTI_LAYER}. */ T lookup(Class key, boolean accessRuntimeOnly, boolean accessMultiLayer); diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/layeredimagesingleton/LayeredImageSingletonBuilderFlags.java b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/layeredimagesingleton/LayeredPersistFlags.java similarity index 50% rename from substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/layeredimagesingleton/LayeredImageSingletonBuilderFlags.java rename to substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/layeredimagesingleton/LayeredPersistFlags.java index 7aa295eaedd1..502db264386e 100644 --- a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/layeredimagesingleton/LayeredImageSingletonBuilderFlags.java +++ b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/layeredimagesingleton/LayeredPersistFlags.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2024, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2024, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -24,29 +24,34 @@ */ package com.oracle.svm.core.layeredimagesingleton; -import java.util.EnumSet; +import org.graalvm.nativeimage.ImageSingletons; -/** - * Flags used during build time to determine how the native image generator handles the layered - * image singleton. - */ -public enum LayeredImageSingletonBuilderFlags { +import com.oracle.svm.core.traits.SingletonLayeredCallbacks; + +public enum LayeredPersistFlags { /** - * This singleton can be accessed from the runtime. + * Indicates nothing should be persisted for this singleton. A different singleton can be linked + * to this key in a subsequent image layer. */ - RUNTIME_ACCESS, + NOTHING, /** - * This singleton can be accessed from the buildtime. + * Indicates nothing should be persisted for this singleton and that a singleton cannot be + * linked to this key in a subsequent image layer. */ - BUILDTIME_ACCESS; - - /* - * Below are some common flag patterns. + FORBIDDEN, + /** + * Indicates in a subsequent image a new singleton should be created and linked via calling + * {@code Object createFromLoader(ImageSingletonLoader)}. */ - - public static final EnumSet BUILDTIME_ACCESS_ONLY = EnumSet.of(BUILDTIME_ACCESS); - - public static final EnumSet RUNTIME_ACCESS_ONLY = EnumSet.of(RUNTIME_ACCESS); - - public static final EnumSet ALL_ACCESS = EnumSet.of(RUNTIME_ACCESS, BUILDTIME_ACCESS); + CREATE, + /** + * Indicates that when and/or if this singleton is registered in the next image via + * {@link ImageSingletons#add}, then {@link SingletonLayeredCallbacks#onSingletonRegistration} + * should be called on this singleton. + *

+ * If a singleton is registered under multiple keys, then + * {@link SingletonLayeredCallbacks#onSingletonRegistration} should only be called once and will + * have finished executing before the singleton is installed into the registry. + */ + CALLBACK_ON_REGISTRATION } diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/layeredimagesingleton/MultiLayeredImageSingleton.java b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/layeredimagesingleton/MultiLayeredImageSingleton.java index 16941bdb5b13..f53d8c596ddd 100644 --- a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/layeredimagesingleton/MultiLayeredImageSingleton.java +++ b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/layeredimagesingleton/MultiLayeredImageSingleton.java @@ -24,6 +24,7 @@ */ package com.oracle.svm.core.layeredimagesingleton; +import com.oracle.svm.core.traits.SingletonLayeredInstallationKind.InstallationKind; import com.oracle.svm.core.util.VMError; public final class MultiLayeredImageSingleton { @@ -47,7 +48,7 @@ private MultiLayeredImageSingleton() { /** * Returns an array containing the image singletons installed for {@code key} within all layers. - * See {@link LayeredImageSingleton} for full explanation. + * See {@link InstallationKind#MULTI_LAYER} for full explanation. */ @SuppressWarnings("unused") public static T[] getAllLayers(Class key) { diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/layeredimagesingleton/NonLayeredImageSingletonFeature.java b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/layeredimagesingleton/NonLayeredImageSingletonFeature.java index ee02372b1a0d..f86ed0ca8de9 100644 --- a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/layeredimagesingleton/NonLayeredImageSingletonFeature.java +++ b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/layeredimagesingleton/NonLayeredImageSingletonFeature.java @@ -37,6 +37,10 @@ import com.oracle.svm.core.feature.AutomaticallyRegisteredFeature; import com.oracle.svm.core.feature.InternalFeature; import com.oracle.svm.core.imagelayer.ImageLayerBuildingSupport; +import com.oracle.svm.core.traits.BuiltinTraits.BuildtimeAccessOnly; +import com.oracle.svm.core.traits.BuiltinTraits.NoLayeredCallbacks; +import com.oracle.svm.core.traits.SingletonLayeredInstallationKind.Independent; +import com.oracle.svm.core.traits.SingletonTraits; import jdk.graal.compiler.nodes.ConstantNode; import jdk.graal.compiler.nodes.ValueNode; @@ -54,7 +58,8 @@ * builds have at most exactly one singleton, so we can optimize these calls accordingly. */ @AutomaticallyRegisteredFeature -public class NonLayeredImageSingletonFeature implements InternalFeature, FeatureSingleton { +@SingletonTraits(access = BuildtimeAccessOnly.class, layeredCallbacks = NoLayeredCallbacks.class, layeredInstallationKind = Independent.class) +public class NonLayeredImageSingletonFeature implements InternalFeature { ConcurrentHashMap, Object> multiLayeredArrays = new ConcurrentHashMap<>(); diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/layeredimagesingleton/UnsavedSingleton.java b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/layeredimagesingleton/SingletonAccessFlags.java similarity index 75% rename from substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/layeredimagesingleton/UnsavedSingleton.java rename to substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/layeredimagesingleton/SingletonAccessFlags.java index 4733b7e2e225..f01346a3aa05 100644 --- a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/layeredimagesingleton/UnsavedSingleton.java +++ b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/layeredimagesingleton/SingletonAccessFlags.java @@ -25,12 +25,20 @@ package com.oracle.svm.core.layeredimagesingleton; /** - * This singleton is not persistent and will be recreated only if requested in the subsequent image. + * Flags used to determine how the native image generator can access the image singleton. */ -public interface UnsavedSingleton extends LayeredImageSingleton { +public enum SingletonAccessFlags { + /** + * This singleton can only be accessed at runtime. + */ + RUNTIME_ACCESS_ONLY, + /** + * This singleton can only be accessed at buildtime. + */ + BUILDTIME_ACCESS_ONLY, - @Override - default PersistFlags preparePersist(ImageSingletonWriter writer) { - return PersistFlags.NOTHING; - } + /** + * This singleton can be accessed from both buildtime and runtime. + */ + ALL_ACCESS } diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/option/RuntimeOptionParser.java b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/option/RuntimeOptionParser.java index d1b8afcd9278..4f78af43e726 100644 --- a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/option/RuntimeOptionParser.java +++ b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/option/RuntimeOptionParser.java @@ -25,7 +25,6 @@ package com.oracle.svm.core.option; import java.util.Arrays; -import java.util.EnumSet; import java.util.Optional; import java.util.function.Predicate; @@ -39,11 +38,13 @@ import com.oracle.svm.core.IsolateArgumentParser; import com.oracle.svm.core.SubstrateOptions; import com.oracle.svm.core.graal.RuntimeCompilation; -import com.oracle.svm.core.layeredimagesingleton.DuplicableImageSingleton; -import com.oracle.svm.core.layeredimagesingleton.ImageSingletonWriter; -import com.oracle.svm.core.layeredimagesingleton.LayeredImageSingletonBuilderFlags; import com.oracle.svm.core.log.Log; import com.oracle.svm.core.properties.RuntimeSystemPropertyParser; +import com.oracle.svm.core.traits.BuiltinTraits.AllAccess; +import com.oracle.svm.core.traits.BuiltinTraits.Duplicable; +import com.oracle.svm.core.traits.BuiltinTraits.NoLayeredCallbacks; +import com.oracle.svm.core.traits.SingletonLayeredInstallationKind.Independent; +import com.oracle.svm.core.traits.SingletonTraits; import com.oracle.svm.core.util.ImageHeapMap; import jdk.graal.compiler.api.replacements.Fold; @@ -58,7 +59,8 @@ * There is no requirement to use this class, you can also implement your own option parsing and * then set the values of options manually. */ -public final class RuntimeOptionParser implements DuplicableImageSingleton { +@SingletonTraits(access = AllAccess.class, layeredCallbacks = NoLayeredCallbacks.class, layeredInstallationKind = Independent.class, other = Duplicable.class) +public final class RuntimeOptionParser { /** * The suggested prefix for all VM options available in an application based on Substrate VM. @@ -209,14 +211,4 @@ public void parseOptionAtRuntime(String arg, String optionPrefix, BooleanOptionF public Iterable getDescriptors() { return options.getValues(); } - - @Override - public EnumSet getImageBuilderFlags() { - return LayeredImageSingletonBuilderFlags.ALL_ACCESS; - } - - @Override - public PersistFlags preparePersist(ImageSingletonWriter writer) { - return PersistFlags.NOTHING; - } } diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/reflect/proxy/DynamicProxySupport.java b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/reflect/proxy/DynamicProxySupport.java index 213cc2d80652..d2e21a823d64 100644 --- a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/reflect/proxy/DynamicProxySupport.java +++ b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/reflect/proxy/DynamicProxySupport.java @@ -27,7 +27,6 @@ import java.lang.reflect.InvocationHandler; import java.lang.reflect.Proxy; import java.util.Arrays; -import java.util.EnumSet; import java.util.regex.Pattern; import org.graalvm.collections.EconomicMap; @@ -44,11 +43,13 @@ import com.oracle.svm.core.hub.PredefinedClassesSupport; import com.oracle.svm.core.imagelayer.ImageLayerBuildingSupport; import com.oracle.svm.core.jdk.proxy.DynamicProxyRegistry; -import com.oracle.svm.core.layeredimagesingleton.DuplicableImageSingleton; -import com.oracle.svm.core.layeredimagesingleton.ImageSingletonWriter; -import com.oracle.svm.core.layeredimagesingleton.LayeredImageSingletonBuilderFlags; import com.oracle.svm.core.metadata.MetadataTracer; import com.oracle.svm.core.reflect.MissingReflectionRegistrationUtils; +import com.oracle.svm.core.traits.BuiltinTraits.AllAccess; +import com.oracle.svm.core.traits.BuiltinTraits.Duplicable; +import com.oracle.svm.core.traits.BuiltinTraits.NoLayeredCallbacks; +import com.oracle.svm.core.traits.SingletonLayeredInstallationKind.Independent; +import com.oracle.svm.core.traits.SingletonTraits; import com.oracle.svm.core.util.ImageHeapMap; import com.oracle.svm.core.util.VMError; import com.oracle.svm.util.ClassUtil; @@ -56,7 +57,8 @@ import jdk.graal.compiler.debug.GraalError; -public class DynamicProxySupport implements DynamicProxyRegistry, DuplicableImageSingleton { +@SingletonTraits(access = AllAccess.class, layeredCallbacks = NoLayeredCallbacks.class, layeredInstallationKind = Independent.class, other = Duplicable.class) +public class DynamicProxySupport implements DynamicProxyRegistry { public static final Pattern PROXY_CLASS_NAME_PATTERN = Pattern.compile(".*\\$Proxy[0-9]+"); @@ -252,14 +254,4 @@ private static void describeLoaderChain(StringBuilder b, ClassLoader loader) { public static String proxyTypeDescriptor(String... interfaceNames) { return "Proxy[" + String.join(", ", interfaceNames) + "]"; } - - @Override - public EnumSet getImageBuilderFlags() { - return LayeredImageSingletonBuilderFlags.ALL_ACCESS; - } - - @Override - public PersistFlags preparePersist(ImageSingletonWriter writer) { - return PersistFlags.NOTHING; - } } diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/thread/VMThreads.java b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/thread/VMThreads.java index ff3d78aa62dc..b042f5b8b8c2 100644 --- a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/thread/VMThreads.java +++ b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/thread/VMThreads.java @@ -53,7 +53,6 @@ import com.oracle.svm.core.imagelayer.ImageLayerBuildingSupport; import com.oracle.svm.core.jdk.UninterruptibleUtils; import com.oracle.svm.core.jdk.UninterruptibleUtils.AtomicWord; -import com.oracle.svm.core.layeredimagesingleton.FeatureSingleton; import com.oracle.svm.core.locks.VMCondition; import com.oracle.svm.core.locks.VMLockSupport; import com.oracle.svm.core.locks.VMMutex; @@ -68,8 +67,11 @@ import com.oracle.svm.core.threadlocal.FastThreadLocalInt; import com.oracle.svm.core.threadlocal.FastThreadLocalWord; import com.oracle.svm.core.threadlocal.VMThreadLocalSupport; +import com.oracle.svm.core.traits.BuiltinTraits.BuildtimeAccessOnly; +import com.oracle.svm.core.traits.BuiltinTraits.NoLayeredCallbacks; import com.oracle.svm.core.traits.BuiltinTraits.RuntimeAccessOnly; import com.oracle.svm.core.traits.BuiltinTraits.SingleLayer; +import com.oracle.svm.core.traits.SingletonLayeredInstallationKind.Independent; import com.oracle.svm.core.traits.SingletonLayeredInstallationKind.InitialLayerOnly; import com.oracle.svm.core.traits.SingletonTraits; import com.oracle.svm.core.util.UnsignedUtils; @@ -1154,7 +1156,8 @@ public boolean matchesThread(IsolateThread thread, ComparableWord identifier) { } @AutomaticallyRegisteredFeature -class ThreadLookupFeature implements InternalFeature, FeatureSingleton { +@SingletonTraits(access = BuildtimeAccessOnly.class, layeredCallbacks = NoLayeredCallbacks.class, layeredInstallationKind = Independent.class) +class ThreadLookupFeature implements InternalFeature { @Override public void beforeAnalysis(BeforeAnalysisAccess access) { if (ImageLayerBuildingSupport.firstImageBuild() && !ImageSingletons.contains(VMThreads.ThreadLookup.class)) { diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/traits/BuiltinTraits.java b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/traits/BuiltinTraits.java index 5e1306ac8820..9c23a055318e 100644 --- a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/traits/BuiltinTraits.java +++ b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/traits/BuiltinTraits.java @@ -25,8 +25,8 @@ package com.oracle.svm.core.traits; import com.oracle.svm.core.layeredimagesingleton.ImageSingletonWriter; -import com.oracle.svm.core.layeredimagesingleton.LayeredImageSingleton; -import com.oracle.svm.core.layeredimagesingleton.LayeredImageSingletonBuilderFlags; +import com.oracle.svm.core.layeredimagesingleton.LayeredPersistFlags; +import com.oracle.svm.core.layeredimagesingleton.SingletonAccessFlags; /** * Commonly used {@link SingletonTrait}s. @@ -37,7 +37,7 @@ public class BuiltinTraits { * Trait indicating this singleton should only be accessed from code executed at runtime. */ public static final SingletonTrait RUNTIME_ONLY = new SingletonTrait(SingletonTraitKind.ACCESS, - (SingletonAccess.Supplier) () -> LayeredImageSingletonBuilderFlags.RUNTIME_ACCESS_ONLY); + (SingletonAccess.Supplier) () -> SingletonAccessFlags.RUNTIME_ACCESS_ONLY); public static final class RuntimeAccessOnly extends SingletonAccessSupplier { @Override @@ -51,7 +51,7 @@ public SingletonTrait getAccessTrait() { * process and not at runtime. */ public static final SingletonTrait BUILDTIME_ONLY = new SingletonTrait(SingletonTraitKind.ACCESS, - (SingletonAccess.Supplier) () -> LayeredImageSingletonBuilderFlags.BUILDTIME_ACCESS_ONLY); + (SingletonAccess.Supplier) () -> SingletonAccessFlags.BUILDTIME_ACCESS_ONLY); public static final class BuildtimeAccessOnly extends SingletonAccessSupplier { @Override @@ -65,7 +65,7 @@ public SingletonTrait getAccessTrait() { * process and at runtime. */ public static final SingletonTrait ALL_ACCESS = new SingletonTrait(SingletonTraitKind.ACCESS, - (SingletonAccess.Supplier) () -> LayeredImageSingletonBuilderFlags.ALL_ACCESS); + (SingletonAccess.Supplier) () -> SingletonAccessFlags.ALL_ACCESS); public static final class AllAccess extends SingletonAccessSupplier { @Override @@ -79,8 +79,8 @@ public SingletonTrait getAccessTrait() { */ public static final SingletonTrait NO_LAYERED_CALLBACKS = new SingletonTrait(SingletonTraitKind.LAYERED_CALLBACKS, new SingletonLayeredCallbacks<>() { @Override - public LayeredImageSingleton.PersistFlags doPersist(ImageSingletonWriter writer, Object singleton) { - return LayeredImageSingleton.PersistFlags.NOTHING; + public LayeredPersistFlags doPersist(ImageSingletonWriter writer, Object singleton) { + return LayeredPersistFlags.NOTHING; } }); @@ -98,8 +98,8 @@ public SingletonTrait getLayeredCallbacksTrait() { */ public static final SingletonTrait SINGLE_LAYER = new SingletonTrait(SingletonTraitKind.LAYERED_CALLBACKS, new SingletonLayeredCallbacks<>() { @Override - public LayeredImageSingleton.PersistFlags doPersist(ImageSingletonWriter writer, Object singleton) { - return LayeredImageSingleton.PersistFlags.FORBIDDEN; + public LayeredPersistFlags doPersist(ImageSingletonWriter writer, Object singleton) { + return LayeredPersistFlags.FORBIDDEN; } }); diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/traits/InjectedSingletonLayeredCallbacks.java b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/traits/InjectedSingletonLayeredCallbacks.java deleted file mode 100644 index 5c3ce69de1aa..000000000000 --- a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/traits/InjectedSingletonLayeredCallbacks.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright (c) 2025, 2025, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ -package com.oracle.svm.core.traits; - -import com.oracle.svm.core.layeredimagesingleton.ImageSingletonWriter; -import com.oracle.svm.core.layeredimagesingleton.LayeredImageSingleton; - -import jdk.graal.compiler.debug.Assertions; - -// GR-66792 remove once no custom persist actions exist - -/** - * Temporarily used to convert {@link LayeredImageSingleton} callbacks into {@link SingletonTrait} - * information. - */ -public final class InjectedSingletonLayeredCallbacks extends SingletonLayeredCallbacks { - final LayeredImageSingleton singleton; - - public InjectedSingletonLayeredCallbacks(LayeredImageSingleton singleton) { - this.singleton = singleton; - } - - @Override - public LayeredImageSingleton.PersistFlags doPersist(ImageSingletonWriter writer, LayeredImageSingleton obj) { - assert singleton == obj : Assertions.errorMessage(singleton, obj); - - return singleton.preparePersist(writer); - } - - public Class getSingletonClass() { - return singleton.getClass(); - } -} diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/traits/SingletonAccess.java b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/traits/SingletonAccess.java index d4e29c7e48a8..e8a4fa274e04 100644 --- a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/traits/SingletonAccess.java +++ b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/traits/SingletonAccess.java @@ -24,9 +24,7 @@ */ package com.oracle.svm.core.traits; -import java.util.EnumSet; - -import com.oracle.svm.core.layeredimagesingleton.LayeredImageSingletonBuilderFlags; +import com.oracle.svm.core.layeredimagesingleton.SingletonAccessFlags; import com.oracle.svm.core.util.VMError; /** @@ -36,10 +34,10 @@ */ public class SingletonAccess { interface Supplier { - EnumSet getAccessFlags(); + SingletonAccessFlags getAccessFlags(); } - public static EnumSet getAccess(SingletonTrait trait) { + public static SingletonAccessFlags getAccess(SingletonTrait trait) { VMError.guarantee(trait.kind() == SingletonTraitKind.ACCESS); return ((Supplier) trait.metadata()).getAccessFlags(); } diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/traits/SingletonLayeredCallbacks.java b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/traits/SingletonLayeredCallbacks.java index b6f9d0a7c35d..91714d17f9cc 100644 --- a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/traits/SingletonLayeredCallbacks.java +++ b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/traits/SingletonLayeredCallbacks.java @@ -30,7 +30,7 @@ import com.oracle.svm.core.imagelayer.ImageLayerBuildingSupport; import com.oracle.svm.core.layeredimagesingleton.ImageSingletonLoader; import com.oracle.svm.core.layeredimagesingleton.ImageSingletonWriter; -import com.oracle.svm.core.layeredimagesingleton.LayeredImageSingleton.PersistFlags; +import com.oracle.svm.core.layeredimagesingleton.LayeredPersistFlags; import com.oracle.svm.core.util.VMError; /** @@ -46,8 +46,9 @@ public abstract class SingletonLayeredCallbacks { * To explain in more detail, consider a two-layered configuration, where "I" is the initial * layer and "A" is the application layer. If, while building I, singleton "S" specifies that it * wants to be created during startup of the next layer (via returning - * {@link PersistFlags#CREATE} from its {@link #doPersist} callback), then it will also provide - * a {@link LayeredSingletonInstantiator} "LI" to use via {@link #getSingletonInstantiator}. + * {@link LayeredPersistFlags#CREATE} from its {@link #doPersist} callback), then it will also + * provide a {@link LayeredSingletonInstantiator} "LI" to use via + * {@link #getSingletonInstantiator}. * *

* Now while building layer A, in order to create S in this layer, the native image generator @@ -63,19 +64,19 @@ public interface LayeredSingletonInstantiator { * at the end of native image generation to perform any needed final actions. The method's * return value also specifies what actions should be taken at the startup of the next layer. */ - public abstract PersistFlags doPersist(ImageSingletonWriter writer, T singleton); + public abstract LayeredPersistFlags doPersist(ImageSingletonWriter writer, T singleton); /** - * If {@link #doPersist} returns {@link PersistFlags#CREATE}, then this method is called to - * determine how to instantiate the singleton in the next layer. + * If {@link #doPersist} returns {@link LayeredPersistFlags#CREATE}, then this method is called + * to determine how to instantiate the singleton in the next layer. */ public Class> getSingletonInstantiator() { throw VMError.shouldNotReachHere("getSingletonInstantiator is not implemented. This method must be implemented if doPersist returns PersistFlag.CREATE"); } /** - * See description in {@link PersistFlags#CALLBACK_ON_REGISTRATION} for more details. Note this - * method will be called at most once for each registered singleton object. + * See description in {@link LayeredPersistFlags#CALLBACK_ON_REGISTRATION} for more details. + * Note this method will be called at most once for each registered singleton object. */ @SuppressWarnings("unused") public void onSingletonRegistration(ImageSingletonLoader loader, T singleton) { diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/util/LayeredHostedImageHeapMapCollector.java b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/util/LayeredHostedImageHeapMapCollector.java index af785eee9a85..99d80db4b6dd 100644 --- a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/util/LayeredHostedImageHeapMapCollector.java +++ b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/util/LayeredHostedImageHeapMapCollector.java @@ -36,7 +36,7 @@ import com.oracle.svm.core.imagelayer.ImageLayerBuildingSupport; import com.oracle.svm.core.layeredimagesingleton.ImageSingletonLoader; import com.oracle.svm.core.layeredimagesingleton.ImageSingletonWriter; -import com.oracle.svm.core.layeredimagesingleton.LayeredImageSingleton; +import com.oracle.svm.core.layeredimagesingleton.LayeredPersistFlags; import com.oracle.svm.core.traits.BuiltinTraits.BuildtimeAccessOnly; import com.oracle.svm.core.traits.SingletonLayeredCallbacks; import com.oracle.svm.core.traits.SingletonLayeredCallbacksSupplier; @@ -105,13 +105,13 @@ public SingletonTrait getLayeredCallbacksTrait() { return new SingletonTrait(SingletonTraitKind.LAYERED_CALLBACKS, new SingletonLayeredCallbacks() { @Override - public LayeredImageSingleton.PersistFlags doPersist(ImageSingletonWriter writer, LayeredHostedImageHeapMapCollector singleton) { + public LayeredPersistFlags doPersist(ImageSingletonWriter writer, LayeredHostedImageHeapMapCollector singleton) { Set reachableMapKeys = new HashSet<>(singleton.currentLayerReachableMapsKeys); if (singleton.previousLayerReachableMapKeys != null) { reachableMapKeys.addAll(singleton.previousLayerReachableMapKeys); } writer.writeStringList("reachableMapKeys", reachableMapKeys.stream().toList()); - return LayeredImageSingleton.PersistFlags.CREATE; + return LayeredPersistFlags.CREATE; } @Override diff --git a/substratevm/src/com.oracle.svm.graal/src/com/oracle/svm/graal/stubs/AMD64StubForeignCallsFeature.java b/substratevm/src/com.oracle.svm.graal/src/com/oracle/svm/graal/stubs/AMD64StubForeignCallsFeature.java index 55c5e2fb52f1..26309fa10c87 100644 --- a/substratevm/src/com.oracle.svm.graal/src/com/oracle/svm/graal/stubs/AMD64StubForeignCallsFeature.java +++ b/substratevm/src/com.oracle.svm.graal/src/com/oracle/svm/graal/stubs/AMD64StubForeignCallsFeature.java @@ -36,8 +36,6 @@ import org.graalvm.nativeimage.Platforms; import com.oracle.svm.core.feature.AutomaticallyRegisteredFeature; -import com.oracle.svm.core.layeredimagesingleton.FeatureSingleton; -import com.oracle.svm.core.layeredimagesingleton.UnsavedSingleton; import com.oracle.svm.core.traits.BuiltinTraits.BuildtimeAccessOnly; import com.oracle.svm.core.traits.BuiltinTraits.NoLayeredCallbacks; import com.oracle.svm.core.traits.SingletonLayeredInstallationKind.Independent; @@ -76,7 +74,7 @@ @AutomaticallyRegisteredFeature @Platforms(AMD64.class) @SingletonTraits(access = BuildtimeAccessOnly.class, layeredCallbacks = NoLayeredCallbacks.class, layeredInstallationKind = Independent.class) -public class AMD64StubForeignCallsFeature extends StubForeignCallsFeatureBase implements FeatureSingleton, UnsavedSingleton { +public class AMD64StubForeignCallsFeature extends StubForeignCallsFeatureBase { private static final EnumSet BASELINE = EnumSet.of(SSE2); diff --git a/substratevm/src/com.oracle.svm.hosted/resources/SharedLayerSnapshotCapnProtoSchema.capnp b/substratevm/src/com.oracle.svm.hosted/resources/SharedLayerSnapshotCapnProtoSchema.capnp index c15acf79a603..89a310804c4b 100644 --- a/substratevm/src/com.oracle.svm.hosted/resources/SharedLayerSnapshotCapnProtoSchema.capnp +++ b/substratevm/src/com.oracle.svm.hosted/resources/SharedLayerSnapshotCapnProtoSchema.capnp @@ -250,9 +250,7 @@ struct ImageSingletonObject { id @0 :SingletonObjId; className @1 :Text; keyStoreId @2 :KeyStoreId; - recreateClass @3 :Text; - # GR-66792 remove once no custom persist actions exist - recreateMethod @4 :Text; + singletonInstantiatorClass @3 :Text; } struct KeyStoreInstance { diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/DumpIsolateCreationOnlyOptionsFeature.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/DumpIsolateCreationOnlyOptionsFeature.java index 25bf67a1442f..26ea7535ce88 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/DumpIsolateCreationOnlyOptionsFeature.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/DumpIsolateCreationOnlyOptionsFeature.java @@ -36,17 +36,20 @@ import com.oracle.svm.core.BuildArtifacts; import com.oracle.svm.core.feature.AutomaticallyRegisteredFeature; import com.oracle.svm.core.feature.InternalFeature; -import com.oracle.svm.core.layeredimagesingleton.FeatureSingleton; -import com.oracle.svm.core.layeredimagesingleton.UnsavedSingleton; import com.oracle.svm.core.option.HostedOptionKey; import com.oracle.svm.core.option.RuntimeOptionKey; import com.oracle.svm.core.option.RuntimeOptionParser; +import com.oracle.svm.core.traits.BuiltinTraits.BuildtimeAccessOnly; +import com.oracle.svm.core.traits.BuiltinTraits.NoLayeredCallbacks; +import com.oracle.svm.core.traits.SingletonLayeredInstallationKind.Independent; +import com.oracle.svm.core.traits.SingletonTraits; import com.oracle.svm.core.util.VMError; import jdk.graal.compiler.options.Option; @AutomaticallyRegisteredFeature -public class DumpIsolateCreationOnlyOptionsFeature implements InternalFeature, FeatureSingleton, UnsavedSingleton { +@SingletonTraits(access = BuildtimeAccessOnly.class, layeredCallbacks = NoLayeredCallbacks.class, layeredInstallationKind = Independent.class) +public class DumpIsolateCreationOnlyOptionsFeature implements InternalFeature { public static final class Options { @Option(help = "Dump options that must be passed during isolate creation and not set later.")// public static final HostedOptionKey DumpIsolateCreationOnlyOptions = new HostedOptionKey<>(false); diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/HostedLayeredModuleSingleton.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/HostedLayeredModuleSingleton.java index 4cee16a126e3..55be5dfff887 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/HostedLayeredModuleSingleton.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/HostedLayeredModuleSingleton.java @@ -34,7 +34,7 @@ import com.oracle.svm.core.jdk.LayeredModuleSingleton; import com.oracle.svm.core.layeredimagesingleton.ImageSingletonLoader; import com.oracle.svm.core.layeredimagesingleton.ImageSingletonWriter; -import com.oracle.svm.core.layeredimagesingleton.LayeredImageSingleton; +import com.oracle.svm.core.layeredimagesingleton.LayeredPersistFlags; import com.oracle.svm.core.traits.BuiltinTraits.BuildtimeAccessOnly; import com.oracle.svm.core.traits.SingletonLayeredCallbacks; import com.oracle.svm.core.traits.SingletonLayeredCallbacksSupplier; @@ -83,12 +83,12 @@ public SingletonTrait getLayeredCallbacksTrait() { return new SingletonTrait(SingletonTraitKind.LAYERED_CALLBACKS, new SingletonLayeredCallbacks() { @Override - public LayeredImageSingleton.PersistFlags doPersist(ImageSingletonWriter writer, HostedLayeredModuleSingleton singleton) { + public LayeredPersistFlags doPersist(ImageSingletonWriter writer, HostedLayeredModuleSingleton singleton) { SVMImageLayerWriter.ImageSingletonWriterImpl writerImpl = (SVMImageLayerWriter.ImageSingletonWriterImpl) writer; var builder = writerImpl.getSnapshotBuilder().initLayeredModule(); persistModulePackages(builder.initOpenModulePackages(singleton.moduleOpenPackages.size()), singleton.moduleOpenPackages); persistModulePackages(builder.initExportedModulePackages(singleton.moduleExportedPackages.size()), singleton.moduleExportedPackages); - return LayeredImageSingleton.PersistFlags.CREATE; + return LayeredPersistFlags.CREATE; } @Override diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/ImageSingletonsSupportImpl.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/ImageSingletonsSupportImpl.java index 1ef8cc4a78a8..f694df379c4b 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/ImageSingletonsSupportImpl.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/ImageSingletonsSupportImpl.java @@ -46,13 +46,10 @@ import com.oracle.svm.core.SubstrateUtil; import com.oracle.svm.core.imagelayer.ImageLayerBuildingSupport; -import com.oracle.svm.core.layeredimagesingleton.LayeredImageSingleton; -import com.oracle.svm.core.layeredimagesingleton.LayeredImageSingleton.PersistFlags; -import com.oracle.svm.core.layeredimagesingleton.LayeredImageSingletonBuilderFlags; import com.oracle.svm.core.layeredimagesingleton.LayeredImageSingletonSupport; +import com.oracle.svm.core.layeredimagesingleton.LayeredPersistFlags; import com.oracle.svm.core.layeredimagesingleton.LoadedLayeredImageSingletonInfo; -import com.oracle.svm.core.traits.BuiltinTraits; -import com.oracle.svm.core.traits.InjectedSingletonLayeredCallbacks; +import com.oracle.svm.core.layeredimagesingleton.SingletonAccessFlags; import com.oracle.svm.core.traits.SingletonAccess; import com.oracle.svm.core.traits.SingletonAccessSupplier; import com.oracle.svm.core.traits.SingletonLayeredCallbacks; @@ -149,8 +146,14 @@ public static final class SingletonInfo { this.traitMap = traitMap; var accessTrait = traitMap.getTrait(SingletonTraitKind.ACCESS); - buildtimeAccessAllowed = accessTrait.map(singletonTrait -> SingletonAccess.getAccess(singletonTrait).contains(LayeredImageSingletonBuilderFlags.BUILDTIME_ACCESS)).orElse(true); - runtimeAccessAllowed = accessTrait.map(singletonTrait -> SingletonAccess.getAccess(singletonTrait).contains(LayeredImageSingletonBuilderFlags.RUNTIME_ACCESS)).orElse(true); + buildtimeAccessAllowed = accessTrait.map(singletonTrait -> { + SingletonAccessFlags access = SingletonAccess.getAccess(singletonTrait); + return access == SingletonAccessFlags.BUILDTIME_ACCESS_ONLY || access == SingletonAccessFlags.ALL_ACCESS; + }).orElse(true); + runtimeAccessAllowed = accessTrait.map(singletonTrait -> { + SingletonAccessFlags access = SingletonAccess.getAccess(singletonTrait); + return access == SingletonAccessFlags.RUNTIME_ACCESS_ONLY || access == SingletonAccessFlags.ALL_ACCESS; + }).orElse(true); } public Object singleton() { @@ -252,7 +255,8 @@ public static final class HostedManagement { /** * Marker for ImageSingleton keys which cannot have a value installed. This can happen when - * a {@link LayeredImageSingleton} specified {@link PersistFlags#FORBIDDEN}. + * a {@link SingletonLayeredCallbacks#doPersist} specified + * {@link LayeredPersistFlags#FORBIDDEN}. */ private static final Object SINGLETON_INSTALLATION_FORBIDDEN = new Object(); private static final SingletonInfo FORBIDDEN_SINGLETON_INFO_EMPTY_TRAITS; @@ -414,37 +418,6 @@ void doAdd(Class key, T value) { addSingleton(key, value); } - /** - * GR-66797 remove all reference to layered image singletons. - *

- * Temporary feature to convert the legacy {@link LayeredImageSingleton} interface into - * singleton traits. This will be removed once all singletons are converted to use the new - * {@link SingletonTraits} API. - */ - private void injectLayeredInformation(Object singleton, SingletonTraitMap traitMap) { - if (singleton instanceof LayeredImageSingleton layeredImageSingleton) { - if (traitMap.getTrait(SingletonTraitKind.ACCESS).isEmpty()) { - var flags = layeredImageSingleton.getImageBuilderFlags(); - SingletonTrait accessTrait; - if (flags.equals(LayeredImageSingletonBuilderFlags.ALL_ACCESS)) { - accessTrait = BuiltinTraits.ALL_ACCESS; - } else if (flags.equals(LayeredImageSingletonBuilderFlags.BUILDTIME_ACCESS_ONLY)) { - accessTrait = BuiltinTraits.BUILDTIME_ONLY; - } else { - VMError.guarantee(flags.equals(LayeredImageSingletonBuilderFlags.RUNTIME_ACCESS_ONLY)); - accessTrait = BuiltinTraits.RUNTIME_ONLY; - } - traitMap.addTrait(accessTrait); - } - if (layeredBuild) { - if (traitMap.getTrait(SingletonTraitKind.LAYERED_CALLBACKS).isEmpty()) { - SingletonLayeredCallbacks action = new InjectedSingletonLayeredCallbacks(layeredImageSingleton); - traitMap.addTrait(new SingletonTrait(SingletonTraitKind.LAYERED_CALLBACKS, action)); - } - } - } - } - /** * Creates or collects the {@link SingletonTraitMap} associated with this singleton before * adding the singleton to the internal map. @@ -453,7 +426,6 @@ private void addSingleton(Class key, Object value) { SingletonTraitMap traitMap = singletonToTraitMap.get(value); if (traitMap == null) { traitMap = SingletonTraitMap.getAnnotatedTraits(value.getClass(), extractor, layeredBuild); - injectLayeredInformation(value, traitMap); if (layeredBuild) { traitMap.getTrait(SingletonTraitKind.LAYERED_INSTALLATION_KIND).ifPresent(trait -> { var kind = SingletonLayeredInstallationKind.getInstallationKind(trait); @@ -492,7 +464,10 @@ private void addSingletonToMap(Class key, Object value, SingletonTraitMap tra case MULTI_LAYER -> { VMError.guarantee(key == value.getClass(), "singleton key %s must match singleton class %s", key, value); boolean runtimeAccess = traitMap.getTrait(SingletonTraitKind.ACCESS) - .map(singletonTrait -> SingletonAccess.getAccess(singletonTrait).contains(LayeredImageSingletonBuilderFlags.RUNTIME_ACCESS)).orElse(false); + .map(singletonTrait -> { + SingletonAccessFlags access = SingletonAccess.getAccess(singletonTrait); + return access == SingletonAccessFlags.RUNTIME_ACCESS_ONLY || access == SingletonAccessFlags.ALL_ACCESS; + }).orElse(false); VMError.guarantee(runtimeAccess, "MultiLayer singleton must have runtime access %s %s", key, value); } } diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/OpenTypeWorldFeature.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/OpenTypeWorldFeature.java index ea549277049b..8ad94f2c3e92 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/OpenTypeWorldFeature.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/OpenTypeWorldFeature.java @@ -48,7 +48,7 @@ import com.oracle.svm.core.imagelayer.ImageLayerBuildingSupport; import com.oracle.svm.core.layeredimagesingleton.ImageSingletonLoader; import com.oracle.svm.core.layeredimagesingleton.ImageSingletonWriter; -import com.oracle.svm.core.layeredimagesingleton.LayeredImageSingleton; +import com.oracle.svm.core.layeredimagesingleton.LayeredPersistFlags; import com.oracle.svm.core.meta.SharedMethod; import com.oracle.svm.core.traits.BuiltinTraits.BuildtimeAccessOnly; import com.oracle.svm.core.traits.SingletonLayeredCallbacks; @@ -361,11 +361,11 @@ static class LayeredCallbacks extends SingletonLayeredCallbacksSupplier { public SingletonTrait getLayeredCallbacksTrait() { return new SingletonTrait(SingletonTraitKind.LAYERED_CALLBACKS, new SingletonLayeredCallbacks<>() { @Override - public LayeredImageSingleton.PersistFlags doPersist(ImageSingletonWriter writer, Object singleton) { + public LayeredPersistFlags doPersist(ImageSingletonWriter writer, Object singleton) { writer.writeInt("maxTypeID", DynamicHubSupport.currentLayer().getMaxTypeId()); writer.writeInt("maxInterfaceID", DynamicHubSupport.currentLayer().getMaxInterfaceId()); - return LayeredImageSingleton.PersistFlags.CREATE; + return LayeredPersistFlags.CREATE; } @Override diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/SharedLayerBootLayerModulesSingleton.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/SharedLayerBootLayerModulesSingleton.java index 3da35b692430..2b57c0a302cf 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/SharedLayerBootLayerModulesSingleton.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/SharedLayerBootLayerModulesSingleton.java @@ -37,7 +37,7 @@ import com.oracle.svm.core.imagelayer.BuildingInitialLayerPredicate; import com.oracle.svm.core.layeredimagesingleton.ImageSingletonLoader; import com.oracle.svm.core.layeredimagesingleton.ImageSingletonWriter; -import com.oracle.svm.core.layeredimagesingleton.LayeredImageSingleton; +import com.oracle.svm.core.layeredimagesingleton.LayeredPersistFlags; import com.oracle.svm.core.traits.BuiltinTraits.BuildtimeAccessOnly; import com.oracle.svm.core.traits.SingletonLayeredCallbacks; import com.oracle.svm.core.traits.SingletonLayeredCallbacksSupplier; @@ -83,7 +83,7 @@ public SingletonTrait getLayeredCallbacksTrait() { return new SingletonTrait(SingletonTraitKind.LAYERED_CALLBACKS, new SingletonLayeredCallbacks() { @Override - public LayeredImageSingleton.PersistFlags doPersist(ImageSingletonWriter writer, SharedLayerBootLayerModulesSingleton singleton) { + public LayeredPersistFlags doPersist(ImageSingletonWriter writer, SharedLayerBootLayerModulesSingleton singleton) { SVMImageLayerWriter.ImageSingletonWriterImpl writerImpl = (SVMImageLayerWriter.ImageSingletonWriterImpl) writer; Stream moduleNames = singleton.bootLayer.modules().stream().map(Module::getName); @@ -93,7 +93,7 @@ public LayeredImageSingleton.PersistFlags doPersist(ImageSingletonWriter writer, SVMImageLayerWriter.initStringList(writerImpl.getSnapshotBuilder()::initSharedLayerBootLayerModules, moduleNames); - return LayeredImageSingleton.PersistFlags.CREATE; + return LayeredPersistFlags.CREATE; } @Override diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/SystemInOutErrFeature.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/SystemInOutErrFeature.java index 151c7d00f79d..0a027349d7b4 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/SystemInOutErrFeature.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/SystemInOutErrFeature.java @@ -37,7 +37,10 @@ import com.oracle.svm.core.feature.InternalFeature; import com.oracle.svm.core.imagelayer.ImageLayerBuildingSupport; import com.oracle.svm.core.jdk.SystemInOutErrSupport; -import com.oracle.svm.core.layeredimagesingleton.FeatureSingleton; +import com.oracle.svm.core.traits.BuiltinTraits.BuildtimeAccessOnly; +import com.oracle.svm.core.traits.BuiltinTraits.NoLayeredCallbacks; +import com.oracle.svm.core.traits.SingletonLayeredInstallationKind.Independent; +import com.oracle.svm.core.traits.SingletonTraits; import com.oracle.svm.hosted.imagelayer.CrossLayerConstantRegistry; import jdk.internal.access.SharedSecrets; @@ -50,7 +53,8 @@ * {@link RecomputeFieldValue} annotations. */ @AutomaticallyRegisteredFeature -public class SystemInOutErrFeature implements InternalFeature, FeatureSingleton { +@SingletonTraits(access = BuildtimeAccessOnly.class, layeredCallbacks = NoLayeredCallbacks.class, layeredInstallationKind = Independent.class) +public class SystemInOutErrFeature implements InternalFeature { private final InputStream hostedIn; private final PrintStream hostedOut; private final PrintStream hostedErr; diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/code/RuntimeMetadataEncoderImpl.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/code/RuntimeMetadataEncoderImpl.java index 0305001fd229..8b9327265da0 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/code/RuntimeMetadataEncoderImpl.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/code/RuntimeMetadataEncoderImpl.java @@ -91,7 +91,7 @@ import com.oracle.svm.core.imagelayer.ImageLayerBuildingSupport; import com.oracle.svm.core.layeredimagesingleton.ImageSingletonLoader; import com.oracle.svm.core.layeredimagesingleton.ImageSingletonWriter; -import com.oracle.svm.core.layeredimagesingleton.LayeredImageSingleton; +import com.oracle.svm.core.layeredimagesingleton.LayeredPersistFlags; import com.oracle.svm.core.meta.SharedField; import com.oracle.svm.core.reflect.target.EncodedRuntimeMetadataSupplier; import com.oracle.svm.core.reflect.target.Target_jdk_internal_reflect_ConstantPool; @@ -1359,14 +1359,14 @@ public SingletonTrait getLayeredCallbacksTrait() { return new SingletonTrait(SingletonTraitKind.LAYERED_CALLBACKS, new SingletonLayeredCallbacks() { @Override - public LayeredImageSingleton.PersistFlags doPersist(ImageSingletonWriter writer, LayeredRuntimeMetadataSingleton singleton) { + public LayeredPersistFlags doPersist(ImageSingletonWriter writer, LayeredRuntimeMetadataSingleton singleton) { SVMImageLayerWriter.ImageSingletonWriterImpl writerImpl = (SVMImageLayerWriter.ImageSingletonWriterImpl) writer; var builder = writerImpl.getSnapshotBuilder().getLayeredRuntimeMetadataSingleton(); persistRegisteredElements(singleton.registeredMethods, singleton.previousLayerRegisteredMethods, builder::initMethods, builder::initMethodStates); persistRegisteredElements(singleton.registeredFields, singleton.previousLayerRegisteredFields, builder::initFields, builder::initFieldStates); - return LayeredImageSingleton.PersistFlags.CREATE; + return LayeredPersistFlags.CREATE; } @Override diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/code/SubstrateLIRBackendFeature.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/code/SubstrateLIRBackendFeature.java index a88380cbbfeb..e1fe8b1a26db 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/code/SubstrateLIRBackendFeature.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/code/SubstrateLIRBackendFeature.java @@ -34,8 +34,10 @@ import com.oracle.svm.core.graal.meta.RuntimeConfiguration; import com.oracle.svm.core.graal.snippets.ExceptionSnippets; import com.oracle.svm.core.graal.snippets.NodeLoweringProvider; -import com.oracle.svm.core.layeredimagesingleton.FeatureSingleton; -import com.oracle.svm.core.layeredimagesingleton.UnsavedSingleton; +import com.oracle.svm.core.traits.BuiltinTraits.BuildtimeAccessOnly; +import com.oracle.svm.core.traits.BuiltinTraits.NoLayeredCallbacks; +import com.oracle.svm.core.traits.SingletonLayeredInstallationKind.Independent; +import com.oracle.svm.core.traits.SingletonTraits; import com.oracle.svm.hosted.HostedConfiguration; import com.oracle.svm.hosted.image.NativeImageCodeCacheFactory; import com.oracle.svm.hosted.image.ObjectFileFactory; @@ -46,7 +48,8 @@ import jdk.graal.compiler.phases.util.Providers; @AutomaticallyRegisteredFeature -class SubstrateLIRBackendFeature implements InternalFeature, FeatureSingleton, UnsavedSingleton { +@SingletonTraits(access = BuildtimeAccessOnly.class, layeredCallbacks = NoLayeredCallbacks.class, layeredInstallationKind = Independent.class) +class SubstrateLIRBackendFeature implements InternalFeature { @Override public boolean isInConfiguration(IsInConfigurationAccess access) { return SubstrateOptions.useLIRBackend(); diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/code/amd64/AMD64HostedPatcherFeature.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/code/amd64/AMD64HostedPatcherFeature.java index 8435cc453d6d..de484b72408d 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/code/amd64/AMD64HostedPatcherFeature.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/code/amd64/AMD64HostedPatcherFeature.java @@ -26,7 +26,6 @@ import java.util.function.Consumer; -import com.oracle.svm.util.ClassUtil; import org.graalvm.nativeimage.ImageSingletons; import org.graalvm.nativeimage.Platform; import org.graalvm.nativeimage.Platforms; @@ -37,15 +36,18 @@ import com.oracle.svm.core.feature.InternalFeature; import com.oracle.svm.core.graal.code.CGlobalDataReference; import com.oracle.svm.core.graal.code.PatchConsumerFactory; -import com.oracle.svm.core.layeredimagesingleton.FeatureSingleton; -import com.oracle.svm.core.layeredimagesingleton.UnsavedSingleton; import com.oracle.svm.core.meta.MethodPointer; import com.oracle.svm.core.meta.SubstrateMethodPointerConstant; +import com.oracle.svm.core.traits.BuiltinTraits.BuildtimeAccessOnly; +import com.oracle.svm.core.traits.BuiltinTraits.NoLayeredCallbacks; +import com.oracle.svm.core.traits.SingletonLayeredInstallationKind.Independent; +import com.oracle.svm.core.traits.SingletonTraits; import com.oracle.svm.core.util.VMError; import com.oracle.svm.hosted.code.HostedImageHeapConstantPatch; import com.oracle.svm.hosted.code.HostedPatcher; import com.oracle.svm.hosted.image.RelocatableBuffer; import com.oracle.svm.hosted.meta.HostedMethod; +import com.oracle.svm.util.ClassUtil; import jdk.graal.compiler.asm.Assembler; import jdk.graal.compiler.asm.amd64.AMD64BaseAssembler.AddressDisplacementAnnotation; @@ -59,7 +61,8 @@ @AutomaticallyRegisteredFeature @Platforms({Platform.AMD64.class}) -class AMD64HostedPatcherFeature implements InternalFeature, FeatureSingleton, UnsavedSingleton { +@SingletonTraits(access = BuildtimeAccessOnly.class, layeredCallbacks = NoLayeredCallbacks.class, layeredInstallationKind = Independent.class) +class AMD64HostedPatcherFeature implements InternalFeature { @Override public void afterRegistration(AfterRegistrationAccess access) { ImageSingletons.add(PatchConsumerFactory.HostedPatchConsumerFactory.class, new PatchConsumerFactory.HostedPatchConsumerFactory() { diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/code/amd64/AMD64HostedTrampolineSupport.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/code/amd64/AMD64HostedTrampolineSupport.java index de4419681363..712b64a93531 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/code/amd64/AMD64HostedTrampolineSupport.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/code/amd64/AMD64HostedTrampolineSupport.java @@ -32,8 +32,10 @@ import com.oracle.svm.core.SubstrateOptions; import com.oracle.svm.core.feature.AutomaticallyRegisteredImageSingleton; import com.oracle.svm.core.graal.code.PatchConsumerFactory; -import com.oracle.svm.core.layeredimagesingleton.FeatureSingleton; -import com.oracle.svm.core.layeredimagesingleton.UnsavedSingleton; +import com.oracle.svm.core.traits.BuiltinTraits.BuildtimeAccessOnly; +import com.oracle.svm.core.traits.BuiltinTraits.NoLayeredCallbacks; +import com.oracle.svm.core.traits.SingletonLayeredInstallationKind.Independent; +import com.oracle.svm.core.traits.SingletonTraits; import com.oracle.svm.core.util.VMError; import com.oracle.svm.hosted.code.HostedDirectCallTrampolineSupport; import com.oracle.svm.hosted.code.HostedPatcher; @@ -49,7 +51,8 @@ @AutomaticallyRegisteredImageSingleton(HostedDirectCallTrampolineSupport.class) @Platforms(Platform.AMD64.class) -public class AMD64HostedTrampolineSupport implements HostedDirectCallTrampolineSupport, FeatureSingleton, UnsavedSingleton { +@SingletonTraits(access = BuildtimeAccessOnly.class, layeredCallbacks = NoLayeredCallbacks.class, layeredInstallationKind = Independent.class) +public class AMD64HostedTrampolineSupport implements HostedDirectCallTrampolineSupport { @Override public boolean mayNeedTrampolines() { diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/fieldfolding/StaticFinalFieldFoldingFeature.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/fieldfolding/StaticFinalFieldFoldingFeature.java index 48ec54584c9f..231c6ea62c4f 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/fieldfolding/StaticFinalFieldFoldingFeature.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/fieldfolding/StaticFinalFieldFoldingFeature.java @@ -45,13 +45,13 @@ import com.oracle.svm.core.feature.AutomaticallyRegisteredFeature; import com.oracle.svm.core.feature.InternalFeature; import com.oracle.svm.core.imagelayer.ImageLayerBuildingSupport; -import com.oracle.svm.core.layeredimagesingleton.FeatureSingleton; import com.oracle.svm.core.layeredimagesingleton.ImageSingletonLoader; import com.oracle.svm.core.layeredimagesingleton.ImageSingletonWriter; -import com.oracle.svm.core.layeredimagesingleton.LayeredImageSingleton; +import com.oracle.svm.core.layeredimagesingleton.LayeredPersistFlags; import com.oracle.svm.core.option.HostedOptionKey; import com.oracle.svm.core.option.SubstrateOptionsParser; import com.oracle.svm.core.traits.BuiltinTraits.BuildtimeAccessOnly; +import com.oracle.svm.core.traits.BuiltinTraits.NoLayeredCallbacks; import com.oracle.svm.core.traits.SingletonLayeredCallbacks; import com.oracle.svm.core.traits.SingletonLayeredCallbacksSupplier; import com.oracle.svm.core.traits.SingletonLayeredInstallationKind.Independent; @@ -129,7 +129,8 @@ * parsing requests may be processed by different threads and could then depend on each other. */ @AutomaticallyRegisteredFeature -public final class StaticFinalFieldFoldingFeature implements InternalFeature, FeatureSingleton { +@SingletonTraits(access = BuildtimeAccessOnly.class, layeredCallbacks = NoLayeredCallbacks.class, layeredInstallationKind = Independent.class) +public final class StaticFinalFieldFoldingFeature implements InternalFeature { public static class Options { @Option(help = "Optimize static final fields that get a constant assigned in the class initializer.")// @@ -494,7 +495,7 @@ static class LayeredCallbacks extends SingletonLayeredCallbacksSupplier { public SingletonTrait getLayeredCallbacksTrait() { return new SingletonTrait(SingletonTraitKind.LAYERED_CALLBACKS, new SingletonLayeredCallbacks() { @Override - public LayeredImageSingleton.PersistFlags doPersist(ImageSingletonWriter writer, StaticFinalFieldFoldingSingleton singleton) { + public LayeredPersistFlags doPersist(ImageSingletonWriter writer, StaticFinalFieldFoldingSingleton singleton) { var snapshotWriter = ((SVMImageLayerWriter.ImageSingletonWriterImpl) writer).getSnapshotBuilder(); SVMImageLayerWriter imageLayerWriter = HostedImageLayerBuildingSupport.singleton().getWriter(); @@ -526,7 +527,7 @@ public LayeredImageSingleton.PersistFlags doPersist(ImageSingletonWriter writer, imageLayerWriter.writeConstant(afterParsingHooksDoneFoldedFieldValuesList.get(i), afterParsingHooksDoneFoldedFieldValuesListBuilder.get(i)); } - return LayeredImageSingleton.PersistFlags.CREATE; + return LayeredPersistFlags.CREATE; } @Override diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/heap/HeapDumpFeature.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/heap/HeapDumpFeature.java index a9c2bb4a22f4..cba89b328710 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/heap/HeapDumpFeature.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/heap/HeapDumpFeature.java @@ -56,7 +56,7 @@ import com.oracle.svm.core.jdk.RuntimeSupport; import com.oracle.svm.core.layeredimagesingleton.ImageSingletonLoader; import com.oracle.svm.core.layeredimagesingleton.ImageSingletonWriter; -import com.oracle.svm.core.layeredimagesingleton.LayeredImageSingleton; +import com.oracle.svm.core.layeredimagesingleton.LayeredPersistFlags; import com.oracle.svm.core.meta.SharedField; import com.oracle.svm.core.meta.SharedType; import com.oracle.svm.core.traits.BuiltinTraits.BuildtimeAccessOnly; @@ -316,9 +316,9 @@ static class LayeredCallbacks extends SingletonLayeredCallbacksSupplier { public SingletonTrait getLayeredCallbacksTrait() { return new SingletonTrait(SingletonTraitKind.LAYERED_CALLBACKS, new SingletonLayeredCallbacks() { @Override - public LayeredImageSingleton.PersistFlags doPersist(ImageSingletonWriter writer, LayeredHeapDumpEncodedTypesTracker singleton) { + public LayeredPersistFlags doPersist(ImageSingletonWriter writer, LayeredHeapDumpEncodedTypesTracker singleton) { writer.writeStringList("encodedFieldNames", singleton.encodedFieldNames); - return LayeredImageSingleton.PersistFlags.CREATE; + return LayeredPersistFlags.CREATE; } @Override diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/heap/ImageHeapObjectAdder.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/heap/ImageHeapObjectAdder.java index 916670615e72..ef2fb081c5ca 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/heap/ImageHeapObjectAdder.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/heap/ImageHeapObjectAdder.java @@ -24,7 +24,6 @@ */ package com.oracle.svm.hosted.heap; -import java.util.EnumSet; import java.util.HashSet; import java.util.Set; import java.util.function.BiConsumer; @@ -32,8 +31,10 @@ import org.graalvm.nativeimage.ImageSingletons; import com.oracle.svm.core.feature.AutomaticallyRegisteredImageSingleton; -import com.oracle.svm.core.layeredimagesingleton.LayeredImageSingletonBuilderFlags; -import com.oracle.svm.core.layeredimagesingleton.UnsavedSingleton; +import com.oracle.svm.core.traits.BuiltinTraits.BuildtimeAccessOnly; +import com.oracle.svm.core.traits.BuiltinTraits.NoLayeredCallbacks; +import com.oracle.svm.core.traits.SingletonLayeredInstallationKind.Independent; +import com.oracle.svm.core.traits.SingletonTraits; import com.oracle.svm.core.util.VMError; import com.oracle.svm.hosted.image.NativeImageHeap; import com.oracle.svm.hosted.meta.HostedUniverse; @@ -44,7 +45,8 @@ * analysis, and it has been added to the shadow heap, e.g., by triggering a shadow heap re-scan. */ @AutomaticallyRegisteredImageSingleton -public class ImageHeapObjectAdder implements UnsavedSingleton { +@SingletonTraits(access = BuildtimeAccessOnly.class, layeredCallbacks = NoLayeredCallbacks.class, layeredInstallationKind = Independent.class) +public class ImageHeapObjectAdder { private final Set> objectAdders = new HashSet<>(); private boolean sealed = false; @@ -61,9 +63,4 @@ public void addInitialObjects(NativeImageHeap heap, HostedUniverse hUniverse) { sealed = true; objectAdders.forEach(adder -> adder.accept(heap, hUniverse)); } - - @Override - public EnumSet getImageBuilderFlags() { - return LayeredImageSingletonBuilderFlags.BUILDTIME_ACCESS_ONLY; - } } diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/imagelayer/CrossLayerConstantRegistryFeature.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/imagelayer/CrossLayerConstantRegistryFeature.java index b664b67cb683..1504800451da 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/imagelayer/CrossLayerConstantRegistryFeature.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/imagelayer/CrossLayerConstantRegistryFeature.java @@ -44,11 +44,11 @@ import com.oracle.svm.core.heap.Heap; import com.oracle.svm.core.imagelayer.ImageLayerBuildingSupport; import com.oracle.svm.core.imagelayer.PriorLayerMarker; -import com.oracle.svm.core.layeredimagesingleton.FeatureSingleton; import com.oracle.svm.core.layeredimagesingleton.ImageSingletonLoader; import com.oracle.svm.core.layeredimagesingleton.ImageSingletonWriter; -import com.oracle.svm.core.layeredimagesingleton.LayeredImageSingleton; +import com.oracle.svm.core.layeredimagesingleton.LayeredPersistFlags; import com.oracle.svm.core.traits.BuiltinTraits.BuildtimeAccessOnly; +import com.oracle.svm.core.traits.BuiltinTraits.NoLayeredCallbacks; import com.oracle.svm.core.traits.SingletonLayeredCallbacks; import com.oracle.svm.core.traits.SingletonLayeredCallbacksSupplier; import com.oracle.svm.core.traits.SingletonLayeredInstallationKind.Independent; @@ -68,7 +68,8 @@ import jdk.vm.ci.meta.JavaConstant; @AutomaticallyRegisteredFeature -public class CrossLayerConstantRegistryFeature implements InternalFeature, FeatureSingleton, CrossLayerConstantRegistry { +@SingletonTraits(access = BuildtimeAccessOnly.class, layeredCallbacks = NoLayeredCallbacks.class, layeredInstallationKind = Independent.class) +public class CrossLayerConstantRegistryFeature implements InternalFeature, CrossLayerConstantRegistry { static final int INVALID = -1; static final int NULL_CONSTANT_ID = -1; private static final Object NULL_CONSTANT_MARKER = new Object(); @@ -476,7 +477,7 @@ private static String futureKeyPatchKey(String key) { } @Override - public LayeredImageSingleton.PersistFlags doPersist(ImageSingletonWriter writer, ImageLayerIdTrackingSingleton singleton) { + public LayeredPersistFlags doPersist(ImageSingletonWriter writer, ImageLayerIdTrackingSingleton singleton) { ArrayList priorKeys = new ArrayList<>(); ArrayList priorIds = new ArrayList<>(); ArrayList futureKeys = new ArrayList<>(); @@ -511,7 +512,7 @@ public LayeredImageSingleton.PersistFlags doPersist(ImageSingletonWriter writer, writer.writeIntList("futureLoaderIds", futureLoaderIds); writer.writeIntList("futureOffsets", futureOffsets); - return LayeredImageSingleton.PersistFlags.CALLBACK_ON_REGISTRATION; + return LayeredPersistFlags.CALLBACK_ON_REGISTRATION; } @Override diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/imagelayer/CrossLayerFieldUpdaterFeature.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/imagelayer/CrossLayerFieldUpdaterFeature.java index cadd5027fd61..5793ca299967 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/imagelayer/CrossLayerFieldUpdaterFeature.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/imagelayer/CrossLayerFieldUpdaterFeature.java @@ -48,8 +48,8 @@ import com.oracle.svm.core.imagelayer.ImageLayerBuildingSupport; import com.oracle.svm.core.layeredimagesingleton.ImageSingletonLoader; import com.oracle.svm.core.layeredimagesingleton.ImageSingletonWriter; -import com.oracle.svm.core.layeredimagesingleton.LayeredImageSingleton; -import com.oracle.svm.core.traits.BuiltinTraits; +import com.oracle.svm.core.layeredimagesingleton.LayeredPersistFlags; +import com.oracle.svm.core.traits.BuiltinTraits.BuildtimeAccessOnly; import com.oracle.svm.core.traits.SingletonLayeredCallbacks; import com.oracle.svm.core.traits.SingletonLayeredCallbacksSupplier; import com.oracle.svm.core.traits.SingletonLayeredInstallationKind; @@ -79,7 +79,7 @@ * */ @AutomaticallyRegisteredFeature -@SingletonTraits(access = BuiltinTraits.BuildtimeAccessOnly.class, layeredCallbacks = CrossLayerFieldUpdaterFeature.LayeredCallbacks.class, layeredInstallationKind = SingletonLayeredInstallationKind.Independent.class) +@SingletonTraits(access = BuildtimeAccessOnly.class, layeredCallbacks = CrossLayerFieldUpdaterFeature.LayeredCallbacks.class, layeredInstallationKind = SingletonLayeredInstallationKind.Independent.class) public class CrossLayerFieldUpdaterFeature implements InternalFeature { private static final int INVALID = -1; @@ -370,7 +370,7 @@ static class LayeredCallbacks extends SingletonLayeredCallbacksSupplier { public SingletonTrait getLayeredCallbacksTrait() { return new SingletonTrait(SingletonTraitKind.LAYERED_CALLBACKS, new SingletonLayeredCallbacks() { @Override - public LayeredImageSingleton.PersistFlags doPersist(ImageSingletonWriter writer, CrossLayerFieldUpdaterFeature singleton) { + public LayeredPersistFlags doPersist(ImageSingletonWriter writer, CrossLayerFieldUpdaterFeature singleton) { var updateInfoMap = singleton.updateInfoMap; ArrayList fieldIds = new ArrayList<>(); ArrayList receiverIds = new ArrayList<>(); @@ -386,7 +386,7 @@ public LayeredImageSingleton.PersistFlags doPersist(ImageSingletonWriter writer, writer.writeIntList("receiverIds", receiverIds); writer.writeIntList("offsets", offsets); writer.writeIntList("javaKindOrdinals", javaKindOrdinals); - return LayeredImageSingleton.PersistFlags.CALLBACK_ON_REGISTRATION; + return LayeredPersistFlags.CALLBACK_ON_REGISTRATION; } @Override diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/imagelayer/HostedDynamicLayerInfo.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/imagelayer/HostedDynamicLayerInfo.java index 5331aaf47804..e12d36da9978 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/imagelayer/HostedDynamicLayerInfo.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/imagelayer/HostedDynamicLayerInfo.java @@ -50,7 +50,7 @@ import com.oracle.svm.core.imagelayer.ImageLayerBuildingSupport; import com.oracle.svm.core.layeredimagesingleton.ImageSingletonLoader; import com.oracle.svm.core.layeredimagesingleton.ImageSingletonWriter; -import com.oracle.svm.core.layeredimagesingleton.LayeredImageSingleton; +import com.oracle.svm.core.layeredimagesingleton.LayeredPersistFlags; import com.oracle.svm.core.meta.SharedMethod; import com.oracle.svm.core.traits.BuiltinTraits.BuildtimeAccessOnly; import com.oracle.svm.core.traits.SingletonLayeredCallbacks; @@ -243,7 +243,7 @@ static class LayeredCallbacks extends SingletonLayeredCallbacksSupplier { public SingletonTrait getLayeredCallbacksTrait() { return new SingletonTrait(SingletonTraitKind.LAYERED_CALLBACKS, new SingletonLayeredCallbacks() { @Override - public LayeredImageSingleton.PersistFlags doPersist(ImageSingletonWriter writer, HostedDynamicLayerInfo singleton) { + public LayeredPersistFlags doPersist(ImageSingletonWriter writer, HostedDynamicLayerInfo singleton) { /* * When there are multiple shared layers we will need to store the starting code * offset of each layer. @@ -271,7 +271,7 @@ public LayeredImageSingleton.PersistFlags doPersist(ImageSingletonWriter writer, nextLayerDelayedMethodIds.addAll(singleton.delayedMethodIds); writer.writeIntList("delayedMethodIds", nextLayerDelayedMethodIds.stream().toList()); - return LayeredImageSingleton.PersistFlags.CREATE; + return LayeredPersistFlags.CREATE; } @Override diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/imagelayer/ImageLayerSectionFeature.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/imagelayer/ImageLayerSectionFeature.java index fa81a98c9d20..1e940210c9d4 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/imagelayer/ImageLayerSectionFeature.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/imagelayer/ImageLayerSectionFeature.java @@ -54,8 +54,6 @@ import com.oracle.svm.core.imagelayer.DynamicImageLayerInfo; import com.oracle.svm.core.imagelayer.ImageLayerBuildingSupport; import com.oracle.svm.core.imagelayer.ImageLayerSection; -import com.oracle.svm.core.layeredimagesingleton.FeatureSingleton; -import com.oracle.svm.core.layeredimagesingleton.UnsavedSingleton; import com.oracle.svm.core.traits.BuiltinTraits.BuildtimeAccessOnly; import com.oracle.svm.core.traits.BuiltinTraits.NoLayeredCallbacks; import com.oracle.svm.core.traits.SingletonLayeredInstallationKind.Independent; @@ -99,7 +97,8 @@ * */ @AutomaticallyRegisteredFeature -public final class ImageLayerSectionFeature implements InternalFeature, FeatureSingleton, UnsavedSingleton { +@SingletonTraits(access = BuildtimeAccessOnly.class, layeredCallbacks = NoLayeredCallbacks.class, layeredInstallationKind = Independent.class) +public final class ImageLayerSectionFeature implements InternalFeature { private static final SectionName SVM_LAYER_SECTION = new SectionName.ProgbitsSectionName("svm_layer"); private static final String LAYER_NAME_PREFIX = "__svm_vm_layer"; diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/imagelayer/LayeredDispatchTableFeature.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/imagelayer/LayeredDispatchTableFeature.java index 32d56f788877..a1e1a0ee9332 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/imagelayer/LayeredDispatchTableFeature.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/imagelayer/LayeredDispatchTableFeature.java @@ -58,10 +58,13 @@ import com.oracle.svm.core.image.ImageHeapLayoutInfo; import com.oracle.svm.core.imagelayer.DynamicImageLayerInfo; import com.oracle.svm.core.imagelayer.ImageLayerBuildingSupport; -import com.oracle.svm.core.layeredimagesingleton.FeatureSingleton; import com.oracle.svm.core.meta.MethodOffset; import com.oracle.svm.core.meta.MethodRef; import com.oracle.svm.core.option.HostedOptionKey; +import com.oracle.svm.core.traits.BuiltinTraits.BuildtimeAccessOnly; +import com.oracle.svm.core.traits.BuiltinTraits.NoLayeredCallbacks; +import com.oracle.svm.core.traits.SingletonLayeredInstallationKind.Independent; +import com.oracle.svm.core.traits.SingletonTraits; import com.oracle.svm.core.util.VMError; import com.oracle.svm.hosted.FeatureImpl; import com.oracle.svm.hosted.FeatureImpl.BeforeCompilationAccessImpl; @@ -99,7 +102,8 @@ * {@link #beforeAnalysis}. */ @AutomaticallyRegisteredFeature -public class LayeredDispatchTableFeature implements FeatureSingleton, InternalFeature { +@SingletonTraits(access = BuildtimeAccessOnly.class, layeredCallbacks = NoLayeredCallbacks.class, layeredInstallationKind = Independent.class) +public class LayeredDispatchTableFeature implements InternalFeature { public static final class Options { @Option(help = "Log discrepancies between layered open world type information. This is an experimental option which will be removed.")// public static final HostedOptionKey LogLayeredDispatchTableDiscrepancies = new HostedOptionKey<>(false); diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/imagelayer/LayeredFieldValueTransformerSupport.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/imagelayer/LayeredFieldValueTransformerSupport.java index f53aeec7a58f..4975f6bfa3a1 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/imagelayer/LayeredFieldValueTransformerSupport.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/imagelayer/LayeredFieldValueTransformerSupport.java @@ -47,7 +47,7 @@ import com.oracle.svm.core.layered.LayeredFieldValueTransformer; import com.oracle.svm.core.layeredimagesingleton.ImageSingletonLoader; import com.oracle.svm.core.layeredimagesingleton.ImageSingletonWriter; -import com.oracle.svm.core.layeredimagesingleton.LayeredImageSingleton; +import com.oracle.svm.core.layeredimagesingleton.LayeredPersistFlags; import com.oracle.svm.core.traits.BuiltinTraits.BuildtimeAccessOnly; import com.oracle.svm.core.traits.SingletonLayeredCallbacks; import com.oracle.svm.core.traits.SingletonLayeredCallbacksSupplier; @@ -276,12 +276,12 @@ static class LayeredCallbacks extends SingletonLayeredCallbacksSupplier { public SingletonTrait getLayeredCallbacksTrait() { return new SingletonTrait(SingletonTraitKind.LAYERED_CALLBACKS, new SingletonLayeredCallbacks() { @Override - public LayeredImageSingleton.PersistFlags doPersist(ImageSingletonWriter writer, LayeredFieldValueTransformerSupport singleton) { + public LayeredPersistFlags doPersist(ImageSingletonWriter writer, LayeredFieldValueTransformerSupport singleton) { var fieldsWithUpdatableValues = singleton.fieldToLayeredTransformer.entrySet().stream() .filter(e -> e.getValue().currentLayerHasUpdatableValues) .map(e -> e.getKey().getId()).toList(); writer.writeIntList("fieldsWithUpdatableValues", fieldsWithUpdatableValues); - return LayeredImageSingleton.PersistFlags.CALLBACK_ON_REGISTRATION; + return LayeredPersistFlags.CALLBACK_ON_REGISTRATION; } @Override diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/imagelayer/LayeredImageHooks.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/imagelayer/LayeredImageHooks.java index 594ceff9ce9e..a184a125016d 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/imagelayer/LayeredImageHooks.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/imagelayer/LayeredImageHooks.java @@ -37,8 +37,11 @@ import com.oracle.svm.core.hub.DynamicHub; import com.oracle.svm.core.image.ImageHeapLayoutInfo; import com.oracle.svm.core.imagelayer.ImageLayerBuildingSupport; -import com.oracle.svm.core.layeredimagesingleton.FeatureSingleton; import com.oracle.svm.core.meta.MethodRef; +import com.oracle.svm.core.traits.BuiltinTraits.BuildtimeAccessOnly; +import com.oracle.svm.core.traits.BuiltinTraits.NoLayeredCallbacks; +import com.oracle.svm.core.traits.SingletonLayeredInstallationKind.Independent; +import com.oracle.svm.core.traits.SingletonTraits; import jdk.graal.compiler.api.replacements.Fold; @@ -46,7 +49,8 @@ * Class containing hooks which can only be registered and executed during layered image builds. */ @AutomaticallyRegisteredFeature -public class LayeredImageHooks implements InternalFeature, FeatureSingleton { +@SingletonTraits(access = BuildtimeAccessOnly.class, layeredCallbacks = NoLayeredCallbacks.class, layeredInstallationKind = Independent.class) +public class LayeredImageHooks implements InternalFeature { private final Set hubWrittenCallbacks = ConcurrentHashMap.newKeySet(); private final Set patchedWordWrittenCallbacks = ConcurrentHashMap.newKeySet(); diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/imagelayer/LayeredStaticFieldSupport.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/imagelayer/LayeredStaticFieldSupport.java index b722e3f7b6be..49f981a3d060 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/imagelayer/LayeredStaticFieldSupport.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/imagelayer/LayeredStaticFieldSupport.java @@ -54,7 +54,7 @@ import com.oracle.svm.core.imagelayer.ImageLayerBuildingSupport; import com.oracle.svm.core.layeredimagesingleton.ImageSingletonLoader; import com.oracle.svm.core.layeredimagesingleton.ImageSingletonWriter; -import com.oracle.svm.core.layeredimagesingleton.LayeredImageSingleton; +import com.oracle.svm.core.layeredimagesingleton.LayeredPersistFlags; import com.oracle.svm.core.layeredimagesingleton.MultiLayeredImageSingleton; import com.oracle.svm.core.traits.BuiltinTraits.BuildtimeAccessOnly; import com.oracle.svm.core.traits.SingletonLayeredCallbacks; @@ -409,7 +409,7 @@ static class LayeredCallbacks extends SingletonLayeredCallbacksSupplier { public SingletonTrait getLayeredCallbacksTrait() { return new SingletonTrait(SingletonTraitKind.LAYERED_CALLBACKS, new SingletonLayeredCallbacks() { @Override - public LayeredImageSingleton.PersistFlags doPersist(ImageSingletonWriter writer, LayeredStaticFieldSupport singleton) { + public LayeredPersistFlags doPersist(ImageSingletonWriter writer, LayeredStaticFieldSupport singleton) { writer.writeInt("appLayerPrimitiveFieldStartingOffset", singleton.appLayerStaticFieldOffsets.nextPrimitiveField); writer.writeInt("appLayerObjectFieldStartingOffset", singleton.appLayerStaticFieldOffsets.nextObjectField); @@ -426,7 +426,7 @@ public LayeredImageSingleton.PersistFlags doPersist(ImageSingletonWriter writer, writer.writeIntList("appLayerFieldsWithKnownLocations", knownLocations); - return LayeredImageSingleton.PersistFlags.CREATE; + return LayeredPersistFlags.CREATE; } @Override diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/imagelayer/LoadImageSingletonFeature.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/imagelayer/LoadImageSingletonFeature.java index 6145fe51f42d..83d4a3543216 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/imagelayer/LoadImageSingletonFeature.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/imagelayer/LoadImageSingletonFeature.java @@ -56,15 +56,14 @@ import com.oracle.svm.core.imagelayer.DynamicImageLayerInfo; import com.oracle.svm.core.imagelayer.ImageLayerBuildingSupport; import com.oracle.svm.core.imagelayer.LoadImageSingletonFactory; -import com.oracle.svm.core.layeredimagesingleton.FeatureSingleton; import com.oracle.svm.core.layeredimagesingleton.ImageSingletonLoader; import com.oracle.svm.core.layeredimagesingleton.ImageSingletonWriter; -import com.oracle.svm.core.layeredimagesingleton.LayeredImageSingleton; import com.oracle.svm.core.layeredimagesingleton.LayeredImageSingletonSupport; +import com.oracle.svm.core.layeredimagesingleton.LayeredPersistFlags; import com.oracle.svm.core.layeredimagesingleton.MultiLayeredAllowNullEntries; import com.oracle.svm.core.layeredimagesingleton.MultiLayeredImageSingleton; -import com.oracle.svm.core.layeredimagesingleton.UnsavedSingleton; import com.oracle.svm.core.traits.BuiltinTraits.BuildtimeAccessOnly; +import com.oracle.svm.core.traits.BuiltinTraits.NoLayeredCallbacks; import com.oracle.svm.core.traits.SingletonLayeredCallbacks; import com.oracle.svm.core.traits.SingletonLayeredCallbacksSupplier; import com.oracle.svm.core.traits.SingletonLayeredInstallationKind; @@ -107,7 +106,8 @@ * referenced as needed. */ @AutomaticallyRegisteredFeature -public class LoadImageSingletonFeature implements InternalFeature, FeatureSingleton, UnsavedSingleton { +@SingletonTraits(access = BuildtimeAccessOnly.class, layeredCallbacks = NoLayeredCallbacks.class, layeredInstallationKind = Independent.class) +public class LoadImageSingletonFeature implements InternalFeature { public static final String CROSS_LAYER_SINGLETON_TABLE_SYMBOL = "__svm_layer_singleton_table_start"; static CrossLayerSingletonMappingInfo getCrossLayerSingletonMappingInfo() { @@ -624,7 +624,7 @@ public SingletonTrait getLayeredCallbacksTrait() { return new SingletonTrait(SingletonTraitKind.LAYERED_CALLBACKS, new SingletonLayeredCallbacks() { @Override - public LayeredImageSingleton.PersistFlags doPersist(ImageSingletonWriter writer, CrossLayerSingletonMappingInfo singleton) { + public LayeredPersistFlags doPersist(ImageSingletonWriter writer, CrossLayerSingletonMappingInfo singleton) { /* * Write out all relevant information. */ @@ -683,7 +683,7 @@ public LayeredImageSingleton.PersistFlags doPersist(ImageSingletonWriter writer, writer.writeStringList("multiLayerClassNames", multiLayerKeyClasses); writer.writeStringList("multiLayerKeyNames", multiLayerKeyNames); - return LayeredImageSingleton.PersistFlags.CREATE; + return LayeredPersistFlags.CREATE; } @Override diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/imagelayer/SVMImageLayerSingletonLoader.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/imagelayer/SVMImageLayerSingletonLoader.java index ec3c04040b32..0c62de87bb59 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/imagelayer/SVMImageLayerSingletonLoader.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/imagelayer/SVMImageLayerSingletonLoader.java @@ -24,7 +24,6 @@ */ package com.oracle.svm.hosted.imagelayer; -import java.lang.reflect.Method; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; @@ -40,7 +39,7 @@ import com.oracle.svm.core.imagelayer.ImageLayerBuildingSupport; import com.oracle.svm.core.layeredimagesingleton.ImageSingletonLoader; -import com.oracle.svm.core.layeredimagesingleton.LayeredImageSingleton.PersistFlags; +import com.oracle.svm.core.layeredimagesingleton.LayeredPersistFlags; import com.oracle.svm.core.traits.SingletonLayeredCallbacks; import com.oracle.svm.core.traits.SingletonLayeredInstallationKind; import com.oracle.svm.core.traits.SingletonTrait; @@ -97,17 +96,10 @@ public Map>> loadImageSingletons(Function clazz = imageLayerBuildingSupport.lookupClass(false, recreateClass); - if (SingletonLayeredCallbacks.LayeredSingletonInstantiator.class.isAssignableFrom(clazz)) { - var instance = (SingletonLayeredCallbacks.LayeredSingletonInstantiator) ReflectionUtil.newInstance(clazz); - result = instance.createFromLoader(imageSingletonLoader); - } else { - // GR-66792 remove once no custom persist actions exist - String recreateMethod = obj.getRecreateMethod().toString(); - Method createMethod = ReflectionUtil.lookupMethod(clazz, recreateMethod, ImageSingletonLoader.class); - result = createMethod.invoke(null, imageSingletonLoader); - } + String singletonInstantiatorClass = obj.getSingletonInstantiatorClass().toString(); + Class clazz = imageLayerBuildingSupport.lookupClass(false, singletonInstantiatorClass); + var instance = (SingletonLayeredCallbacks.LayeredSingletonInstantiator) ReflectionUtil.newInstance(clazz); + result = instance.createFromLoader(imageSingletonLoader); Class instanceClass = imageLayerBuildingSupport.lookupClass(false, obj.getClassName().toString()); VMError.guarantee(result.getClass().equals(instanceClass)); } catch (Throwable t) { @@ -121,15 +113,15 @@ public Map>> loadImageSingletons(Function clazz = imageLayerBuildingSupport.lookupClass(false, className); singletonInitializationMap.computeIfAbsent(singletonObject, _ -> new HashSet<>()); singletonInitializationMap.get(singletonObject).add(clazz); - } else if (persistInfo == PersistFlags.FORBIDDEN) { + } else if (persistFlags == LayeredPersistFlags.FORBIDDEN) { assert singletonObjId == SVMImageLayerSnapshotUtil.UNDEFINED_SINGLETON_OBJ_ID : "Unrestored image singleton should not be linked to an object"; Class clazz = imageLayerBuildingSupport.lookupClass(false, className); @@ -143,14 +135,14 @@ public Map>> loadImageSingletons(Function new HashSet<>()); singletonInitializationMap.get(forbiddenObject).add(clazz); - } else if (persistInfo == PersistFlags.CALLBACK_ON_REGISTRATION) { + } else if (persistFlags == LayeredPersistFlags.CALLBACK_ON_REGISTRATION) { Class clazz = imageLayerBuildingSupport.lookupClass(false, className); int keyStoreId = entry.getKeyStoreId(); assert keyStoreId != SVMImageLayerSnapshotUtil.UNDEFINED_KEY_STORE_ID; var prev = singletonKeyToKeyStoreIdMap.put(clazz, keyStoreId); assert prev == null : clazz; } else { - assert persistInfo == PersistFlags.NOTHING : "Unexpected PersistFlags value: " + persistInfo; + assert persistFlags == LayeredPersistFlags.NOTHING : "Unexpected PersistFlags value: " + persistFlags; assert singletonObjId == SVMImageLayerSnapshotUtil.UNDEFINED_SINGLETON_OBJ_ID : "Unrestored image singleton should not be linked to an object"; assert entry.getKeyStoreId() == SVMImageLayerSnapshotUtil.UNDEFINED_KEY_STORE_ID : "Singleton should not have a key store associated with it"; } diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/imagelayer/SVMImageLayerWriter.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/imagelayer/SVMImageLayerWriter.java index 73a7252045f1..2b87209de5ae 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/imagelayer/SVMImageLayerWriter.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/imagelayer/SVMImageLayerWriter.java @@ -36,7 +36,6 @@ import java.lang.reflect.Constructor; import java.lang.reflect.Executable; import java.lang.reflect.Field; -import java.lang.reflect.Method; import java.lang.reflect.Parameter; import java.nio.ByteBuffer; import java.nio.channels.Channels; @@ -94,6 +93,7 @@ import com.oracle.graal.pointsto.meta.AnalysisUniverse; import com.oracle.graal.pointsto.util.AnalysisError; import com.oracle.graal.pointsto.util.AnalysisFuture; +import com.oracle.svm.common.hosted.layeredimage.LayeredCompilationSupport; import com.oracle.svm.common.layeredimage.LayeredCompilationBehavior; import com.oracle.svm.core.FunctionPointerHolder; import com.oracle.svm.core.StaticFieldsSupport; @@ -103,18 +103,15 @@ import com.oracle.svm.core.classinitialization.ClassInitializationInfo; import com.oracle.svm.core.graal.code.CGlobalDataBasePointer; import com.oracle.svm.core.hub.DynamicHub; -import com.oracle.svm.common.hosted.layeredimage.LayeredCompilationSupport; -import com.oracle.svm.core.layeredimagesingleton.ImageSingletonLoader; import com.oracle.svm.core.layeredimagesingleton.ImageSingletonWriter; -import com.oracle.svm.core.layeredimagesingleton.LayeredImageSingleton; import com.oracle.svm.core.layeredimagesingleton.LayeredImageSingletonSupport; +import com.oracle.svm.core.layeredimagesingleton.LayeredPersistFlags; import com.oracle.svm.core.layeredimagesingleton.MultiLayeredImageSingleton; import com.oracle.svm.core.meta.MethodOffset; import com.oracle.svm.core.meta.MethodPointer; import com.oracle.svm.core.meta.MethodRef; import com.oracle.svm.core.reflect.serialize.SerializationSupport; import com.oracle.svm.core.threadlocal.FastThreadLocal; -import com.oracle.svm.core.traits.InjectedSingletonLayeredCallbacks; import com.oracle.svm.core.traits.SingletonLayeredCallbacks; import com.oracle.svm.core.traits.SingletonLayeredInstallationKind; import com.oracle.svm.core.traits.SingletonTraitKind; @@ -176,7 +173,6 @@ import com.oracle.svm.shaded.org.capnproto.TextList; import com.oracle.svm.shaded.org.capnproto.Void; import com.oracle.svm.util.LogUtils; -import com.oracle.svm.util.ReflectionUtil; import jdk.graal.compiler.annotation.AnnotationValue; import jdk.graal.compiler.annotation.AnnotationValueSupport; @@ -1128,27 +1124,7 @@ public void addPolymorphicSignatureCaller(AnalysisMethod polymorphicSignature, A polymorphicSignatureCallers.computeIfAbsent(polymorphicSignature, _ -> ConcurrentHashMap.newKeySet()).add(caller); } - record SingletonPersistInfo(LayeredImageSingleton.PersistFlags flags, int singletonId, RecreateInfo recreateInfo, int keyStoreId, EconomicMap keyStore) { - } - - // GR-66792 remove once no custom persist actions exist - record RecreateInfo(String clazz, String method) { - } - - RecreateInfo createRecreateInfo(SingletonLayeredCallbacks action) { - if (action instanceof InjectedSingletonLayeredCallbacks injectAction) { - // GR-66792 remove once no custom persist actions exist - Class singletonClass = injectAction.getSingletonClass(); - String recreateName = "createFromLoader"; - Method loaderMethod = ReflectionUtil.lookupMethod(true, singletonClass, recreateName, ImageSingletonLoader.class); - if (loaderMethod == null) { - throw VMError.shouldNotReachHere("Unable to find createFromLoader for %s", singletonClass); - } - return new RecreateInfo(singletonClass.getName(), recreateName); - - } else { - return new RecreateInfo(action.getSingletonInstantiator().getName(), ""); - } + record SingletonPersistInfo(LayeredPersistFlags flags, int singletonId, Class singletonInstantiator, int keyStoreId, EconomicMap keyStore) { } @SuppressWarnings("unchecked") @@ -1171,28 +1147,28 @@ public void writeImageSingletonInfo(List, ImageSingletonsSupp var action = (SingletonLayeredCallbacks) singletonEntry.getValue().traitMap().getTrait(SingletonTraitKind.LAYERED_CALLBACKS).get().metadata(); var flags = SubstrateUtil.cast(action, SingletonLayeredCallbacks.class).doPersist(writer, singleton); if (initialLayerOnly) { - VMError.guarantee(flags == LayeredImageSingleton.PersistFlags.FORBIDDEN, "InitialLayer Singleton's persist action must return %s %s", LayeredImageSingleton.PersistFlags.FORBIDDEN, + VMError.guarantee(flags == LayeredPersistFlags.FORBIDDEN, "InitialLayer Singleton's persist action must return %s %s", LayeredPersistFlags.FORBIDDEN, singleton); } int singletonId = SVMImageLayerSnapshotUtil.UNDEFINED_SINGLETON_OBJ_ID; int keyStoreId = SVMImageLayerSnapshotUtil.UNDEFINED_KEY_STORE_ID; - RecreateInfo recreateInfo = null; + Class singletonInstantiator = null; EconomicMap keyValueStore = null; - if (flags == LayeredImageSingleton.PersistFlags.CREATE) { - VMError.guarantee(!(singleton instanceof Feature), "Features cannot return %s. Use %s instead. Feature: %s", LayeredImageSingleton.PersistFlags.CREATE, - LayeredImageSingleton.PersistFlags.CALLBACK_ON_REGISTRATION, singleton); + if (flags == LayeredPersistFlags.CREATE) { + VMError.guarantee(!(singleton instanceof Feature), "Features cannot return %s. Use %s instead. Feature: %s", LayeredPersistFlags.CREATE, + LayeredPersistFlags.CALLBACK_ON_REGISTRATION, singleton); singletonId = nextSingletonId++; - recreateInfo = createRecreateInfo(action); + singletonInstantiator = action.getSingletonInstantiator(); keyValueStore = writer.getKeyValueStore(); keyStoreId = nextKeyStoreId++; - } else if (flags == LayeredImageSingleton.PersistFlags.CALLBACK_ON_REGISTRATION) { + } else if (flags == LayeredPersistFlags.CALLBACK_ON_REGISTRATION) { keyValueStore = writer.getKeyValueStore(); keyStoreId = nextKeyStoreId++; } else { VMError.guarantee(writer.getKeyValueStore().isEmpty(), "ImageSingletonWriter was used, but the results will not be persisted %s %s", singletonEntry.getKey(), singleton); } - var info = new SingletonPersistInfo(flags, singletonId, recreateInfo, keyStoreId, keyValueStore); + var info = new SingletonPersistInfo(flags, singletonId, singletonInstantiator, keyStoreId, keyValueStore); singletonPersistInfoMap.put(singleton, info); } var info = singletonPersistInfoMap.get(singleton); @@ -1215,7 +1191,7 @@ public void writeImageSingletonInfo(List, ImageSingletonsSupp * Next write the singleton objects. */ var sortedBySingletonIds = singletonPersistInfoMap.entrySet().stream() - .filter(e -> e.getValue().flags == LayeredImageSingleton.PersistFlags.CREATE) + .filter(e -> e.getValue().flags == LayeredPersistFlags.CREATE) .sorted(Comparator.comparingInt(e -> e.getValue().singletonId)) .toList(); StructList.Builder objectsBuilder = snapshotBuilder.initSingletonObjects(sortedBySingletonIds.size()); @@ -1227,8 +1203,7 @@ public void writeImageSingletonInfo(List, ImageSingletonsSupp ImageSingletonObject.Builder ob = objectsBuilder.get(i); ob.setId(info.singletonId); ob.setClassName(entry.getKey().getClass().getName()); - ob.setRecreateClass(info.recreateInfo().clazz()); - ob.setRecreateMethod(info.recreateInfo().method()); + ob.setSingletonInstantiatorClass(info.singletonInstantiator().getName()); ob.setKeyStoreId(info.keyStoreId); } diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/imagelayer/SharedLayerSnapshotCapnProtoSchemaHolder.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/imagelayer/SharedLayerSnapshotCapnProtoSchemaHolder.java index 84b0b6ca3e89..db7f0c9acd40 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/imagelayer/SharedLayerSnapshotCapnProtoSchemaHolder.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/imagelayer/SharedLayerSnapshotCapnProtoSchemaHolder.java @@ -4154,7 +4154,7 @@ public final int getKeyStoreId() { public static class ImageSingletonObject { - public static final com.oracle.svm.shaded.org.capnproto.StructSize STRUCT_SIZE = new com.oracle.svm.shaded.org.capnproto.StructSize((short)1,(short)3); + public static final com.oracle.svm.shaded.org.capnproto.StructSize STRUCT_SIZE = new com.oracle.svm.shaded.org.capnproto.StructSize((short)1,(short)2); public static final class Factory extends com.oracle.svm.shaded.org.capnproto.StructFactory { public Factory() { } @@ -4210,36 +4210,21 @@ public final void setKeyStoreId(int value) { _setIntField(1, value); } - public final boolean hasRecreateClass() { + public final boolean hasSingletonInstantiatorClass() { return !_pointerFieldIsNull(1); } - public final com.oracle.svm.shaded.org.capnproto.Text.Builder getRecreateClass() { + public final com.oracle.svm.shaded.org.capnproto.Text.Builder getSingletonInstantiatorClass() { return _getPointerField(com.oracle.svm.shaded.org.capnproto.Text.factory, 1, null, 0, 0); } - public final void setRecreateClass(com.oracle.svm.shaded.org.capnproto.Text.Reader value) { + public final void setSingletonInstantiatorClass(com.oracle.svm.shaded.org.capnproto.Text.Reader value) { _setPointerField(com.oracle.svm.shaded.org.capnproto.Text.factory, 1, value); } - public final void setRecreateClass(String value) { + public final void setSingletonInstantiatorClass(String value) { _setPointerField(com.oracle.svm.shaded.org.capnproto.Text.factory, 1, new com.oracle.svm.shaded.org.capnproto.Text.Reader(value)); } - public final com.oracle.svm.shaded.org.capnproto.Text.Builder initRecreateClass(int size) { + public final com.oracle.svm.shaded.org.capnproto.Text.Builder initSingletonInstantiatorClass(int size) { return _initPointerField(com.oracle.svm.shaded.org.capnproto.Text.factory, 1, size); } - public final boolean hasRecreateMethod() { - return !_pointerFieldIsNull(2); - } - public final com.oracle.svm.shaded.org.capnproto.Text.Builder getRecreateMethod() { - return _getPointerField(com.oracle.svm.shaded.org.capnproto.Text.factory, 2, null, 0, 0); - } - public final void setRecreateMethod(com.oracle.svm.shaded.org.capnproto.Text.Reader value) { - _setPointerField(com.oracle.svm.shaded.org.capnproto.Text.factory, 2, value); - } - public final void setRecreateMethod(String value) { - _setPointerField(com.oracle.svm.shaded.org.capnproto.Text.factory, 2, new com.oracle.svm.shaded.org.capnproto.Text.Reader(value)); - } - public final com.oracle.svm.shaded.org.capnproto.Text.Builder initRecreateMethod(int size) { - return _initPointerField(com.oracle.svm.shaded.org.capnproto.Text.factory, 2, size); - } } public static final class Reader extends com.oracle.svm.shaded.org.capnproto.StructReader { @@ -4262,20 +4247,13 @@ public final int getKeyStoreId() { return _getIntField(1); } - public boolean hasRecreateClass() { + public boolean hasSingletonInstantiatorClass() { return !_pointerFieldIsNull(1); } - public com.oracle.svm.shaded.org.capnproto.Text.Reader getRecreateClass() { + public com.oracle.svm.shaded.org.capnproto.Text.Reader getSingletonInstantiatorClass() { return _getPointerField(com.oracle.svm.shaded.org.capnproto.Text.factory, 1, null, 0, 0); } - public boolean hasRecreateMethod() { - return !_pointerFieldIsNull(2); - } - public com.oracle.svm.shaded.org.capnproto.Text.Reader getRecreateMethod() { - return _getPointerField(com.oracle.svm.shaded.org.capnproto.Text.factory, 2, null, 0, 0); - } - } } diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/jdk/ForkJoinPoolFeature.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/jdk/ForkJoinPoolFeature.java index 70cf837c6afd..26f42d2941bd 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/jdk/ForkJoinPoolFeature.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/jdk/ForkJoinPoolFeature.java @@ -31,14 +31,18 @@ import com.oracle.svm.core.feature.InternalFeature; import com.oracle.svm.core.imagelayer.ImageLayerBuildingSupport; import com.oracle.svm.core.jdk.DeferredCommonPool; -import com.oracle.svm.core.layeredimagesingleton.FeatureSingleton; +import com.oracle.svm.core.traits.BuiltinTraits.BuildtimeAccessOnly; +import com.oracle.svm.core.traits.BuiltinTraits.NoLayeredCallbacks; +import com.oracle.svm.core.traits.SingletonLayeredInstallationKind.Independent; +import com.oracle.svm.core.traits.SingletonTraits; import com.oracle.svm.hosted.FeatureImpl; import com.oracle.svm.hosted.imagelayer.CrossLayerConstantRegistry; import jdk.vm.ci.meta.JavaConstant; @AutomaticallyRegisteredFeature -class ForkJoinPoolFeature implements InternalFeature, FeatureSingleton { +@SingletonTraits(access = BuildtimeAccessOnly.class, layeredCallbacks = NoLayeredCallbacks.class, layeredInstallationKind = Independent.class) +class ForkJoinPoolFeature implements InternalFeature { private static final String KEY_NAME = "ForkJoinPool#commonPool"; diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/jdk/HostedClassLoaderPackageManagement.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/jdk/HostedClassLoaderPackageManagement.java index e279b4a5fcb9..ba7845c60ea1 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/jdk/HostedClassLoaderPackageManagement.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/jdk/HostedClassLoaderPackageManagement.java @@ -44,7 +44,7 @@ import com.oracle.svm.core.jdk.Target_java_lang_ClassLoader; import com.oracle.svm.core.layeredimagesingleton.ImageSingletonLoader; import com.oracle.svm.core.layeredimagesingleton.ImageSingletonWriter; -import com.oracle.svm.core.layeredimagesingleton.LayeredImageSingleton; +import com.oracle.svm.core.layeredimagesingleton.LayeredPersistFlags; import com.oracle.svm.core.reflect.serialize.SerializationSupport; import com.oracle.svm.core.traits.BuiltinTraits.BuildtimeAccessOnly; import com.oracle.svm.core.traits.SingletonLayeredCallbacks; @@ -316,7 +316,7 @@ static class LayeredCallbacks extends SingletonLayeredCallbacksSupplier { public SingletonTrait getLayeredCallbacksTrait() { return new SingletonTrait(SingletonTraitKind.LAYERED_CALLBACKS, new SingletonLayeredCallbacks() { @Override - public LayeredImageSingleton.PersistFlags doPersist(ImageSingletonWriter writer, HostedClassLoaderPackageManagement singleton) { + public LayeredPersistFlags doPersist(ImageSingletonWriter writer, HostedClassLoaderPackageManagement singleton) { return singleton.preparePersist(writer); } @@ -341,12 +341,12 @@ private List collectPackageNames(ClassLoader classLoader, Set pr } } - private LayeredImageSingleton.PersistFlags preparePersist(ImageSingletonWriter writer) { + private LayeredPersistFlags preparePersist(ImageSingletonWriter writer) { writer.writeStringList(APP_KEY, collectPackageNames(appClassLoader, priorAppPackageNames)); writer.writeStringList(PLATFORM_KEY, collectPackageNames(platformClassLoader, priorPlatformPackageNames)); writer.writeStringList(BOOT_KEY, collectPackageNames(bootClassLoader, priorBootPackageNames)); - return LayeredImageSingleton.PersistFlags.CREATE; + return LayeredPersistFlags.CREATE; } static class SingletonInstantiator implements SingletonLayeredCallbacks.LayeredSingletonInstantiator { diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/jdk/JNIRegistrationSupport.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/jdk/JNIRegistrationSupport.java index c1be71f16f2b..7b93422708d6 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/jdk/JNIRegistrationSupport.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/jdk/JNIRegistrationSupport.java @@ -55,7 +55,7 @@ import com.oracle.svm.core.jdk.NativeLibrarySupport; import com.oracle.svm.core.layeredimagesingleton.ImageSingletonLoader; import com.oracle.svm.core.layeredimagesingleton.ImageSingletonWriter; -import com.oracle.svm.core.layeredimagesingleton.LayeredImageSingleton; +import com.oracle.svm.core.layeredimagesingleton.LayeredPersistFlags; import com.oracle.svm.core.option.HostedOptionKey; import com.oracle.svm.core.traits.BuiltinTraits.BuildtimeAccessOnly; import com.oracle.svm.core.traits.BuiltinTraits.NoLayeredCallbacks; @@ -380,10 +380,10 @@ static class LayeredCallbacks extends SingletonLayeredCallbacksSupplier { public SingletonTrait getLayeredCallbacksTrait() { return new SingletonTrait(SingletonTraitKind.LAYERED_CALLBACKS, new SingletonLayeredCallbacks() { @Override - public LayeredImageSingleton.PersistFlags doPersist(ImageSingletonWriter writer, JNIRegistrationSupportSingleton singleton) { + public LayeredPersistFlags doPersist(ImageSingletonWriter writer, JNIRegistrationSupportSingleton singleton) { var snapshotWriter = ((SVMImageLayerWriter.ImageSingletonWriterImpl) writer).getSnapshotBuilder(); SVMImageLayerWriter.initStringList(snapshotWriter::initRegisteredJNILibraries, singleton.currentLayerRegisteredLibraries.stream()); - return LayeredImageSingleton.PersistFlags.CALLBACK_ON_REGISTRATION; + return LayeredPersistFlags.CALLBACK_ON_REGISTRATION; } @Override diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/meta/DynamicHubOffsetsFeature.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/meta/DynamicHubOffsetsFeature.java index b244e4420365..5829c0615eea 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/meta/DynamicHubOffsetsFeature.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/meta/DynamicHubOffsetsFeature.java @@ -29,11 +29,15 @@ import com.oracle.svm.core.feature.AutomaticallyRegisteredFeature; import com.oracle.svm.core.feature.InternalFeature; import com.oracle.svm.core.graal.meta.DynamicHubOffsets; -import com.oracle.svm.core.layeredimagesingleton.FeatureSingleton; +import com.oracle.svm.core.traits.BuiltinTraits.BuildtimeAccessOnly; +import com.oracle.svm.core.traits.BuiltinTraits.NoLayeredCallbacks; +import com.oracle.svm.core.traits.SingletonLayeredInstallationKind.Independent; +import com.oracle.svm.core.traits.SingletonTraits; import com.oracle.svm.hosted.FeatureImpl; @AutomaticallyRegisteredFeature -public final class DynamicHubOffsetsFeature implements InternalFeature, FeatureSingleton { +@SingletonTraits(access = BuildtimeAccessOnly.class, layeredCallbacks = NoLayeredCallbacks.class, layeredInstallationKind = Independent.class) +public final class DynamicHubOffsetsFeature implements InternalFeature { @Override public void afterRegistration(AfterRegistrationAccess access) { diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/meta/KnownOffsetsFeature.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/meta/KnownOffsetsFeature.java index 7d950ba61a05..7c94d4d9c3ae 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/meta/KnownOffsetsFeature.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/meta/KnownOffsetsFeature.java @@ -37,10 +37,12 @@ import com.oracle.svm.core.feature.AutomaticallyRegisteredFeature; import com.oracle.svm.core.feature.InternalFeature; import com.oracle.svm.core.graal.meta.KnownOffsets; -import com.oracle.svm.core.layeredimagesingleton.FeatureSingleton; -import com.oracle.svm.core.layeredimagesingleton.UnsavedSingleton; import com.oracle.svm.core.stack.JavaFrameAnchor; import com.oracle.svm.core.thread.VMThreads; +import com.oracle.svm.core.traits.BuiltinTraits.BuildtimeAccessOnly; +import com.oracle.svm.core.traits.BuiltinTraits.NoLayeredCallbacks; +import com.oracle.svm.core.traits.SingletonLayeredInstallationKind.Independent; +import com.oracle.svm.core.traits.SingletonTraits; import com.oracle.svm.hosted.FeatureImpl.BeforeCompilationAccessImpl; import com.oracle.svm.hosted.c.info.AccessorInfo; import com.oracle.svm.hosted.c.info.StructFieldInfo; @@ -50,7 +52,8 @@ @AutomaticallyRegisteredFeature @Platforms(InternalPlatform.NATIVE_ONLY.class) -public final class KnownOffsetsFeature implements InternalFeature, FeatureSingleton, UnsavedSingleton { +@SingletonTraits(access = BuildtimeAccessOnly.class, layeredCallbacks = NoLayeredCallbacks.class, layeredInstallationKind = Independent.class) +public final class KnownOffsetsFeature implements InternalFeature { @Override public List> getRequiredFeatures() { diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/reflect/ReflectionDataBuilder.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/reflect/ReflectionDataBuilder.java index 57c175fd083d..9276b1b2664e 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/reflect/ReflectionDataBuilder.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/reflect/ReflectionDataBuilder.java @@ -100,7 +100,7 @@ import com.oracle.svm.core.imagelayer.ImageLayerBuildingSupport; import com.oracle.svm.core.layeredimagesingleton.ImageSingletonLoader; import com.oracle.svm.core.layeredimagesingleton.ImageSingletonWriter; -import com.oracle.svm.core.layeredimagesingleton.LayeredImageSingleton; +import com.oracle.svm.core.layeredimagesingleton.LayeredPersistFlags; import com.oracle.svm.core.reflect.SubstrateAccessor; import com.oracle.svm.core.reflect.target.ReflectionSubstitutionSupport; import com.oracle.svm.core.traits.BuiltinTraits.BuildtimeAccessOnly; @@ -1525,11 +1525,11 @@ private static void persistRegisteredElements(ImageSingletonWriter writer } @Override - public LayeredImageSingleton.PersistFlags doPersist(ImageSingletonWriter writer, LayeredReflectionDataBuilder singleton) { + public LayeredPersistFlags doPersist(ImageSingletonWriter writer, LayeredReflectionDataBuilder singleton) { ReflectionDataBuilder reflectionDataBuilder = (ReflectionDataBuilder) ImageSingletons.lookup(RuntimeReflectionSupport.class); persistRegisteredElements(writer, reflectionDataBuilder.registeredMethods, AnalysisMethod::getId, METHODS); persistRegisteredElements(writer, reflectionDataBuilder.registeredFields, AnalysisField::getId, FIELDS); - return LayeredImageSingleton.PersistFlags.CREATE; + return LayeredPersistFlags.CREATE; } @Override diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/thread/HostedJavaThreadsFeature.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/thread/HostedJavaThreadsFeature.java index 5c9b8f4313e8..ed066c492739 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/thread/HostedJavaThreadsFeature.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/thread/HostedJavaThreadsFeature.java @@ -39,7 +39,7 @@ import com.oracle.svm.core.imagelayer.ImageLayerBuildingSupport; import com.oracle.svm.core.layeredimagesingleton.ImageSingletonLoader; import com.oracle.svm.core.layeredimagesingleton.ImageSingletonWriter; -import com.oracle.svm.core.layeredimagesingleton.LayeredImageSingleton; +import com.oracle.svm.core.layeredimagesingleton.LayeredPersistFlags; import com.oracle.svm.core.thread.JavaThreads; import com.oracle.svm.core.thread.JavaThreadsFeature; import com.oracle.svm.core.thread.PlatformThreads; @@ -268,10 +268,10 @@ private HostedJavaThreadsMetadata(long maxThreadId, int maxAutonumber) { this.maxAutonumber = maxAutonumber; } - public LayeredImageSingleton.PersistFlags preparePersist(ImageSingletonWriter writer) { + public LayeredPersistFlags preparePersist(ImageSingletonWriter writer) { writer.writeLong("maxThreadId", maxThreadId); writer.writeInt("maxAutonumber", maxAutonumber); - return LayeredImageSingleton.PersistFlags.CREATE; + return LayeredPersistFlags.CREATE; } static class LayeredCallbacks extends SingletonLayeredCallbacksSupplier { @@ -279,7 +279,7 @@ static class LayeredCallbacks extends SingletonLayeredCallbacksSupplier { public SingletonTrait getLayeredCallbacksTrait() { SingletonLayeredCallbacks action = new SingletonLayeredCallbacks<>() { @Override - public LayeredImageSingleton.PersistFlags doPersist(ImageSingletonWriter writer, HostedJavaThreadsMetadata singleton) { + public LayeredPersistFlags doPersist(ImageSingletonWriter writer, HostedJavaThreadsMetadata singleton) { return singleton.preparePersist(writer); } diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/thread/LayeredVMThreadLocalCollector.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/thread/LayeredVMThreadLocalCollector.java index cef3c2668846..e4d7796bebb9 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/thread/LayeredVMThreadLocalCollector.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/thread/LayeredVMThreadLocalCollector.java @@ -33,7 +33,7 @@ import com.oracle.svm.core.imagelayer.ImageLayerBuildingSupport; import com.oracle.svm.core.layeredimagesingleton.ImageSingletonLoader; import com.oracle.svm.core.layeredimagesingleton.ImageSingletonWriter; -import com.oracle.svm.core.layeredimagesingleton.LayeredImageSingleton; +import com.oracle.svm.core.layeredimagesingleton.LayeredPersistFlags; import com.oracle.svm.core.threadlocal.FastThreadLocal; import com.oracle.svm.core.threadlocal.VMThreadLocalInfo; import com.oracle.svm.core.threadlocal.VMThreadLocalInfos; @@ -131,7 +131,7 @@ public SingletonTrait getLayeredCallbacksTrait() { return new SingletonTrait(SingletonTraitKind.LAYERED_CALLBACKS, new SingletonLayeredCallbacks() { @Override - public LayeredImageSingleton.PersistFlags doPersist(ImageSingletonWriter writer, LayeredVMThreadLocalCollector singleton) { + public LayeredPersistFlags doPersist(ImageSingletonWriter writer, LayeredVMThreadLocalCollector singleton) { /* * Store the (name, offset, size) tuple of all thread locals. */ @@ -162,7 +162,7 @@ public LayeredImageSingleton.PersistFlags doPersist(ImageSingletonWriter writer, * information will need to be propagated. */ writer.writeInt("nextOffset", singleton.nextOffset); - return LayeredImageSingleton.PersistFlags.CREATE; + return LayeredPersistFlags.CREATE; } @Override diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/thread/VMThreadFeature.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/thread/VMThreadFeature.java index f5bae6b46320..c64bbbc7567e 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/thread/VMThreadFeature.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/thread/VMThreadFeature.java @@ -40,7 +40,6 @@ import com.oracle.svm.core.graal.thread.StoreVMThreadLocalNode; import com.oracle.svm.core.heap.InstanceReferenceMapEncoder; import com.oracle.svm.core.imagelayer.ImageLayerBuildingSupport; -import com.oracle.svm.core.layeredimagesingleton.FeatureSingleton; import com.oracle.svm.core.threadlocal.FastThreadLocal; import com.oracle.svm.core.threadlocal.FastThreadLocalBytes; import com.oracle.svm.core.threadlocal.FastThreadLocalWord; @@ -48,6 +47,10 @@ import com.oracle.svm.core.threadlocal.VMThreadLocalInfos; import com.oracle.svm.core.threadlocal.VMThreadLocalOffsetProvider; import com.oracle.svm.core.threadlocal.VMThreadLocalSupport; +import com.oracle.svm.core.traits.BuiltinTraits.BuildtimeAccessOnly; +import com.oracle.svm.core.traits.BuiltinTraits.NoLayeredCallbacks; +import com.oracle.svm.core.traits.SingletonLayeredInstallationKind.Independent; +import com.oracle.svm.core.traits.SingletonTraits; import com.oracle.svm.hosted.nodes.ReadReservedRegister; import jdk.graal.compiler.core.common.memory.BarrierType; @@ -67,7 +70,8 @@ */ @AutomaticallyRegisteredFeature @Platforms(InternalPlatform.NATIVE_ONLY.class) -public class VMThreadFeature implements InternalFeature, VMThreadLocalOffsetProvider, FeatureSingleton { +@SingletonTraits(access = BuildtimeAccessOnly.class, layeredCallbacks = NoLayeredCallbacks.class, layeredInstallationKind = Independent.class) +public class VMThreadFeature implements InternalFeature, VMThreadLocalOffsetProvider { private VMThreadLocalCollector threadLocalCollector;