Skip to content

Commit 351aafc

Browse files
Zeaveedougxc
authored andcommitted
Persist and reload the location for the GLOBAL_NODE_CLASS_MAP
1 parent 90cf54a commit 351aafc

File tree

7 files changed

+103
-15
lines changed

7 files changed

+103
-15
lines changed

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

Lines changed: 2 additions & 0 deletions
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

Lines changed: 1 addition & 0 deletions
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

Lines changed: 3 additions & 0 deletions
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

Lines changed: 13 additions & 4 deletions
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

Lines changed: 53 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,7 @@
8383
import jdk.graal.compiler.debug.CounterKey;
8484
import jdk.graal.compiler.nodes.EncodedGraph;
8585
import jdk.graal.compiler.nodes.FieldLocationIdentity;
86+
import jdk.graal.compiler.nodes.NodeClassMap;
8687
import jdk.graal.compiler.serviceprovider.JavaVersionUtil;
8788
import jdk.graal.compiler.util.ObjectCopier;
8889
import jdk.graal.compiler.util.ObjectCopierInputStream;
@@ -230,16 +231,16 @@ private static Set<Integer> getRelinkedFields(AnalysisType type, Set<Field> type
230231
return typeRelinkedFieldsSet.stream().map(metaAccess::lookupJavaField).map(AnalysisField::getPosition).collect(Collectors.toSet());
231232
}
232233

233-
public SVMGraphEncoder getGraphEncoder() {
234-
return new SVMGraphEncoder(externalValues);
234+
public SVMGraphEncoder getGraphEncoder(boolean graph) {
235+
return new SVMGraphEncoder(externalValues, graph);
235236
}
236237

237238
public AbstractSVMGraphDecoder getGraphHostedToAnalysisElementsDecoder(SVMImageLayerLoader imageLayerLoader, AnalysisMethod analysisMethod, SnippetReflectionProvider snippetReflectionProvider) {
238239
return new SVMGraphHostedToAnalysisElementsDecoder(EncodedGraph.class.getClassLoader(), imageLayerLoader, analysisMethod, snippetReflectionProvider);
239240
}
240241

241-
public AbstractSVMGraphDecoder getGraphDecoder(SVMImageLayerLoader imageLayerLoader, AnalysisMethod analysisMethod, SnippetReflectionProvider snippetReflectionProvider) {
242-
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);
243244
}
244245

