@@ -250,7 +250,12 @@ public enum UsageKind {
250250 private final boolean buildingExtensionLayer = ImageLayerBuildingSupport .buildingExtensionLayer ();
251251
252252 // All elements below are from the host VM universe, not the analysis universe
253- private Set <ResolvedJavaField > sharedLayerExcludedFields ;
253+ private final Set <ResolvedJavaField > sharedLayerExcludedFields ;
254+ /**
255+ * Some modules contain native methods that should never be in the image, as they are either
256+ * hosted only, or currently unsupported in layered images.
257+ */
258+ protected final Set <Module > sharedLayerForbiddenModules ;
254259 private final ResolvedJavaType optionKeyType ;
255260 private final ResolvedJavaType featureType ;
256261
@@ -264,12 +269,6 @@ public enum UsageKind {
264269 private final boolean trackDynamicAccess ;
265270 private DynamicAccessDetectionSupport dynamicAccessDetectionSupport = null ;
266271
267- /**
268- * Some modules contain native methods that should never be in the image, as they are either
269- * hosted only, or currently unsupported in layered images.
270- */
271- private final Set <Module > forbiddenModules = new HashSet <>();
272-
273272 @ SuppressWarnings ("this-escape" )
274273 public SVMHost (OptionValues options , ImageClassLoader loader , ClassInitializationSupport classInitializationSupport , AnnotationSubstitutionProcessor annotationSubstitutions ,
275274 MissingRegistrationSupport missingRegistrationSupport ) {
@@ -301,7 +300,11 @@ public SVMHost(OptionValues options, ImageClassLoader loader, ClassInitializatio
301300 }
302301 layerId = buildingImageLayer ? DynamicImageLayerInfo .getCurrentLayerNumber () : 0 ;
303302 if (buildingSharedLayer ) {
304- initializeSharedLayerExcludedFields ();
303+ sharedLayerExcludedFields = initializeSharedLayerExcludedFields ();
304+ sharedLayerForbiddenModules = initializeSharedLayerForbiddenModules ();
305+ } else {
306+ sharedLayerExcludedFields = null ;
307+ sharedLayerForbiddenModules = null ;
305308 }
306309 layeredStaticFieldSupport = buildingImageLayer ? LayeredStaticFieldSupport .singleton () : null ;
307310
@@ -1008,41 +1011,60 @@ private ResolvedJavaField lookupOriginalDeclaredField(Class<?> declaringClass, S
10081011 return originalMetaAccess .lookupJavaField (ReflectionUtil .lookupField (declaringClass , fieldName ));
10091012 }
10101013
1011- private void initializeSharedLayerExcludedFields () {
1012- sharedLayerExcludedFields = new HashSet <>();
1014+ private Set <ResolvedJavaField > initializeSharedLayerExcludedFields () {
1015+ Set <ResolvedJavaField > excludedFields = new HashSet <>();
1016+
10131017 /*
10141018 * These fields need to be folded as they are used in snippets, and they must be accessed
10151019 * without producing reads with side effects.
10161020 */
1017-
1018- sharedLayerExcludedFields .add (lookupOriginalDeclaredField (DynamicHub .class , "layoutEncoding" ));
1019- sharedLayerExcludedFields .add (lookupOriginalDeclaredField (DynamicHub .class , "numClassTypes" ));
1020- sharedLayerExcludedFields .add (lookupOriginalDeclaredField (DynamicHub .class , "numIterableInterfaceTypes" ));
1021- sharedLayerExcludedFields .add (lookupOriginalDeclaredField (DynamicHub .class , "openTypeWorldTypeCheckSlots" ));
1022- sharedLayerExcludedFields .add (lookupOriginalDeclaredField (DynamicHub .class , "openTypeWorldInterfaceHashParam" ));
1023- sharedLayerExcludedFields .add (lookupOriginalDeclaredField (DynamicHub .class , "openTypeWorldInterfaceHashTable" ));
1024- sharedLayerExcludedFields .add (lookupOriginalDeclaredField (DynamicHub .class , "interfaceID" ));
1025- sharedLayerExcludedFields .add (lookupOriginalDeclaredField (DynamicHub .class , "typeIDDepth" ));
1026- sharedLayerExcludedFields .add (lookupOriginalDeclaredField (DynamicHub .class , "typeID" ));
1027- sharedLayerExcludedFields .add (lookupOriginalDeclaredField (DynamicHub .class , "monitorOffset" ));
1028- sharedLayerExcludedFields .add (lookupOriginalDeclaredField (DynamicHub .class , "hubType" ));
1029- sharedLayerExcludedFields .add (lookupOriginalDeclaredField (DynamicHub .class , "companion" ));
1030- sharedLayerExcludedFields .add (lookupOriginalDeclaredField (DynamicHubCompanion .class , "arrayHub" ));
1031- sharedLayerExcludedFields .add (lookupOriginalDeclaredField (DynamicHubCompanion .class , "additionalFlags" ));
1021+ excludedFields .add (lookupOriginalDeclaredField (DynamicHub .class , "layoutEncoding" ));
1022+ excludedFields .add (lookupOriginalDeclaredField (DynamicHub .class , "numClassTypes" ));
1023+ excludedFields .add (lookupOriginalDeclaredField (DynamicHub .class , "numIterableInterfaceTypes" ));
1024+ excludedFields .add (lookupOriginalDeclaredField (DynamicHub .class , "openTypeWorldTypeCheckSlots" ));
1025+ excludedFields .add (lookupOriginalDeclaredField (DynamicHub .class , "openTypeWorldInterfaceHashParam" ));
1026+ excludedFields .add (lookupOriginalDeclaredField (DynamicHub .class , "openTypeWorldInterfaceHashTable" ));
1027+ excludedFields .add (lookupOriginalDeclaredField (DynamicHub .class , "interfaceID" ));
1028+ excludedFields .add (lookupOriginalDeclaredField (DynamicHub .class , "typeIDDepth" ));
1029+ excludedFields .add (lookupOriginalDeclaredField (DynamicHub .class , "typeID" ));
1030+ excludedFields .add (lookupOriginalDeclaredField (DynamicHub .class , "monitorOffset" ));
1031+ excludedFields .add (lookupOriginalDeclaredField (DynamicHub .class , "hubType" ));
1032+ excludedFields .add (lookupOriginalDeclaredField (DynamicHub .class , "companion" ));
1033+ excludedFields .add (lookupOriginalDeclaredField (DynamicHubCompanion .class , "arrayHub" ));
1034+ excludedFields .add (lookupOriginalDeclaredField (DynamicHubCompanion .class , "additionalFlags" ));
10321035
10331036 /* Needs to be immutable for correct lowering of SubstrateIdentityHashCodeNode. */
1034- sharedLayerExcludedFields .add (lookupOriginalDeclaredField (DynamicHub .class , "identityHashOffset" ));
1037+ excludedFields .add (lookupOriginalDeclaredField (DynamicHub .class , "identityHashOffset" ));
10351038
10361039 /*
10371040 * Including this field makes ThreadLocalAllocation.getTlabDescriptorSize reachable through
10381041 * ThreadLocalAllocation.regularTLAB which is accessed with
10391042 * FastThreadLocalBytes.getSizeSupplier
10401043 */
1041- sharedLayerExcludedFields .add (lookupOriginalDeclaredField (VMThreadLocalInfo .class , "sizeSupplier" ));
1044+ excludedFields .add (lookupOriginalDeclaredField (VMThreadLocalInfo .class , "sizeSupplier" ));
10421045 /* This field cannot be written to (see documentation) */
1043- sharedLayerExcludedFields .add (lookupOriginalDeclaredField (Counter .Group .class , "enabled" ));
1046+ excludedFields .add (lookupOriginalDeclaredField (Counter .Group .class , "enabled" ));
10441047 /* This field can contain a reference to a Thread, which is not allowed in the heap */
1045- sharedLayerExcludedFields .add (lookupOriginalDeclaredField (NativeLibraries .class , "nativeLibraryLockMap" ));
1048+ excludedFields .add (lookupOriginalDeclaredField (NativeLibraries .class , "nativeLibraryLockMap" ));
1049+
1050+ return excludedFields ;
1051+ }
1052+
1053+ protected Set <Module > initializeSharedLayerForbiddenModules () {
1054+ Set <Module > forbiddenModules = new HashSet <>();
1055+ forbiddenModules .add (JVMCI .class .getModule ());
1056+ addForbiddenModule (forbiddenModules , "com.oracle.svm.shadowed.org.bytedeco.llvm.global.LLVM" );
1057+ addForbiddenModule (forbiddenModules , "com.oracle.svm.shadowed.org.bytedeco.javacpp.presets.javacpp" );
1058+ addForbiddenModule (forbiddenModules , "com.oracle.truffle.polyglot.JDKSupport" );
1059+ addForbiddenModule (forbiddenModules , "com.oracle.truffle.runtime.hotspot.libgraal.LibGraal" );
1060+ return forbiddenModules ;
1061+ }
1062+
1063+ protected static void addForbiddenModule (Set <Module > sharedLayerForbiddenModules , String className ) {
1064+ Class <?> clazz = ReflectionUtil .lookupClass (true , className );
1065+ if (clazz != null ) {
1066+ sharedLayerForbiddenModules .add (clazz .getModule ());
1067+ }
10461068 }
10471069
10481070 /** If it's not one of the known builder types it must be an original VM type. */
@@ -1542,26 +1564,7 @@ public ConstantExpressionRegistry getConstantExpressionRegistry() {
15421564 }
15431565
15441566 @ Override
1545- public Set <Module > getForbiddenModules () {
1546- if (forbiddenModules .isEmpty ()) {
1547- forbiddenModules .add (JVMCI .class .getModule ());
1548- Class <?> llvm = ReflectionUtil .lookupClass (true , "com.oracle.svm.shadowed.org.bytedeco.llvm.global.LLVM" );
1549- if (llvm != null ) {
1550- forbiddenModules .add (llvm .getModule ());
1551- }
1552- Class <?> javacpp = ReflectionUtil .lookupClass (true , "com.oracle.svm.shadowed.org.bytedeco.javacpp.presets.javacpp" );
1553- if (javacpp != null ) {
1554- forbiddenModules .add (javacpp .getModule ());
1555- }
1556- Class <?> truffle = ReflectionUtil .lookupClass (true , "com.oracle.truffle.polyglot.JDKSupport" );
1557- if (truffle != null ) {
1558- forbiddenModules .add (truffle .getModule ());
1559- }
1560- Class <?> libGraal = ReflectionUtil .lookupClass (true , "com.oracle.truffle.runtime.hotspot.libgraal.LibGraal" );
1561- if (libGraal != null ) {
1562- forbiddenModules .add (libGraal .getModule ());
1563- }
1564- }
1565- return forbiddenModules ;
1567+ public Set <Module > getSharedLayerForbiddenModules () {
1568+ return sharedLayerForbiddenModules ;
15661569 }
15671570}
0 commit comments