24
24
*/
25
25
package com .oracle .svm .hosted ;
26
26
27
+ import static com .oracle .graal .pointsto .api .PointstoOptions .UseExperimentalReachabilityAnalysis ;
27
28
import static com .oracle .svm .hosted .NativeImageOptions .DiagnosticsDir ;
28
29
import static com .oracle .svm .hosted .NativeImageOptions .DiagnosticsMode ;
29
30
import static org .graalvm .compiler .hotspot .JVMCIVersionCheck .OPEN_LABSJDK_RELEASE_URL_PATTERN ;
30
- import static com .oracle .graal .pointsto .api .PointstoOptions .UseExperimentalReachabilityAnalysis ;
31
31
import static org .graalvm .compiler .replacements .StandardGraphBuilderPlugins .registerInvocationPlugins ;
32
32
33
33
import java .io .IOException ;
34
+ import java .lang .annotation .Annotation ;
34
35
import java .lang .ref .Reference ;
35
36
import java .lang .reflect .Method ;
36
37
import java .lang .reflect .Modifier ;
56
57
import java .util .function .BooleanSupplier ;
57
58
import java .util .stream .Collectors ;
58
59
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 ;
71
60
import org .graalvm .collections .EconomicSet ;
72
61
import org .graalvm .collections .Pair ;
73
62
import org .graalvm .compiler .api .replacements .Fold ;
143
132
import com .oracle .graal .pointsto .AnalysisObjectScanningObserver ;
144
133
import com .oracle .graal .pointsto .AnalysisPolicy ;
145
134
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 ;
147
137
import com .oracle .graal .pointsto .api .PointstoOptions ;
148
138
import com .oracle .graal .pointsto .constraints .UnsupportedFeatureException ;
149
139
import com .oracle .graal .pointsto .flow .FormalParamTypeFlow ;
140
+ import com .oracle .graal .pointsto .flow .MethodTypeFlowBuilder ;
150
141
import com .oracle .graal .pointsto .flow .TypeFlow ;
151
142
import com .oracle .graal .pointsto .flow .context .bytecode .BytecodeSensitiveAnalysisPolicy ;
152
143
import com .oracle .graal .pointsto .heap .HeapSnapshotVerifier ;
153
144
import com .oracle .graal .pointsto .heap .ImageHeap ;
154
145
import com .oracle .graal .pointsto .heap .ImageHeapScanner ;
155
146
import com .oracle .graal .pointsto .infrastructure .SubstitutionProcessor ;
156
147
import com .oracle .graal .pointsto .infrastructure .WrappedJavaMethod ;
148
+ import com .oracle .graal .pointsto .meta .AnalysisFactory ;
157
149
import com .oracle .graal .pointsto .meta .AnalysisField ;
158
150
import com .oracle .graal .pointsto .meta .AnalysisMetaAccess ;
159
151
import com .oracle .graal .pointsto .meta .AnalysisMethod ;
160
152
import com .oracle .graal .pointsto .meta .AnalysisType ;
161
153
import com .oracle .graal .pointsto .meta .AnalysisUniverse ;
162
154
import com .oracle .graal .pointsto .meta .HostedProviders ;
155
+ import com .oracle .graal .pointsto .meta .PointsToAnalysisFactory ;
156
+ import com .oracle .graal .pointsto .meta .PointsToAnalysisMethod ;
163
157
import com .oracle .graal .pointsto .reports .AnalysisReporter ;
158
+ import com .oracle .graal .pointsto .typestate .DefaultAnalysisPolicy ;
164
159
import com .oracle .graal .pointsto .typestate .TypeState ;
165
160
import com .oracle .graal .pointsto .util .AnalysisError ;
166
161
import com .oracle .graal .pointsto .util .GraalAccess ;
167
162
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 ;
168
167
import com .oracle .svm .core .BuildArtifacts ;
169
168
import com .oracle .svm .core .BuildArtifacts .ArtifactType ;
170
169
import com .oracle .svm .core .BuildPhaseProvider ;
241
240
import com .oracle .svm .hosted .ameta .AnalysisConstantReflectionProvider ;
242
241
import com .oracle .svm .hosted .analysis .Inflation ;
243
242
import com .oracle .svm .hosted .analysis .NativeImagePointsToAnalysis ;
243
+ import com .oracle .svm .hosted .analysis .NativeImageReachabilityAnalysisEngine ;
244
244
import com .oracle .svm .hosted .analysis .SVMAnalysisMetaAccess ;
245
245
import com .oracle .svm .hosted .analysis .SubstrateUnsupportedFeatures ;
246
246
import com .oracle .svm .hosted .annotation .AnnotationSupport ;
253
253
import com .oracle .svm .hosted .cenum .CEnumCallWrapperSubstitutionProcessor ;
254
254
import com .oracle .svm .hosted .classinitialization .ClassInitializationFeature ;
255
255
import com .oracle .svm .hosted .classinitialization .ClassInitializationSupport ;
256
- import com .oracle .svm .hosted .classinitialization .ConfigurableClassInitialization ;
257
256
import com .oracle .svm .hosted .code .CEntryPointCallStubSupport ;
258
257
import com .oracle .svm .hosted .code .CEntryPointData ;
259
258
import com .oracle .svm .hosted .code .CFunctionSubstitutionProcessor ;
293
292
import com .oracle .svm .hosted .substitute .AnnotationSubstitutionProcessor ;
294
293
import com .oracle .svm .hosted .substitute .DeletedFieldsPlugin ;
295
294
import com .oracle .svm .hosted .substitute .UnsafeAutomaticSubstitutionProcessor ;
295
+ import com .oracle .svm .util .AnnotationExtracter ;
296
+ import com .oracle .svm .util .ClassUtil ;
296
297
import com .oracle .svm .util .ImageBuildStatistics ;
297
298
import com .oracle .svm .util .ReflectionUtil ;
298
299
import com .oracle .svm .util .ReflectionUtil .ReflectionUtilError ;
@@ -828,7 +829,7 @@ private void setupNativeImage(OptionValues options, Map<Method, CEntryPointData>
828
829
ImageSingletons .add (ClassLoaderSupport .class , classLoaderSupport );
829
830
ImageSingletons .add (LinkAtBuildTimeSupport .class , new LinkAtBuildTimeSupport (loader , classLoaderSupport ));
830
831
831
- ClassInitializationSupport classInitializationSupport = new ConfigurableClassInitialization (originalMetaAccess , loader );
832
+ ClassInitializationSupport classInitializationSupport = ClassInitializationSupport . create (originalMetaAccess , loader );
832
833
ImageSingletons .add (RuntimeClassInitializationSupport .class , classInitializationSupport );
833
834
ClassInitializationFeature .processClassInitializationOptions (classInitializationSupport );
834
835
@@ -1603,7 +1604,7 @@ private void processNativeLibraryImports(NativeLibraries nativeLibs, MetaAccessP
1603
1604
1604
1605
for (Method method : loader .findAnnotatedMethods (CConstant .class )) {
1605
1606
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 );
1607
1608
nativeLibs .loadJavaMethod (metaAccess .lookupJavaMethod (method ));
1608
1609
}
1609
1610
}
@@ -1614,38 +1615,38 @@ private void processNativeLibraryImports(NativeLibraries nativeLibs, MetaAccessP
1614
1615
}
1615
1616
for (Class <?> clazz : loader .findAnnotatedClasses (CStruct .class , false )) {
1616
1617
if (LibCBase .isTypeProvidedInCurrentLibc (clazz )) {
1617
- classInitializationSupport . initializeAtBuildTime (clazz , "classes annotated with " + CStruct .class . getSimpleName () + " are always initialized" );
1618
+ initializeAtBuildTime (clazz , classInitializationSupport , CStruct .class );
1618
1619
nativeLibs .loadJavaType (metaAccess .lookupJavaType (clazz ));
1619
1620
}
1620
1621
}
1621
1622
for (Class <?> clazz : loader .findAnnotatedClasses (RawStructure .class , false )) {
1622
1623
if (LibCBase .isTypeProvidedInCurrentLibc (clazz )) {
1623
- classInitializationSupport . initializeAtBuildTime (clazz , "classes annotated with " + RawStructure .class . getSimpleName () + " are always initialized" );
1624
+ initializeAtBuildTime (clazz , classInitializationSupport , RawStructure .class );
1624
1625
nativeLibs .loadJavaType (metaAccess .lookupJavaType (clazz ));
1625
1626
}
1626
1627
}
1627
1628
for (Class <?> clazz : loader .findAnnotatedClasses (CPointerTo .class , false )) {
1628
1629
if (LibCBase .isTypeProvidedInCurrentLibc (clazz )) {
1629
- classInitializationSupport . initializeAtBuildTime (clazz , "classes annotated with " + CPointerTo .class . getSimpleName () + " are always initialized" );
1630
+ initializeAtBuildTime (clazz , classInitializationSupport , CPointerTo .class );
1630
1631
nativeLibs .loadJavaType (metaAccess .lookupJavaType (clazz ));
1631
1632
}
1632
1633
}
1633
1634
for (Class <?> clazz : loader .findAnnotatedClasses (RawPointerTo .class , false )) {
1634
1635
if (LibCBase .isTypeProvidedInCurrentLibc (clazz )) {
1635
- classInitializationSupport . initializeAtBuildTime (clazz , "classes annotated with " + RawPointerTo .class . getSimpleName () + " are always initialized" );
1636
+ initializeAtBuildTime (clazz , classInitializationSupport , RawPointerTo .class );
1636
1637
nativeLibs .loadJavaType (metaAccess .lookupJavaType (clazz ));
1637
1638
}
1638
1639
}
1639
1640
for (Class <?> clazz : loader .findAnnotatedClasses (CEnum .class , false )) {
1640
1641
if (LibCBase .isTypeProvidedInCurrentLibc (clazz )) {
1641
1642
ResolvedJavaType type = metaAccess .lookupJavaType (clazz );
1642
- classInitializationSupport . initializeAtBuildTime (clazz , "classes annotated with " + CEnum .class . getSimpleName () + " are always initialized" );
1643
+ initializeAtBuildTime (clazz , classInitializationSupport , CEnum .class );
1643
1644
nativeLibs .loadJavaType (type );
1644
1645
}
1645
1646
}
1646
1647
for (Class <?> clazz : loader .findAnnotatedClasses (CContext .class , false )) {
1647
1648
if (LibCBase .isTypeProvidedInCurrentLibc (clazz )) {
1648
- classInitializationSupport . initializeAtBuildTime (clazz , "classes annotated with " + CContext .class . getSimpleName () + " are always initialized" );
1649
+ initializeAtBuildTime (clazz , classInitializationSupport , CContext .class );
1649
1650
}
1650
1651
}
1651
1652
nativeLibs .processCLibraryAnnotations (loader );
@@ -1654,6 +1655,12 @@ private void processNativeLibraryImports(NativeLibraries nativeLibs, MetaAccessP
1654
1655
nativeLibs .reportErrors ();
1655
1656
}
1656
1657
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
+
1657
1664
public AbstractImage getBuiltImage () {
1658
1665
return image ;
1659
1666
}
0 commit comments