Skip to content
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 @@ -28,7 +28,6 @@
import static com.oracle.svm.core.util.VMError.shouldNotReachHereUnexpectedInput;

import java.util.BitSet;
import java.util.EnumSet;
import java.util.Objects;
import java.util.TreeMap;
import java.util.function.Consumer;
Expand Down Expand Up @@ -70,12 +69,18 @@
import com.oracle.svm.core.layeredimagesingleton.ImageSingletonLoader;
import com.oracle.svm.core.layeredimagesingleton.ImageSingletonWriter;
import com.oracle.svm.core.layeredimagesingleton.LayeredImageSingleton;
import com.oracle.svm.core.layeredimagesingleton.LayeredImageSingletonBuilderFlags;
import com.oracle.svm.core.meta.SharedField;
import com.oracle.svm.core.meta.SharedMethod;
import com.oracle.svm.core.meta.SharedType;
import com.oracle.svm.core.nmt.NmtCategory;
import com.oracle.svm.core.option.HostedOptionKey;
import com.oracle.svm.core.traits.BuiltinTraits.BuildtimeAccessOnly;
import com.oracle.svm.core.traits.SingletonLayeredCallbacks;
import com.oracle.svm.core.traits.SingletonLayeredCallbacksSupplier;
import com.oracle.svm.core.traits.SingletonLayeredInstallationKind.Independent;
import com.oracle.svm.core.traits.SingletonTrait;
import com.oracle.svm.core.traits.SingletonTraitKind;
import com.oracle.svm.core.traits.SingletonTraits;
import com.oracle.svm.core.util.ByteArrayReader;
import com.oracle.svm.core.util.Counter;
import com.oracle.svm.core.util.VMError;
Expand Down Expand Up @@ -909,7 +914,8 @@ private static ValueInfo findActualValue(ValueInfo[] actualObject, UnsignedWord
}

