Skip to content

Commit ed06e3a

Browse files
committed
[GR-62562] Skip methods not reachable in current layer from compilation.
PullRequest: graal/20543
2 parents 0abcd56 + 9afa449 commit ed06e3a

File tree

3 files changed

+35
-18
lines changed

3 files changed

+35
-18
lines changed

substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/code/CompileQueue.java

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -990,7 +990,7 @@ private static boolean parseInCurrentLayer(HostedMethod method) {
990990
SVMImageLayerLoader imageLayerLoader = HostedImageLayerBuildingSupport.singleton().getLoader();
991991
hasAnalyzedGraph = imageLayerLoader.hasStrengthenedGraph(method.wrapped);
992992
}
993-
assert hasAnalyzedGraph || method.isCompiledInPriorLayer() || method.compilationInfo.inParseQueue.get() : method;
993+
assert hasAnalyzedGraph || !method.wrapped.reachableInCurrentLayer() || method.isCompiledInPriorLayer() || method.compilationInfo.inParseQueue.get() : method;
994994
return hasAnalyzedGraph;
995995
}
996996

@@ -1205,6 +1205,19 @@ protected void ensureCompiled(HostedMethod method, CompileReason reason) {
12051205
*/
12061206
return;
12071207
}
1208+
if (ImageLayerBuildingSupport.buildingExtensionLayer() && !method.wrapped.reachableInCurrentLayer()) {
1209+
assert method.wrapped.isInBaseLayer();
1210+
/*
1211+
* This method was reached and analyzed in the base layer, but it was not compiled in
1212+
* that layer, e.g., because it was always inlined. It is referenced in the app layer,
1213+
* but it was not reached during this layer's analysis, so its base layer graph was not
1214+
* loaded. However, it is considered as a potential compilation target because it is the
1215+
* implementation of a method invoked in this layer. Since we don't have an analysis
1216+
* graph we cannot compile it, however it should not be called at run time since it was
1217+
* not reached during analysis. (GR-64200)
1218+
*/
1219+
return;
1220+
}
12081221

12091222
CompilationInfo compilationInfo = method.compilationInfo;
12101223
assert method.getMultiMethodKey() != SubstrateCompilationDirectives.RUNTIME_COMPILED_METHOD;

substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/imagelayer/SVMImageLayerLoader.java

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -54,12 +54,7 @@
5454
import java.util.stream.Stream;
5555
import java.util.stream.StreamSupport;
5656

57-
import com.oracle.svm.shaded.org.capnproto.ListReader;
58-
import com.oracle.svm.shaded.org.capnproto.PrimitiveList;
59-
import com.oracle.svm.shaded.org.capnproto.StructList;
60-
import com.oracle.svm.shaded.org.capnproto.StructReader;
61-
import com.oracle.svm.shaded.org.capnproto.Text;
62-
import com.oracle.svm.shaded.org.capnproto.TextList;
57+
import org.graalvm.nativeimage.AnnotationAccess;
6358
import org.graalvm.nativeimage.ImageSingletons;
6459
import org.graalvm.nativeimage.c.function.CEntryPoint;
6560
import org.graalvm.nativeimage.impl.CEntryPointLiteralCodePointer;
@@ -87,6 +82,7 @@
8782
import com.oracle.graal.pointsto.util.AnalysisFuture;
8883
import com.oracle.graal.pointsto.util.CompletionExecutor.DebugContextRunnable;
8984
import com.oracle.svm.core.SubstrateOptions;
85+
import com.oracle.svm.core.annotate.Delete;
9086
import com.oracle.svm.core.classinitialization.ClassInitializationInfo;
9187
import com.oracle.svm.core.graal.code.CGlobalDataInfo;
9288
import com.oracle.svm.core.hub.DynamicHub;
@@ -124,6 +120,12 @@
124120
import com.oracle.svm.hosted.reflect.ReflectionFeature;
125121
import com.oracle.svm.hosted.reflect.serialize.SerializationFeature;
126122
import com.oracle.svm.hosted.util.IdentityHashCodeUtil;
123+
import com.oracle.svm.shaded.org.capnproto.ListReader;
124+
import com.oracle.svm.shaded.org.capnproto.PrimitiveList;
125+
import com.oracle.svm.shaded.org.capnproto.StructList;
126+
import com.oracle.svm.shaded.org.capnproto.StructReader;
127+
import com.oracle.svm.shaded.org.capnproto.Text;
128+
import com.oracle.svm.shaded.org.capnproto.TextList;
127129
import com.oracle.svm.util.LogUtils;
128130
import com.oracle.svm.util.ReflectionUtil;
129131

