Skip to content

Commit ab876ef

Browse files
Zeaveeloicottet
authored andcommitted
Ensure the list of forbidden modules for layered images is always complete when accessed
1 parent b9ba8ce commit ab876ef

File tree

3 files changed

+55
-52
lines changed

3 files changed

+55
-52
lines changed

substratevm/src/com.oracle.graal.pointsto/src/com/oracle/graal/pointsto/AbstractAnalysisEngine.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -421,7 +421,7 @@ public void tryRegisterNativeMethodsForBaseImage(ResolvedJavaType type) {
421421
* Some modules contain native methods that should not be included in the image because they
422422
* are hosted only, or because they are currently unsupported.
423423
*/
424-
Set<Module> forbiddenModules = hostVM.getForbiddenModules();
424+
Set<Module> forbiddenModules = hostVM.getSharedLayerForbiddenModules();
425425
if (forbiddenModules.contains(OriginalClassProvider.getJavaClass(type).getModule())) {
426426
return;
427427
}

substratevm/src/com.oracle.graal.pointsto/src/com/oracle/graal/pointsto/api/HostVM.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -467,7 +467,7 @@ public boolean preventConstantFolding(AnalysisField aField) {
467467
return false;
468468
}
469469

470-
public Set<Module> getForbiddenModules() {
470+
public Set<Module> getSharedLayerForbiddenModules() {
471471
return Set.of();
472472
}
473473

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

Lines changed: 53 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)