Skip to content

Commit faeaf3d

Browse files
author
Christian Wimmer
committed
[GR-39406] Add class initialization strategy that allows all classes to be used at image build time.
PullRequest: graal/12121
2 parents b62f37f + d90833a commit faeaf3d

18 files changed

+676
-429
lines changed

substratevm/mx.substratevm/suite.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1174,6 +1174,7 @@
11741174
"com.oracle.truffle.api.instrumentation.TruffleInstrument.Provider",
11751175
"com.oracle.svm.hosted.agent.NativeImageBytecodeInstrumentationAgentExtension",
11761176
"com.oracle.svm.hosted.NativeImageClassLoaderPostProcessing",
1177+
"java.util.spi.ResourceBundleControlProvider",
11771178
],
11781179
"requiresConcealed": {
11791180
"jdk.internal.vm.ci": [

substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jdk/Target_sun_security_ssl_TrustStoreManager.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,7 @@ public void afterRegistration(AfterRegistrationAccess access) {
9595
* certificate files while generating X509Certificates.
9696
*/
9797
rci.initializeAtBuildTime("org.jcp.xml.dsig.internal.dom.XMLDSigRI", "Required for TrustStoreManager");
98+
rci.initializeAtBuildTime("org.jcp.xml.dsig.internal.dom.XMLDSigRI$ProviderService", "Required for TrustStoreManager");
9899
}
99100
}
100101

substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jdk/management/ManagementFeature.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,10 @@ public void duringSetup(DuringSetupAccess access) {
8585
access.registerObjectReplacer(this::replaceHostedPlatformManagedObject);
8686

8787
RuntimeClassInitialization.initializeAtBuildTime("com.sun.jmx.mbeanserver.DefaultMXBeanMappingFactory");
88+
RuntimeClassInitialization.initializeAtBuildTime("com.sun.jmx.mbeanserver.DefaultMXBeanMappingFactory$Mappings");
89+
RuntimeClassInitialization.initializeAtBuildTime("com.sun.jmx.mbeanserver.DefaultMXBeanMappingFactory$IdentityMapping");
90+
RuntimeClassInitialization.initializeAtBuildTime("com.sun.jmx.mbeanserver.DescriptorCache");
91+
RuntimeClassInitialization.initializeAtBuildTime("com.sun.jmx.remote.util.ClassLogger");
8892
}
8993

9094
/**

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

Lines changed: 30 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -24,13 +24,14 @@
2424
*/
2525
package com.oracle.svm.hosted;
2626

27+
import static com.oracle.graal.pointsto.api.PointstoOptions.UseExperimentalReachabilityAnalysis;
2728
import static com.oracle.svm.hosted.NativeImageOptions.DiagnosticsDir;
2829
import static com.oracle.svm.hosted.NativeImageOptions.DiagnosticsMode;
2930
import static org.graalvm.compiler.hotspot.JVMCIVersionCheck.OPEN_LABSJDK_RELEASE_URL_PATTERN;
30-
import static com.oracle.graal.pointsto.api.PointstoOptions.UseExperimentalReachabilityAnalysis;
3131
import static org.graalvm.compiler.replacements.StandardGraphBuilderPlugins.registerInvocationPlugins;
3232

3333
import java.io.IOException;
34+
import java.lang.annotation.Annotation;
3435
import java.lang.ref.Reference;
3536
import java.lang.reflect.Method;
3637
import java.lang.reflect.Modifier;
@@ -56,18 +57,6 @@
5657
import java.util.function.BooleanSupplier;
5758
import java.util.stream.Collectors;
5859

59-
import com.oracle.graal.pointsto.ObjectScanningObserver;
60-
import com.oracle.graal.pointsto.PointsToAnalysis;
61-
import com.oracle.graal.pointsto.flow.MethodTypeFlowBuilder;
62-
import com.oracle.graal.pointsto.meta.AnalysisFactory;
63-
import com.oracle.graal.pointsto.meta.PointsToAnalysisFactory;
64-
import com.oracle.graal.pointsto.meta.PointsToAnalysisMethod;
65-
import com.oracle.graal.reachability.MethodSummaryProvider;
66-
import com.oracle.graal.reachability.ReachabilityAnalysisFactory;
67-
import com.oracle.graal.reachability.ReachabilityObjectScanner;
68-
import com.oracle.svm.hosted.analysis.NativeImageReachabilityAnalysisEngine;
69-
import com.oracle.graal.pointsto.util.TimerCollection;
70-
import com.oracle.svm.util.AnnotationExtracter;
7160
import org.graalvm.collections.EconomicSet;
7261
import org.graalvm.collections.Pair;
7362
import org.graalvm.compiler.api.replacements.Fold;
@@ -143,28 +132,38 @@
143132
import com.oracle.graal.pointsto.AnalysisObjectScanningObserver;
144133
import com.oracle.graal.pointsto.AnalysisPolicy;
145134
import com.oracle.graal.pointsto.BigBang;
146-
import com.oracle.graal.pointsto.typestate.DefaultAnalysisPolicy;
135+
import com.oracle.graal.pointsto.ObjectScanningObserver;
136+
import com.oracle.graal.pointsto.PointsToAnalysis;
147137
import com.oracle.graal.pointsto.api.PointstoOptions;
148138
import com.oracle.graal.pointsto.constraints.UnsupportedFeatureException;
149139
import com.oracle.graal.pointsto.flow.FormalParamTypeFlow;
140+
import com.oracle.graal.pointsto.flow.MethodTypeFlowBuilder;
150141
import com.oracle.graal.pointsto.flow.TypeFlow;
151142
import com.oracle.graal.pointsto.flow.context.bytecode.BytecodeSensitiveAnalysisPolicy;
152143
import com.oracle.graal.pointsto.heap.HeapSnapshotVerifier;
153144
import com.oracle.graal.pointsto.heap.ImageHeap;
154145
import com.oracle.graal.pointsto.heap.ImageHeapScanner;
155146
import com.oracle.graal.pointsto.infrastructure.SubstitutionProcessor;
156147
import com.oracle.graal.pointsto.infrastructure.WrappedJavaMethod;
148+
import com.oracle.graal.pointsto.meta.AnalysisFactory;
157149
import com.oracle.graal.pointsto.meta.AnalysisField;
158150
import com.oracle.graal.pointsto.meta.AnalysisMetaAccess;
159151
import com.oracle.graal.pointsto.meta.AnalysisMethod;
160152
import com.oracle.graal.pointsto.meta.AnalysisType;
161153
import com.oracle.graal.pointsto.meta.AnalysisUniverse;
162154
import com.oracle.graal.pointsto.meta.HostedProviders;
155+
import com.oracle.graal.pointsto.meta.PointsToAnalysisFactory;
156+
import com.oracle.graal.pointsto.meta.PointsToAnalysisMethod;
163157
import com.oracle.graal.pointsto.reports.AnalysisReporter;
158+
import com.oracle.graal.pointsto.typestate.DefaultAnalysisPolicy;
164159
import com.oracle.graal.pointsto.typestate.TypeState;
165160
import com.oracle.graal.pointsto.util.AnalysisError;
166161
import com.oracle.graal.pointsto.util.GraalAccess;
167162
import com.oracle.graal.pointsto.util.Timer.StopTimer;
163+
import com.oracle.graal.pointsto.util.TimerCollection;
164+
import com.oracle.graal.reachability.MethodSummaryProvider;
165+
import com.oracle.graal.reachability.ReachabilityAnalysisFactory;
166+
import com.oracle.graal.reachability.ReachabilityObjectScanner;
168167
import com.oracle.svm.core.BuildArtifacts;
169168
import com.oracle.svm.core.BuildArtifacts.ArtifactType;
170169
import com.oracle.svm.core.BuildPhaseProvider;
@@ -241,6 +240,7 @@
241240
import com.oracle.svm.hosted.ameta.AnalysisConstantReflectionProvider;
242241
import com.oracle.svm.hosted.analysis.Inflation;
243242
import com.oracle.svm.hosted.analysis.NativeImagePointsToAnalysis;
243+
import com.oracle.svm.hosted.analysis.NativeImageReachabilityAnalysisEngine;
244244
import com.oracle.svm.hosted.analysis.SVMAnalysisMetaAccess;
245245
import com.oracle.svm.hosted.analysis.SubstrateUnsupportedFeatures;
246246
import com.oracle.svm.hosted.annotation.AnnotationSupport;
@@ -253,7 +253,6 @@
253253
import com.oracle.svm.hosted.cenum.CEnumCallWrapperSubstitutionProcessor;
254254
import com.oracle.svm.hosted.classinitialization.ClassInitializationFeature;
255255
import com.oracle.svm.hosted.classinitialization.ClassInitializationSupport;
256-
import com.oracle.svm.hosted.classinitialization.ConfigurableClassInitialization;
257256
import com.oracle.svm.hosted.code.CEntryPointCallStubSupport;
258257
import com.oracle.svm.hosted.code.CEntryPointData;
259258
import com.oracle.svm.hosted.code.CFunctionSubstitutionProcessor;
@@ -293,6 +292,8 @@
293292
import com.oracle.svm.hosted.substitute.AnnotationSubstitutionProcessor;
294293
import com.oracle.svm.hosted.substitute.DeletedFieldsPlugin;
295294
import com.oracle.svm.hosted.substitute.UnsafeAutomaticSubstitutionProcessor;
295+
import com.oracle.svm.util.AnnotationExtracter;
296+
import com.oracle.svm.util.ClassUtil;
296297
import com.oracle.svm.util.ImageBuildStatistics;
297298
import com.oracle.svm.util.ReflectionUtil;
298299
import com.oracle.svm.util.ReflectionUtil.ReflectionUtilError;
@@ -828,7 +829,7 @@ private void setupNativeImage(OptionValues options, Map<Method, CEntryPointData>
828829
ImageSingletons.add(ClassLoaderSupport.class, classLoaderSupport);
829830
ImageSingletons.add(LinkAtBuildTimeSupport.class, new LinkAtBuildTimeSupport(loader, classLoaderSupport));
830831

831-
ClassInitializationSupport classInitializationSupport = new ConfigurableClassInitialization(originalMetaAccess, loader);
832+
ClassInitializationSupport classInitializationSupport = ClassInitializationSupport.create(originalMetaAccess, loader);
832833
ImageSingletons.add(RuntimeClassInitializationSupport.class, classInitializationSupport);
833834
ClassInitializationFeature.processClassInitializationOptions(classInitializationSupport);
834835

@@ -1603,7 +1604,7 @@ private void processNativeLibraryImports(NativeLibraries nativeLibs, MetaAccessP
16031604

16041605
for (Method method : loader.findAnnotatedMethods(CConstant.class)) {
16051606
if (LibCBase.isMethodProvidedInCurrentLibc(method)) {
1606-
classInitializationSupport.initializeAtBuildTime(method.getDeclaringClass(), "classes with " + CConstant.class.getSimpleName() + " annotations are always initialized");
1607+
initializeAtBuildTime(method.getDeclaringClass(), classInitializationSupport, CConstant.class);
16071608
nativeLibs.loadJavaMethod(metaAccess.lookupJavaMethod(method));
16081609
}
16091610
}
@@ -1614,38 +1615,38 @@ private void processNativeLibraryImports(NativeLibraries nativeLibs, MetaAccessP
16141615
}
16151616
for (Class<?> clazz : loader.findAnnotatedClasses(CStruct.class, false)) {
16161617
if (LibCBase.isTypeProvidedInCurrentLibc(clazz)) {
1617-
classInitializationSupport.initializeAtBuildTime(clazz, "classes annotated with " + CStruct.class.getSimpleName() + " are always initialized");
1618+
initializeAtBuildTime(clazz, classInitializationSupport, CStruct.class);
16181619
nativeLibs.loadJavaType(metaAccess.lookupJavaType(clazz));
16191620
}
16201621
}
16211622
for (Class<?> clazz : loader.findAnnotatedClasses(RawStructure.class, false)) {
16221623
if (LibCBase.isTypeProvidedInCurrentLibc(clazz)) {
1623-
classInitializationSupport.initializeAtBuildTime(clazz, "classes annotated with " + RawStructure.class.getSimpleName() + " are always initialized");
1624+
initializeAtBuildTime(clazz, classInitializationSupport, RawStructure.class);
16241625
nativeLibs.loadJavaType(metaAccess.lookupJavaType(clazz));
16251626
}
16261627
}
16271628
for (Class<?> clazz : loader.findAnnotatedClasses(CPointerTo.class, false)) {
16281629
if (LibCBase.isTypeProvidedInCurrentLibc(clazz)) {
1629-
classInitializationSupport.initializeAtBuildTime(clazz, "classes annotated with " + CPointerTo.class.getSimpleName() + " are always initialized");
1630+
initializeAtBuildTime(clazz, classInitializationSupport, CPointerTo.class);
16301631
nativeLibs.loadJavaType(metaAccess.lookupJavaType(clazz));
16311632
}
16321633
}
16331634
for (Class<?> clazz : loader.findAnnotatedClasses(RawPointerTo.class, false)) {
16341635
if (LibCBase.isTypeProvidedInCurrentLibc(clazz)) {
1635-
classInitializationSupport.initializeAtBuildTime(clazz, "classes annotated with " + RawPointerTo.class.getSimpleName() + " are always initialized");
1636+
initializeAtBuildTime(clazz, classInitializationSupport, RawPointerTo.class);
16361637
nativeLibs.loadJavaType(metaAccess.lookupJavaType(clazz));
16371638
}
16381639
}
16391640
for (Class<?> clazz : loader.findAnnotatedClasses(CEnum.class, false)) {
16401641
if (LibCBase.isTypeProvidedInCurrentLibc(clazz)) {
16411642
ResolvedJavaType type = metaAccess.lookupJavaType(clazz);
1642-
classInitializationSupport.initializeAtBuildTime(clazz, "classes annotated with " + CEnum.class.getSimpleName() + " are always initialized");
1643+
initializeAtBuildTime(clazz, classInitializationSupport, CEnum.class);
16431644
nativeLibs.loadJavaType(type);
16441645
}
16451646
}
16461647
for (Class<?> clazz : loader.findAnnotatedClasses(CContext.class, false)) {
16471648
if (LibCBase.isTypeProvidedInCurrentLibc(clazz)) {
1648-
classInitializationSupport.initializeAtBuildTime(clazz, "classes annotated with " + CContext.class.getSimpleName() + " are always initialized");
1649+
initializeAtBuildTime(clazz, classInitializationSupport, CContext.class);
16491650
}
16501651
}
16511652
nativeLibs.processCLibraryAnnotations(loader);
@@ -1654,6 +1655,12 @@ private void processNativeLibraryImports(NativeLibraries nativeLibs, MetaAccessP
16541655
nativeLibs.reportErrors();
16551656
}
16561657

1658+
private static void initializeAtBuildTime(Class<?> clazz, ClassInitializationSupport classInitializationSupport, Class<? extends Annotation> annotationForMessage) {
1659+
String message = "classes annotated with " + ClassUtil.getUnqualifiedName(annotationForMessage) + " are always initialized at image build time";
1660+
classInitializationSupport.initializeAtBuildTime(clazz, message);
1661+
classInitializationSupport.forceInitializeHosted(clazz, message, false);
1662+
}
1663+
16571664
public AbstractImage getBuiltImage() {
16581665
return image;
16591666
}

0 commit comments

Comments
 (0)