2424 */
2525package com .oracle .svm .hosted ;
2626
27+ import com .oracle .graal .pointsto .meta .AnalysisMetaAccess ;
2728import com .oracle .graal .pointsto .reports .ReportUtils ;
2829import com .oracle .svm .core .BuildArtifacts ;
2930import com .oracle .svm .core .SubstrateOptions ;
@@ -73,16 +74,16 @@ public final class DynamicAccessDetectionFeature implements InternalFeature {
7374
7475 // We use a ConcurrentSkipListMap, as opposed to a ConcurrentHashMap, to maintain
7576 // order of methods by access kind.
76- public record MethodsByAccessKind (Map <DynamicAccessDetectionPhase .DynamicAccessKind , CallLocationsByMethod > methodsByAccessKind ) {
77+ public record MethodsByAccessKind (Map <DynamicAccessDetectionSupport .DynamicAccessKind , CallLocationsByMethod > methodsByAccessKind ) {
7778 MethodsByAccessKind () {
7879 this (new ConcurrentSkipListMap <>());
7980 }
8081
81- public Set <DynamicAccessDetectionPhase .DynamicAccessKind > getAccessKinds () {
82+ public Set <DynamicAccessDetectionSupport .DynamicAccessKind > getAccessKinds () {
8283 return methodsByAccessKind .keySet ();
8384 }
8485
85- public CallLocationsByMethod getCallLocationsByMethod (DynamicAccessDetectionPhase .DynamicAccessKind accessKind ) {
86+ public CallLocationsByMethod getCallLocationsByMethod (DynamicAccessDetectionSupport .DynamicAccessKind accessKind ) {
8687 return methodsByAccessKind .getOrDefault (accessKind , new CallLocationsByMethod ());
8788 }
8889 }
@@ -137,7 +138,7 @@ public static DynamicAccessDetectionFeature instance() {
137138 return ImageSingletons .lookup (DynamicAccessDetectionFeature .class );
138139 }
139140
140- public void addCall (String entry , DynamicAccessDetectionPhase .DynamicAccessKind accessKind , String call , String callLocation ) {
141+ public void addCall (String entry , DynamicAccessDetectionSupport .DynamicAccessKind accessKind , String call , String callLocation ) {
141142 MethodsByAccessKind entryContent = callsBySourceEntry .computeIfAbsent (entry , _ -> new MethodsByAccessKind ());
142143 CallLocationsByMethod methodCallLocations = entryContent .methodsByAccessKind ().computeIfAbsent (accessKind , _ -> new CallLocationsByMethod ());
143144 ConcurrentSkipListSet <String > callLocations = methodCallLocations .callLocationsByMethod ().computeIfAbsent (call , _ -> new ConcurrentSkipListSet <>());
@@ -163,7 +164,7 @@ public static String getEntryName(String path) {
163164 private void printReportForEntry (String entry ) {
164165 System .out .println ("Dynamic method usage detected in " + entry + ":" );
165166 MethodsByAccessKind methodsByAccessKind = getMethodsByAccessKind (entry );
166- for (DynamicAccessDetectionPhase .DynamicAccessKind accessKind : methodsByAccessKind .getAccessKinds ()) {
167+ for (DynamicAccessDetectionSupport .DynamicAccessKind accessKind : methodsByAccessKind .getAccessKinds ()) {
167168 System .out .println (" " + accessKind + " calls detected:" );
168169 CallLocationsByMethod methodCallLocations = methodsByAccessKind .getCallLocationsByMethod (accessKind );
169170 for (String call : methodCallLocations .getMethods ()) {
@@ -196,7 +197,7 @@ private void dumpReportForEntry(String entry) {
196197 MethodsByAccessKind methodsByAccessKind = getMethodsByAccessKind (entry );
197198 Path reportDirectory = NativeImageGenerator .generatedFiles (hostedOptionValues )
198199 .resolve (OUTPUT_DIR_NAME );
199- for (DynamicAccessDetectionPhase .DynamicAccessKind accessKind : methodsByAccessKind .getAccessKinds ()) {
200+ for (DynamicAccessDetectionSupport .DynamicAccessKind accessKind : methodsByAccessKind .getAccessKinds ()) {
200201 Path entryDirectory = getOrCreateDirectory (reportDirectory .resolve (getEntryName (entry )));
201202 Path targetPath = entryDirectory .resolve (accessKind .fileName );
202203 ReportUtils .report ("Dynamic Access Detection Report" , targetPath ,
@@ -209,7 +210,7 @@ private void dumpReportForEntry(String entry) {
209210 }
210211 }
211212
212- private static void generateDynamicAccessReport (PrintWriter writer , DynamicAccessDetectionPhase .DynamicAccessKind accessKind , MethodsByAccessKind methodsByAccessKind ) {
213+ private static void generateDynamicAccessReport (PrintWriter writer , DynamicAccessDetectionSupport .DynamicAccessKind accessKind , MethodsByAccessKind methodsByAccessKind ) {
213214 writer .println ("{" );
214215 String methodsJson = methodsByAccessKind .getCallLocationsByMethod (accessKind ).getMethods ().stream ()
215216 .map (methodName -> toMethodJson (accessKind , methodName , methodsByAccessKind ))
@@ -218,7 +219,7 @@ private static void generateDynamicAccessReport(PrintWriter writer, DynamicAcces
218219 writer .println ("}" );
219220 }
220221
221- private static String toMethodJson (DynamicAccessDetectionPhase .DynamicAccessKind accessKind , String methodName , MethodsByAccessKind methodsByAccessKind ) {
222+ private static String toMethodJson (DynamicAccessDetectionSupport .DynamicAccessKind accessKind , String methodName , MethodsByAccessKind methodsByAccessKind ) {
222223 String locationsJson = methodsByAccessKind .getCallLocationsByMethod (accessKind )
223224 .getMethodCallLocations (methodName ).stream ()
224225 .map (location -> " \" " + location + "\" " )
@@ -321,10 +322,17 @@ public void afterRegistration(AfterRegistrationAccess access) {
321322 });
322323 }
323324
325+ @ Override
326+ public void beforeAnalysis (BeforeAnalysisAccess access ) {
327+ AnalysisMetaAccess metaAccess = ((FeatureImpl .BeforeAnalysisAccessImpl ) access ).getMetaAccess ();
328+ DynamicAccessDetectionSupport dynamicAccessDetectionSupport = new DynamicAccessDetectionSupport (metaAccess );
329+ ImageSingletons .add (DynamicAccessDetectionSupport .class , dynamicAccessDetectionSupport );
330+ }
331+
324332 @ Override
325333 public void beforeCompilation (BeforeCompilationAccess access ) {
326334 DynamicAccessDetectionFeature .instance ().reportDynamicAccess ();
327- DynamicAccessDetectionPhase . clearMethodSignatures ();
335+ DynamicAccessDetectionSupport . instance (). clear ();
328336 foldEntries .clear ();
329337 }
330338
0 commit comments