Skip to content

[GR-66793] Use SingletonTraits to identify InitialLayerOnly Image Singletons. #11884

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Aug 5, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -24,22 +24,23 @@
*/
package com.oracle.svm.core.genscavenge;

import java.util.EnumSet;

import org.graalvm.nativeimage.PinnedObject;
import org.graalvm.nativeimage.Platform;
import org.graalvm.nativeimage.Platforms;
import org.graalvm.word.Pointer;

import com.oracle.svm.core.Uninterruptible;
import com.oracle.svm.core.heap.AbstractPinnedObjectSupport;
import com.oracle.svm.core.layeredimagesingleton.InitialLayerOnlyImageSingleton;
import com.oracle.svm.core.layeredimagesingleton.LayeredImageSingletonBuilderFlags;
import com.oracle.svm.core.traits.BuiltinTraits.AllAccess;
import com.oracle.svm.core.traits.BuiltinTraits.SingleLayer;
import com.oracle.svm.core.traits.SingletonLayeredInstallationKind.InitialLayerOnly;
import com.oracle.svm.core.traits.SingletonTraits;

import jdk.graal.compiler.nodes.NamedLocationIdentity;

/** Support for pinning objects to a memory address with {@link PinnedObject}. */
public final class PinnedObjectSupportImpl extends AbstractPinnedObjectSupport implements InitialLayerOnlyImageSingleton {
@SingletonTraits(access = AllAccess.class, layeredCallbacks = SingleLayer.class, layeredInstallationKind = InitialLayerOnly.class)
public final class PinnedObjectSupportImpl extends AbstractPinnedObjectSupport {
@Platforms(Platform.HOSTED_ONLY.class)
public PinnedObjectSupportImpl() {
}
Expand All @@ -66,14 +67,4 @@ private static void modifyPinnedObjectCount(Object object, int delta) {

assert oldValue < Integer.MAX_VALUE;
}

@Override
public EnumSet<LayeredImageSingletonBuilderFlags> getImageBuilderFlags() {
return LayeredImageSingletonBuilderFlags.ALL_ACCESS;
}

@Override
public boolean accessibleInFutureLayers() {
return true;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -53,8 +53,9 @@
import com.oracle.svm.core.graal.snippets.NodeLoweringProvider;
import com.oracle.svm.core.option.HostedOptionKey;
import com.oracle.svm.core.snippets.ExceptionUnwind;
import com.oracle.svm.core.traits.BuiltinTraits;
import com.oracle.svm.core.traits.SingletonLayeredInstallationKind;
import com.oracle.svm.core.traits.BuiltinTraits.BuildtimeAccessOnly;
import com.oracle.svm.core.traits.BuiltinTraits.NoLayeredCallbacks;
import com.oracle.svm.core.traits.SingletonLayeredInstallationKind.Disallowed;
import com.oracle.svm.core.traits.SingletonTraits;
import com.oracle.svm.core.util.UserError;
import com.oracle.svm.hosted.FeatureImpl;
Expand Down Expand Up @@ -82,7 +83,7 @@
*/
@AutomaticallyRegisteredFeature
@Platforms({Platform.LINUX.class, Platform.DARWIN.class})
@SingletonTraits(access = BuiltinTraits.BuildtimeAccessOnly.class, layeredCallbacks = BuiltinTraits.NoLayeredCallbacks.class, layeredInstallationKind = SingletonLayeredInstallationKind.Disallowed.class)
@SingletonTraits(access = BuildtimeAccessOnly.class, layeredCallbacks = NoLayeredCallbacks.class, layeredInstallationKind = Disallowed.class)
public class LLVMFeature implements InternalFeature {

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,9 +25,7 @@
package com.oracle.svm.core.posix;

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;
Expand All @@ -36,10 +34,13 @@
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.InitialLayerOnlyImageSingleton;
import com.oracle.svm.core.layeredimagesingleton.LayeredImageSingletonBuilderFlags;
import com.oracle.svm.core.imagelayer.ImageLayerBuildingSupport;
import com.oracle.svm.core.log.Log;
import com.oracle.svm.core.thread.VMThreads;
import com.oracle.svm.core.traits.BuiltinTraits.RuntimeAccessOnly;
import com.oracle.svm.core.traits.BuiltinTraits.SingleLayer;
import com.oracle.svm.core.traits.SingletonLayeredInstallationKind.InitialLayerOnly;
import com.oracle.svm.core.traits.SingletonTraits;

@AutomaticallyRegisteredFeature
class PosixLogHandlerFeature implements InternalFeature {
Expand All @@ -51,7 +52,8 @@ public void beforeAnalysis(BeforeAnalysisAccess access) {
}
}

public class PosixLogHandler implements LogHandler, InitialLayerOnlyImageSingleton {
@SingletonTraits(access = RuntimeAccessOnly.class, layeredCallbacks = SingleLayer.class, layeredInstallationKind = InitialLayerOnly.class)
public class PosixLogHandler implements LogHandler {

@Override
public void log(CCharPointer bytes, UnsignedWord length) {
Expand Down Expand Up @@ -94,14 +96,4 @@ public void fatalError() {
private static FileDescriptor getOutputFile() {
return FileDescriptor.err;
}

@Override
public EnumSet<LayeredImageSingletonBuilderFlags> getImageBuilderFlags() {
return LayeredImageSingletonBuilderFlags.RUNTIME_ACCESS_ONLY;
}

@Override
public boolean accessibleInFutureLayers() {
return true;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -26,22 +26,23 @@

import static com.oracle.svm.core.Uninterruptible.CALLED_FROM_UNINTERRUPTIBLE_CODE;

import java.util.EnumSet;

import org.graalvm.nativeimage.c.type.CCharPointer;
import org.graalvm.word.Pointer;
import org.graalvm.word.UnsignedWord;

import com.oracle.svm.core.Uninterruptible;
import com.oracle.svm.core.feature.AutomaticallyRegisteredImageSingleton;
import com.oracle.svm.core.headers.LibC;
import com.oracle.svm.core.layeredimagesingleton.InitialLayerOnlyImageSingleton;
import com.oracle.svm.core.layeredimagesingleton.LayeredImageSingletonBuilderFlags;
import com.oracle.svm.core.log.StdErrWriter;
import com.oracle.svm.core.traits.BuiltinTraits.RuntimeAccessOnly;
import com.oracle.svm.core.traits.BuiltinTraits.SingleLayer;
import com.oracle.svm.core.traits.SingletonLayeredInstallationKind.InitialLayerOnly;
import com.oracle.svm.core.traits.SingletonTraits;
import com.oracle.svm.core.util.VMError;

@AutomaticallyRegisteredImageSingleton(value = StdErrWriter.class)
class PosixStdErrWriter implements StdErrWriter, InitialLayerOnlyImageSingleton {
@SingletonTraits(access = RuntimeAccessOnly.class, layeredCallbacks = SingleLayer.class, layeredInstallationKind = InitialLayerOnly.class)
class PosixStdErrWriter implements StdErrWriter {
private static final int STDERR_FD = 2;

@Override
Expand Down Expand Up @@ -70,14 +71,4 @@ public void flush() {
LibC.setErrno(savedErrno);
}
}

@Override
public EnumSet<LayeredImageSingletonBuilderFlags> getImageBuilderFlags() {
return LayeredImageSingletonBuilderFlags.RUNTIME_ACCESS_ONLY;
}

@Override
public boolean accessibleInFutureLayers() {
return true;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -24,31 +24,22 @@
*/
package com.oracle.svm.core.posix.linux;

import java.util.EnumSet;

import org.graalvm.nativeimage.impl.ProcessPropertiesSupport;

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.posix.PosixProcessPropertiesSupport;
import com.oracle.svm.core.traits.BuiltinTraits.RuntimeAccessOnly;
import com.oracle.svm.core.traits.BuiltinTraits.SingleLayer;
import com.oracle.svm.core.traits.SingletonLayeredInstallationKind.InitialLayerOnly;
import com.oracle.svm.core.traits.SingletonTraits;

@AutomaticallyRegisteredImageSingleton(ProcessPropertiesSupport.class)
public class LinuxProcessPropertiesSupport extends PosixProcessPropertiesSupport implements InitialLayerOnlyImageSingleton {
@SingletonTraits(access = RuntimeAccessOnly.class, layeredCallbacks = SingleLayer.class, layeredInstallationKind = InitialLayerOnly.class)
public class LinuxProcessPropertiesSupport extends PosixProcessPropertiesSupport {

@Override
public String getExecutableName() {
final String exefileString = "/proc/self/exe";
return realpath(exefileString);
}

@Override
public EnumSet<LayeredImageSingletonBuilderFlags> getImageBuilderFlags() {
return LayeredImageSingletonBuilderFlags.RUNTIME_ACCESS_ONLY;
}

@Override
public boolean accessibleInFutureLayers() {
return true;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -47,12 +47,17 @@
import com.oracle.svm.core.posix.headers.darwin.DarwinPthread;
import com.oracle.svm.core.posix.linux.LinuxLibCHelper;
import com.oracle.svm.core.thread.VMThreads;
import com.oracle.svm.core.traits.BuiltinTraits.RuntimeAccessOnly;
import com.oracle.svm.core.traits.BuiltinTraits.SingleLayer;
import com.oracle.svm.core.traits.SingletonLayeredInstallationKind.InitialLayerOnly;
import com.oracle.svm.core.traits.SingletonTraits;
import com.oracle.svm.core.util.TimeUtils;
import com.oracle.svm.core.util.VMError;

import jdk.graal.compiler.word.Word;

@AutomaticallyRegisteredImageSingleton(VMThreads.class)
@SingletonTraits(access = RuntimeAccessOnly.class, layeredCallbacks = SingleLayer.class, layeredInstallationKind = InitialLayerOnly.class)
public final class PosixVMThreads extends VMThreads {

@Uninterruptible(reason = "Called from uninterruptible code.", mayBeInlined = true)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,22 +26,23 @@

import static com.oracle.svm.core.Uninterruptible.CALLED_FROM_UNINTERRUPTIBLE_CODE;

import java.util.EnumSet;

import org.graalvm.nativeimage.c.type.CCharPointer;
import org.graalvm.word.UnsignedWord;

import com.oracle.svm.core.Uninterruptible;
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.log.StdErrWriter;
import com.oracle.svm.core.traits.BuiltinTraits.RuntimeAccessOnly;
import com.oracle.svm.core.traits.BuiltinTraits.SingleLayer;
import com.oracle.svm.core.traits.SingletonLayeredInstallationKind.InitialLayerOnly;
import com.oracle.svm.core.traits.SingletonTraits;
import com.oracle.svm.core.util.VMError;
import com.oracle.svm.core.windows.headers.FileAPI;
import com.oracle.svm.core.windows.headers.WinBase.HANDLE;

@AutomaticallyRegisteredImageSingleton(value = StdErrWriter.class)
class WindowsStdErrWriter implements StdErrWriter, InitialLayerOnlyImageSingleton {
@SingletonTraits(access = RuntimeAccessOnly.class, layeredCallbacks = SingleLayer.class, layeredInstallationKind = InitialLayerOnly.class)
class WindowsStdErrWriter implements StdErrWriter {
@Override
@Uninterruptible(reason = CALLED_FROM_UNINTERRUPTIBLE_CODE, mayBeInlined = true)
public void log(CCharPointer bytes, UnsignedWord length) {
Expand All @@ -57,16 +58,6 @@ public void flush() {
WindowsUtils.flushUninterruptibly(getStdErrHandle());
}

@Override
public EnumSet<LayeredImageSingletonBuilderFlags> getImageBuilderFlags() {
return LayeredImageSingletonBuilderFlags.RUNTIME_ACCESS_ONLY;
}

@Override
public boolean accessibleInFutureLayers() {
return true;
}

@Uninterruptible(reason = CALLED_FROM_UNINTERRUPTIBLE_CODE, mayBeInlined = true)
private static HANDLE getStdErrHandle() {
return FileAPI.NoTransition.GetStdHandle(FileAPI.STD_ERROR_HANDLE());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,6 @@
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.util.Arrays;
import java.util.EnumSet;

import org.graalvm.nativeimage.ImageSingletons;
import org.graalvm.nativeimage.c.type.CCharPointer;
Expand All @@ -45,13 +44,16 @@
import com.oracle.svm.core.feature.AutomaticallyRegisteredImageSingleton;
import com.oracle.svm.core.handles.PrimitiveArrayView;
import com.oracle.svm.core.jdk.DirectByteBufferUtil;
import com.oracle.svm.core.layeredimagesingleton.InitialLayerOnlyImageSingleton;
import com.oracle.svm.core.layeredimagesingleton.LayeredImageSingletonBuilderFlags;
import com.oracle.svm.core.traits.BuiltinTraits.RuntimeAccessOnly;
import com.oracle.svm.core.traits.BuiltinTraits.SingleLayer;
import com.oracle.svm.core.traits.SingletonLayeredInstallationKind.InitialLayerOnly;
import com.oracle.svm.core.traits.SingletonTraits;

import jdk.graal.compiler.word.Word;

@AutomaticallyRegisteredImageSingleton(CTypeConversionSupport.class)
class CTypeConversionSupportImpl implements CTypeConversionSupport, InitialLayerOnlyImageSingleton {
@SingletonTraits(access = RuntimeAccessOnly.class, layeredCallbacks = SingleLayer.class, layeredInstallationKind = InitialLayerOnly.class)
class CTypeConversionSupportImpl implements CTypeConversionSupport {

static final CCharPointerHolder NULL_HOLDER = new CCharPointerHolder() {
@Override
Expand Down Expand Up @@ -193,16 +195,6 @@ public ByteBuffer asByteBuffer(PointerBase address, int size) {
ByteBuffer byteBuffer = DirectByteBufferUtil.allocate(address.rawValue(), size);
return byteBuffer.order(ConfigurationValues.getTarget().arch.getByteOrder());
}

@Override
public EnumSet<LayeredImageSingletonBuilderFlags> getImageBuilderFlags() {
return LayeredImageSingletonBuilderFlags.RUNTIME_ACCESS_ONLY;
}

@Override
public boolean accessibleInFutureLayers() {
return true;
}
}

final class CCharPointerHolderImpl implements CCharPointerHolder {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,6 @@
*/
package com.oracle.svm.core.c.function;

import java.util.EnumSet;
import java.util.List;

import org.graalvm.nativeimage.Isolate;
Expand All @@ -41,18 +40,21 @@
import com.oracle.svm.core.c.function.CEntryPointNativeFunctions.IsolateThreadPointer;
import com.oracle.svm.core.feature.AutomaticallyRegisteredImageSingleton;
import com.oracle.svm.core.graal.stackvalue.UnsafeStackValue;
import com.oracle.svm.core.layeredimagesingleton.InitialLayerOnlyImageSingleton;
import com.oracle.svm.core.layeredimagesingleton.LayeredImageSingletonBuilderFlags;
import com.oracle.svm.core.memory.NativeMemory;
import com.oracle.svm.core.nmt.NmtCategory;
import com.oracle.svm.core.option.SubstrateOptionsParser;
import com.oracle.svm.core.os.MemoryProtectionProvider;
import com.oracle.svm.core.os.MemoryProtectionProvider.UnsupportedDomainException;
import com.oracle.svm.core.traits.BuiltinTraits.RuntimeAccessOnly;
import com.oracle.svm.core.traits.BuiltinTraits.SingleLayer;
import com.oracle.svm.core.traits.SingletonLayeredInstallationKind.InitialLayerOnly;
import com.oracle.svm.core.traits.SingletonTraits;

import jdk.graal.compiler.word.Word;

@AutomaticallyRegisteredImageSingleton(IsolateSupport.class)
public final class IsolateSupportImpl implements IsolateSupport, InitialLayerOnlyImageSingleton {
@SingletonTraits(access = RuntimeAccessOnly.class, layeredCallbacks = SingleLayer.class, layeredInstallationKind = InitialLayerOnly.class)
public final class IsolateSupportImpl implements IsolateSupport {
private static final String ISOLATES_DISABLED_MESSAGE = "Spawning of multiple isolates is disabled, use " +
SubstrateOptionsParser.commandArgument(SubstrateOptions.SpawnIsolates, "+") + " option.";
private static final String PROTECTION_DOMAIN_UNSUPPORTED_MESSAGE = "Protection domains are unavailable";
Expand Down Expand Up @@ -171,14 +173,4 @@ private static void throwOnError(int code) {
throw new IsolateException(message);
}
}

@Override
public EnumSet<LayeredImageSingletonBuilderFlags> getImageBuilderFlags() {
return LayeredImageSingletonBuilderFlags.RUNTIME_ACCESS_ONLY;
}

@Override
public boolean accessibleInFutureLayers() {
return true;
}
}
Loading