Skip to content

Commit 5607520

Browse files
committed
Persist and reload the location for the GLOBAL_NODE_CLASS_MAP
1 parent 690e44e commit 5607520

File tree

7 files changed

+68
-23
lines changed

7 files changed

+68
-23
lines changed

compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/nodes/GraphEncoder.java

+2
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@
4949
import jdk.graal.compiler.graph.iterators.NodeIterable;
5050
import jdk.graal.compiler.nodes.java.ExceptionObjectNode;
5151
import jdk.graal.compiler.replacements.nodes.MethodHandleWithExceptionNode;
52+
import jdk.graal.compiler.util.ObjectCopier;
5253
import jdk.vm.ci.code.Architecture;
5354

5455
/**
@@ -160,6 +161,7 @@ public class GraphEncoder {
160161
* graphs for Native Image runtime compilation must not use this map as it will contain
161162
* hosted-only types.
162163
*/
164+
@ObjectCopier.NotExternalValue(reason = "Needs to be persisted separately")
163165
private static final NodeClassMap GLOBAL_NODE_CLASS_MAP = new NodeClassMap();
164166

165167
private final InliningLogCodec inliningLogCodec;

substratevm/src/com.oracle.svm.hosted/resources/SharedLayerSnapshotCapnProtoSchema.capnp

+1
Original file line numberDiff line numberDiff line change
@@ -277,6 +277,7 @@ struct SharedLayerSnapshot {
277277
layeredRuntimeMetadataSingleton @17 :LayeredRuntimeMetadataSingleton;
278278
dynamicHubInfos @18 :List(DynamicHubInfo);
279279
hostedMethods @19 :List(PersistedHostedMethod);
280+
globalNodeClassMapLocation @20 :Text;
280281
}
281282

