Skip to content

Commit ff93591

Browse files
committed
Add conversion of Class<?> and String to ResolvedJavaType and ResolvedJavaMethod in DynamicAccessDetectionPhase
1 parent 4959f1d commit ff93591

File tree

3 files changed

+299
-290
lines changed

3 files changed

+299
-290
lines changed

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

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
*/
2525
package com.oracle.svm.hosted;
2626

27+
import com.oracle.graal.pointsto.meta.AnalysisMetaAccess;
2728
import com.oracle.graal.pointsto.reports.ReportUtils;
2829
import com.oracle.svm.core.BuildArtifacts;
2930
import 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

Comments
 (0)