@@ -1536,7 +1538,7 @@ private JavaConstant lookupHostedObject(PersistedConstant.Reader baseLayerConsta
15361538
} else if (relinking.isFieldConstant()) {
15371539
var fieldConstant = relinking.getFieldConstant();
15381540
AnalysisField analysisField = getAnalysisFieldForBaseLayerId(fieldConstant.getOriginFieldId());
1539-
if (!(analysisField.getWrapped() instanceof BaseLayerField)) {
1541+
if (!(analysisField.getWrapped() instanceof BaseLayerField) && !AnnotationAccess.isAnnotationPresent(analysisField, Delete.class)) {
15401542
VMError.guarantee(!baseLayerConstant.getIsSimulated(), "Should not alter the initialization status for simulated constants.");
15411543
/*
15421544
* The declaring type of relinked fields was already initialized in the previous

substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/imagelayer/SVMImageLayerWriter.java

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -67,15 +67,6 @@
6767
import java.util.stream.IntStream;
6868
import java.util.stream.Stream;
6969

70-
import com.oracle.svm.shaded.org.capnproto.ListBuilder;
71-
import com.oracle.svm.shaded.org.capnproto.MessageBuilder;
72-
import com.oracle.svm.shaded.org.capnproto.PrimitiveList;
73-
import com.oracle.svm.shaded.org.capnproto.Serialize;
74-
import com.oracle.svm.shaded.org.capnproto.StructBuilder;
75-
import com.oracle.svm.shaded.org.capnproto.StructList;
76-
import com.oracle.svm.shaded.org.capnproto.Text;
77-
import com.oracle.svm.shaded.org.capnproto.TextList;
78-
import com.oracle.svm.shaded.org.capnproto.Void;
7970
import org.graalvm.collections.EconomicMap;
8071
import org.graalvm.collections.MapCursor;
8172
import org.graalvm.nativeimage.AnnotationAccess;
@@ -104,6 +95,7 @@
10495
import com.oracle.svm.core.FunctionPointerHolder;
10596
import com.oracle.svm.core.StaticFieldsSupport;
10697
import com.oracle.svm.core.SubstrateOptions;
98+
import com.oracle.svm.core.annotate.Delete;
10799
import com.oracle.svm.core.classinitialization.ClassInitializationInfo;
108100
import com.oracle.svm.core.graal.code.CGlobalDataBasePointer;
109101
import com.oracle.svm.core.hub.DynamicHub;
@@ -158,6 +150,15 @@
158150
import com.oracle.svm.hosted.reflect.proxy.ProxySubstitutionType;
159151
import com.oracle.svm.hosted.substitute.PolymorphicSignatureWrapperMethod;
160152
import com.oracle.svm.hosted.substitute.SubstitutionMethod;
153+
import com.oracle.svm.shaded.org.capnproto.ListBuilder;
154+
import com.oracle.svm.shaded.org.capnproto.MessageBuilder;
155+
import com.oracle.svm.shaded.org.capnproto.PrimitiveList;
156+
import com.oracle.svm.shaded.org.capnproto.Serialize;
157+
import com.oracle.svm.shaded.org.capnproto.StructBuilder;
158+
import com.oracle.svm.shaded.org.capnproto.StructList;
159+
import com.oracle.svm.shaded.org.capnproto.Text;
160+
import com.oracle.svm.shaded.org.capnproto.TextList;
161+
import com.oracle.svm.shaded.org.capnproto.Void;
161162
import com.oracle.svm.util.FileDumpingUtil;
162163
import com.oracle.svm.util.LogUtils;
163164
import com.oracle.svm.util.ModuleSupport;
@@ -867,7 +868,8 @@ private boolean shouldRelinkConstant(ImageHeapConstant heapConstant) {
867868
}
868869

869870
private static boolean shouldRelinkField(AnalysisField field) {
870-
return ClassInitializationSupport.singleton().maybeInitializeAtBuildTime(field.getDeclaringClass()) &&
871+
return !AnnotationAccess.isAnnotationPresent(field, Delete.class) &&
872+
ClassInitializationSupport.singleton().maybeInitializeAtBuildTime(field.getDeclaringClass()) &&
871873
field.isStatic() && field.isFinal() && field.isTrackedAcrossLayers() && field.installableInLayer();
872874
}
873875

0 commit comments

Comments
 (0)