2424 */
2525package com .oracle .svm .hosted ;
2626
27+ import static com .oracle .graal .pointsto .api .PointstoOptions .UseExperimentalReachabilityAnalysis ;
2728import static com .oracle .svm .hosted .NativeImageOptions .DiagnosticsDir ;
2829import static com .oracle .svm .hosted .NativeImageOptions .DiagnosticsMode ;
2930import static org .graalvm .compiler .hotspot .JVMCIVersionCheck .OPEN_LABSJDK_RELEASE_URL_PATTERN ;
30- import static com .oracle .graal .pointsto .api .PointstoOptions .UseExperimentalReachabilityAnalysis ;
3131import static org .graalvm .compiler .replacements .StandardGraphBuilderPlugins .registerInvocationPlugins ;
3232
3333import java .io .IOException ;
34+ import java .lang .annotation .Annotation ;
3435import java .lang .ref .Reference ;
3536import java .lang .reflect .Method ;
3637import java .lang .reflect .Modifier ;
5657import java .util .function .BooleanSupplier ;
5758import 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 ;
7160import org .graalvm .collections .EconomicSet ;
7261import org .graalvm .collections .Pair ;
7362import org .graalvm .compiler .api .replacements .Fold ;
143132import com .oracle .graal .pointsto .AnalysisObjectScanningObserver ;
144133import com .oracle .graal .pointsto .AnalysisPolicy ;
145134import 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 ;
147137import com .oracle .graal .pointsto .api .PointstoOptions ;
148138import com .oracle .graal .pointsto .constraints .UnsupportedFeatureException ;
149139import com .oracle .graal .pointsto .flow .FormalParamTypeFlow ;
140+ import com .oracle .graal .pointsto .flow .MethodTypeFlowBuilder ;
150141import com .oracle .graal .pointsto .flow .TypeFlow ;
151142import com .oracle .graal .pointsto .flow .context .bytecode .BytecodeSensitiveAnalysisPolicy ;
152143import com .oracle .graal .pointsto .heap .HeapSnapshotVerifier ;
153144import com .oracle .graal .pointsto .heap .ImageHeap ;
154145import com .oracle .graal .pointsto .heap .ImageHeapScanner ;
155146import com .oracle .graal .pointsto .infrastructure .SubstitutionProcessor ;
156147import com .oracle .graal .pointsto .infrastructure .WrappedJavaMethod ;
148+ import com .oracle .graal .pointsto .meta .AnalysisFactory ;
157149import com .oracle .graal .pointsto .meta .AnalysisField ;
158150import com .oracle .graal .pointsto .meta .AnalysisMetaAccess ;
159151import com .oracle .graal .pointsto .meta .AnalysisMethod ;
160152import com .oracle .graal .pointsto .meta .AnalysisType ;
161153import com .oracle .graal .pointsto .meta .AnalysisUniverse ;
162154import com .oracle .graal .pointsto .meta .HostedProviders ;
155+ import com .oracle .graal .pointsto .meta .PointsToAnalysisFactory ;
156+ import com .oracle .graal .pointsto .meta .PointsToAnalysisMethod ;
163157import com .oracle .graal .pointsto .reports .AnalysisReporter ;
158+ import com .oracle .graal .pointsto .typestate .DefaultAnalysisPolicy ;
164159import com .oracle .graal .pointsto .typestate .TypeState ;
165160import com .oracle .graal .pointsto .util .AnalysisError ;
166161import com .oracle .graal .pointsto .util .GraalAccess ;
167162import 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 ;
168167import com .oracle .svm .core .BuildArtifacts ;
169168import com .oracle .svm .core .BuildArtifacts .ArtifactType ;
170169import com .oracle .svm .core .BuildPhaseProvider ;
241240import com .oracle .svm .hosted .ameta .AnalysisConstantReflectionProvider ;
242241import com .oracle .svm .hosted .analysis .Inflation ;
243242import com .oracle .svm .hosted .analysis .NativeImagePointsToAnalysis ;
243+ import com .oracle .svm .hosted .analysis .NativeImageReachabilityAnalysisEngine ;
244244import com .oracle .svm .hosted .analysis .SVMAnalysisMetaAccess ;
245245import com .oracle .svm .hosted .analysis .SubstrateUnsupportedFeatures ;
246246import com .oracle .svm .hosted .annotation .AnnotationSupport ;
253253import com .oracle .svm .hosted .cenum .CEnumCallWrapperSubstitutionProcessor ;
254254import com .oracle .svm .hosted .classinitialization .ClassInitializationFeature ;
255255import com .oracle .svm .hosted .classinitialization .ClassInitializationSupport ;
256- import com .oracle .svm .hosted .classinitialization .ConfigurableClassInitialization ;
257256import com .oracle .svm .hosted .code .CEntryPointCallStubSupport ;
258257import com .oracle .svm .hosted .code .CEntryPointData ;
259258import com .oracle .svm .hosted .code .CFunctionSubstitutionProcessor ;
293292import com .oracle .svm .hosted .substitute .AnnotationSubstitutionProcessor ;
294293import com .oracle .svm .hosted .substitute .DeletedFieldsPlugin ;
295294import com .oracle .svm .hosted .substitute .UnsafeAutomaticSubstitutionProcessor ;
295+ import com .oracle .svm .util .AnnotationExtracter ;
296+ import com .oracle .svm .util .ClassUtil ;
296297import com .oracle .svm .util .ImageBuildStatistics ;
297298import com .oracle .svm .util .ReflectionUtil ;
298299import 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