Skip to content

Commit

Permalink
svm: set native access for the image run time modules
Browse files Browse the repository at this point in the history
  • Loading branch information
zapster committed Nov 13, 2024
1 parent 369ea76 commit 830a611
Show file tree
Hide file tree
Showing 2 changed files with 39 additions and 4 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,7 @@
import org.graalvm.nativeimage.hosted.FieldValueTransformer;

import com.oracle.graal.pointsto.meta.AnalysisType;
import com.oracle.svm.core.NativeImageClassLoaderOptions;
import com.oracle.svm.core.SubstrateOptions;
import com.oracle.svm.core.SubstrateUtil;
import com.oracle.svm.core.feature.AutomaticallyRegisteredFeature;
Expand Down Expand Up @@ -260,7 +261,9 @@ public void afterAnalysis(AfterAnalysisAccess access) {
* the originals.
*/
replicateVisibilityModifications(runtimeBootLayer, accessImpl, accessImpl.imageClassLoader, runtimeImageNamedModules, runtimeImageUnnamedModules);
replicateNativeAccess(accessImpl, runtimeImageNamedModules);
Set<String> nativeAccessEnabled = NativeImageClassLoaderOptions.EnableNativeAccess.getValue().values().stream().flatMap(m -> Arrays.stream(SubstrateUtil.split(m, ",")))
.collect(Collectors.toSet());
replicateNativeAccess(accessImpl, runtimeImageNamedModules, nativeAccessEnabled);
}

/**
Expand Down Expand Up @@ -530,15 +533,16 @@ private void replicateVisibilityModification(AfterAnalysisAccessImpl accessImpl,
}
}

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

ModuleLayer runtimeBootLayer = RuntimeModuleSupport.instance().getBootLayer();
for (Map.Entry<Module, Module> modulesPair : modulePairs.entrySet()) {
Module hosted = modulesPair.getKey();
Module runtime = modulesPair.getValue();
if (moduleLayerFeatureUtils.allowsNativeAccess(hosted)) {
if (moduleLayerFeatureUtils.allowsNativeAccess(hosted) || (runtimeBootLayer == runtime.getLayer() && nativeAccessEnabled.contains(runtime.getName()))) {
moduleLayerFeatureUtils.setNativeAccess(accessImpl, runtime, true);
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,7 @@
import java.util.stream.Collectors;
import java.util.stream.Stream;

import com.oracle.svm.core.SubstrateUtil;
import org.graalvm.collections.EconomicMap;
import org.graalvm.collections.EconomicSet;
import org.graalvm.collections.MapCursor;
Expand Down Expand Up @@ -379,7 +380,29 @@ private static void implAddReadsAllUnnamed(Module module) {
implAddReadsAllUnnamed.setAccessible(true);
implAddReadsAllUnnamed.invoke(module);
} catch (ReflectiveOperationException | NoSuchElementException e) {
VMError.shouldNotReachHere("Could reflectively call Module.implAddReadsAllUnnamed", e);
VMError.shouldNotReachHere("Could not reflectively call Module.implAddReadsAllUnnamed", e);
}
}

static void implAddEnableNativeAccess(Module module) {
try {
Method implAddEnableNativeAccess = Module.class.getDeclaredMethod("implAddEnableNativeAccess");
ModuleSupport.accessModuleByClass(ModuleSupport.Access.OPEN, NativeImageClassLoaderSupport.class, Module.class);
implAddEnableNativeAccess.setAccessible(true);
implAddEnableNativeAccess.invoke(module);
} catch (ReflectiveOperationException | NoSuchElementException e) {
VMError.shouldNotReachHere("Could not reflectively call Module.implAddEnableNativeAccess", e);
}
}

static void implAddEnableNativeAccessToAllUnnamed() {
try {
Method implAddEnableNativeAccess = Module.class.getDeclaredMethod("implAddEnableNativeAccessToAllUnnamed");
ModuleSupport.accessModuleByClass(ModuleSupport.Access.OPEN, NativeImageClassLoaderSupport.class, Module.class);
implAddEnableNativeAccess.setAccessible(true);
implAddEnableNativeAccess.invoke(null);
} catch (ReflectiveOperationException | NoSuchElementException e) {
VMError.shouldNotReachHere("Could not reflectively call Module.implAddEnableNativeAccessToAllUnnamed", e);
}
}

Expand Down Expand Up @@ -436,6 +459,14 @@ void processClassLoaderOptions() {
}
}
});
NativeImageClassLoaderOptions.EnableNativeAccess.getValue(parsedHostedOptions).values().stream().flatMap(m -> Arrays.stream(SubstrateUtil.split(m, ","))).forEach(moduleName -> {
if ("ALL-UNNAMED".equals(moduleName)) {
implAddEnableNativeAccessToAllUnnamed();
} else {
Module module = findModule(moduleName).orElseThrow(() -> userWarningModuleNotFound(NativeImageClassLoaderOptions.EnableNativeAccess, moduleName));
implAddEnableNativeAccess(module);
}
});
}

private static void warn(String m) {
Expand Down

0 comments on commit 830a611

Please # to comment.