From 27be6b96d5436abd0f4aaf604d37b84b5a26e89e Mon Sep 17 00:00:00 2001 From: Vojin Jovanovic Date: Fri, 4 Apr 2025 12:53:47 +0200 Subject: [PATCH] Internal ignore lists for -H:Preserve --- .../src/com/oracle/svm/core/SubstrateOptions.java | 5 +---- .../com/oracle/svm/hosted/NativeImageGenerator.java | 12 ++++++++++-- 2 files changed, 11 insertions(+), 6 deletions(-) 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 ed9c94909ef2..5d84fb812d66 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 @@ -1338,12 +1338,9 @@ 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")// + @Option(help = "Ignore classes or packages (comma separated) from the ones included with '-H:Preserve'. This can be used to workaround potential issues related to '-H:Preserve'.", type = OptionType.Debug) // 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 4a0c3a0822ef..6e007b220159 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 @@ -43,6 +43,7 @@ import java.util.Collection; import java.util.Collections; import java.util.EnumSet; +import java.util.HashSet; import java.util.List; import java.util.ListIterator; import java.util.Locale; @@ -1098,10 +1099,10 @@ protected void setupNativeImage(String imageName, OptionValues options, Map classesOrPackagesToIgnore = ignoredClassesOrPackagesForPreserve(); loader.classLoaderSupport.getClassesToPreserve().parallel() .filter(ClassInclusionPolicy::isClassIncludedBase) - .filter(c -> classesToIgnore.isIncluded(c) == null) + .filter(c -> !(classesOrPackagesToIgnore.contains(c.getPackageName()) || classesOrPackagesToIgnore.contains(c.getName()))) .forEach(c -> runtimeReflection.registerClassFully(ConfigurationCondition.alwaysTrue(), c)); for (String className : loader.classLoaderSupport.getClassNamesToPreserve()) { RuntimeReflection.registerClassLookup(className); @@ -1114,6 +1115,13 @@ protected void setupNativeImage(String imageName, OptionValues options, Map ignoredClassesOrPackagesForPreserve() { + Set ignoredClassesOrPackages = new HashSet<>(SubstrateOptions.IgnorePreserveForClasses.getValue().valuesAsSet()); + // GR-63360: Parsing of constant_ lambda forms fails + ignoredClassesOrPackages.add("java.lang.invoke.LambdaForm$Holder"); + return Collections.unmodifiableSet(ignoredClassesOrPackages); + } + protected void registerEntryPointStubs(Map entryPoints) { entryPoints.forEach((method, entryPointData) -> CEntryPointCallStubSupport.singleton().registerStubForMethod(method, () -> entryPointData)); }