245246
/**
@@ -344,8 +345,10 @@ public static void forcePersistConstant(ImageHeapConstant imageHeapConstant) {
344345
}
345346

346347
public static class SVMGraphEncoder extends ObjectCopier.Encoder {
348+
public static final GlobalNodeClassMapBuiltin globalNodeClassMapBuiltin = new GlobalNodeClassMapBuiltin(null);
349+
347350
@SuppressWarnings("this-escape")
348-
public SVMGraphEncoder(Map<Object, Field> externalValues) {
351+
public SVMGraphEncoder(Map<Object, Field> externalValues, boolean graph) {
349352
super(externalValues);
350353
addBuiltin(new ImageHeapConstantBuiltIn(null));
351354
addBuiltin(new AnalysisTypeBuiltIn(null));
@@ -359,6 +362,9 @@ public SVMGraphEncoder(Map<Object, Field> externalValues) {
359362
addBuiltin(new CInterfaceLocationIdentityBuiltIn());
360363
addBuiltin(new FastThreadLocalLocationIdentityBuiltIn());
361364
addBuiltin(new VMThreadLocalInfoBuiltIn());
365+
if (graph) {
366+
addBuiltin(globalNodeClassMapBuiltin);
367+
}
362368
}
363369

364370
@Override
@@ -377,7 +383,7 @@ public abstract static class AbstractSVMGraphDecoder extends ObjectCopier.Decode
377383
private final HostedImageLayerBuildingSupport imageLayerBuildingSupport;
378384

379385
@SuppressWarnings("this-escape")
380-
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) {
381387
super(classLoader);
382388
this.imageLayerBuildingSupport = imageLayerLoader.getImageLayerBuildingSupport();
383389
addBuiltin(new ImageHeapConstantBuiltIn(imageLayerLoader));
@@ -390,6 +396,10 @@ public AbstractSVMGraphDecoder(ClassLoader classLoader, SVMImageLayerLoader imag
390396
addBuiltin(new CInterfaceLocationIdentityBuiltIn());
391397
addBuiltin(new FastThreadLocalLocationIdentityBuiltIn());
392398
addBuiltin(new VMThreadLocalInfoBuiltIn());
399+
// TODO: Read serialized NodeClassMap somehow and pass to constructor below
400+
if (graph) {
401+
addBuiltin(new GlobalNodeClassMapBuiltin(globalMap));
402+
}
393403
}
394404

395405
@Override
@@ -402,21 +412,55 @@ public static class SVMGraphHostedToAnalysisElementsDecoder extends AbstractSVMG
402412
@SuppressWarnings("this-escape")
403413
public SVMGraphHostedToAnalysisElementsDecoder(ClassLoader classLoader, SVMImageLayerLoader svmImageLayerLoader, AnalysisMethod analysisMethod,
404414
SnippetReflectionProvider snippetReflectionProvider) {
405-
super(classLoader, svmImageLayerLoader, analysisMethod, snippetReflectionProvider);
415+
super(classLoader, svmImageLayerLoader, analysisMethod, snippetReflectionProvider, true, null);
406416
addBuiltin(new HostedToAnalysisTypeDecoderBuiltIn(svmImageLayerLoader));
407417
addBuiltin(new HostedToAnalysisMethodDecoderBuiltIn(svmImageLayerLoader));
408418
}
409419
}
410420

411421
public static class SVMGraphDecoder extends AbstractSVMGraphDecoder {
412422
@SuppressWarnings("this-escape")
413-
public SVMGraphDecoder(ClassLoader classLoader, SVMImageLayerLoader svmImageLayerLoader, AnalysisMethod analysisMethod, SnippetReflectionProvider snippetReflectionProvider) {
414-
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);
415425
addBuiltin(new HostedTypeBuiltIn(svmImageLayerLoader));
416426
addBuiltin(new HostedMethodBuiltIn(svmImageLayerLoader));
417427
}
418428
}
419429

430+
public static class GlobalNodeClassMapBuiltin extends ObjectCopier.Builtin {
431+
private NodeClassMap globalMap;
432+
433+
protected GlobalNodeClassMapBuiltin(NodeClassMap map) {
434+
super(NodeClassMap.class);
435+
this.globalMap = map;
436+
}
437+
438+
@Override
439+
public void encode(ObjectCopier.Encoder encoder, ObjectCopierOutputStream stream, Object obj) throws IOException {
440+
if (globalMap == null) {
441+
globalMap = (NodeClassMap) obj;
442+
} else if (globalMap != obj) {
443+
throw AnalysisError.shouldNotReachHere("More than one NodeClassMap instance encountered");
444+
}
445+
}
446+
447+
@Override
448+
protected Object decode(ObjectCopier.Decoder decoder, Class<?> concreteType, ObjectCopierInputStream stream) throws IOException {
449+
if (globalMap == null) {
450+
throw AnalysisError.shouldNotReachHere("Global NodeClassMap not set");
451+
}
452+
return globalMap;
453+
}
454+
455+
public NodeClassMap getGlobalMap() {
456+
return globalMap;
457+
}
458+
459+
public void setGlobalMap(NodeClassMap globalMap) {
460+
this.globalMap = globalMap;
461+
}
462+
}
463+
420464
public static class ImageHeapConstantBuiltIn extends ObjectCopier.Builtin {
421465
private final SVMImageLayerLoader imageLayerLoader;
422466

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

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,7 @@
169169
import jdk.graal.compiler.debug.GraalError;
170170
import jdk.graal.compiler.java.LambdaUtils;
171171
import jdk.graal.compiler.nodes.EncodedGraph;
172+
import jdk.graal.compiler.nodes.NodeClassMap;
172173
import jdk.graal.compiler.nodes.spi.IdentityHashCodeProvider;
173174
import jdk.graal.compiler.util.ObjectCopier;
174175
import jdk.vm.ci.meta.JavaConstant;
@@ -297,6 +298,12 @@ public void openGraphsOutput(Path layerGraphsPath, String fileName, String suffi
297298
}
298299

299300
public void dumpFiles() {
301+
SVMImageLayerSnapshotUtil.SVMGraphEncoder graphEncoder = imageLayerSnapshotUtil.getGraphEncoder(false);
302+
NodeClassMap globalMap = SVMImageLayerSnapshotUtil.SVMGraphEncoder.globalNodeClassMapBuiltin.getGlobalMap();
303+
byte[] encodedGlobalMap = ObjectCopier.encode(graphEncoder, globalMap);
304+
String location = graphsOutput.add(encodedGlobalMap);
305+
snapshotBuilder.setGlobalNodeClassMapLocation(location);
306+
300307
graphsOutput.finish();
301308

302309
FileDumpingUtil.dumpFile(fileInfo.layerFilePath, fileInfo.fileName, fileInfo.suffix, outputStream -> {
@@ -1062,7 +1069,7 @@ private String persistGraph(AnalysisMethod method, EncodedGraph analyzedGraph) {
10621069
*/
10631070
return null;
10641071
}
1065-
byte[] encodedGraph = ObjectCopier.encode(imageLayerSnapshotUtil.getGraphEncoder(), analyzedGraph);
1072+
byte[] encodedGraph = ObjectCopier.encode(imageLayerSnapshotUtil.getGraphEncoder(true), analyzedGraph);
10661073
if (contains(encodedGraph, LambdaUtils.LAMBDA_CLASS_NAME_SUBSTRING.getBytes(StandardCharsets.UTF_8))) {
10671074
throw AnalysisError.shouldNotReachHere("The graph for the method %s contains a reference to a lambda type, which cannot be decoded: %s".formatted(method, encodedGraph));
10681075
}

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

Lines changed: 23 additions & 1 deletion
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)