282283
struct StaticFinalFieldFoldingSingleton {

substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/NativeImageGenerator.java

+3
Original file line numberDiff line numberDiff line change
@@ -1040,6 +1040,9 @@ protected void setupNativeImage(String imageName, OptionValues options, Map<Meth
10401040

10411041
bb = createBigBang(debug, options, aUniverse, aMetaAccess, aProviders, annotationSubstitutions);
10421042
aUniverse.setBigBang(bb);
1043+
if (imageLayerLoader != null) {
1044+
imageLayerLoader.setGlobalNodeClassMap();
1045+
}
10431046

10441047
/* Create the HeapScanner and install it into the universe. */
10451048
ImageHeap imageHeap = new ImageHeap();

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

+13-4
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@
5454
import java.util.stream.Stream;
5555
import java.util.stream.StreamSupport;
5656

57+
import jdk.graal.compiler.nodes.NodeClassMap;
5758
import org.graalvm.nativeimage.AnnotationAccess;
5859
import org.graalvm.nativeimage.ImageSingletons;
5960
import org.graalvm.nativeimage.c.function.CEntryPoint;
@@ -190,6 +191,7 @@ public class SVMImageLayerLoader extends ImageLayerLoader {
190191
protected AnalysisMetaAccess metaAccess;
191192
protected HostedValuesProvider hostedValuesProvider;
192193
private final LayeredStaticFieldSupport layeredStaticFieldSupport = LayeredStaticFieldSupport.singleton();
194+
private NodeClassMap globalNodeClassMap;
193195

194196
public SVMImageLayerLoader(SVMImageLayerSnapshotUtil imageLayerSnapshotUtil, HostedImageLayerBuildingSupport imageLayerBuildingSupport, SharedLayerSnapshot.Reader snapshot,
195197
FileChannel graphChannel, boolean useSharedLayerGraphs) {
@@ -218,6 +220,12 @@ public void setMetaAccess(AnalysisMetaAccess metaAccess) {
218220
this.metaAccess = metaAccess;
219221
}
220222

223+
public void setGlobalNodeClassMap() {
224+
byte[] encodedGlobalNodeClassMap = readEncodedObject(snapshot.getGlobalNodeClassMapLocation().toString());
225+
globalNodeClassMap = (NodeClassMap) ObjectCopier.decode(imageLayerSnapshotUtil.getGraphDecoder(this, null, universe.getSnippetReflection(), false, globalNodeClassMap),
226+
encodedGlobalNodeClassMap);
227+
}
228+
221229
public void setHostedValuesProvider(HostedValuesProvider hostedValuesProvider) {
222230
this.hostedValuesProvider = hostedValuesProvider;
223231
}
@@ -989,8 +997,9 @@ private boolean hasGraph(AnalysisMethod analysisMethod, Function<PersistedAnalys
989997
}
990998

991999
private EncodedGraph getEncodedGraph(AnalysisMethod analysisMethod, Text.Reader location) {
992-
byte[] encodedAnalyzedGraph = readEncodedGraph(location.toString());
993-
EncodedGraph encodedGraph = (EncodedGraph) ObjectCopier.decode(imageLayerSnapshotUtil.getGraphDecoder(this, analysisMethod, universe.getSnippetReflection()), encodedAnalyzedGraph);
1000+
byte[] encodedAnalyzedGraph = readEncodedObject(location.toString());
1001+
EncodedGraph encodedGraph = (EncodedGraph) ObjectCopier.decode(imageLayerSnapshotUtil.getGraphDecoder(this, analysisMethod, universe.getSnippetReflection(), true, globalNodeClassMap),
1002+
encodedAnalyzedGraph);
9941003
for (int i = 0; i < encodedGraph.getNumObjects(); ++i) {
9951004
if (encodedGraph.getObject(i) instanceof CGlobalDataInfo cGlobalDataInfo) {
9961005
encodedGraph.setObject(i, CGlobalDataFeature.singleton().registerAsAccessedOrGet(cGlobalDataInfo.getData()));
@@ -999,7 +1008,7 @@ private EncodedGraph getEncodedGraph(AnalysisMethod analysisMethod, Text.Reader
9991008
return encodedGraph;
10001009
}
10011010

1002-
private byte[] readEncodedGraph(String location) {
1011+
private byte[] readEncodedObject(String location) {
10031012
int closingBracketAt = location.length() - 1;
10041013
AnalysisError.guarantee(location.charAt(0) == '@' && location.charAt(closingBracketAt) == ']', "Location must start with '@' and end with ']': %s", location);
10051014
int openingBracketAt = location.indexOf('[', 1, closingBracketAt);
@@ -1030,7 +1039,7 @@ private byte[] readEncodedGraph(String location) {
10301039
public void loadPriorStrengthenedGraphAnalysisElements(AnalysisMethod analysisMethod) {
10311040
if (hasStrengthenedGraph(analysisMethod)) {
10321041
PersistedAnalysisMethod.Reader methodData = getMethodData(analysisMethod);
1033-
byte[] encodedAnalyzedGraph = readEncodedGraph(methodData.getStrengthenedGraphLocation().toString());
1042+
byte[] encodedAnalyzedGraph = readEncodedObject(methodData.getStrengthenedGraphLocation().toString());
10341043
EncodedGraph graph = (EncodedGraph) ObjectCopier.decode(imageLayerSnapshotUtil.getGraphHostedToAnalysisElementsDecoder(this, analysisMethod, universe.getSnippetReflection()),
10351044
encodedAnalyzedGraph);
10361045
for (Object o : graph.getObjects()) {

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

+21-13
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,6 @@
4040
import java.util.concurrent.ConcurrentHashMap;
4141
import java.util.stream.Collectors;
4242

43-
import jdk.graal.compiler.nodes.NodeClassMap;
4443
import org.graalvm.nativeimage.ImageSingletons;
4544

4645
import com.oracle.graal.pointsto.ObjectScanner;
@@ -84,6 +83,7 @@
8483
import jdk.graal.compiler.debug.CounterKey;
8584
import jdk.graal.compiler.nodes.EncodedGraph;
8685
import jdk.graal.compiler.nodes.FieldLocationIdentity;
86+
import jdk.graal.compiler.nodes.NodeClassMap;
8787
import jdk.graal.compiler.serviceprovider.JavaVersionUtil;
8888
import jdk.graal.compiler.util.ObjectCopier;
8989
import jdk.graal.compiler.util.ObjectCopierInputStream;
@@ -231,16 +231,16 @@ private static Set<Integer> getRelinkedFields(AnalysisType type, Set<Field> type
231231
return typeRelinkedFieldsSet.stream().map(metaAccess::lookupJavaField).map(AnalysisField::getPosition).collect(Collectors.toSet());
232232
}
233233

234-
public SVMGraphEncoder getGraphEncoder() {
235-
return new SVMGraphEncoder(externalValues);
234+
public SVMGraphEncoder getGraphEncoder(boolean graph) {
235+
return new SVMGraphEncoder(externalValues, graph);
236236
}
237237

238238
public AbstractSVMGraphDecoder getGraphHostedToAnalysisElementsDecoder(SVMImageLayerLoader imageLayerLoader, AnalysisMethod analysisMethod, SnippetReflectionProvider snippetReflectionProvider) {
239239
return new SVMGraphHostedToAnalysisElementsDecoder(EncodedGraph.class.getClassLoader(), imageLayerLoader, analysisMethod, snippetReflectionProvider);
240240
}
241241

242-
public AbstractSVMGraphDecoder getGraphDecoder(SVMImageLayerLoader imageLayerLoader, AnalysisMethod analysisMethod, SnippetReflectionProvider snippetReflectionProvider) {
243-
return new SVMGraphDecoder(EncodedGraph.class.getClassLoader(), imageLayerLoader, analysisMethod, snippetReflectionProvider);
242+
public AbstractSVMGraphDecoder getGraphDecoder(SVMImageLayerLoader imageLayerLoader, AnalysisMethod analysisMethod, SnippetReflectionProvider snippetReflectionProvider, boolean graph, NodeClassMap globalNodeClassMap) {
243+
return new SVMGraphDecoder(EncodedGraph.class.getClassLoader(), imageLayerLoader, analysisMethod, snippetReflectionProvider, graph, globalNodeClassMap);
244244
}
245245

246246
/**
@@ -345,10 +345,10 @@ public static void forcePersistConstant(ImageHeapConstant imageHeapConstant) {
345345
}
346346

347347
public static class SVMGraphEncoder extends ObjectCopier.Encoder {
348-
public final GlobalNodeClassMapBuiltin globalNodeClassMapBuiltin = new GlobalNodeClassMapBuiltin(null);
348+
public static final GlobalNodeClassMapBuiltin globalNodeClassMapBuiltin = new GlobalNodeClassMapBuiltin(null);
349349

350350
@SuppressWarnings("this-escape")
351-
public SVMGraphEncoder(Map<Object, Field> externalValues) {
351+
public SVMGraphEncoder(Map<Object, Field> externalValues, boolean graph) {
352352
super(externalValues);
353353
addBuiltin(new ImageHeapConstantBuiltIn(null));
354354
addBuiltin(new AnalysisTypeBuiltIn(null));
@@ -362,7 +362,9 @@ public SVMGraphEncoder(Map<Object, Field> externalValues) {
362362
addBuiltin(new CInterfaceLocationIdentityBuiltIn());
363363
addBuiltin(new FastThreadLocalLocationIdentityBuiltIn());
364364
addBuiltin(new VMThreadLocalInfoBuiltIn());
365-
addBuiltin(globalNodeClassMapBuiltin);
365+
if (graph) {
366+
addBuiltin(globalNodeClassMapBuiltin);
367+
}
366368
}
367369

368370
@Override
@@ -381,7 +383,7 @@ public abstract static class AbstractSVMGraphDecoder extends ObjectCopier.Decode
381383
private final HostedImageLayerBuildingSupport imageLayerBuildingSupport;
382384

383385
@SuppressWarnings("this-escape")
384-
public AbstractSVMGraphDecoder(ClassLoader classLoader, SVMImageLayerLoader imageLayerLoader, AnalysisMethod analysisMethod, SnippetReflectionProvider snippetReflectionProvider) {
386+
public AbstractSVMGraphDecoder(ClassLoader classLoader, SVMImageLayerLoader imageLayerLoader, AnalysisMethod analysisMethod, SnippetReflectionProvider snippetReflectionProvider, boolean graph, NodeClassMap globalMap) {
385387
super(classLoader);
386388
this.imageLayerBuildingSupport = imageLayerLoader.getImageLayerBuildingSupport();
387389
addBuiltin(new ImageHeapConstantBuiltIn(imageLayerLoader));
@@ -395,7 +397,9 @@ public AbstractSVMGraphDecoder(ClassLoader classLoader, SVMImageLayerLoader imag
395397
addBuiltin(new FastThreadLocalLocationIdentityBuiltIn());
396398
addBuiltin(new VMThreadLocalInfoBuiltIn());
397399
// TODO: Read serialized NodeClassMap somehow and pass to constructor below
398-
addBuiltin(new GlobalNodeClassMapBuiltin(null));
400+
if (graph) {
401+
addBuiltin(new GlobalNodeClassMapBuiltin(globalMap));
402+
}
399403
}
400404

401405
@Override
@@ -408,16 +412,16 @@ public static class SVMGraphHostedToAnalysisElementsDecoder extends AbstractSVMG
408412
@SuppressWarnings("this-escape")
409413
public SVMGraphHostedToAnalysisElementsDecoder(ClassLoader classLoader, SVMImageLayerLoader svmImageLayerLoader, AnalysisMethod analysisMethod,
410414
SnippetReflectionProvider snippetReflectionProvider) {
411-
super(classLoader, svmImageLayerLoader, analysisMethod, snippetReflectionProvider);
415+
super(classLoader, svmImageLayerLoader, analysisMethod, snippetReflectionProvider, true, null);
412416
addBuiltin(new HostedToAnalysisTypeDecoderBuiltIn(svmImageLayerLoader));
413417
addBuiltin(new HostedToAnalysisMethodDecoderBuiltIn(svmImageLayerLoader));
414418
}
415419
}
416420

417421
public static class SVMGraphDecoder extends AbstractSVMGraphDecoder {
418422
@SuppressWarnings("this-escape")
419-
public SVMGraphDecoder(ClassLoader classLoader, SVMImageLayerLoader svmImageLayerLoader, AnalysisMethod analysisMethod, SnippetReflectionProvider snippetReflectionProvider) {
420-
super(classLoader, svmImageLayerLoader, analysisMethod, snippetReflectionProvider);
423+
public SVMGraphDecoder(ClassLoader classLoader, SVMImageLayerLoader svmImageLayerLoader, AnalysisMethod analysisMethod, SnippetReflectionProvider snippetReflectionProvider, boolean graph, NodeClassMap globalMap) {
424+
super(classLoader, svmImageLayerLoader, analysisMethod, snippetReflectionProvider, graph, globalMap);
421425
addBuiltin(new HostedTypeBuiltIn(svmImageLayerLoader));
422426
addBuiltin(new HostedMethodBuiltIn(svmImageLayerLoader));
423427
}
@@ -451,6 +455,10 @@ protected Object decode(ObjectCopier.Decoder decoder, Class<?> concreteType, Obj
451455
public NodeClassMap getGlobalMap() {
452456
return globalMap;
453457
}
458+
459+
public void setGlobalMap(NodeClassMap globalMap) {
460+
this.globalMap = globalMap;
461+
}
454462
}
455463

456464
public static class ImageHeapConstantBuiltIn extends ObjectCopier.Builtin {

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

+5-5
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,6 @@
6767
import java.util.stream.IntStream;
6868
import java.util.stream.Stream;
6969

70-
import jdk.graal.compiler.nodes.NodeClassMap;
7170
import org.graalvm.collections.EconomicMap;
7271
import org.graalvm.collections.MapCursor;
7372
import org.graalvm.nativeimage.AnnotationAccess;
@@ -170,6 +169,7 @@
170169
import jdk.graal.compiler.debug.GraalError;
171170
import jdk.graal.compiler.java.LambdaUtils;
172171
import jdk.graal.compiler.nodes.EncodedGraph;
172+
import jdk.graal.compiler.nodes.NodeClassMap;
173173
import jdk.graal.compiler.nodes.spi.IdentityHashCodeProvider;
174174
import jdk.graal.compiler.util.ObjectCopier;
175175
import jdk.vm.ci.meta.JavaConstant;
@@ -298,11 +298,11 @@ public void openGraphsOutput(Path layerGraphsPath, String fileName, String suffi
298298
}
299299

300300
public void dumpFiles() {
301-
SVMImageLayerSnapshotUtil.SVMGraphEncoder graphEncoder = imageLayerSnapshotUtil.getGraphEncoder();
302-
NodeClassMap globalMap = graphEncoder.globalNodeClassMapBuiltin.getGlobalMap();
301+
SVMImageLayerSnapshotUtil.SVMGraphEncoder graphEncoder = imageLayerSnapshotUtil.getGraphEncoder(false);
302+
NodeClassMap globalMap = SVMImageLayerSnapshotUtil.SVMGraphEncoder.globalNodeClassMapBuiltin.getGlobalMap();
303303
byte[] encodedGlobalMap = ObjectCopier.encode(graphEncoder, globalMap);
304304
String location = graphsOutput.add(encodedGlobalMap);
305-
// TODO write location somewhere that decoding can find
305+
snapshotBuilder.setGlobalNodeClassMapLocation(location);
306306

307307
graphsOutput.finish();
308308

@@ -1069,7 +1069,7 @@ private String persistGraph(AnalysisMethod method, EncodedGraph analyzedGraph) {
10691069
*/
10701070
return null;
10711071
}
1072-
byte[] encodedGraph = ObjectCopier.encode(imageLayerSnapshotUtil.getGraphEncoder(), analyzedGraph);
1072+
byte[] encodedGraph = ObjectCopier.encode(imageLayerSnapshotUtil.getGraphEncoder(true), analyzedGraph);
10731073
if (contains(encodedGraph, LambdaUtils.LAMBDA_CLASS_NAME_SUBSTRING.getBytes(StandardCharsets.UTF_8))) {
10741074
throw AnalysisError.shouldNotReachHere("The graph for the method %s contains a reference to a lambda type, which cannot be decoded: %s".formatted(method, encodedGraph));
10751075
}

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

+23-1
Original file line numberDiff line numberDiff line change
@@ -4596,7 +4596,7 @@ public final com.oracle.svm.shaded.org.capnproto.StructList.Reader<com.oracle.sv
45964596

45974597

45984598
public static class SharedLayerSnapshot {
4599-
public static final com.oracle.svm.shaded.org.capnproto.StructSize STRUCT_SIZE = new com.oracle.svm.shaded.org.capnproto.StructSize((short)5,(short)12);
4599+
public static final com.oracle.svm.shaded.org.capnproto.StructSize STRUCT_SIZE = new com.oracle.svm.shaded.org.capnproto.StructSize((short)5,(short)13);
46004600
public static final class Factory extends com.oracle.svm.shaded.org.capnproto.StructFactory<Builder, Reader> {
46014601
public Factory() {
46024602
}
@@ -4817,6 +4817,21 @@ public final void setHostedMethods(com.oracle.svm.shaded.org.capnproto.StructLis
48174817
public final com.oracle.svm.shaded.org.capnproto.StructList.Builder<com.oracle.svm.hosted.imagelayer.SharedLayerSnapshotCapnProtoSchemaHolder.PersistedHostedMethod.Builder> initHostedMethods(int size) {
48184818
return _initPointerField(com.oracle.svm.hosted.imagelayer.SharedLayerSnapshotCapnProtoSchemaHolder.PersistedHostedMethod.listFactory, 11, size);
48194819
}
4820+
public final boolean hasGlobalNodeClassMapLocation() {
4821+
return !_pointerFieldIsNull(12);
4822+
}
4823+
public final com.oracle.svm.shaded.org.capnproto.Text.Builder getGlobalNodeClassMapLocation() {
4824+
return _getPointerField(com.oracle.svm.shaded.org.capnproto.Text.factory, 12, null, 0, 0);
4825+
}
4826+
public final void setGlobalNodeClassMapLocation(com.oracle.svm.shaded.org.capnproto.Text.Reader value) {
4827+
_setPointerField(com.oracle.svm.shaded.org.capnproto.Text.factory, 12, value);
4828+
}
4829+
public final void setGlobalNodeClassMapLocation(String value) {
4830+
_setPointerField(com.oracle.svm.shaded.org.capnproto.Text.factory, 12, new com.oracle.svm.shaded.org.capnproto.Text.Reader(value));
4831+
}
4832+
public final com.oracle.svm.shaded.org.capnproto.Text.Builder initGlobalNodeClassMapLocation(int size) {
4833+
return _initPointerField(com.oracle.svm.shaded.org.capnproto.Text.factory, 12, size);
4834+
}
48204835
}
48214836

48224837
public static final class Reader extends com.oracle.svm.shaded.org.capnproto.StructReader {
@@ -4940,6 +4955,13 @@ public final com.oracle.svm.shaded.org.capnproto.StructList.Reader<com.oracle.sv
49404955
return _getPointerField(com.oracle.svm.hosted.imagelayer.SharedLayerSnapshotCapnProtoSchemaHolder.PersistedHostedMethod.listFactory, 11, null, 0);
49414956
}
49424957

4958+
public boolean hasGlobalNodeClassMapLocation() {
4959+
return !_pointerFieldIsNull(12);
4960+
}
4961+
public com.oracle.svm.shaded.org.capnproto.Text.Reader getGlobalNodeClassMapLocation() {
4962+
return _getPointerField(com.oracle.svm.shaded.org.capnproto.Text.factory, 12, null, 0, 0);
4963+
}
4964+
49434965
}
49444966

49454967
}

0 commit comments

Comments
 (0)