74
74
import org .graalvm .collections .EconomicMap ;
75
75
76
76
import com .oracle .graal .pointsto .BigBang ;
77
+ import com .oracle .graal .pointsto .infrastructure .Universe ;
77
78
import com .oracle .graal .pointsto .meta .AnalysisField ;
78
79
import com .oracle .graal .pointsto .meta .AnalysisMethod ;
79
80
import com .oracle .graal .pointsto .meta .AnalysisType ;
@@ -128,9 +129,11 @@ protected static boolean isTypeSwitch(AnalysisType type) {
128
129
return type .toJavaName ().contains (TYPE_SWITCH_SUBSTRING );
129
130
}
130
131
131
- public void persist (AnalysisUniverse analysisUniverse , Path layerSnapshotPath , String fileName , String suffix ) {
132
+ public void persist (Universe hostedUniverse , AnalysisUniverse analysisUniverse , Path layerSnapshotPath , String fileName , String suffix ) {
132
133
EconomicMap <String , Object > jsonMap = EconomicMap .create ();
133
134
135
+ persistHook (hostedUniverse , analysisUniverse , jsonMap );
136
+
134
137
jsonMap .put (NEXT_TYPE_ID_TAG , analysisUniverse .getNextTypeId ());
135
138
jsonMap .put (NEXT_METHOD_ID_TAG , analysisUniverse .getNextMethodId ());
136
139
jsonMap .put (NEXT_FIELD_ID_TAG , analysisUniverse .getNextFieldId ());
@@ -157,7 +160,7 @@ public void persist(AnalysisUniverse analysisUniverse, Path layerSnapshotPath, S
157
160
158
161
EconomicMap <String , EconomicMap <String , Object >> fieldsMap = EconomicMap .create ();
159
162
for (AnalysisField field : analysisUniverse .getFields ().stream ().filter (AnalysisField ::isReachable ).toList ()) {
160
- persistField (fieldsMap , field );
163
+ persistField (fieldsMap , field , hostedUniverse );
161
164
}
162
165
jsonMap .put (FIELDS_TAG , fieldsMap );
163
166
@@ -172,6 +175,15 @@ public void persist(AnalysisUniverse analysisUniverse, Path layerSnapshotPath, S
172
175
FileDumpingUtil .dumpFile (layerSnapshotPath , fileName , suffix , writer -> JSONFormatter .printJSON (jsonMap , writer ));
173
176
}
174
177
178
+ /**
179
+ * A hook used to persist more general information about the base layer not accessible in
180
+ * pointsto.
181
+ */
182
+ @ SuppressWarnings ("unused" )
183
+ protected void persistHook (Universe hostedUniverse , AnalysisUniverse analysisUniverse , EconomicMap <String , Object > jsonMap ) {
184
+
185
+ }
186
+
175
187
private static void persistType (EconomicMap <String , Object > typesMap , AnalysisType type , String typeIdentifier ) {
176
188
EconomicMap <String , Object > typeMap = EconomicMap .create ();
177
189
typeMap .put (ID_TAG , type .getId ());
@@ -223,14 +235,16 @@ public void persistMethod(EconomicMap<String, Object> methodsMap, AnalysisMethod
223
235
methodsMap .put (name , methodMap );
224
236
}
225
237
226
- private static void persistField (EconomicMap <String , EconomicMap <String , Object >> fieldsMap , AnalysisField field ) {
238
+ private void persistField (EconomicMap <String , EconomicMap <String , Object >> fieldsMap , AnalysisField field , Universe hostedUniverse ) {
227
239
EconomicMap <String , Object > fieldMap = EconomicMap .create ();
228
240
fieldMap .put (ID_TAG , field .getId ());
229
241
fieldMap .put (FIELD_ACCESSED_TAG , field .getAccessedReason () != null );
230
242
fieldMap .put (FIELD_READ_TAG , field .getReadReason () != null );
231
243
fieldMap .put (FIELD_WRITTEN_TAG , field .getWrittenReason () != null );
232
244
fieldMap .put (FIELD_FOLDED_TAG , field .getFoldedReason () != null );
233
245
246
+ persistFieldHook (fieldMap , field , hostedUniverse );
247
+
234
248
String tid = String .valueOf (field .getDeclaringClass ().getId ());
235
249
if (fieldsMap .containsKey (tid )) {
236
250
fieldsMap .get (tid ).put (field .getName (), fieldMap );
@@ -241,31 +255,47 @@ private static void persistField(EconomicMap<String, EconomicMap<String, Object>
241
255
}
242
256
}
243
257
258
+ /**
259
+ * A hook used to persist more field information not accessible in pointsto.
260
+ */
261
+ @ SuppressWarnings ("unused" )
262
+ protected void persistFieldHook (EconomicMap <String , Object > fieldMap , AnalysisField field , Universe hostedUniverse ) {
263
+
264
+ }
265
+
244
266
private void persistConstant (AnalysisUniverse analysisUniverse , ImageHeapConstant imageHeapConstant , EconomicMap <String , Object > constantsMap ) {
245
- if (imageHeapConstant .isReaderInstalled () && !constantsMap .containsKey (Integer .toString (imageHeapConstant . constantData . id ))) {
267
+ if (imageHeapConstant .isReaderInstalled () && !constantsMap .containsKey (Integer .toString (getConstantId ( imageHeapConstant ) ))) {
246
268
EconomicMap <String , Object > constantMap = EconomicMap .create ();
247
- constantsMap .put (Integer .toString (imageHeapConstant .constantData .id ), constantMap );
248
- constantMap .put (TID_TAG , imageHeapConstant .getType ().getId ());
249
- if (imageHeapConstant .hasIdentityHashCode ()) {
250
- constantMap .put (IDENTITY_HASH_CODE_TAG , imageHeapConstant .getIdentityHashCode ());
251
- }
269
+ persistConstant (analysisUniverse , imageHeapConstant , constantMap , constantsMap );
270
+ }
271
+ }
252
272
253
- switch (imageHeapConstant ) {
254
- case ImageHeapInstance imageHeapInstance -> {
255
- persistConstant (analysisUniverse , constantsMap , constantMap , INSTANCE_TAG , imageHeapInstance .getFieldValues ());
256
- persistConstantRelinkingInfo (constantMap , imageHeapConstant , analysisUniverse .getBigbang ());
257
- }
258
- case ImageHeapObjectArray imageHeapObjectArray ->
259
- persistConstant (analysisUniverse , constantsMap , constantMap , ARRAY_TAG , imageHeapObjectArray .getElementValues ());
260
- case ImageHeapPrimitiveArray imageHeapPrimitiveArray -> {
261
- constantMap .put (CONSTANT_TYPE_TAG , PRIMITIVE_ARRAY_TAG );
262
- constantMap .put (DATA_TAG , getString (imageHeapPrimitiveArray .getType ().getComponentType ().getJavaKind (), imageHeapPrimitiveArray .getArray ()));
263
- }
264
- default -> throw AnalysisError .shouldNotReachHere ("Unexpected constant type " + imageHeapConstant );
273
+ protected void persistConstant (AnalysisUniverse analysisUniverse , ImageHeapConstant imageHeapConstant , EconomicMap <String , Object > constantMap , EconomicMap <String , Object > constantsMap ) {
274
+ constantsMap .put (Integer .toString (getConstantId (imageHeapConstant )), constantMap );
275
+ constantMap .put (TID_TAG , imageHeapConstant .getType ().getId ());
276
+ if (imageHeapConstant .hasIdentityHashCode ()) {
277
+ constantMap .put (IDENTITY_HASH_CODE_TAG , imageHeapConstant .getIdentityHashCode ());
278
+ }
279
+
280
+ switch (imageHeapConstant ) {
281
+ case ImageHeapInstance imageHeapInstance -> {
282
+ persistConstant (analysisUniverse , constantsMap , constantMap , INSTANCE_TAG , imageHeapInstance .getFieldValues ());
283
+ persistConstantRelinkingInfo (constantMap , imageHeapConstant , analysisUniverse .getBigbang ());
284
+ }
285
+ case ImageHeapObjectArray imageHeapObjectArray ->
286
+ persistConstant (analysisUniverse , constantsMap , constantMap , ARRAY_TAG , imageHeapObjectArray .getElementValues ());
287
+ case ImageHeapPrimitiveArray imageHeapPrimitiveArray -> {
288
+ constantMap .put (CONSTANT_TYPE_TAG , PRIMITIVE_ARRAY_TAG );
289
+ constantMap .put (DATA_TAG , getString (imageHeapPrimitiveArray .getType ().getComponentType ().getJavaKind (), imageHeapPrimitiveArray .getArray ()));
265
290
}
291
+ default -> throw AnalysisError .shouldNotReachHere ("Unexpected constant type " + imageHeapConstant );
266
292
}
267
293
}
268
294
295
+ protected int getConstantId (ImageHeapConstant imageHeapConstant ) {
296
+ return imageHeapConstant .constantData .id ;
297
+ }
298
+
269
299
public void persistConstantRelinkingInfo (EconomicMap <String , Object > constantMap , ImageHeapConstant imageHeapConstant , BigBang bb ) {
270
300
Class <?> clazz = imageHeapConstant .getType ().getJavaClass ();
271
301
JavaConstant hostedObject = imageHeapConstant .getHostedObject ();
@@ -318,7 +348,7 @@ protected void persistConstant(AnalysisUniverse analysisUniverse, EconomicMap<St
318
348
if (delegateProcessing (data , object )) {
319
349
/* The object was already persisted */
320
350
} else if (object instanceof ImageHeapConstant imageHeapConstant ) {
321
- data .add (List .of (OBJECT_TAG , imageHeapConstant . constantData . id ));
351
+ data .add (List .of (OBJECT_TAG , getConstantId ( imageHeapConstant ) ));
322
352
/*
323
353
* Some constants are not in imageHeap#reachableObjects, but are still created in
324
354
* reachable constants. They can be created in the extension image, but should not
0 commit comments