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
6 changes: 6 additions & 0 deletions sdk/src/org.graalvm.nativeimage/snapshot.sigtest
Original file line number Diff line number Diff line change
Expand Up @@ -943,6 +943,7 @@ innr public abstract interface static AfterImageWriteAccess
innr public abstract interface static AfterRegistrationAccess
innr public abstract interface static BeforeAnalysisAccess
innr public abstract interface static BeforeCompilationAccess
innr public abstract interface static BeforeHeapLayoutAccess
innr public abstract interface static BeforeImageWriteAccess
innr public abstract interface static BeforeUniverseBuildingAccess
innr public abstract interface static CompilationAccess
Expand All @@ -963,6 +964,7 @@ meth public void afterImageWrite(org.graalvm.nativeimage.hosted.Feature$AfterIma
meth public void afterRegistration(org.graalvm.nativeimage.hosted.Feature$AfterRegistrationAccess)
meth public void beforeAnalysis(org.graalvm.nativeimage.hosted.Feature$BeforeAnalysisAccess)
meth public void beforeCompilation(org.graalvm.nativeimage.hosted.Feature$BeforeCompilationAccess)
meth public void beforeHeapLayout(org.graalvm.nativeimage.hosted.Feature$BeforeHeapLayoutAccess)
meth public void beforeImageWrite(org.graalvm.nativeimage.hosted.Feature$BeforeImageWriteAccess)
meth public void beforeUniverseBuilding(org.graalvm.nativeimage.hosted.Feature$BeforeUniverseBuildingAccess)
meth public void cleanup()
Expand Down Expand Up @@ -1008,6 +1010,10 @@ CLSS public abstract interface static org.graalvm.nativeimage.hosted.Feature$Bef
outer org.graalvm.nativeimage.hosted.Feature
intf org.graalvm.nativeimage.hosted.Feature$CompilationAccess

CLSS public abstract interface static org.graalvm.nativeimage.hosted.Feature$BeforeHeapLayoutAccess
outer org.graalvm.nativeimage.hosted.Feature
intf org.graalvm.nativeimage.hosted.Feature$CompilationAccess

CLSS public abstract interface static org.graalvm.nativeimage.hosted.Feature$BeforeImageWriteAccess
outer org.graalvm.nativeimage.hosted.Feature
intf org.graalvm.nativeimage.hosted.Feature$FeatureAccess
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright (c) 2013, 2022, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2013, 2023, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* The Universal Permissive License (UPL), Version 1.0
Expand Down Expand Up @@ -452,6 +452,15 @@ interface BeforeCompilationAccess extends CompilationAccess {
interface AfterCompilationAccess extends CompilationAccess {
}

/**
* Access methods available for {@link Feature#beforeHeapLayout}.
*
* @since 23.2
*/
@Platforms(Platform.HOSTED_ONLY.class)
interface BeforeHeapLayoutAccess extends CompilationAccess {
}

/**
* Access methods available for {@link Feature#afterHeapLayout}.
*
Expand Down Expand Up @@ -607,6 +616,16 @@ default void beforeCompilation(BeforeCompilationAccess access) {
default void afterCompilation(AfterCompilationAccess access) {
}

/**
* Handler for initializations before the native image heap and code layout.
*
* @param access The supported operations that the feature can perform at this time
*
* @since 23.2
*/
default void beforeHeapLayout(BeforeHeapLayoutAccess access) {
}

/**
* Handler for initializations after the native image heap and code layout. Objects and methods
* have their offsets assigned. At this point, no additional objects must be added to the native
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,16 +29,26 @@
import org.graalvm.nativeimage.Platform;
import org.graalvm.nativeimage.Platforms;

import com.oracle.svm.core.BuildPhaseProvider.ReadyForCompilation;
import com.oracle.svm.core.SubstrateOptions;
import com.oracle.svm.core.heap.UnknownPrimitiveField;

public final class KnownOffsets {
@UnknownPrimitiveField(availability = ReadyForCompilation.class) //
private int vtableBaseOffset;
@UnknownPrimitiveField(availability = ReadyForCompilation.class) //
private int vtableEntrySize;
@UnknownPrimitiveField(availability = ReadyForCompilation.class) //
private int typeIDSlotsOffset;
@UnknownPrimitiveField(availability = ReadyForCompilation.class) //
private int componentHubOffset;
@UnknownPrimitiveField(availability = ReadyForCompilation.class) //
private int javaFrameAnchorLastSPOffset;
@UnknownPrimitiveField(availability = ReadyForCompilation.class) //
private int javaFrameAnchorLastIPOffset;
@UnknownPrimitiveField(availability = ReadyForCompilation.class) //
private int vmThreadStatusOffset;
@UnknownPrimitiveField(availability = ReadyForCompilation.class) //
private int imageCodeInfoCodeStartOffset;

@Fold
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,7 @@
import org.graalvm.nativeimage.AnnotationAccess;
import org.graalvm.nativeimage.Platform;
import org.graalvm.nativeimage.Platforms;
import org.graalvm.nativeimage.hosted.Feature;
import org.graalvm.nativeimage.hosted.Feature.BeforeHeapLayoutAccess;

import com.oracle.svm.core.SubstrateTargetDescription;
import com.oracle.svm.core.config.ConfigurationValues;
Expand Down Expand Up @@ -163,7 +163,7 @@ public SubstrateReplacements(Providers providers, SnippetReflectionProvider snip
}

@Platforms(Platform.HOSTED_ONLY.class)
public void registerImmutableObjects(Feature.CompilationAccess access) {
public void registerImmutableObjects(BeforeHeapLayoutAccess access) {
access.registerAsImmutable(this);
access.registerAsImmutable(snippetEncoding);
access.registerAsImmutable(snippetObjects);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@
import java.util.stream.StreamSupport;

import org.graalvm.collections.EconomicMap;
import org.graalvm.collections.EconomicSet;
import org.graalvm.collections.MapCursor;
import org.graalvm.collections.Pair;
import org.graalvm.nativeimage.ImageSingletons;
import org.graalvm.nativeimage.Platform;
Expand Down Expand Up @@ -88,7 +88,7 @@ public static Resources singleton() {
* com.oracle.svm.hosted.ModuleLayerFeature}.
*/
private final EconomicMap<Pair<Module, String>, ResourceStorageEntryBase> resources = ImageHeapMap.create();
private final EconomicSet<ModuleResourcePair> includePatterns = EconomicSet.create();
private final EconomicMap<ModuleResourcePair, Boolean> includePatterns = ImageHeapMap.create();

public record ModuleResourcePair(String module, String resource) {
}
Expand Down Expand Up @@ -280,7 +280,7 @@ public void registerIncludePattern(String module, String pattern) {
assert MissingRegistrationUtils.throwMissingRegistrationErrors();
synchronized (includePatterns) {
updateTimeStamp();
includePatterns.add(new ModuleResourcePair(module, pattern));
includePatterns.put(new ModuleResourcePair(module, pattern), Boolean.TRUE);
}
}

Expand Down Expand Up @@ -321,7 +321,9 @@ public ResourceStorageEntryBase get(Module module, String resourceName, boolean
ResourceStorageEntryBase entry = resources.get(createStorageKey(module, canonicalResourceName));
if (entry == null) {
if (MissingRegistrationUtils.throwMissingRegistrationErrors()) {
for (ModuleResourcePair moduleResourcePair : includePatterns) {
MapCursor<ModuleResourcePair, Boolean> cursor = includePatterns.getEntries();
while (cursor.advance()) {
ModuleResourcePair moduleResourcePair = cursor.getKey();
if (Objects.equals(moduleName, moduleResourcePair.module) &&
(matchResource(moduleResourcePair.resource, resourceName) || matchResource(moduleResourcePair.resource, canonicalResourceName))) {
return null;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,8 +33,10 @@
import org.graalvm.word.WordBase;
import org.graalvm.word.WordFactory;

import com.oracle.svm.core.BuildPhaseProvider.ReadyForCompilation;
import com.oracle.svm.core.StaticFieldsSupport;
import com.oracle.svm.core.Uninterruptible;
import com.oracle.svm.core.heap.UnknownPrimitiveField;
import com.oracle.svm.core.jni.headers.JNIFieldId;

import jdk.vm.ci.meta.JavaKind;
Expand Down Expand Up @@ -76,6 +78,7 @@ public static WordBase getOffsetFromId(JNIFieldId id) {
* <li>Remaining 62 bits for (unsigned) offset in the object</li>
* </ul>
*/
@UnknownPrimitiveField(availability = ReadyForCompilation.class)//
private UnsignedWord id = WordFactory.zero();

@Platforms(HOSTED_ONLY.class)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,9 @@
import org.graalvm.word.PointerBase;

import com.oracle.svm.core.AlwaysInline;
import com.oracle.svm.core.BuildPhaseProvider.ReadyForCompilation;
import com.oracle.svm.core.Uninterruptible;
import com.oracle.svm.core.heap.UnknownPrimitiveField;
import com.oracle.svm.core.jni.CallVariant;
import com.oracle.svm.core.util.VMError;
import com.oracle.svm.util.ReflectionUtil;
Expand Down Expand Up @@ -71,15 +73,25 @@ public static ResolvedJavaField getCallVariantWrapperField(MetaAccessProvider me
}

private final int modifiers;
@UnknownPrimitiveField(availability = ReadyForCompilation.class)//
private int vtableOffset = VTABLE_OFFSET_NOT_YET_COMPUTED;
@UnknownPrimitiveField(availability = ReadyForCompilation.class)//
private CodePointer nonvirtualTarget;
@UnknownPrimitiveField(availability = ReadyForCompilation.class)//
private PointerBase newObjectTarget; // for constructors
@UnknownPrimitiveField(availability = ReadyForCompilation.class)//
private CodePointer callWrapper;
@UnknownPrimitiveField(availability = ReadyForCompilation.class)//
@SuppressWarnings("unused") private CodePointer varargsWrapper;
@UnknownPrimitiveField(availability = ReadyForCompilation.class)//
@SuppressWarnings("unused") private CodePointer arrayWrapper;
@UnknownPrimitiveField(availability = ReadyForCompilation.class)//
@SuppressWarnings("unused") private CodePointer valistWrapper;
@UnknownPrimitiveField(availability = ReadyForCompilation.class)//
@SuppressWarnings("unused") private CodePointer varargsNonvirtualWrapper;
@UnknownPrimitiveField(availability = ReadyForCompilation.class)//
@SuppressWarnings("unused") private CodePointer arrayNonvirtualWrapper;
@UnknownPrimitiveField(availability = ReadyForCompilation.class)//
@SuppressWarnings("unused") private CodePointer valistNonvirtualWrapper;

@Platforms(HOSTED_ONLY.class)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,15 +31,16 @@
import java.lang.invoke.SerializedLambda;
import java.lang.reflect.Constructor;
import java.lang.reflect.Modifier;
import java.util.Map;
import java.util.Objects;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;

import org.graalvm.collections.EconomicMap;
import org.graalvm.compiler.java.LambdaUtils;
import org.graalvm.nativeimage.Platform;
import org.graalvm.nativeimage.Platforms;

import com.oracle.svm.core.util.ImageHeapMap;
import com.oracle.svm.core.util.VMError;

public class SerializationSupport implements SerializationRegistry {
Expand Down Expand Up @@ -114,11 +115,11 @@ public int hashCode() {
}
}

private final Map<SerializationLookupKey, Object> constructorAccessors;
private final EconomicMap<SerializationLookupKey, Object> constructorAccessors;

@Platforms(Platform.HOSTED_ONLY.class)
public SerializationSupport(Constructor<?> stubConstructor) {
constructorAccessors = new ConcurrentHashMap<>();
constructorAccessors = ImageHeapMap.create();
this.stubConstructor = stubConstructor;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@
import org.graalvm.nativeimage.ImageSingletons;
import org.graalvm.nativeimage.Platform;
import org.graalvm.nativeimage.Platforms;
import org.graalvm.nativeimage.hosted.Feature.CompilationAccess;
import org.graalvm.nativeimage.hosted.Feature.BeforeHeapLayoutAccess;
import org.graalvm.nativeimage.hosted.Feature.DuringAnalysisAccess;
import org.graalvm.nativeimage.hosted.Feature.FeatureAccess;
import org.graalvm.word.Pointer;
Expand Down Expand Up @@ -301,7 +301,7 @@ public static void rescan(AnalysisUniverse universe, Object object) {
}

@Platforms(Platform.HOSTED_ONLY.class)
public static void registerImmutableObjects(CompilationAccess access) {
public static void registerImmutableObjects(BeforeHeapLayoutAccess access) {
access.registerAsImmutable(get().graphEncoding);
access.registerAsImmutable(get().graphObjects);
access.registerAsImmutable(get().graphNodeTypes);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@
import org.graalvm.compiler.nodes.FieldLocationIdentity;
import org.graalvm.compiler.phases.util.Providers;
import org.graalvm.nativeimage.c.function.RelocatedPointer;
import org.graalvm.nativeimage.hosted.Feature.CompilationAccess;
import org.graalvm.nativeimage.hosted.Feature.BeforeHeapLayoutAccess;

import com.oracle.graal.pointsto.constraints.UnsupportedFeatureException;
import com.oracle.graal.pointsto.meta.AnalysisField;
Expand Down Expand Up @@ -465,7 +465,7 @@ public void updateSubstrateDataAfterHeapLayout(HostedUniverse hUniverse) {
}
}

public void registerImmutableObjects(CompilationAccess access) {
public void registerImmutableObjects(BeforeHeapLayoutAccess access) {
for (SubstrateMethod method : methods.values()) {
access.registerAsImmutable(method);
access.registerAsImmutable(method.getRawImplementations());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -517,6 +517,11 @@ public void afterCompilation(AfterCompilationAccess a) {
super.afterCompilationHelper(a);
}

@Override
public void beforeHeapLayout(BeforeHeapLayoutAccess a) {
super.beforeHeapLayoutHelper(a);
}

@Override
public void afterHeapLayout(AfterHeapLayoutAccess a) {
super.afterHeapLayoutHelper(a);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -714,6 +714,11 @@ public void afterCompilation(AfterCompilationAccess a) {
super.afterCompilationHelper(a);
}

@Override
public void beforeHeapLayout(BeforeHeapLayoutAccess a) {
super.beforeHeapLayoutHelper(a);
}

@Override
public void afterHeapLayout(AfterHeapLayoutAccess a) {
afterHeapLayoutHelper(a);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,7 @@
import org.graalvm.nativeimage.hosted.Feature.AfterCompilationAccess;
import org.graalvm.nativeimage.hosted.Feature.AfterHeapLayoutAccess;
import org.graalvm.nativeimage.hosted.Feature.BeforeAnalysisAccess;
import org.graalvm.nativeimage.hosted.Feature.BeforeHeapLayoutAccess;
import org.graalvm.nativeimage.hosted.Feature.DuringSetupAccess;
import org.graalvm.nativeimage.hosted.RuntimeReflection;

Expand Down Expand Up @@ -653,10 +654,12 @@ protected final void afterCompilationHelper(AfterCompilationAccess a) {
HostedMetaAccess hMetaAccess = config.getMetaAccess();
HostedUniverse hUniverse = hMetaAccess.getUniverse();
objectReplacer.updateSubstrateDataAfterCompilation(hUniverse, config.getProviders());
}

objectReplacer.registerImmutableObjects(config);
GraalSupport.registerImmutableObjects(config);
((SubstrateReplacements) GraalSupport.getRuntimeConfig().getProviders().getReplacements()).registerImmutableObjects(config);
protected final void beforeHeapLayoutHelper(BeforeHeapLayoutAccess a) {
objectReplacer.registerImmutableObjects(a);
GraalSupport.registerImmutableObjects(a);
((SubstrateReplacements) GraalSupport.getRuntimeConfig().getProviders().getReplacements()).registerImmutableObjects(a);
}

protected final void afterHeapLayoutHelper(AfterHeapLayoutAccess a) {
Expand Down
Loading