diff --git a/substratevm/src/com.oracle.svm.core.genscavenge/src/com/oracle/svm/core/genscavenge/HeapImpl.java b/substratevm/src/com.oracle.svm.core.genscavenge/src/com/oracle/svm/core/genscavenge/HeapImpl.java index 987fc9e56321..0d2d8576707f 100644 --- a/substratevm/src/com.oracle.svm.core.genscavenge/src/com/oracle/svm/core/genscavenge/HeapImpl.java +++ b/substratevm/src/com.oracle.svm.core.genscavenge/src/com/oracle/svm/core/genscavenge/HeapImpl.java @@ -130,11 +130,13 @@ public HeapImpl() { this.oldGeneration = SerialGCOptions.useCompactingOldGen() ? new CompactingOldGeneration("OldGeneration") : new CopyingOldGeneration("OldGeneration"); HeapParameters.initialize(); - DiagnosticThunkRegistry.singleton().add(new DumpHeapSettingsAndStatistics()); - DiagnosticThunkRegistry.singleton().add(new DumpHeapUsage()); - DiagnosticThunkRegistry.singleton().add(new DumpGCPolicy()); - DiagnosticThunkRegistry.singleton().add(new DumpImageHeapInfo()); - DiagnosticThunkRegistry.singleton().add(new DumpChunkInfo()); + if (ImageLayerBuildingSupport.firstImageBuild()) { + DiagnosticThunkRegistry.singleton().add(new DumpHeapSettingsAndStatistics()); + DiagnosticThunkRegistry.singleton().add(new DumpHeapUsage()); + DiagnosticThunkRegistry.singleton().add(new DumpGCPolicy()); + DiagnosticThunkRegistry.singleton().add(new DumpImageHeapInfo()); + DiagnosticThunkRegistry.singleton().add(new DumpChunkInfo()); + } } @Fold diff --git a/substratevm/src/com.oracle.svm.core.genscavenge/src/com/oracle/svm/core/genscavenge/JfrGCEventSupport.java b/substratevm/src/com.oracle.svm.core.genscavenge/src/com/oracle/svm/core/genscavenge/JfrGCEventSupport.java index 738a933a0374..52ddbf49ac4b 100644 --- a/substratevm/src/com.oracle.svm.core.genscavenge/src/com/oracle/svm/core/genscavenge/JfrGCEventSupport.java +++ b/substratevm/src/com.oracle.svm.core.genscavenge/src/com/oracle/svm/core/genscavenge/JfrGCEventSupport.java @@ -34,6 +34,7 @@ import com.oracle.svm.core.feature.AutomaticallyRegisteredFeature; import com.oracle.svm.core.feature.InternalFeature; import com.oracle.svm.core.heap.GCCause; +import com.oracle.svm.core.imagelayer.ImageLayerBuildingSupport; import com.oracle.svm.core.jfr.HasJfrSupport; import com.oracle.svm.core.jfr.JfrEvent; import com.oracle.svm.core.jfr.JfrGCName; @@ -42,6 +43,7 @@ import com.oracle.svm.core.jfr.JfrNativeEventWriterData; import com.oracle.svm.core.jfr.JfrNativeEventWriterDataAccess; import com.oracle.svm.core.jfr.JfrTicks; +import com.oracle.svm.core.layeredimagesingleton.UnsupportedLayeredSingleton; import com.oracle.svm.core.util.VMError; class JfrGCEventSupport { @@ -139,10 +141,10 @@ private int popPhase() { } @AutomaticallyRegisteredFeature -class JfrGCEventFeature implements InternalFeature { +class JfrGCEventFeature implements InternalFeature, UnsupportedLayeredSingleton { @Override public boolean isInConfiguration(IsInConfigurationAccess access) { - return SubstrateOptions.useSerialGC(); + return SubstrateOptions.useSerialGC() && !ImageLayerBuildingSupport.buildingImageLayer(); } @Override diff --git a/substratevm/src/com.oracle.svm.core.graal.amd64/src/com/oracle/svm/core/graal/amd64/SubstrateAMD64Feature.java b/substratevm/src/com.oracle.svm.core.graal.amd64/src/com/oracle/svm/core/graal/amd64/SubstrateAMD64Feature.java index bf635b49743c..1caa27ad051d 100644 --- a/substratevm/src/com.oracle.svm.core.graal.amd64/src/com/oracle/svm/core/graal/amd64/SubstrateAMD64Feature.java +++ b/substratevm/src/com.oracle.svm.core.graal.amd64/src/com/oracle/svm/core/graal/amd64/SubstrateAMD64Feature.java @@ -41,6 +41,7 @@ import com.oracle.svm.core.graal.code.SubstrateVectorArchitectureFactory; import com.oracle.svm.core.graal.meta.SubstrateRegisterConfig.ConfigKind; import com.oracle.svm.core.heap.ReferenceAccess; +import com.oracle.svm.core.layeredimagesingleton.FeatureSingleton; import jdk.graal.compiler.core.common.spi.ForeignCallsProvider; import jdk.graal.compiler.core.common.spi.MetaAccessExtensionProvider; @@ -58,7 +59,7 @@ @AutomaticallyRegisteredFeature @Platforms(Platform.AMD64.class) -class SubstrateAMD64Feature implements InternalFeature { +class SubstrateAMD64Feature implements InternalFeature, FeatureSingleton { @Override public void afterRegistration(AfterRegistrationAccess access) { diff --git a/substratevm/src/com.oracle.svm.core.posix/src/com/oracle/svm/core/posix/PosixLibMSupport.java b/substratevm/src/com.oracle.svm.core.posix/src/com/oracle/svm/core/posix/PosixLibMSupport.java index 13afae25d23c..1635ee9e1080 100644 --- a/substratevm/src/com.oracle.svm.core.posix/src/com/oracle/svm/core/posix/PosixLibMSupport.java +++ b/substratevm/src/com.oracle.svm.core.posix/src/com/oracle/svm/core/posix/PosixLibMSupport.java @@ -27,9 +27,10 @@ import com.oracle.svm.core.Uninterruptible; import com.oracle.svm.core.feature.AutomaticallyRegisteredImageSingleton; import com.oracle.svm.core.headers.LibMSupport; +import com.oracle.svm.core.imagelayer.BuildingMonolithicImage; import com.oracle.svm.core.posix.headers.PosixLibM; -@AutomaticallyRegisteredImageSingleton(LibMSupport.class) +@AutomaticallyRegisteredImageSingleton(value = LibMSupport.class, onlyWith = BuildingMonolithicImage.class) public class PosixLibMSupport implements LibMSupport { @Override @Uninterruptible(reason = "Called from uninterruptible code.", mayBeInlined = true) diff --git a/substratevm/src/com.oracle.svm.core.posix/src/com/oracle/svm/core/posix/PosixLogHandler.java b/substratevm/src/com.oracle.svm.core.posix/src/com/oracle/svm/core/posix/PosixLogHandler.java index 306919685743..2d4c0aaebae1 100644 --- a/substratevm/src/com.oracle.svm.core.posix/src/com/oracle/svm/core/posix/PosixLogHandler.java +++ b/substratevm/src/com.oracle.svm.core.posix/src/com/oracle/svm/core/posix/PosixLogHandler.java @@ -27,27 +27,24 @@ import java.io.FileDescriptor; import java.util.EnumSet; -import com.oracle.svm.core.imagelayer.ImageLayerBuildingSupport; import org.graalvm.nativeimage.LogHandler; import org.graalvm.nativeimage.c.type.CCharPointer; import org.graalvm.word.UnsignedWord; import com.oracle.svm.core.SubstrateDiagnostics; import com.oracle.svm.core.feature.AutomaticallyRegisteredFeature; -import com.oracle.svm.core.feature.InternalFeature; import com.oracle.svm.core.headers.LibC; +import com.oracle.svm.core.layeredimagesingleton.InitialLayerInternalFeature; import com.oracle.svm.core.layeredimagesingleton.InitialLayerOnlyImageSingleton; import com.oracle.svm.core.layeredimagesingleton.LayeredImageSingletonBuilderFlags; import com.oracle.svm.core.log.Log; import com.oracle.svm.core.thread.VMThreads; @AutomaticallyRegisteredFeature -class PosixLogHandlerFeature implements InternalFeature { +class PosixLogHandlerFeature implements InitialLayerInternalFeature { @Override public void beforeAnalysis(BeforeAnalysisAccess access) { - if (ImageLayerBuildingSupport.firstImageBuild()) { - Log.finalizeDefaultLogHandler(new PosixLogHandler()); - } + Log.finalizeDefaultLogHandler(new PosixLogHandler()); } } diff --git a/substratevm/src/com.oracle.svm.core.posix/src/com/oracle/svm/core/posix/PosixVirtualMemoryProvider.java b/substratevm/src/com.oracle.svm.core.posix/src/com/oracle/svm/core/posix/PosixVirtualMemoryProvider.java index 9668834fff82..3b3eb86f1b88 100644 --- a/substratevm/src/com.oracle.svm.core.posix/src/com/oracle/svm/core/posix/PosixVirtualMemoryProvider.java +++ b/substratevm/src/com.oracle.svm.core.posix/src/com/oracle/svm/core/posix/PosixVirtualMemoryProvider.java @@ -39,7 +39,6 @@ import static com.oracle.svm.core.posix.headers.Mman.NoTransitions.munmap; import static jdk.graal.compiler.word.Word.nullPointer; -import jdk.graal.compiler.word.Word; import org.graalvm.nativeimage.ImageSingletons; import org.graalvm.nativeimage.Platform; import org.graalvm.nativeimage.c.type.WordPointer; @@ -52,14 +51,16 @@ import com.oracle.svm.core.c.CGlobalData; import com.oracle.svm.core.c.CGlobalDataFactory; import com.oracle.svm.core.feature.AutomaticallyRegisteredFeature; -import com.oracle.svm.core.feature.InternalFeature; +import com.oracle.svm.core.layeredimagesingleton.InitialLayerInternalFeature; import com.oracle.svm.core.os.VirtualMemoryProvider; import com.oracle.svm.core.posix.headers.Unistd; import com.oracle.svm.core.util.PointerUtils; import com.oracle.svm.core.util.UnsignedUtils; +import jdk.graal.compiler.word.Word; + @AutomaticallyRegisteredFeature -class PosixVirtualMemoryProviderFeature implements InternalFeature { +class PosixVirtualMemoryProviderFeature implements InitialLayerInternalFeature { @Override public void beforeAnalysis(BeforeAnalysisAccess access) { if (!ImageSingletons.contains(VirtualMemoryProvider.class)) { diff --git a/substratevm/src/com.oracle.svm.core.posix/src/com/oracle/svm/core/posix/darwin/DarwinImageSingletonsFeature.java b/substratevm/src/com.oracle.svm.core.posix/src/com/oracle/svm/core/posix/darwin/DarwinImageSingletonsFeature.java index 8876276dd74c..56928591d483 100644 --- a/substratevm/src/com.oracle.svm.core.posix/src/com/oracle/svm/core/posix/darwin/DarwinImageSingletonsFeature.java +++ b/substratevm/src/com.oracle.svm.core.posix/src/com/oracle/svm/core/posix/darwin/DarwinImageSingletonsFeature.java @@ -26,12 +26,12 @@ import org.graalvm.nativeimage.ImageSingletons; -import com.oracle.svm.core.feature.InternalFeature; -import com.oracle.svm.core.os.ImageHeapProvider; import com.oracle.svm.core.feature.AutomaticallyRegisteredFeature; +import com.oracle.svm.core.layeredimagesingleton.InitialLayerInternalFeature; +import com.oracle.svm.core.os.ImageHeapProvider; @AutomaticallyRegisteredFeature -class DarwinImageSingletonsFeature implements InternalFeature { +class DarwinImageSingletonsFeature implements InitialLayerInternalFeature { @Override public void duringSetup(DuringSetupAccess access) { if (!ImageSingletons.contains(ImageHeapProvider.class)) { diff --git a/substratevm/src/com.oracle.svm.core.posix/src/com/oracle/svm/core/posix/linux/DumpLinuxOSInfo.java b/substratevm/src/com.oracle.svm.core.posix/src/com/oracle/svm/core/posix/linux/DumpLinuxOSInfo.java index c3da72746499..772c8ecdb242 100644 --- a/substratevm/src/com.oracle.svm.core.posix/src/com/oracle/svm/core/posix/linux/DumpLinuxOSInfo.java +++ b/substratevm/src/com.oracle.svm.core.posix/src/com/oracle/svm/core/posix/linux/DumpLinuxOSInfo.java @@ -35,8 +35,8 @@ import com.oracle.svm.core.c.CGlobalData; import com.oracle.svm.core.c.CGlobalDataFactory; import com.oracle.svm.core.feature.AutomaticallyRegisteredFeature; -import com.oracle.svm.core.feature.InternalFeature; import com.oracle.svm.core.heap.RestrictHeapAccess; +import com.oracle.svm.core.layeredimagesingleton.InitialLayerInternalFeature; import com.oracle.svm.core.log.Log; import com.oracle.svm.core.os.RawFileOperationSupport; @@ -103,7 +103,7 @@ private static int countLineBytes(CCharPointer buffer, int len) { } @AutomaticallyRegisteredFeature -class DumpLinuxOSInfoFeature implements InternalFeature { +class DumpLinuxOSInfoFeature implements InitialLayerInternalFeature { @Override public void afterRegistration(AfterRegistrationAccess access) { if (!SubstrateOptions.AsyncSignalSafeDiagnostics.getValue()) { diff --git a/substratevm/src/com.oracle.svm.core.posix/src/com/oracle/svm/core/posix/linux/LinuxImageSingletonsFeature.java b/substratevm/src/com.oracle.svm.core.posix/src/com/oracle/svm/core/posix/linux/LinuxImageSingletonsFeature.java index 7f51e5f50f95..1463452b45c7 100644 --- a/substratevm/src/com.oracle.svm.core.posix/src/com/oracle/svm/core/posix/linux/LinuxImageSingletonsFeature.java +++ b/substratevm/src/com.oracle.svm.core.posix/src/com/oracle/svm/core/posix/linux/LinuxImageSingletonsFeature.java @@ -29,12 +29,12 @@ import com.oracle.svm.core.c.libc.BionicLibC; import com.oracle.svm.core.c.libc.LibCBase; import com.oracle.svm.core.feature.AutomaticallyRegisteredFeature; -import com.oracle.svm.core.feature.InternalFeature; import com.oracle.svm.core.headers.LibCSupport; +import com.oracle.svm.core.layeredimagesingleton.InitialLayerInternalFeature; import com.oracle.svm.core.os.ImageHeapProvider; @AutomaticallyRegisteredFeature -class LinuxImageSingletonsFeature implements InternalFeature { +class LinuxImageSingletonsFeature implements InitialLayerInternalFeature { @Override public void duringSetup(DuringSetupAccess access) { if (LibCBase.singleton() instanceof BionicLibC) { diff --git a/substratevm/src/com.oracle.svm.core.windows/src/com/oracle/svm/core/windows/WindowsFeature.java b/substratevm/src/com.oracle.svm.core.windows/src/com/oracle/svm/core/windows/WindowsFeature.java index 5265174e0079..6667f607afd7 100644 --- a/substratevm/src/com.oracle.svm.core.windows/src/com/oracle/svm/core/windows/WindowsFeature.java +++ b/substratevm/src/com.oracle.svm.core.windows/src/com/oracle/svm/core/windows/WindowsFeature.java @@ -26,13 +26,13 @@ import org.graalvm.nativeimage.ImageSingletons; -import com.oracle.svm.core.feature.InternalFeature; +import com.oracle.svm.core.feature.AutomaticallyRegisteredFeature; +import com.oracle.svm.core.layeredimagesingleton.InitialLayerInternalFeature; import com.oracle.svm.core.log.Log; import com.oracle.svm.core.os.ImageHeapProvider; -import com.oracle.svm.core.feature.AutomaticallyRegisteredFeature; @AutomaticallyRegisteredFeature -class WindowsFeature implements InternalFeature { +class WindowsFeature implements InitialLayerInternalFeature { @Override public void duringSetup(DuringSetupAccess access) { diff --git a/substratevm/src/com.oracle.svm.core.windows/src/com/oracle/svm/core/windows/WindowsLibMSupport.java b/substratevm/src/com.oracle.svm.core.windows/src/com/oracle/svm/core/windows/WindowsLibMSupport.java index f950192cd3d8..489d5d70e0f6 100644 --- a/substratevm/src/com.oracle.svm.core.windows/src/com/oracle/svm/core/windows/WindowsLibMSupport.java +++ b/substratevm/src/com.oracle.svm.core.windows/src/com/oracle/svm/core/windows/WindowsLibMSupport.java @@ -27,9 +27,10 @@ import com.oracle.svm.core.Uninterruptible; import com.oracle.svm.core.feature.AutomaticallyRegisteredImageSingleton; import com.oracle.svm.core.headers.LibMSupport; +import com.oracle.svm.core.imagelayer.BuildingMonolithicImage; import com.oracle.svm.core.windows.headers.WindowsLibC; -@AutomaticallyRegisteredImageSingleton(LibMSupport.class) +@AutomaticallyRegisteredImageSingleton(value = LibMSupport.class, onlyWith = BuildingMonolithicImage.class) public class WindowsLibMSupport implements LibMSupport { @Override @Uninterruptible(reason = "Called from uninterruptible code.", mayBeInlined = true) diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/BuildArtifacts.java b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/BuildArtifacts.java index 0d31744e4322..ecae5be7eb4d 100644 --- a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/BuildArtifacts.java +++ b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/BuildArtifacts.java @@ -30,8 +30,10 @@ import org.graalvm.nativeimage.ImageSingletons; +import com.oracle.svm.core.layeredimagesingleton.BuildTimeUnsavedSingleton; + /** Interface for collecting artifacts produced during native image build. */ -public interface BuildArtifacts { +public interface BuildArtifacts extends BuildTimeUnsavedSingleton { /** * Artifact types generated by Native Image. Changing this enum requires updating the diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/BuildPhaseProvider.java b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/BuildPhaseProvider.java index 81471f8ded34..ddba99d15ed8 100644 --- a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/BuildPhaseProvider.java +++ b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/BuildPhaseProvider.java @@ -30,8 +30,10 @@ import org.graalvm.nativeimage.Platform; import org.graalvm.nativeimage.Platforms; +import com.oracle.svm.core.layeredimagesingleton.BuildTimeUnsavedSingleton; + @Platforms(Platform.HOSTED_ONLY.class) -public final class BuildPhaseProvider { +public final class BuildPhaseProvider implements BuildTimeUnsavedSingleton { private boolean featureRegistrationFinished; private boolean setupFinished; diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/ClassLoaderSupport.java b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/ClassLoaderSupport.java index 3f3a411b3a13..8b6716e6db32 100644 --- a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/ClassLoaderSupport.java +++ b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/ClassLoaderSupport.java @@ -36,8 +36,10 @@ import org.graalvm.nativeimage.Platforms; import org.graalvm.nativeimage.impl.ConfigurationCondition; +import com.oracle.svm.core.layeredimagesingleton.BuildTimeUnsavedSingleton; + @Platforms(Platform.HOSTED_ONLY.class) -public abstract class ClassLoaderSupport { +public abstract class ClassLoaderSupport implements BuildTimeUnsavedSingleton { public boolean isNativeImageClassLoader(ClassLoader classLoader) { ClassLoader loader = classLoader; diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/IsolateListenerFeature.java b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/IsolateListenerFeature.java index 326709604f60..eae393a9a642 100644 --- a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/IsolateListenerFeature.java +++ b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/IsolateListenerFeature.java @@ -30,13 +30,20 @@ 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.UnsupportedLayeredSingleton; /** * For compatibility with legacy code. */ @AutomaticallyRegisteredFeature @Deprecated -public class IsolateListenerFeature implements InternalFeature { +public class IsolateListenerFeature implements InternalFeature, UnsupportedLayeredSingleton { + @Override + public boolean isInConfiguration(IsInConfigurationAccess access) { + return !ImageLayerBuildingSupport.buildingImageLayer(); + } + @Override public List> getRequiredFeatures() { return List.of(IsolateListenerSupportFeature.class); diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/IsolateListenerSupport.java b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/IsolateListenerSupport.java index 2529b569eab4..9742f714c052 100644 --- a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/IsolateListenerSupport.java +++ b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/IsolateListenerSupport.java @@ -25,6 +25,7 @@ package com.oracle.svm.core; import java.util.Arrays; +import java.util.EnumSet; import org.graalvm.nativeimage.ImageSingletons; import org.graalvm.nativeimage.Isolate; @@ -32,12 +33,14 @@ import org.graalvm.nativeimage.Platforms; import com.oracle.svm.core.feature.AutomaticallyRegisteredImageSingleton; +import com.oracle.svm.core.layeredimagesingleton.InitialLayerOnlyImageSingleton; +import com.oracle.svm.core.layeredimagesingleton.LayeredImageSingletonBuilderFlags; import com.oracle.svm.core.util.VMError; import jdk.graal.compiler.api.replacements.Fold; @AutomaticallyRegisteredImageSingleton -public class IsolateListenerSupport { +public class IsolateListenerSupport implements InitialLayerOnlyImageSingleton { private IsolateListener[] listeners; @Platforms(Platform.HOSTED_ONLY.class) @@ -80,6 +83,11 @@ public void onIsolateTeardown() { } } + @Override + public EnumSet getImageBuilderFlags() { + return LayeredImageSingletonBuilderFlags.ALL_ACCESS; + } + public interface IsolateListener { /** * Implementations must not throw any exceptions. Note that the thread that creates the diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/RegisterDumper.java b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/RegisterDumper.java index 2f3e132815b9..48fd05f7b3c8 100644 --- a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/RegisterDumper.java +++ b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/RegisterDumper.java @@ -24,14 +24,19 @@ */ package com.oracle.svm.core; -import jdk.graal.compiler.word.Word; +import java.util.EnumSet; + import org.graalvm.nativeimage.ImageSingletons; import org.graalvm.word.PointerBase; +import com.oracle.svm.core.layeredimagesingleton.InitialLayerOnlyImageSingleton; +import com.oracle.svm.core.layeredimagesingleton.LayeredImageSingletonBuilderFlags; import com.oracle.svm.core.log.Log; import com.oracle.svm.core.util.VMError; -public interface RegisterDumper { +import jdk.graal.compiler.word.Word; + +public interface RegisterDumper extends InitialLayerOnlyImageSingleton { @Uninterruptible(reason = "Called from uninterruptible code.", mayBeInlined = true) static RegisterDumper singleton() { if (!ImageSingletons.contains(RegisterDumper.class)) { @@ -61,4 +66,14 @@ interface Context extends PointerBase { PointerBase getSP(Context context); PointerBase getIP(Context context); + + @Override + default EnumSet getImageBuilderFlags() { + return LayeredImageSingletonBuilderFlags.RUNTIME_ACCESS_ONLY; + } + + @Override + default boolean accessibleInFutureLayers() { + return true; + } } diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/StaticFieldsSupport.java b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/StaticFieldsSupport.java index fcf9c4a210b1..a35650910c1e 100644 --- a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/StaticFieldsSupport.java +++ b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/StaticFieldsSupport.java @@ -42,6 +42,8 @@ import com.oracle.svm.core.feature.InternalFeature; import com.oracle.svm.core.heap.UnknownObjectField; import com.oracle.svm.core.imagelayer.ImageLayerBuildingSupport; +import com.oracle.svm.core.layeredimagesingleton.BuildTimeUnsavedSingleton; +import com.oracle.svm.core.layeredimagesingleton.FeatureSingleton; import com.oracle.svm.core.layeredimagesingleton.LayeredImageSingletonBuilderFlags; import com.oracle.svm.core.layeredimagesingleton.LayeredImageSingletonSupport; import com.oracle.svm.core.layeredimagesingleton.MultiLayeredImageSingleton; @@ -94,7 +96,7 @@ public final class StaticFieldsSupport { @Platforms(Platform.HOSTED_ONLY.class) - public interface HostedStaticFieldSupport { + public interface HostedStaticFieldSupport extends BuildTimeUnsavedSingleton { static HostedStaticFieldSupport singleton() { return ImageSingletons.lookup(HostedStaticFieldSupport.class); @@ -273,7 +275,7 @@ public void lower(LoweringTool tool) { * We must ensure we are not querying the offset of a static field of a type assignable from * {@link org.graalvm.word.WordBase}. */ - public interface StaticFieldValidator { + public interface StaticFieldValidator extends BuildTimeUnsavedSingleton { static void checkFieldOffsetAllowed(ResolvedJavaField field) { if (field.isStatic()) { if (SubstrateUtil.HOSTED) { @@ -335,7 +337,7 @@ public EnumSet getImageBuilderFlags() { * See {@link StaticFieldsSupport} for how this prevents aliasing issues. */ @AutomaticallyRegisteredFeature -final class StaticFieldsFeature implements InternalFeature { +final class StaticFieldsFeature implements InternalFeature, FeatureSingleton { @Override public void registerInvocationPlugins(Providers providers, Plugins plugins, ParsingReason reason) { diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/SubstrateDiagnostics.java b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/SubstrateDiagnostics.java index 2f912ff5f7e9..c73bc91a93d8 100644 --- a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/SubstrateDiagnostics.java +++ b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/SubstrateDiagnostics.java @@ -28,6 +28,7 @@ import static com.oracle.svm.core.option.RuntimeOptionKey.RuntimeOptionKeyFlag.RelevantForCompilationIsolates; import java.util.Arrays; +import java.util.EnumSet; import java.util.List; import org.graalvm.collections.EconomicMap; @@ -65,7 +66,6 @@ import com.oracle.svm.core.deopt.Deoptimizer; import com.oracle.svm.core.feature.AutomaticallyRegisteredFeature; import com.oracle.svm.core.feature.AutomaticallyRegisteredImageSingleton; -import com.oracle.svm.core.feature.InternalFeature; import com.oracle.svm.core.graal.RuntimeCompilation; import com.oracle.svm.core.graal.code.CGlobalDataInfo; import com.oracle.svm.core.graal.stackvalue.UnsafeStackValue; @@ -73,8 +73,12 @@ import com.oracle.svm.core.heap.RestrictHeapAccess; import com.oracle.svm.core.hub.DynamicHub; import com.oracle.svm.core.hub.LayoutEncoding; +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.InitialLayerInternalFeature; +import com.oracle.svm.core.layeredimagesingleton.InitialLayerOnlyImageSingleton; +import com.oracle.svm.core.layeredimagesingleton.LayeredImageSingletonBuilderFlags; import com.oracle.svm.core.locks.VMLockSupport; import com.oracle.svm.core.log.Log; import com.oracle.svm.core.option.RuntimeOptionKey; @@ -512,7 +516,7 @@ private static boolean pointsIntoNativeImageCode(CodePointer possibleIp) { return CodeInfoTable.lookupCodeInfo(possibleIp).isNonNull(); } - public static class FatalErrorState { + public static class FatalErrorState implements InitialLayerOnlyImageSingleton { AtomicWord diagnosticThread; volatile int diagnosticThunkIndex; volatile int invocationCount; @@ -565,6 +569,16 @@ public void clear() { diagnosticThread.set(Word.nullPointer()); } + + @Override + public EnumSet getImageBuilderFlags() { + return LayeredImageSingletonBuilderFlags.ALL_ACCESS; + } + + @Override + public boolean accessibleInFutureLayers() { + return true; + } } private static final class DumpRegisters extends DiagnosticThunk { @@ -1262,7 +1276,7 @@ public abstract static class DiagnosticThunk { public abstract int maxInvocationCount(); } - public static class DiagnosticThunkRegistry { + public static class DiagnosticThunkRegistry implements InitialLayerOnlyImageSingleton { @Platforms(Platform.HOSTED_ONLY.class) // final int runtimeCompilationPosition; @@ -1272,7 +1286,7 @@ public static class DiagnosticThunkRegistry { @Fold public static synchronized DiagnosticThunkRegistry singleton() { /* The registry is already used very early during the image build. */ - if (!ImageSingletons.contains(DiagnosticThunkRegistry.class)) { + if (!ImageSingletons.contains(DiagnosticThunkRegistry.class) && ImageLayerBuildingSupport.firstImageBuild()) { ImageSingletons.add(DiagnosticThunkRegistry.class, new DiagnosticThunkRegistry()); } return ImageSingletons.lookup(DiagnosticThunkRegistry.class); @@ -1358,10 +1372,20 @@ int getInitialInvocationCount(int index) { void setInitialInvocationCount(int index, int value) { initialInvocationCount[index] = value; } + + @Override + public EnumSet getImageBuilderFlags() { + return LayeredImageSingletonBuilderFlags.ALL_ACCESS; + } + + @Override + public boolean accessibleInFutureLayers() { + return true; + } } @AutomaticallyRegisteredImageSingleton - public static class Options { + public static class Options implements InitialLayerOnlyImageSingleton { @Option(help = "Execute an endless loop before printing diagnostics for a fatal error.", type = OptionType.Debug)// public static final RuntimeOptionKey LoopOnFatalError = new RuntimeOptionKey<>(false, RelevantForCompilationIsolates) { @Override @@ -1417,11 +1441,21 @@ public static boolean shouldLoopOnFatalError() { public static boolean implicitExceptionWithoutStacktraceIsFatal() { return singleton().implicitExceptionWithoutStacktraceIsFatal; } + + @Override + public EnumSet getImageBuilderFlags() { + return LayeredImageSingletonBuilderFlags.ALL_ACCESS; + } + + @Override + public boolean accessibleInFutureLayers() { + return true; + } } } @AutomaticallyRegisteredFeature -class SubstrateDiagnosticsFeature implements InternalFeature { +class SubstrateDiagnosticsFeature implements InitialLayerInternalFeature { /** * {@link RuntimeCompilation#isEnabled()} can't be executed in the * {@link DiagnosticThunkRegistry} constructor because the feature registration is not diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/SubstrateExitHandlerFeature.java b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/SubstrateExitHandlerFeature.java index 084af30092ba..d2c8f9ee44d0 100644 --- a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/SubstrateExitHandlerFeature.java +++ b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/SubstrateExitHandlerFeature.java @@ -29,9 +29,10 @@ import com.oracle.svm.core.feature.AutomaticallyRegisteredFeature; import com.oracle.svm.core.feature.InternalFeature; import com.oracle.svm.core.jdk.RuntimeSupport; +import com.oracle.svm.core.layeredimagesingleton.FeatureSingleton; @AutomaticallyRegisteredFeature -public class SubstrateExitHandlerFeature implements InternalFeature { +public class SubstrateExitHandlerFeature implements InternalFeature, FeatureSingleton { @Override public void beforeAnalysis(BeforeAnalysisAccess access) { if (SubstrateOptions.InstallExitHandlers.getValue()) { diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/SubstrateOptions.java b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/SubstrateOptions.java index 0452a9a3e10b..9dd529e4f257 100644 --- a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/SubstrateOptions.java +++ b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/SubstrateOptions.java @@ -55,6 +55,7 @@ import com.oracle.svm.core.heap.ReferenceHandler; import com.oracle.svm.core.imagelayer.ImageLayerBuildingSupport; import com.oracle.svm.core.jdk.VectorAPIEnabled; +import com.oracle.svm.core.layeredimagesingleton.BuildTimeUnsavedSingleton; import com.oracle.svm.core.option.APIOption; import com.oracle.svm.core.option.APIOptionGroup; import com.oracle.svm.core.option.AccumulatingLocatableMultiOptionValue; @@ -1294,7 +1295,7 @@ public static String reportsPath() { return getImagePath().resolve(reportsPath).toString(); } - public static class ReportingSupport { + public static class ReportingSupport implements BuildTimeUnsavedSingleton { Path reportsPath; public ReportingSupport(Path reportingPath) { diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/SubstrateSegfaultHandler.java b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/SubstrateSegfaultHandler.java index 904a95de76fd..cb53e8cfddc8 100644 --- a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/SubstrateSegfaultHandler.java +++ b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/SubstrateSegfaultHandler.java @@ -49,7 +49,6 @@ import com.oracle.svm.core.c.CGlobalDataFactory; import com.oracle.svm.core.c.function.CEntryPointErrors; import com.oracle.svm.core.feature.AutomaticallyRegisteredFeature; -import com.oracle.svm.core.feature.InternalFeature; import com.oracle.svm.core.graal.nodes.WriteCurrentVMThreadNode; import com.oracle.svm.core.graal.snippets.CEntryPointSnippets; import com.oracle.svm.core.graal.stackvalue.UnsafeLateStackValue; @@ -57,6 +56,7 @@ import com.oracle.svm.core.heap.RestrictHeapAccess; import com.oracle.svm.core.heap.UnknownPrimitiveField; import com.oracle.svm.core.jdk.RuntimeSupport; +import com.oracle.svm.core.layeredimagesingleton.InitialLayerInternalFeature; import com.oracle.svm.core.layeredimagesingleton.MultiLayeredImageSingleton; import com.oracle.svm.core.log.Log; import com.oracle.svm.core.option.RuntimeOptionKey; @@ -72,7 +72,7 @@ import jdk.graal.compiler.word.Word; @AutomaticallyRegisteredFeature -class SubstrateSegfaultHandlerFeature implements InternalFeature { +class SubstrateSegfaultHandlerFeature implements InitialLayerInternalFeature { @Override public List> getRequiredFeatures() { return Collections.singletonList(IsolateListenerSupportFeature.class); diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/code/RuntimeMetadataDecoderImpl.java b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/code/RuntimeMetadataDecoderImpl.java index d87d1d92bbf0..b028c92b2a0f 100644 --- a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/code/RuntimeMetadataDecoderImpl.java +++ b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/code/RuntimeMetadataDecoderImpl.java @@ -269,11 +269,6 @@ public boolean isNegative(int modifiers) { return (modifiers & NEGATIVE_FLAG_MASK) != 0; } - @Override - public int getMetadataByteLength() { - return RuntimeMetadataEncoding.currentLayer().getEncoding().length; - } - public static boolean isErrorIndex(int index) { return index < NO_DATA; } diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/graal/code/PatchConsumerFactory.java b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/graal/code/PatchConsumerFactory.java index 0471743a1729..1dc1c25618ad 100644 --- a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/graal/code/PatchConsumerFactory.java +++ b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/graal/code/PatchConsumerFactory.java @@ -26,13 +26,16 @@ import java.util.function.Consumer; +import org.graalvm.nativeimage.ImageSingletons; + +import com.oracle.svm.core.layeredimagesingleton.BuildTimeUnsavedSingleton; + import jdk.graal.compiler.asm.Assembler.CodeAnnotation; import jdk.graal.compiler.code.CompilationResult; -import org.graalvm.nativeimage.ImageSingletons; public abstract class PatchConsumerFactory { - public abstract static class HostedPatchConsumerFactory extends PatchConsumerFactory { + public abstract static class HostedPatchConsumerFactory extends PatchConsumerFactory implements BuildTimeUnsavedSingleton { public static HostedPatchConsumerFactory factory() { return ImageSingletons.lookup(HostedPatchConsumerFactory.class); } diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/graal/code/SubstrateBackendFactory.java b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/graal/code/SubstrateBackendFactory.java index fb4bebc111b1..10c36199ad03 100644 --- a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/graal/code/SubstrateBackendFactory.java +++ b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/graal/code/SubstrateBackendFactory.java @@ -24,10 +24,13 @@ */ package com.oracle.svm.core.graal.code; -import jdk.graal.compiler.phases.util.Providers; import org.graalvm.nativeimage.ImageSingletons; -public abstract class SubstrateBackendFactory { +import com.oracle.svm.core.layeredimagesingleton.BuildTimeUnsavedSingleton; + +import jdk.graal.compiler.phases.util.Providers; + +public abstract class SubstrateBackendFactory implements BuildTimeUnsavedSingleton { public abstract SubstrateBackend newBackend(Providers newProviders); public static SubstrateBackendFactory get() { diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/graal/code/SubstrateLoweringProviderFactory.java b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/graal/code/SubstrateLoweringProviderFactory.java index 2eb355f2de65..d005bac4bf9b 100644 --- a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/graal/code/SubstrateLoweringProviderFactory.java +++ b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/graal/code/SubstrateLoweringProviderFactory.java @@ -24,15 +24,16 @@ */ package com.oracle.svm.core.graal.code; +import com.oracle.svm.core.layeredimagesingleton.BuildTimeUnsavedSingleton; + import jdk.graal.compiler.core.common.spi.ForeignCallsProvider; import jdk.graal.compiler.core.common.spi.MetaAccessExtensionProvider; import jdk.graal.compiler.nodes.spi.PlatformConfigurationProvider; import jdk.graal.compiler.replacements.DefaultJavaLoweringProvider; - import jdk.vm.ci.code.TargetDescription; import jdk.vm.ci.meta.MetaAccessProvider; -public interface SubstrateLoweringProviderFactory { +public interface SubstrateLoweringProviderFactory extends BuildTimeUnsavedSingleton { DefaultJavaLoweringProvider newLoweringProvider(MetaAccessProvider metaAccess, ForeignCallsProvider foreignCalls, PlatformConfigurationProvider platformConfig, MetaAccessExtensionProvider metaAccessExtensionProvider, TargetDescription target); diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/graal/code/SubstrateRegisterConfigFactory.java b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/graal/code/SubstrateRegisterConfigFactory.java index 2657aab56ebf..2149c2a3b89c 100644 --- a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/graal/code/SubstrateRegisterConfigFactory.java +++ b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/graal/code/SubstrateRegisterConfigFactory.java @@ -25,11 +25,12 @@ package com.oracle.svm.core.graal.code; import com.oracle.svm.core.graal.meta.SubstrateRegisterConfig.ConfigKind; +import com.oracle.svm.core.layeredimagesingleton.BuildTimeUnsavedSingleton; import jdk.vm.ci.code.RegisterConfig; import jdk.vm.ci.code.TargetDescription; import jdk.vm.ci.meta.MetaAccessProvider; -public interface SubstrateRegisterConfigFactory { +public interface SubstrateRegisterConfigFactory extends BuildTimeUnsavedSingleton { RegisterConfig newRegisterFactory(ConfigKind config, MetaAccessProvider metaAccess, TargetDescription target, Boolean preserveFramePointer); } diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/graal/jdk/JDKIntrinsicsFeature.java b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/graal/jdk/JDKIntrinsicsFeature.java index 93d6812def64..f2f27e747580 100644 --- a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/graal/jdk/JDKIntrinsicsFeature.java +++ b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/graal/jdk/JDKIntrinsicsFeature.java @@ -32,6 +32,7 @@ import com.oracle.svm.core.graal.meta.RuntimeConfiguration; import com.oracle.svm.core.graal.meta.SubstrateForeignCallsProvider; import com.oracle.svm.core.graal.snippets.NodeLoweringProvider; +import com.oracle.svm.core.layeredimagesingleton.FeatureSingleton; import jdk.graal.compiler.graph.Node; import jdk.graal.compiler.nodes.graphbuilderconf.GraphBuilderConfiguration.Plugins; @@ -42,7 +43,7 @@ import jdk.graal.compiler.replacements.arraycopy.ArrayCopySnippets; @AutomaticallyRegisteredFeature -final class JDKIntrinsicsFeature implements InternalFeature { +final class JDKIntrinsicsFeature implements InternalFeature, FeatureSingleton { @Override public void registerForeignCalls(SubstrateForeignCallsProvider foreignCalls) { diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/graal/snippets/CFunctionSnippets.java b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/graal/snippets/CFunctionSnippets.java index 5b8962aa2641..a7251c059cd7 100644 --- a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/graal/snippets/CFunctionSnippets.java +++ b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/graal/snippets/CFunctionSnippets.java @@ -41,6 +41,7 @@ import com.oracle.svm.core.graal.nodes.VerificationMarkerNode; import com.oracle.svm.core.graal.stackvalue.LoweredStackValueNode; import com.oracle.svm.core.graal.stackvalue.StackValueNode.StackSlotIdentity; +import com.oracle.svm.core.layeredimagesingleton.FeatureSingleton; import com.oracle.svm.core.nodes.CFunctionEpilogueNode; import com.oracle.svm.core.nodes.CFunctionPrologueDataNode; import com.oracle.svm.core.nodes.CFunctionPrologueNode; @@ -278,7 +279,7 @@ private static void matchCallStructure(CFunctionPrologueNode prologueNode) { @AutomaticallyRegisteredFeature @Platforms(InternalPlatform.NATIVE_ONLY.class) -class CFunctionSnippetsFeature implements InternalFeature { +class CFunctionSnippetsFeature implements InternalFeature, FeatureSingleton { @Override @SuppressWarnings("unused") diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/graal/snippets/DeoptSnippetsFeature.java b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/graal/snippets/DeoptSnippetsFeature.java index 6ab0e7fc66ba..ae973ca45b3c 100644 --- a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/graal/snippets/DeoptSnippetsFeature.java +++ b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/graal/snippets/DeoptSnippetsFeature.java @@ -26,16 +26,17 @@ import java.util.Map; -import jdk.graal.compiler.graph.Node; -import jdk.graal.compiler.options.OptionValues; -import jdk.graal.compiler.phases.util.Providers; - import com.oracle.svm.core.feature.AutomaticallyRegisteredFeature; import com.oracle.svm.core.feature.InternalFeature; import com.oracle.svm.core.graal.meta.RuntimeConfiguration; +import com.oracle.svm.core.layeredimagesingleton.FeatureSingleton; + +import jdk.graal.compiler.graph.Node; +import jdk.graal.compiler.options.OptionValues; +import jdk.graal.compiler.phases.util.Providers; @AutomaticallyRegisteredFeature -final class DeoptSnippetsFeature implements InternalFeature { +final class DeoptSnippetsFeature implements InternalFeature, FeatureSingleton { @Override public void registerLowerings(RuntimeConfiguration runtimeConfig, OptionValues options, Providers providers, diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/graal/snippets/ExceptionSnippets.java b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/graal/snippets/ExceptionSnippets.java index 43d00a51b1bd..1c9395837eaa 100644 --- a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/graal/snippets/ExceptionSnippets.java +++ b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/graal/snippets/ExceptionSnippets.java @@ -39,6 +39,7 @@ import com.oracle.svm.core.feature.InternalFeature; import com.oracle.svm.core.graal.meta.RuntimeConfiguration; import com.oracle.svm.core.graal.nodes.ReadExceptionObjectNode; +import com.oracle.svm.core.layeredimagesingleton.FeatureSingleton; import com.oracle.svm.core.meta.SharedMethod; import com.oracle.svm.core.snippets.ExceptionUnwind; @@ -119,7 +120,7 @@ public void lower(LoadExceptionObjectNode node, LoweringTool tool) { @AutomaticallyRegisteredFeature @Platforms(InternalPlatform.NATIVE_ONLY.class) -final class ExceptionFeature implements InternalFeature { +final class ExceptionFeature implements InternalFeature, FeatureSingleton { @Override public void registerLowerings(RuntimeConfiguration runtimeConfig, OptionValues options, Providers providers, diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/graal/snippets/StackOverflowCheckFeature.java b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/graal/snippets/StackOverflowCheckFeature.java index 225aace71405..1b23c7b9066a 100644 --- a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/graal/snippets/StackOverflowCheckFeature.java +++ b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/graal/snippets/StackOverflowCheckFeature.java @@ -37,6 +37,8 @@ import com.oracle.svm.core.graal.meta.RuntimeConfiguration; import com.oracle.svm.core.graal.meta.SubstrateForeignCallsProvider; import com.oracle.svm.core.heap.RestrictHeapAccessCallees; +import com.oracle.svm.core.imagelayer.ImageLayerBuildingSupport; +import com.oracle.svm.core.layeredimagesingleton.FeatureSingleton; import com.oracle.svm.core.stack.StackOverflowCheck; import jdk.graal.compiler.graph.Node; @@ -50,11 +52,13 @@ @AutomaticallyRegisteredFeature @Platforms(InternalPlatform.NATIVE_ONLY.class) -public final class StackOverflowCheckFeature implements InternalFeature { +public final class StackOverflowCheckFeature implements InternalFeature, FeatureSingleton { @Override public void afterRegistration(AfterRegistrationAccess access) { - ImageSingletons.add(StackOverflowCheck.class, new StackOverflowCheckImpl()); + if (ImageLayerBuildingSupport.firstImageBuild()) { + ImageSingletons.add(StackOverflowCheck.class, new StackOverflowCheckImpl()); + } } @Override diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/graal/snippets/StackOverflowCheckImpl.java b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/graal/snippets/StackOverflowCheckImpl.java index ee9ceb6e2974..4330039b60b3 100644 --- a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/graal/snippets/StackOverflowCheckImpl.java +++ b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/graal/snippets/StackOverflowCheckImpl.java @@ -29,6 +29,7 @@ import static jdk.graal.compiler.nodes.extended.BranchProbabilityNode.EXTREMELY_SLOW_PATH_PROBABILITY; import static jdk.graal.compiler.nodes.extended.BranchProbabilityNode.probability; +import java.util.EnumSet; import java.util.Map; import java.util.function.Predicate; @@ -47,6 +48,7 @@ import com.oracle.svm.core.heap.Heap; import com.oracle.svm.core.heap.RestrictHeapAccess; import com.oracle.svm.core.heap.RestrictHeapAccess.Access; +import com.oracle.svm.core.layeredimagesingleton.LayeredImageSingletonBuilderFlags; import com.oracle.svm.core.meta.SharedMethod; import com.oracle.svm.core.snippets.ImplicitExceptions; import com.oracle.svm.core.snippets.KnownIntrinsics; @@ -409,6 +411,11 @@ private static long computeDeoptFrameSize(FrameState state, NodeMap deoptF deoptFrameSizeCache.put(state, result); return result; } + + @Override + public EnumSet getImageBuilderFlags() { + return LayeredImageSingletonBuilderFlags.ALL_ACCESS; + } } @NodeInfo(cycles = NodeCycles.CYCLES_4, size = NodeSize.SIZE_8) diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/graal/snippets/amd64/AMD64SnippetsFeature.java b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/graal/snippets/amd64/AMD64SnippetsFeature.java index 7dfdd79c37be..9fcd9dfc77f3 100644 --- a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/graal/snippets/amd64/AMD64SnippetsFeature.java +++ b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/graal/snippets/amd64/AMD64SnippetsFeature.java @@ -27,24 +27,25 @@ import java.util.Map; import java.util.function.Predicate; -import jdk.graal.compiler.graph.Node; -import jdk.graal.compiler.options.OptionValues; -import jdk.graal.compiler.phases.util.Providers; import org.graalvm.nativeimage.ImageSingletons; import org.graalvm.nativeimage.Platform; import org.graalvm.nativeimage.Platforms; +import com.oracle.svm.core.feature.AutomaticallyRegisteredFeature; import com.oracle.svm.core.feature.InternalFeature; import com.oracle.svm.core.graal.meta.RuntimeConfiguration; import com.oracle.svm.core.graal.snippets.NodeLoweringProvider; import com.oracle.svm.core.heap.RestrictHeapAccessCallees; -import com.oracle.svm.core.feature.AutomaticallyRegisteredFeature; +import com.oracle.svm.core.layeredimagesingleton.FeatureSingleton; +import jdk.graal.compiler.graph.Node; +import jdk.graal.compiler.options.OptionValues; +import jdk.graal.compiler.phases.util.Providers; import jdk.vm.ci.meta.ResolvedJavaMethod; @AutomaticallyRegisteredFeature @Platforms(Platform.AMD64.class) -public class AMD64SnippetsFeature implements InternalFeature { +public class AMD64SnippetsFeature implements InternalFeature, FeatureSingleton { @Override public void registerLowerings(RuntimeConfiguration runtimeConfig, OptionValues options, Providers providers, diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/graal/stackvalue/StackValueFeature.java b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/graal/stackvalue/StackValueFeature.java index 0c8f0b3dd54c..c234c02e7ca9 100644 --- a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/graal/stackvalue/StackValueFeature.java +++ b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/graal/stackvalue/StackValueFeature.java @@ -32,6 +32,7 @@ import com.oracle.svm.core.graal.meta.RuntimeConfiguration; import com.oracle.svm.core.graal.meta.SubstrateForeignCallsProvider; import com.oracle.svm.core.graal.snippets.NodeLoweringProvider; +import com.oracle.svm.core.layeredimagesingleton.FeatureSingleton; import jdk.graal.compiler.graph.Node; import jdk.graal.compiler.options.OptionValues; @@ -42,7 +43,7 @@ import jdk.graal.compiler.phases.util.Providers; @AutomaticallyRegisteredFeature -public class StackValueFeature implements InternalFeature { +public class StackValueFeature implements InternalFeature, FeatureSingleton { @Override public void registerGraalPhases(Providers providers, Suites suites, boolean hosted) { ListIterator> midTierPos = suites.getMidTier().findPhase(FrameStateAssignmentPhase.class); diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/headers/LibCSupport.java b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/headers/LibCSupport.java index b7ed0b46fdae..dccfd58849c7 100644 --- a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/headers/LibCSupport.java +++ b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/headers/LibCSupport.java @@ -24,6 +24,8 @@ */ package com.oracle.svm.core.headers; +import java.util.EnumSet; + import org.graalvm.nativeimage.c.type.CCharPointer; import org.graalvm.nativeimage.c.type.CCharPointerPointer; import org.graalvm.word.PointerBase; @@ -31,10 +33,12 @@ import org.graalvm.word.UnsignedWord; import com.oracle.svm.core.Uninterruptible; +import com.oracle.svm.core.layeredimagesingleton.InitialLayerOnlyImageSingleton; +import com.oracle.svm.core.layeredimagesingleton.LayeredImageSingletonBuilderFlags; import com.oracle.svm.core.memory.NativeMemory; /** Platform-independent LibC support. Don't use this class directly, use {@link LibC} instead. */ -public interface LibCSupport { +public interface LibCSupport extends InitialLayerOnlyImageSingleton { @Uninterruptible(reason = "Called from uninterruptible code.", mayBeInlined = true) int errno(); @@ -86,4 +90,14 @@ public interface LibCSupport { @Uninterruptible(reason = "Called from uninterruptible code.", mayBeInlined = true) UnsignedWord strtoull(CCharPointer string, CCharPointerPointer endPtr, int base); + + @Override + default EnumSet getImageBuilderFlags() { + return LayeredImageSingletonBuilderFlags.ALL_ACCESS; + } + + @Override + default boolean accessibleInFutureLayers() { + return true; + } } diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/headers/LibMSupport.java b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/headers/LibMSupport.java index 02d6442347ad..06b3147fb8d1 100644 --- a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/headers/LibMSupport.java +++ b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/headers/LibMSupport.java @@ -25,8 +25,9 @@ package com.oracle.svm.core.headers; import com.oracle.svm.core.Uninterruptible; +import com.oracle.svm.core.layeredimagesingleton.UnsupportedLayeredSingleton; -public interface LibMSupport { +public interface LibMSupport extends UnsupportedLayeredSingleton { @Uninterruptible(reason = "Called from uninterruptible code.", mayBeInlined = true) double log(double value); } diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/heap/AllocationFeature.java b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/heap/AllocationFeature.java index a10a92d79eb7..c58a19a8a1df 100644 --- a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/heap/AllocationFeature.java +++ b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/heap/AllocationFeature.java @@ -30,9 +30,10 @@ import com.oracle.svm.core.feature.InternalFeature; import com.oracle.svm.core.graal.meta.SubstrateForeignCallsProvider; import com.oracle.svm.core.graal.snippets.SubstrateAllocationSnippets; +import com.oracle.svm.core.layeredimagesingleton.FeatureSingleton; @AutomaticallyRegisteredFeature -public class AllocationFeature implements InternalFeature { +public class AllocationFeature implements InternalFeature, FeatureSingleton { @Override public void duringSetup(DuringSetupAccess access) { if (!ImageSingletons.contains(SubstrateAllocationSnippets.class)) { diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/heap/BarrierSetProvider.java b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/heap/BarrierSetProvider.java index 34c991b8c449..ceff8668ce9f 100644 --- a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/heap/BarrierSetProvider.java +++ b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/heap/BarrierSetProvider.java @@ -25,7 +25,6 @@ package com.oracle.svm.core.heap; import jdk.graal.compiler.nodes.gc.BarrierSet; - import jdk.vm.ci.meta.MetaAccessProvider; public interface BarrierSetProvider { diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/heap/Pod.java b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/heap/Pod.java index cc67450b46df..d5c557654413 100644 --- a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/heap/Pod.java +++ b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/heap/Pod.java @@ -47,6 +47,7 @@ import com.oracle.svm.core.hub.DynamicHub; import com.oracle.svm.core.hub.Hybrid; import com.oracle.svm.core.hub.LayoutEncoding; +import com.oracle.svm.core.layeredimagesingleton.UnsupportedLayeredSingleton; import com.oracle.svm.core.util.ImageHeapMap; import com.oracle.svm.core.util.UnsignedUtils; @@ -280,7 +281,7 @@ public int compareTo(Field f) { } } - public static final class RuntimeSupport { + public static final class RuntimeSupport implements UnsupportedLayeredSingleton { @Fold public static boolean isPresent() { return ImageSingletons.contains(RuntimeSupport.class); diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/imagelayer/BuildingMonolithicImage.java b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/imagelayer/BuildingMonolithicImage.java new file mode 100644 index 000000000000..8884a4aaa7c6 --- /dev/null +++ b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/imagelayer/BuildingMonolithicImage.java @@ -0,0 +1,38 @@ +/* + * 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.imagelayer; + +import java.util.function.BooleanSupplier; + +import org.graalvm.nativeimage.Platform; +import org.graalvm.nativeimage.Platforms; + +@Platforms(Platform.HOSTED_ONLY.class) +public class BuildingMonolithicImage implements BooleanSupplier { + @Override + public boolean getAsBoolean() { + return !ImageLayerBuildingSupport.buildingImageLayer(); + } +} diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jdk/SignalHandlerSupport.java b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jdk/SignalHandlerSupport.java index 98036218380f..0276f2e5bde4 100644 --- a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jdk/SignalHandlerSupport.java +++ b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jdk/SignalHandlerSupport.java @@ -33,7 +33,7 @@ import com.oracle.svm.core.IsolateListenerSupport.IsolateListener; import com.oracle.svm.core.IsolateListenerSupportFeature; import com.oracle.svm.core.feature.AutomaticallyRegisteredFeature; -import com.oracle.svm.core.feature.InternalFeature; +import com.oracle.svm.core.layeredimagesingleton.InitialLayerInternalFeature; import com.oracle.svm.core.util.VMError; import jdk.graal.compiler.api.replacements.Fold; @@ -62,7 +62,7 @@ public void stopDispatcherThread() { } @AutomaticallyRegisteredFeature -class SignalHandlerFeature implements InternalFeature { +class SignalHandlerFeature implements InitialLayerInternalFeature { @Override public List> getRequiredFeatures() { return List.of(RuntimeSupportFeature.class, IsolateListenerSupportFeature.class); diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/layeredimagesingleton/BuildTimeUnsavedSingleton.java b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/layeredimagesingleton/BuildTimeUnsavedSingleton.java new file mode 100644 index 000000000000..ad79a96a7e68 --- /dev/null +++ b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/layeredimagesingleton/BuildTimeUnsavedSingleton.java @@ -0,0 +1,42 @@ +/* + * 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; + +import java.util.EnumSet; + +import org.graalvm.nativeimage.Platform; +import org.graalvm.nativeimage.Platforms; + +/** + * This singleton is not persistent and is only accessed at build time. + */ +@Platforms(Platform.HOSTED_ONLY.class) +public interface BuildTimeUnsavedSingleton 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/FeatureSingleton.java b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/layeredimagesingleton/FeatureSingleton.java index c527e60e4fe0..261b8b3efd87 100644 --- 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 @@ -24,12 +24,16 @@ */ 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 diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/layeredimagesingleton/InitialLayerInternalFeature.java b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/layeredimagesingleton/InitialLayerInternalFeature.java new file mode 100644 index 000000000000..b43d48861301 --- /dev/null +++ b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/layeredimagesingleton/InitialLayerInternalFeature.java @@ -0,0 +1,38 @@ +/* + * 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; + +import com.oracle.svm.core.feature.InternalFeature; +import com.oracle.svm.core.imagelayer.ImageLayerBuildingSupport; + +/** + * Feature singleton that should only be installed in the initial layer. + */ +public interface InitialLayerInternalFeature extends InternalFeature, FeatureSingleton { + @Override + default boolean isInConfiguration(IsInConfigurationAccess access) { + return ImageLayerBuildingSupport.firstImageBuild(); + } +} 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 c8786c73fb52..01a89b424a83 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 @@ -53,5 +53,7 @@ static LayeredImageSingletonSupport singleton() { void freezeLayeredImageSingletonMetadata(); + boolean isInitialLayerOnlyImageSingleton(Class key); + JavaConstant getInitialLayerOnlyImageSingleton(Class key); } diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/os/ImageHeapProvider.java b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/os/ImageHeapProvider.java index 3f2dd1328caa..1c4acf7ba17a 100644 --- a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/os/ImageHeapProvider.java +++ b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/os/ImageHeapProvider.java @@ -26,6 +26,8 @@ import static com.oracle.svm.core.Uninterruptible.CALLED_FROM_UNINTERRUPTIBLE_CODE; +import java.util.EnumSet; + import org.graalvm.nativeimage.ImageSingletons; import org.graalvm.nativeimage.c.type.WordPointer; import org.graalvm.word.Pointer; @@ -36,6 +38,8 @@ import com.oracle.svm.core.Uninterruptible; import com.oracle.svm.core.c.function.CEntryPointErrors; import com.oracle.svm.core.heap.Heap; +import com.oracle.svm.core.layeredimagesingleton.InitialLayerOnlyImageSingleton; +import com.oracle.svm.core.layeredimagesingleton.LayeredImageSingletonBuilderFlags; import jdk.graal.compiler.api.replacements.Fold; @@ -68,7 +72,7 @@ * Note that the relocatable data may overlap with both the read-only and writable part of the image * heap. Besides that, parts of the read-only relocatable data may be writable at run-time. */ -public interface ImageHeapProvider { +public interface ImageHeapProvider extends InitialLayerOnlyImageSingleton { @Fold static ImageHeapProvider get() { return ImageSingletons.lookup(ImageHeapProvider.class); @@ -101,4 +105,14 @@ static ImageHeapProvider get() { @Uninterruptible(reason = CALLED_FROM_UNINTERRUPTIBLE_CODE, mayBeInlined = true) UnsignedWord getImageHeapAddressSpaceSize(); + + @Override + default EnumSet getImageBuilderFlags() { + return LayeredImageSingletonBuilderFlags.ALL_ACCESS; + } + + @Override + default boolean accessibleInFutureLayers() { + return true; + } } diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/os/ImageHeapProviderFeature.java b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/os/ImageHeapProviderFeature.java index cf4d711b2b4d..dd96ae9647d2 100644 --- a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/os/ImageHeapProviderFeature.java +++ b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/os/ImageHeapProviderFeature.java @@ -26,11 +26,11 @@ import org.graalvm.nativeimage.ImageSingletons; -import com.oracle.svm.core.feature.InternalFeature; import com.oracle.svm.core.feature.AutomaticallyRegisteredFeature; +import com.oracle.svm.core.layeredimagesingleton.InitialLayerInternalFeature; @AutomaticallyRegisteredFeature -public class ImageHeapProviderFeature implements InternalFeature { +public class ImageHeapProviderFeature implements InitialLayerInternalFeature { @Override public void beforeAnalysis(BeforeAnalysisAccess access) { if (!ImageSingletons.contains(ImageHeapProvider.class)) { diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/os/VirtualMemoryProvider.java b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/os/VirtualMemoryProvider.java index fa650a7912b8..907ae0a8d5fb 100644 --- a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/os/VirtualMemoryProvider.java +++ b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/os/VirtualMemoryProvider.java @@ -24,18 +24,24 @@ */ package com.oracle.svm.core.os; -import jdk.graal.compiler.api.replacements.Fold; -import jdk.graal.compiler.word.Word; +import java.util.EnumSet; + import org.graalvm.nativeimage.ImageSingletons; import org.graalvm.word.Pointer; import org.graalvm.word.PointerBase; import org.graalvm.word.UnsignedWord; import org.graalvm.word.WordBase; +import com.oracle.svm.core.layeredimagesingleton.InitialLayerOnlyImageSingleton; +import com.oracle.svm.core.layeredimagesingleton.LayeredImageSingletonBuilderFlags; + +import jdk.graal.compiler.api.replacements.Fold; +import jdk.graal.compiler.word.Word; + /** * Primitive operations for low-level virtual memory management. */ -public interface VirtualMemoryProvider { +public interface VirtualMemoryProvider extends InitialLayerOnlyImageSingleton { /** * Bitmask with the modes of protection for {@linkplain #commit committed} or * {@linkplain #mapFile mapped} memory. @@ -189,4 +195,14 @@ default UnsignedWord getAlignment() { * @return 0 when successful, or a non-zero implementation-specific error code. */ int free(PointerBase start, UnsignedWord nbytes); + + @Override + default EnumSet getImageBuilderFlags() { + return LayeredImageSingletonBuilderFlags.ALL_ACCESS; + } + + @Override + default boolean accessibleInFutureLayers() { + return true; + } } diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/reflect/RuntimeMetadataDecoder.java b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/reflect/RuntimeMetadataDecoder.java index db628afee0c3..d13d99d86b09 100644 --- a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/reflect/RuntimeMetadataDecoder.java +++ b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/reflect/RuntimeMetadataDecoder.java @@ -30,18 +30,19 @@ import java.lang.reflect.Method; import java.lang.reflect.Parameter; import java.lang.reflect.RecordComponent; +import java.util.EnumSet; import org.graalvm.nativeimage.ImageSingletons; -import org.graalvm.nativeimage.Platform; -import org.graalvm.nativeimage.Platforms; import com.oracle.svm.core.hub.DynamicHub; import com.oracle.svm.core.imagelayer.ImageLayerBuildingSupport; +import com.oracle.svm.core.layeredimagesingleton.InitialLayerOnlyImageSingleton; +import com.oracle.svm.core.layeredimagesingleton.LayeredImageSingletonBuilderFlags; import com.oracle.svm.core.reflect.target.Target_jdk_internal_reflect_ConstantPool; import jdk.graal.compiler.api.replacements.Fold; -public interface RuntimeMetadataDecoder { +public interface RuntimeMetadataDecoder extends InitialLayerOnlyImageSingleton { int NO_DATA = -1; Field[] parseFields(DynamicHub declaringType, int index, boolean publicOnly, int layerId); @@ -74,9 +75,6 @@ public interface RuntimeMetadataDecoder { boolean isNegative(int modifiers); - @Platforms(Platform.HOSTED_ONLY.class) - int getMetadataByteLength(); - class ElementDescriptor { private final Class declaringClass; @@ -154,7 +152,7 @@ public String[] getParameterTypeNames() { } } - interface MetadataAccessor { + interface MetadataAccessor extends InitialLayerOnlyImageSingleton { @Fold static MetadataAccessor singleton() { return ImageSingletons.lookup(MetadataAccessor.class); @@ -167,6 +165,16 @@ static MetadataAccessor singleton() { String getMemberName(int index, int layerId); String getOtherString(int index, int layerId); + + @Override + default EnumSet getImageBuilderFlags() { + return LayeredImageSingletonBuilderFlags.ALL_ACCESS; + } + + @Override + default boolean accessibleInFutureLayers() { + return true; + } } static int getConstantPoolLayerId(Target_jdk_internal_reflect_ConstantPool constPool) { @@ -176,4 +184,14 @@ static int getConstantPoolLayerId(Target_jdk_internal_reflect_ConstantPool const return 0; } } + + @Override + default EnumSet getImageBuilderFlags() { + return LayeredImageSingletonBuilderFlags.RUNTIME_ACCESS_ONLY; + } + + @Override + default boolean accessibleInFutureLayers() { + return true; + } } diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/stack/JavaFrameAnchors.java b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/stack/JavaFrameAnchors.java index f53e995ed585..57e958e871ab 100644 --- a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/stack/JavaFrameAnchors.java +++ b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/stack/JavaFrameAnchors.java @@ -27,7 +27,6 @@ import static com.oracle.svm.core.Uninterruptible.CALLED_FROM_UNINTERRUPTIBLE_CODE; import static jdk.graal.compiler.core.common.spi.ForeignCallDescriptor.CallSideEffect.NO_SIDE_EFFECT; -import jdk.graal.compiler.word.Word; import org.graalvm.nativeimage.CurrentIsolate; import org.graalvm.nativeimage.IsolateThread; import org.graalvm.word.Pointer; @@ -38,6 +37,7 @@ import com.oracle.svm.core.feature.AutomaticallyRegisteredFeature; import com.oracle.svm.core.feature.InternalFeature; import com.oracle.svm.core.graal.meta.SubstrateForeignCallsProvider; +import com.oracle.svm.core.layeredimagesingleton.FeatureSingleton; import com.oracle.svm.core.snippets.KnownIntrinsics; import com.oracle.svm.core.snippets.SnippetRuntime; import com.oracle.svm.core.snippets.SubstrateForeignCallTarget; @@ -52,6 +52,7 @@ import jdk.graal.compiler.core.common.spi.ForeignCallDescriptor; import jdk.graal.compiler.graph.Node; import jdk.graal.compiler.nodes.extended.ForeignCallNode; +import jdk.graal.compiler.word.Word; /** * Maintains the linked list of {@link JavaFrameAnchor} for stack walking. Note that a thread may @@ -155,7 +156,7 @@ private static void verifyFrameAnchor(JavaFrameAnchor cur, boolean newAnchor) { } @AutomaticallyRegisteredFeature -class JavaFrameAnchorsFeature implements InternalFeature { +class JavaFrameAnchorsFeature implements InternalFeature, FeatureSingleton { @Override public void registerForeignCalls(SubstrateForeignCallsProvider foreignCalls) { foreignCalls.register(JavaFrameAnchors.VERIFY_FRAME_ANCHOR_STUB); diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/stack/StackOverflowCheck.java b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/stack/StackOverflowCheck.java index cf5c7c421e1c..526fc96b37e3 100644 --- a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/stack/StackOverflowCheck.java +++ b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/stack/StackOverflowCheck.java @@ -24,11 +24,15 @@ */ package com.oracle.svm.core.stack; +import java.util.EnumSet; + import org.graalvm.nativeimage.ImageSingletons; import org.graalvm.nativeimage.c.type.WordPointer; import org.graalvm.word.UnsignedWord; import com.oracle.svm.core.Uninterruptible; +import com.oracle.svm.core.layeredimagesingleton.InitialLayerOnlyImageSingleton; +import com.oracle.svm.core.layeredimagesingleton.LayeredImageSingletonBuilderFlags; import com.oracle.svm.core.option.HostedOptionKey; import com.oracle.svm.core.thread.VMOperation; import com.oracle.svm.core.threadlocal.FastThreadLocalWord; @@ -70,7 +74,7 @@ * error. The red zone is small and sized just to do something slightly better than a segmentation * fault. */ -public interface StackOverflowCheck { +public interface StackOverflowCheck extends InitialLayerOnlyImageSingleton { class Options { @Option(help = "Size (in bytes) of the yellow zone reserved at the end of the stack. This stack space is reserved for VM use and cannot be used by the application.")// @@ -85,7 +89,7 @@ class Options { * stack that grows from higher addresses towards lower addresses. All supported platforms use * this direction. */ - interface PlatformSupport { + interface PlatformSupport extends InitialLayerOnlyImageSingleton { @Fold static PlatformSupport singleton() { return ImageSingletons.lookup(PlatformSupport.class); @@ -107,6 +111,16 @@ static PlatformSupport singleton() { */ @Uninterruptible(reason = "Called from uninterruptible code.", mayBeInlined = true) boolean lookupStack(WordPointer stackBasePtr, WordPointer stackEndPtr); + + @Override + default EnumSet getImageBuilderFlags() { + return LayeredImageSingletonBuilderFlags.ALL_ACCESS; + } + + @Override + default boolean accessibleInFutureLayers() { + return true; + } } @Fold diff --git a/substratevm/src/com.oracle.svm.hosted/resources/SharedLayerSnapshotCapnProtoSchema.capnp b/substratevm/src/com.oracle.svm.hosted/resources/SharedLayerSnapshotCapnProtoSchema.capnp index 5e1804c4fd3f..7f9f6e1c3951 100644 --- a/substratevm/src/com.oracle.svm.hosted/resources/SharedLayerSnapshotCapnProtoSchema.capnp +++ b/substratevm/src/com.oracle.svm.hosted/resources/SharedLayerSnapshotCapnProtoSchema.capnp @@ -228,6 +228,7 @@ struct ImageSingletonKey { persistFlag @1 :Int32; objectId @2 :SingletonObjId; constantId @3 :ConstantId; + isInitialLayerOnly @4 :Bool; } struct ImageSingletonObject { diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/HeapBreakdownProvider.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/HeapBreakdownProvider.java index f2f19693767e..3b123fc68e8b 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/HeapBreakdownProvider.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/HeapBreakdownProvider.java @@ -37,12 +37,12 @@ import org.graalvm.nativeimage.ImageSingletons; import com.oracle.svm.core.code.CodeInfoTable; +import com.oracle.svm.core.code.RuntimeMetadataEncoding; import com.oracle.svm.core.config.ObjectLayout; import com.oracle.svm.core.configure.ConditionalRuntimeValue; import com.oracle.svm.core.imagelayer.ImageLayerBuildingSupport; import com.oracle.svm.core.jdk.Resources; import com.oracle.svm.core.jdk.resources.ResourceStorageEntryBase; -import com.oracle.svm.core.reflect.RuntimeMetadataDecoder; import com.oracle.svm.core.util.VMError; import com.oracle.svm.hosted.FeatureImpl.BeforeImageWriteAccessImpl; import com.oracle.svm.hosted.ProgressReporter.LinkStrategy; @@ -154,7 +154,7 @@ protected void calculate(BeforeImageWriteAccessImpl access) { long codeInfoSize = codeInfoByteArrayLengths.stream().map(l -> objectLayout.getArraySize(JavaKind.Byte, l, true)).reduce(0L, Long::sum); addEntry(entries, byteArrayEntry, new HeapBreakdownEntry(BYTE_ARRAY_PREFIX, "code metadata", "#glossary-code-metadata"), codeInfoSize, codeInfoByteArrayLengths.size()); /* Extract byte[] for metadata. */ - int metadataByteLength = ImageSingletons.lookup(RuntimeMetadataDecoder.class).getMetadataByteLength(); + int metadataByteLength = RuntimeMetadataEncoding.currentLayer().getEncoding().length; if (metadataByteLength > 0) { long metadataSize = objectLayout.getArraySize(JavaKind.Byte, metadataByteLength, true); addEntry(entries, byteArrayEntry, new HeapBreakdownEntry(BYTE_ARRAY_PREFIX, "reflection metadata", "#glossary-reflection-metadata"), metadataSize, 1); 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 6700ea038e4a..0997d31b6b7c 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 @@ -26,6 +26,7 @@ import java.util.Collection; import java.util.Comparator; +import java.util.EnumSet; import java.util.HashSet; import java.util.Map; import java.util.Set; @@ -82,6 +83,12 @@ public void freezeLayeredImageSingletonMetadata() { HostedManagement.getAndAssertExists().freezeLayeredImageSingletonMetadata(); } + @Override + public boolean isInitialLayerOnlyImageSingleton(Class key) { + var loader = HostedImageLayerBuildingSupport.singleton().getSingletonLoader(); + return loader.isInitialLayerOnlyImageSingleton(key); + } + @Override public JavaConstant getInitialLayerOnlyImageSingleton(Class key) { var loader = HostedImageLayerBuildingSupport.singleton().getSingletonLoader(); @@ -229,7 +236,8 @@ private void doAddInternal(Class key, Object value) { if (value instanceof LayeredImageSingleton singleton) { assert LayeredImageSingletonBuilderFlags.verifyImageBuilderFlags(singleton); - if (checkUnsupported && singleton.getImageBuilderFlags().contains(LayeredImageSingletonBuilderFlags.UNSUPPORTED)) { + EnumSet imageBuilderFlags = singleton.getImageBuilderFlags(); + if (checkUnsupported && imageBuilderFlags.contains(LayeredImageSingletonBuilderFlags.UNSUPPORTED)) { throw UserError.abort("Unsupported image singleton is being installed %s %s", key.getTypeName(), singleton); } @@ -252,7 +260,7 @@ private void doAddInternal(Class key, Object value) { futureLayerAccessibleImageSingletonKeys.add(key); } - if (!singleton.getImageBuilderFlags().contains(LayeredImageSingletonBuilderFlags.BUILDTIME_ACCESS)) { + if (!imageBuilderFlags.contains(LayeredImageSingletonBuilderFlags.BUILDTIME_ACCESS) && !imageBuilderFlags.contains(LayeredImageSingletonBuilderFlags.UNSUPPORTED)) { storedValue = new RuntimeOnlyWrapper(singleton); } } diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/SubstrateDiagnosticFeature.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/SubstrateDiagnosticFeature.java index 139a1ebcb8c7..219f24cc92cb 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/SubstrateDiagnosticFeature.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/SubstrateDiagnosticFeature.java @@ -34,11 +34,11 @@ import com.oracle.svm.core.SubstrateDiagnostics.FatalErrorState; import com.oracle.svm.core.SubstrateOptions; import com.oracle.svm.core.feature.AutomaticallyRegisteredFeature; -import com.oracle.svm.core.feature.InternalFeature; +import com.oracle.svm.core.layeredimagesingleton.InitialLayerInternalFeature; import com.oracle.svm.hosted.FeatureImpl.BeforeAnalysisAccessImpl; @AutomaticallyRegisteredFeature -class SubstrateDiagnosticFeature implements InternalFeature { +class SubstrateDiagnosticFeature implements InitialLayerInternalFeature { @Override public void duringSetup(DuringSetupAccess access) { ImageSingletons.add(FatalErrorState.class, new FatalErrorState()); diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/heap/PodSupport.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/heap/PodSupport.java index dda94da4cbac..21327e4ac72a 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/heap/PodSupport.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/heap/PodSupport.java @@ -60,6 +60,7 @@ import com.oracle.svm.core.heap.Pod.RuntimeSupport.PodSpec; import com.oracle.svm.core.hub.Hybrid; import com.oracle.svm.core.hub.LayoutEncoding; +import com.oracle.svm.core.imagelayer.ImageLayerBuildingSupport; import com.oracle.svm.core.util.UserError; import com.oracle.svm.hosted.FeatureImpl.BeforeAnalysisAccessImpl; import com.oracle.svm.hosted.FeatureImpl.DuringSetupAccessImpl; @@ -120,6 +121,11 @@ final class PodFeature implements PodSupport, InternalFeature { private volatile boolean instantiated = false; private boolean sealed = false; + @Override + public boolean isInConfiguration(IsInConfigurationAccess access) { + return !ImageLayerBuildingSupport.buildingImageLayer(); + } + @Override public void afterRegistration(AfterRegistrationAccess access) { ImageSingletons.add(PodSupport.class, this); diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/heap/SVMImageHeapScanner.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/heap/SVMImageHeapScanner.java index f752425f1216..4276c2a76848 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/heap/SVMImageHeapScanner.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/heap/SVMImageHeapScanner.java @@ -74,15 +74,10 @@ public SVMImageHeapScanner(BigBang bb, ImageHeap imageHeap, ImageClassLoader loa economicMapImplHashArrayField = ReflectionUtil.lookupField(economicMapImpl, "hashArray"); economicMapImplTotalEntriesField = ReflectionUtil.lookupField(economicMapImpl, "totalEntries"); economicMapImplDeletedEntriesField = ReflectionUtil.lookupField(economicMapImpl, "deletedEntries"); - ImageSingletons.add(ImageHeapScanner.class, this); reflectionSupport = ImageSingletons.lookup(ReflectionHostedSupport.class); fieldValueInterceptionSupport = FieldValueInterceptionSupport.singleton(); } - public static ImageHeapScanner instance() { - return ImageSingletons.lookup(ImageHeapScanner.class); - } - @Override protected Class getClass(String className) { return loader.findClassOrFail(className); 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 2677e0ce4d8b..56a8b1859b21 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 @@ -36,18 +36,17 @@ import java.util.stream.Stream; import java.util.stream.StreamSupport; -import com.oracle.svm.shaded.org.capnproto.Text; import org.graalvm.collections.EconomicMap; import org.graalvm.collections.UnmodifiableEconomicMap; import com.oracle.svm.core.layeredimagesingleton.ImageSingletonLoader; -import com.oracle.svm.core.layeredimagesingleton.InitialLayerOnlyImageSingleton; import com.oracle.svm.core.layeredimagesingleton.LayeredImageSingleton.PersistFlags; import com.oracle.svm.core.util.UserError; import com.oracle.svm.core.util.VMError; import com.oracle.svm.hosted.imagelayer.SharedLayerSnapshotCapnProtoSchemaHolder.ImageSingletonKey; import com.oracle.svm.hosted.imagelayer.SharedLayerSnapshotCapnProtoSchemaHolder.ImageSingletonObject; import com.oracle.svm.hosted.imagelayer.SharedLayerSnapshotCapnProtoSchemaHolder.KeyStoreEntry; +import com.oracle.svm.shaded.org.capnproto.Text; import com.oracle.svm.util.ReflectionUtil; import jdk.vm.ci.meta.JavaConstant; @@ -112,11 +111,9 @@ public Map>> loadImageSingletons(Object forbiddenObject) { Class clazz = imageLayerBuildingSupport.lookupClass(false, className); singletonInitializationMap.computeIfAbsent(forbiddenObject, (k) -> new HashSet<>()); singletonInitializationMap.get(forbiddenObject).add(clazz); - if (InitialLayerOnlyImageSingleton.class.isAssignableFrom(clazz)) { + if (entry.getIsInitialLayerOnly()) { int constantId = entry.getConstantId(); - if (constantId != -1) { - initialLayerKeyToIdMap.put(clazz, constantId); - } + initialLayerKeyToIdMap.put(clazz, constantId); } } else { assert persistInfo == PersistFlags.NOTHING : "Unexpected PersistFlags value: " + persistInfo; @@ -129,6 +126,10 @@ public Map>> loadImageSingletons(Object forbiddenObject) { return singletonInitializationMap; } + public boolean isInitialLayerOnlyImageSingleton(Class key) { + return initialLayerOnlySingletonConstantIds.containsKey(key); + } + public JavaConstant loadInitialLayerOnlyImageSingleton(Class key) { int constantId = initialLayerOnlySingletonConstantIds.getOrDefault(key, -1); if (constantId != -1) { 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 30ac5015e2d8..ec157d3c4730 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 @@ -1114,6 +1114,7 @@ public void writeImageSingletonInfo(List, Object>> layeredIma constantId = initialLayerOnlySingletonMap.getOrDefault(initialLayerOnlyImageSingleton, -1); } sb.setConstantId(constantId); + sb.setIsInitialLayerOnly(singleton instanceof InitialLayerOnlyImageSingleton); } var sortedByIDs = singletonInfoMap.entrySet().stream() 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 7ec51b711a01..a951625ca0b5 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 @@ -3937,6 +3937,13 @@ public final void setConstantId(int value) { _setIntField(2, value); } + public final boolean getIsInitialLayerOnly() { + return _getBooleanField(96); + } + public final void setIsInitialLayerOnly(boolean value) { + _setBooleanField(96, value); + } + } public static final class Reader extends com.oracle.svm.shaded.org.capnproto.StructReader { @@ -3963,6 +3970,10 @@ public final int getConstantId() { return _getIntField(2); } + public final boolean getIsInitialLayerOnly() { + return _getBooleanField(96); + } + } } diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/jni/JNINativeCallWrapperMethod.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/jni/JNINativeCallWrapperMethod.java index 296bb46b9069..53c854204166 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/jni/JNINativeCallWrapperMethod.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/jni/JNINativeCallWrapperMethod.java @@ -44,7 +44,6 @@ import com.oracle.svm.core.thread.VMThreads.StatusSupport; import com.oracle.svm.hosted.annotation.CustomSubstitutionMethod; import com.oracle.svm.hosted.c.CGlobalDataFeature; -import com.oracle.svm.hosted.heap.SVMImageHeapScanner; import com.oracle.svm.util.ReflectionUtil; import jdk.graal.compiler.debug.DebugContext; @@ -113,7 +112,7 @@ public StructuredGraph buildGraph(DebugContext debug, AnalysisMethod method, Hos Function createSymbol = symbolName -> CGlobalDataFeature.singleton().registerAsAccessedOrGet(CGlobalDataFactory.forSymbol(symbolName)); CGlobalDataInfo builtinAddress = linkage.getOrCreateBuiltInAddress(createSymbol); callAddress = kit.unique(new CGlobalDataLoadAddressNode(builtinAddress)); - SVMImageHeapScanner.instance().rescanField(linkage, linkageBuiltInAddressField); + method.getUniverse().getHeapScanner().rescanField(linkage, linkageBuiltInAddressField); } else { callAddress = kit.invokeNativeCallAddress(kit.createObject(linkage)); } diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/snippets/SubstrateGraphBuilderPlugins.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/snippets/SubstrateGraphBuilderPlugins.java index da4e04ba4ea3..d384e6c3d988 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/snippets/SubstrateGraphBuilderPlugins.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/snippets/SubstrateGraphBuilderPlugins.java @@ -91,7 +91,6 @@ import com.oracle.svm.core.imagelayer.LoadImageSingletonFactory; import com.oracle.svm.core.jdk.proxy.DynamicProxyRegistry; import com.oracle.svm.core.layeredimagesingleton.ApplicationLayerOnlyImageSingleton; -import com.oracle.svm.core.layeredimagesingleton.InitialLayerOnlyImageSingleton; import com.oracle.svm.core.layeredimagesingleton.LayeredImageSingleton; import com.oracle.svm.core.layeredimagesingleton.LayeredImageSingletonBuilderFlags; import com.oracle.svm.core.layeredimagesingleton.LayeredImageSingletonSupport; @@ -1206,27 +1205,30 @@ public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, Rec public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, Receiver unused, ValueNode classNode) { Class key = constantObjectParameter(b, targetMethod, 0, Class.class, classNode); - if (ApplicationLayerOnlyImageSingleton.isAssignableFrom(key) && - ImageLayerBuildingSupport.buildingSharedLayer()) { - /* - * This singleton is only installed in the application layer heap. All other - * layers looks refer to this singleton. - */ - b.addPush(JavaKind.Object, LoadImageSingletonFactory.loadApplicationOnlyImageSingleton(key, b.getMetaAccess())); - return true; - } + var layeredSingletonSupport = LayeredImageSingletonSupport.singleton(); + if (ImageLayerBuildingSupport.buildingImageLayer()) { + if (ApplicationLayerOnlyImageSingleton.isAssignableFrom(key) && + ImageLayerBuildingSupport.buildingSharedLayer()) { + /* + * This singleton is only installed in the application layer heap. All other + * layers looks refer to this singleton. + */ + b.addPush(JavaKind.Object, LoadImageSingletonFactory.loadApplicationOnlyImageSingleton(key, b.getMetaAccess())); + return true; + } - if (InitialLayerOnlyImageSingleton.class.isAssignableFrom(key) && ImageLayerBuildingSupport.buildingExtensionLayer()) { - /* - * This singleton is only installed in the initial layer heap. When allowed, all - * other layers lookups refer to this singleton. - */ - JavaConstant initialSingleton = LayeredImageSingletonSupport.singleton().getInitialLayerOnlyImageSingleton(key); - b.addPush(JavaKind.Object, ConstantNode.forConstant(initialSingleton, b.getMetaAccess(), b.getGraph())); - return true; + if (ImageLayerBuildingSupport.buildingExtensionLayer() && layeredSingletonSupport.isInitialLayerOnlyImageSingleton(key)) { + /* + * This singleton is only installed in the initial layer heap. When allowed, + * all other layers lookups refer to this singleton. + */ + JavaConstant initialSingleton = layeredSingletonSupport.getInitialLayerOnlyImageSingleton(key); + b.addPush(JavaKind.Object, ConstantNode.forConstant(initialSingleton, b.getMetaAccess(), b.getGraph())); + return true; + } } - Object singleton = LayeredImageSingletonSupport.singleton().lookup(key, true, true); + Object singleton = layeredSingletonSupport.lookup(key, true, true); if (singleton instanceof LayeredImageSingleton layeredSingleton) { if (!layeredSingleton.getImageBuilderFlags().contains(LayeredImageSingletonBuilderFlags.RUNTIME_ACCESS)) { /*