Skip to content

Commit 830a611

Browse files
committed
svm: set native access for the image run time modules
1 parent 369ea76 commit 830a611

File tree

2 files changed

+39
-4
lines changed

2 files changed

+39
-4
lines changed

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

+7-3
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@
6262
import org.graalvm.nativeimage.hosted.FieldValueTransformer;
6363

6464
import com.oracle.graal.pointsto.meta.AnalysisType;
65+
import com.oracle.svm.core.NativeImageClassLoaderOptions;
6566
import com.oracle.svm.core.SubstrateOptions;
6667
import com.oracle.svm.core.SubstrateUtil;
6768
import com.oracle.svm.core.feature.AutomaticallyRegisteredFeature;
@@ -260,7 +261,9 @@ public void afterAnalysis(AfterAnalysisAccess access) {
260261
* the originals.
261262
*/
262263
replicateVisibilityModifications(runtimeBootLayer, accessImpl, accessImpl.imageClassLoader, runtimeImageNamedModules, runtimeImageUnnamedModules);
263-
replicateNativeAccess(accessImpl, runtimeImageNamedModules);
264+
Set<String> nativeAccessEnabled = NativeImageClassLoaderOptions.EnableNativeAccess.getValue().values().stream().flatMap(m -> Arrays.stream(SubstrateUtil.split(m, ",")))
265+
.collect(Collectors.toSet());
266+
replicateNativeAccess(accessImpl, runtimeImageNamedModules, nativeAccessEnabled);
264267
}
265268

266269
/**
@@ -530,15 +533,16 @@ private void replicateVisibilityModification(AfterAnalysisAccessImpl accessImpl,
530533
}
531534
}
532535

533-
private void replicateNativeAccess(AfterAnalysisAccessImpl accessImpl, Set<Module> analysisReachableNamedModules) {
536+
private void replicateNativeAccess(AfterAnalysisAccessImpl accessImpl, Set<Module> analysisReachableNamedModules, Set<String> nativeAccessEnabled) {
534537
Map<Module, Module> modulePairs = analysisReachableNamedModules
535538
.stream()
536539
.collect(Collectors.toMap(m -> m, m -> moduleLayerFeatureUtils.getRuntimeModuleForHostedModule(m, false)));
537540

541+
ModuleLayer runtimeBootLayer = RuntimeModuleSupport.instance().getBootLayer();
538542
for (Map.Entry<Module, Module> modulesPair : modulePairs.entrySet()) {
539543
Module hosted = modulesPair.getKey();
540544
Module runtime = modulesPair.getValue();
541-
if (moduleLayerFeatureUtils.allowsNativeAccess(hosted)) {
545+
if (moduleLayerFeatureUtils.allowsNativeAccess(hosted) || (runtimeBootLayer == runtime.getLayer() && nativeAccessEnabled.contains(runtime.getName()))) {
542546
moduleLayerFeatureUtils.setNativeAccess(accessImpl, runtime, true);
543547
}
544548
}

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

+32-1
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@
7575
import java.util.stream.Collectors;
7676
import java.util.stream.Stream;
7777

78+
import com.oracle.svm.core.SubstrateUtil;
7879
import org.graalvm.collections.EconomicMap;
7980
import org.graalvm.collections.EconomicSet;
8081
import org.graalvm.collections.MapCursor;
@@ -379,7 +380,29 @@ private static void implAddReadsAllUnnamed(Module module) {
379380
implAddReadsAllUnnamed.setAccessible(true);
380381
implAddReadsAllUnnamed.invoke(module);
381382
} catch (ReflectiveOperationException | NoSuchElementException e) {
382-
VMError.shouldNotReachHere("Could reflectively call Module.implAddReadsAllUnnamed", e);
383+
VMError.shouldNotReachHere("Could not reflectively call Module.implAddReadsAllUnnamed", e);
384+
}
385+
}
386+
387+
static void implAddEnableNativeAccess(Module module) {
388+
try {
389+
Method implAddEnableNativeAccess = Module.class.getDeclaredMethod("implAddEnableNativeAccess");
390+
ModuleSupport.accessModuleByClass(ModuleSupport.Access.OPEN, NativeImageClassLoaderSupport.class, Module.class);
391+
implAddEnableNativeAccess.setAccessible(true);
392+
implAddEnableNativeAccess.invoke(module);
393+
} catch (ReflectiveOperationException | NoSuchElementException e) {
394+
VMError.shouldNotReachHere("Could not reflectively call Module.implAddEnableNativeAccess", e);
395+
}
396+
}
397+
398+
static void implAddEnableNativeAccessToAllUnnamed() {
399+
try {
400+
Method implAddEnableNativeAccess = Module.class.getDeclaredMethod("implAddEnableNativeAccessToAllUnnamed");
401+
ModuleSupport.accessModuleByClass(ModuleSupport.Access.OPEN, NativeImageClassLoaderSupport.class, Module.class);
402+
implAddEnableNativeAccess.setAccessible(true);
403+
implAddEnableNativeAccess.invoke(null);
404+
} catch (ReflectiveOperationException | NoSuchElementException e) {
405+
VMError.shouldNotReachHere("Could not reflectively call Module.implAddEnableNativeAccessToAllUnnamed", e);
383406
}
384407
}
385408

@@ -436,6 +459,14 @@ void processClassLoaderOptions() {
436459
}
437460
}
438461
});
462+
NativeImageClassLoaderOptions.EnableNativeAccess.getValue(parsedHostedOptions).values().stream().flatMap(m -> Arrays.stream(SubstrateUtil.split(m, ","))).forEach(moduleName -> {
463+
if ("ALL-UNNAMED".equals(moduleName)) {
464+
implAddEnableNativeAccessToAllUnnamed();
465+
} else {
466+
Module module = findModule(moduleName).orElseThrow(() -> userWarningModuleNotFound(NativeImageClassLoaderOptions.EnableNativeAccess, moduleName));
467+
implAddEnableNativeAccess(module);
468+
}
469+
});
439470
}
440471

441472
private static void warn(String m) {

0 commit comments

Comments
 (0)