diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/code/CompileQueue.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/code/CompileQueue.java index 845f878b3f55..9f91009a9435 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/code/CompileQueue.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/code/CompileQueue.java @@ -990,7 +990,7 @@ private static boolean parseInCurrentLayer(HostedMethod method) { SVMImageLayerLoader imageLayerLoader = HostedImageLayerBuildingSupport.singleton().getLoader(); hasAnalyzedGraph = imageLayerLoader.hasStrengthenedGraph(method.wrapped); } - assert hasAnalyzedGraph || method.isCompiledInPriorLayer() || method.compilationInfo.inParseQueue.get() : method; + assert hasAnalyzedGraph || !method.wrapped.reachableInCurrentLayer() || method.isCompiledInPriorLayer() || method.compilationInfo.inParseQueue.get() : method; return hasAnalyzedGraph; } @@ -1205,6 +1205,19 @@ protected void ensureCompiled(HostedMethod method, CompileReason reason) { */ return; } + if (ImageLayerBuildingSupport.buildingExtensionLayer() && !method.wrapped.reachableInCurrentLayer()) { + assert method.wrapped.isInBaseLayer(); + /* + * This method was reached and analyzed in the base layer, but it was not compiled in + * that layer, e.g., because it was always inlined. It is referenced in the app layer, + * but it was not reached during this layer's analysis, so its base layer graph was not + * loaded. However, it is considered as a potential compilation target because it is the + * implementation of a method invoked in this layer. Since we don't have an analysis + * graph we cannot compile it, however it should not be called at run time since it was + * not reached during analysis. (GR-64200) + */ + return; + } CompilationInfo compilationInfo = method.compilationInfo; assert method.getMultiMethodKey() != SubstrateCompilationDirectives.RUNTIME_COMPILED_METHOD; diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/imagelayer/SVMImageLayerLoader.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/imagelayer/SVMImageLayerLoader.java index fd08937c6fab..c75e48ef605c 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/imagelayer/SVMImageLayerLoader.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/imagelayer/SVMImageLayerLoader.java @@ -54,12 +54,7 @@ import java.util.stream.Stream; import java.util.stream.StreamSupport; -import com.oracle.svm.shaded.org.capnproto.ListReader; -import com.oracle.svm.shaded.org.capnproto.PrimitiveList; -import com.oracle.svm.shaded.org.capnproto.StructList; -import com.oracle.svm.shaded.org.capnproto.StructReader; -import com.oracle.svm.shaded.org.capnproto.Text; -import com.oracle.svm.shaded.org.capnproto.TextList; +import org.graalvm.nativeimage.AnnotationAccess; import org.graalvm.nativeimage.ImageSingletons; import org.graalvm.nativeimage.c.function.CEntryPoint; import org.graalvm.nativeimage.impl.CEntryPointLiteralCodePointer; @@ -87,6 +82,7 @@ import com.oracle.graal.pointsto.util.AnalysisFuture; import com.oracle.graal.pointsto.util.CompletionExecutor.DebugContextRunnable; import com.oracle.svm.core.SubstrateOptions; +import com.oracle.svm.core.annotate.Delete; import com.oracle.svm.core.classinitialization.ClassInitializationInfo; import com.oracle.svm.core.graal.code.CGlobalDataInfo; import com.oracle.svm.core.hub.DynamicHub; @@ -124,6 +120,12 @@ import com.oracle.svm.hosted.reflect.ReflectionFeature; import com.oracle.svm.hosted.reflect.serialize.SerializationFeature; import com.oracle.svm.hosted.util.IdentityHashCodeUtil; +import com.oracle.svm.shaded.org.capnproto.ListReader; +import com.oracle.svm.shaded.org.capnproto.PrimitiveList; +import com.oracle.svm.shaded.org.capnproto.StructList; +import com.oracle.svm.shaded.org.capnproto.StructReader; +import com.oracle.svm.shaded.org.capnproto.Text; +import com.oracle.svm.shaded.org.capnproto.TextList; import com.oracle.svm.util.LogUtils; import com.oracle.svm.util.ReflectionUtil; @@ -1536,7 +1538,7 @@ private JavaConstant lookupHostedObject(PersistedConstant.Reader baseLayerConsta } else if (relinking.isFieldConstant()) { var fieldConstant = relinking.getFieldConstant(); AnalysisField analysisField = getAnalysisFieldForBaseLayerId(fieldConstant.getOriginFieldId()); - if (!(analysisField.getWrapped() instanceof BaseLayerField)) { + if (!(analysisField.getWrapped() instanceof BaseLayerField) && !AnnotationAccess.isAnnotationPresent(analysisField, Delete.class)) { VMError.guarantee(!baseLayerConstant.getIsSimulated(), "Should not alter the initialization status for simulated constants."); /* * The declaring type of relinked fields was already initialized in the previous 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 634545ac58f8..5d6870f3e48f 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 @@ -67,15 +67,6 @@ import java.util.stream.IntStream; import java.util.stream.Stream; -import com.oracle.svm.shaded.org.capnproto.ListBuilder; -import com.oracle.svm.shaded.org.capnproto.MessageBuilder; -import com.oracle.svm.shaded.org.capnproto.PrimitiveList; -import com.oracle.svm.shaded.org.capnproto.Serialize; -import com.oracle.svm.shaded.org.capnproto.StructBuilder; -import com.oracle.svm.shaded.org.capnproto.StructList; -import com.oracle.svm.shaded.org.capnproto.Text; -import com.oracle.svm.shaded.org.capnproto.TextList; -import com.oracle.svm.shaded.org.capnproto.Void; import org.graalvm.collections.EconomicMap; import org.graalvm.collections.MapCursor; import org.graalvm.nativeimage.AnnotationAccess; @@ -104,6 +95,7 @@ import com.oracle.svm.core.FunctionPointerHolder; import com.oracle.svm.core.StaticFieldsSupport; import com.oracle.svm.core.SubstrateOptions; +import com.oracle.svm.core.annotate.Delete; import com.oracle.svm.core.classinitialization.ClassInitializationInfo; import com.oracle.svm.core.graal.code.CGlobalDataBasePointer; import com.oracle.svm.core.hub.DynamicHub; @@ -158,6 +150,15 @@ import com.oracle.svm.hosted.reflect.proxy.ProxySubstitutionType; import com.oracle.svm.hosted.substitute.PolymorphicSignatureWrapperMethod; import com.oracle.svm.hosted.substitute.SubstitutionMethod; +import com.oracle.svm.shaded.org.capnproto.ListBuilder; +import com.oracle.svm.shaded.org.capnproto.MessageBuilder; +import com.oracle.svm.shaded.org.capnproto.PrimitiveList; +import com.oracle.svm.shaded.org.capnproto.Serialize; +import com.oracle.svm.shaded.org.capnproto.StructBuilder; +import com.oracle.svm.shaded.org.capnproto.StructList; +import com.oracle.svm.shaded.org.capnproto.Text; +import com.oracle.svm.shaded.org.capnproto.TextList; +import com.oracle.svm.shaded.org.capnproto.Void; import com.oracle.svm.util.FileDumpingUtil; import com.oracle.svm.util.LogUtils; import com.oracle.svm.util.ModuleSupport; @@ -867,7 +868,8 @@ private boolean shouldRelinkConstant(ImageHeapConstant heapConstant) { } private static boolean shouldRelinkField(AnalysisField field) { - return ClassInitializationSupport.singleton().maybeInitializeAtBuildTime(field.getDeclaringClass()) && + return !AnnotationAccess.isAnnotationPresent(field, Delete.class) && + ClassInitializationSupport.singleton().maybeInitializeAtBuildTime(field.getDeclaringClass()) && field.isStatic() && field.isFinal() && field.isTrackedAcrossLayers() && field.installableInLayer(); }