From d89749d59473f5a2b6fa3045e5c4332c5e344402 Mon Sep 17 00:00:00 2001 From: Loic Ottet Date: Mon, 24 Mar 2025 13:08:41 +0100 Subject: [PATCH] Ignore precomputed lambda forms from -H:Preserve=all --- .../src/com/oracle/svm/core/SubstrateOptions.java | 6 ++++++ .../src/com/oracle/svm/hosted/NativeImageGenerator.java | 3 +++ 2 files changed, 9 insertions(+) diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/SubstrateOptions.java b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/SubstrateOptions.java index a93901cf413e..0b243890827d 100644 --- a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/SubstrateOptions.java +++ b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/SubstrateOptions.java @@ -1328,6 +1328,12 @@ public enum ReportingMode { @Option(help = "file:doc-files/PreserveHelp.txt")// public static final HostedOptionKey Preserve = new HostedOptionKey<>(AccumulatingLocatableMultiOptionValue.Strings.build()); + @Option(help = "file:doc-files/PreserveHelp.txt")// + public static final HostedOptionKey IgnorePreserveForClasses = new HostedOptionKey<>(AccumulatingLocatableMultiOptionValue.Strings.build()); + + @Option(help = "file:doc-files/PreserveHelp.txt")// + public static final HostedOptionKey IgnorePreserveForClassesPaths = new HostedOptionKey<>(AccumulatingLocatableMultiOptionValue.Strings.build()); + @Option(help = "Force include include all public types and methods that can be reached using normal Java access rules.")// public static final HostedOptionKey UseBaseLayerInclusionPolicy = new HostedOptionKey<>(false); diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/NativeImageGenerator.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/NativeImageGenerator.java index 1fdd59266cc8..667ce455e462 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/NativeImageGenerator.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/NativeImageGenerator.java @@ -1096,8 +1096,11 @@ protected void setupNativeImage(String imageName, OptionValues options, Map bb.registerTypeForBaseImage(cls)); var runtimeReflection = ImageSingletons.lookup(RuntimeReflectionSupport.class); + + var classesToIgnore = OptionClassFilterBuilder.createFilter(loader, SubstrateOptions.IgnorePreserveForClasses, SubstrateOptions.IgnorePreserveForClassesPaths); loader.classLoaderSupport.getClassesToPreserve().parallel() .filter(ClassInclusionPolicy::isClassIncludedBase) + .filter(c -> classesToIgnore.isIncluded(c) == null) .forEach(c -> runtimeReflection.registerClassFully(ConfigurationCondition.alwaysTrue(), c)); for (String className : loader.classLoaderSupport.getClassNamesToPreserve()) { RuntimeReflection.registerClassLookup(className);