@AutomaticallyRegisteredImageSingleton(onlyWith = BuildingImageLayerPredicate.class)
class MethodTableFirstIDTracker implements LayeredImageSingleton {
@SingletonTraits(access = BuildtimeAccessOnly.class, layeredCallbacks = MethodTableFirstIDTracker.LayeredCallbacks.class, layeredInstallationKind = Independent.class)
class MethodTableFirstIDTracker {
public final int startingID;
public int nextStartingId = -1;

Expand All @@ -925,21 +931,31 @@ private MethodTableFirstIDTracker(int id) {
startingID = id;
}

@Override
public EnumSet<LayeredImageSingletonBuilderFlags> getImageBuilderFlags() {
return LayeredImageSingletonBuilderFlags.BUILDTIME_ACCESS_ONLY;
}
static class LayeredCallbacks extends SingletonLayeredCallbacksSupplier {
@Override
public SingletonTrait getLayeredCallbacksTrait() {
return new SingletonTrait(SingletonTraitKind.LAYERED_CALLBACKS, new SingletonLayeredCallbacks<MethodTableFirstIDTracker>() {
@Override
public LayeredImageSingleton.PersistFlags doPersist(ImageSingletonWriter writer, MethodTableFirstIDTracker singleton) {
int nextStartingId = singleton.nextStartingId;
assert nextStartingId > 0 : nextStartingId;
writer.writeInt("startingID", nextStartingId);
return LayeredImageSingleton.PersistFlags.CREATE;
}

@Override
public PersistFlags preparePersist(ImageSingletonWriter writer) {
assert nextStartingId > 0 : nextStartingId;
writer.writeInt("startingID", nextStartingId);
return PersistFlags.CREATE;
@Override
public Class<? extends SingletonLayeredCallbacks.LayeredSingletonInstantiator<?>> getSingletonInstantiator() {
return SingletonInstantiator.class;
}
});
}
}

@SuppressWarnings("unused")
public static Object createFromLoader(ImageSingletonLoader loader) {
return new MethodTableFirstIDTracker(loader.readInt("startingID"));
static class SingletonInstantiator implements SingletonLayeredCallbacks.LayeredSingletonInstantiator<MethodTableFirstIDTracker> {
@Override
public MethodTableFirstIDTracker createFromLoader(ImageSingletonLoader loader) {
return new MethodTableFirstIDTracker(loader.readInt("startingID"));
}
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,6 @@

import java.lang.reflect.Field;
import java.util.Arrays;
import java.util.EnumSet;
import java.util.function.Predicate;

import org.graalvm.nativeimage.ImageSingletons;
Expand All @@ -40,7 +39,13 @@
import com.oracle.svm.core.layeredimagesingleton.ImageSingletonLoader;
import com.oracle.svm.core.layeredimagesingleton.ImageSingletonWriter;
import com.oracle.svm.core.layeredimagesingleton.LayeredImageSingleton;
import com.oracle.svm.core.layeredimagesingleton.LayeredImageSingletonBuilderFlags;
import com.oracle.svm.core.traits.BuiltinTraits.BuildtimeAccessOnly;
import com.oracle.svm.core.traits.SingletonLayeredCallbacks;
import com.oracle.svm.core.traits.SingletonLayeredCallbacksSupplier;
import com.oracle.svm.core.traits.SingletonLayeredInstallationKind.Independent;
import com.oracle.svm.core.traits.SingletonTrait;
import com.oracle.svm.core.traits.SingletonTraitKind;
import com.oracle.svm.core.traits.SingletonTraits;
import com.oracle.svm.core.util.VMError;

import jdk.graal.compiler.api.replacements.Fold;
Expand Down Expand Up @@ -157,28 +162,38 @@ public int getImageCodeInfoCodeStartOffset() {
return imageCodeInfoCodeStartOffset;
}

static class PriorKnownOffsets implements LayeredImageSingleton {
@SingletonTraits(access = BuildtimeAccessOnly.class, layeredCallbacks = PriorKnownOffsets.LayeredCallbacks.class, layeredInstallationKind = Independent.class)
static class PriorKnownOffsets {
final int[] priorValues;

PriorKnownOffsets(int[] priorValues) {
this.priorValues = priorValues;
}

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

@Override
public PersistFlags preparePersist(ImageSingletonWriter writer) {
writer.writeIntList("priorValues", Arrays.stream(priorValues).boxed().toList());
return PersistFlags.CREATE;
static class LayeredCallbacks extends SingletonLayeredCallbacksSupplier {
@Override
public SingletonTrait getLayeredCallbacksTrait() {
return new SingletonTrait(SingletonTraitKind.LAYERED_CALLBACKS, new SingletonLayeredCallbacks<PriorKnownOffsets>() {
@Override
public LayeredImageSingleton.PersistFlags doPersist(ImageSingletonWriter writer, PriorKnownOffsets singleton) {
writer.writeIntList("priorValues", Arrays.stream(singleton.priorValues).boxed().toList());
return LayeredImageSingleton.PersistFlags.CREATE;
}

@Override
public Class<? extends SingletonLayeredCallbacks.LayeredSingletonInstantiator<?>> getSingletonInstantiator() {
return SingletonInstantiator.class;
}
});
}
}

@SuppressWarnings("unused")
public static Object createFromLoader(ImageSingletonLoader loader) {
int[] priorValues = loader.readIntList("priorValues").stream().mapToInt(e -> e).toArray();
return new PriorKnownOffsets(priorValues);
static class SingletonInstantiator implements SingletonLayeredCallbacks.LayeredSingletonInstantiator<PriorKnownOffsets> {
@Override
public PriorKnownOffsets createFromLoader(ImageSingletonLoader loader) {
int[] priorValues = loader.readIntList("priorValues").stream().mapToInt(e -> e).toArray();
return new PriorKnownOffsets(priorValues);
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,6 @@
import org.graalvm.word.Pointer;

import com.oracle.svm.core.c.CGlobalData;
import com.oracle.svm.core.layeredimagesingleton.LayeredImageSingleton;

import jdk.graal.compiler.api.replacements.Fold;

Expand All @@ -38,7 +37,7 @@
* contains the addresses of various important locations and information about values to patch at
* runtime. See {@code ImageLayerSectionFeature} for details.
*/
public abstract class ImageLayerSection implements LayeredImageSingleton {
public abstract class ImageLayerSection {

protected final CGlobalData<Pointer> initialSectionStart;
protected final CGlobalData<WordPointer> cachedImageFDs;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,15 +34,14 @@
import org.graalvm.nativeimage.Platform;
import org.graalvm.nativeimage.Platforms;

import com.oracle.svm.core.layeredimagesingleton.LayeredImageSingleton;
import com.oracle.svm.core.util.UserError;

/**
* This singleton keeps track of the {@code Module#openPackages} and {@code Module#exportedPackages}
* from all image layers.
*/
@Platforms(Platform.HOSTED_ONLY.class)
public abstract class LayeredModuleSingleton implements LayeredImageSingleton {
public abstract class LayeredModuleSingleton {
public static final String ALL_UNNAMED_MODULE_NAME = "native-image-all-unnamed";
public static final String EVERYONE_MODULE_NAME = "native-image-everyone";

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,6 @@
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.EnumSet;
import java.util.IdentityHashMap;
import java.util.List;
import java.util.Set;
Expand All @@ -46,20 +45,26 @@
import com.oracle.svm.core.layeredimagesingleton.ImageSingletonLoader;
import com.oracle.svm.core.layeredimagesingleton.ImageSingletonWriter;
import com.oracle.svm.core.layeredimagesingleton.LayeredImageSingleton;
import com.oracle.svm.core.layeredimagesingleton.LayeredImageSingletonBuilderFlags;
import com.oracle.svm.core.layeredimagesingleton.LayeredImageSingletonSupport;
import com.oracle.svm.core.layeredimagesingleton.MultiLayeredImageSingleton;
import com.oracle.svm.core.traits.BuiltinTraits.AllAccess;
import com.oracle.svm.core.traits.BuiltinTraits.BuildtimeAccessOnly;
import com.oracle.svm.core.traits.BuiltinTraits.NoLayeredCallbacks;
import com.oracle.svm.core.traits.BuiltinTraits.RuntimeAccessOnly;
import com.oracle.svm.core.traits.BuiltinTraits.SingleLayer;
import com.oracle.svm.core.traits.SingletonLayeredCallbacks;
import com.oracle.svm.core.traits.SingletonLayeredCallbacksSupplier;
import com.oracle.svm.core.traits.SingletonLayeredInstallationKind.Independent;
import com.oracle.svm.core.traits.SingletonLayeredInstallationKind.InitialLayerOnly;
import com.oracle.svm.core.traits.SingletonLayeredInstallationKind.MultiLayer;
import com.oracle.svm.core.traits.SingletonTrait;
import com.oracle.svm.core.traits.SingletonTraitKind;
import com.oracle.svm.core.traits.SingletonTraits;
import com.oracle.svm.util.ReflectionUtil;

@AutomaticallyRegisteredImageSingleton
public final class StringInternSupport implements LayeredImageSingleton {
@SingletonTraits(access = BuildtimeAccessOnly.class, layeredCallbacks = StringInternSupport.LayeredCallbacks.class, layeredInstallationKind = Independent.class)
public final class StringInternSupport {

interface SetGenerator {
Set<String> generateSet();
Expand All @@ -76,11 +81,7 @@ public static Field getInternedStringsField() {

@Platforms(Platform.HOSTED_ONLY.class)
public StringInternSupport() {
this(Set.of());
}

private StringInternSupport(Object obj) {
this.priorLayersInternedStrings = obj;
this.priorLayersInternedStrings = Set.of();
}

@Platforms(Platform.HOSTED_ONLY.class)
Expand Down Expand Up @@ -167,27 +168,27 @@ public static Object getImageInternedStrings() {
return LayeredImageSingletonSupport.singleton().lookup(ImageInternedStrings.class, false, true);
}

@Override
public EnumSet<LayeredImageSingletonBuilderFlags> getImageBuilderFlags() {
return LayeredImageSingletonBuilderFlags.BUILDTIME_ACCESS_ONLY;
}
static class LayeredCallbacks extends SingletonLayeredCallbacksSupplier {
@Override
public SingletonTrait getLayeredCallbacksTrait() {
return new SingletonTrait(SingletonTraitKind.LAYERED_CALLBACKS, new SingletonLayeredCallbacks<StringInternSupport>() {
@Override
public LayeredImageSingleton.PersistFlags doPersist(ImageSingletonWriter writer, StringInternSupport singleton) {
// This can be switched to use constant ids in the future
List<String> newPriorInternedStrings = new ArrayList<>(singleton.internedStringsIdentityMap.size());

@Override
public PersistFlags preparePersist(ImageSingletonWriter writer) {
// This can be switched to use constant ids in the future
List<String> newPriorInternedStrings = new ArrayList<>(internedStringsIdentityMap.size());
newPriorInternedStrings.addAll(singleton.internedStringsIdentityMap.keySet());

newPriorInternedStrings.addAll(internedStringsIdentityMap.keySet());
writer.writeStringList("internedStrings", newPriorInternedStrings);
return LayeredImageSingleton.PersistFlags.CALLBACK_ON_REGISTRATION;
}

writer.writeStringList("internedStrings", newPriorInternedStrings);
return PersistFlags.CREATE;
}

@SuppressWarnings("unused")
public static Object createFromLoader(ImageSingletonLoader loader) {
SetGenerator gen = (() -> Set.of(loader.readStringList("internedStrings").toArray(new String[0])));

return new StringInternSupport(gen);
@Override
public void onSingletonRegistration(ImageSingletonLoader loader, StringInternSupport singleton) {
singleton.priorLayersInternedStrings = (SetGenerator) (() -> Set.of(loader.readStringList("internedStrings").toArray(new String[0])));
}
});
}
}
}

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

import java.util.ArrayList;
import java.util.EnumSet;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
Expand All @@ -38,7 +37,13 @@
import com.oracle.svm.core.layeredimagesingleton.ImageSingletonLoader;
import com.oracle.svm.core.layeredimagesingleton.ImageSingletonWriter;
import com.oracle.svm.core.layeredimagesingleton.LayeredImageSingleton;
import com.oracle.svm.core.layeredimagesingleton.LayeredImageSingletonBuilderFlags;
import com.oracle.svm.core.traits.BuiltinTraits.BuildtimeAccessOnly;
import com.oracle.svm.core.traits.SingletonLayeredCallbacks;
import com.oracle.svm.core.traits.SingletonLayeredCallbacksSupplier;
import com.oracle.svm.core.traits.SingletonLayeredInstallationKind.Independent;
import com.oracle.svm.core.traits.SingletonTrait;
import com.oracle.svm.core.traits.SingletonTraitKind;
import com.oracle.svm.core.traits.SingletonTraits;
import com.oracle.svm.core.util.ImageHeapMap.HostedImageHeapMap;

/**
Expand All @@ -50,7 +55,8 @@
* {@code ImageHeapCollectionFeature#allMaps} to ensure it is always rescanned and reachable.
*/
@Platforms(Platform.HOSTED_ONLY.class)
public class LayeredHostedImageHeapMapCollector implements LayeredImageSingleton {
@SingletonTraits(access = BuildtimeAccessOnly.class, layeredCallbacks = LayeredHostedImageHeapMapCollector.LayeredCallbacks.class, layeredInstallationKind = Independent.class)
public class LayeredHostedImageHeapMapCollector {
/**
* Map keys of maps reachable in the current layer.
*/
Expand Down Expand Up @@ -92,24 +98,36 @@ public void registerPreviousLayerHostedImageHeapMap(HostedImageHeapMap<?, ?> hos
return previousLayerReachableMaps;
}

@Override
public EnumSet<LayeredImageSingletonBuilderFlags> getImageBuilderFlags() {
return LayeredImageSingletonBuilderFlags.BUILDTIME_ACCESS_ONLY;
}
static class LayeredCallbacks extends SingletonLayeredCallbacksSupplier {

@Override
public SingletonTrait getLayeredCallbacksTrait() {
return new SingletonTrait(SingletonTraitKind.LAYERED_CALLBACKS, new SingletonLayeredCallbacks<LayeredHostedImageHeapMapCollector>() {

@Override
public LayeredImageSingleton.PersistFlags doPersist(ImageSingletonWriter writer, LayeredHostedImageHeapMapCollector singleton) {
Set<String> reachableMapKeys = new HashSet<>(singleton.currentLayerReachableMapsKeys);
if (singleton.previousLayerReachableMapKeys != null) {
reachableMapKeys.addAll(singleton.previousLayerReachableMapKeys);
}
writer.writeStringList("reachableMapKeys", reachableMapKeys.stream().toList());
return LayeredImageSingleton.PersistFlags.CREATE;
}

@Override
public PersistFlags preparePersist(ImageSingletonWriter writer) {
Set<String> reachableMapKeys = new HashSet<>(currentLayerReachableMapsKeys);
if (previousLayerReachableMapKeys != null) {
reachableMapKeys.addAll(previousLayerReachableMapKeys);
@Override
public Class<? extends LayeredSingletonInstantiator<?>> getSingletonInstantiator() {
return SingletonInstantiator.class;
}
});
}
writer.writeStringList("reachableMapKeys", reachableMapKeys.stream().toList());
return PersistFlags.CREATE;
}

@SuppressWarnings("unused")
public static Object createFromLoader(ImageSingletonLoader loader) {
List<String> previousLayerReachableMapKeys = loader.readStringList("reachableMapKeys");
return new LayeredHostedImageHeapMapCollector(previousLayerReachableMapKeys);
static class SingletonInstantiator implements SingletonLayeredCallbacks.LayeredSingletonInstantiator<LayeredHostedImageHeapMapCollector> {

@Override
public LayeredHostedImageHeapMapCollector createFromLoader(ImageSingletonLoader loader) {
List<String> previousLayerReachableMapKeys = loader.readStringList("reachableMapKeys");
return new LayeredHostedImageHeapMapCollector(previousLayerReachableMapKeys);
}
}
}
Loading