|
32 | 32 |
|
33 | 33 | import java.io.IOException;
|
34 | 34 | import java.lang.annotation.Annotation;
|
35 |
| -import java.lang.reflect.Executable; |
36 | 35 | import java.lang.reflect.Method;
|
37 | 36 | import java.lang.reflect.Modifier;
|
38 |
| -import java.lang.reflect.Type; |
39 | 37 | import java.nio.file.FileSystems;
|
40 | 38 | import java.nio.file.Files;
|
41 | 39 | import java.nio.file.Path;
|
42 | 40 | import java.util.ArrayList;
|
43 | 41 | import java.util.Arrays;
|
44 | 42 | import java.util.Collection;
|
45 | 43 | import java.util.Collections;
|
46 |
| -import java.util.Comparator; |
47 | 44 | import java.util.EnumSet;
|
48 | 45 | import java.util.List;
|
49 | 46 | import java.util.ListIterator;
|
|
55 | 52 | import java.util.function.BooleanSupplier;
|
56 | 53 | import java.util.function.Function;
|
57 | 54 |
|
58 |
| -import org.graalvm.collections.EconomicMap; |
59 | 55 | import org.graalvm.collections.EconomicSet;
|
60 |
| -import org.graalvm.collections.MapCursor; |
61 | 56 | import org.graalvm.collections.Pair;
|
62 |
| -import org.graalvm.nativeimage.AnnotationAccess; |
63 | 57 | import org.graalvm.nativeimage.ImageInfo;
|
64 | 58 | import org.graalvm.nativeimage.ImageSingletons;
|
65 | 59 | import org.graalvm.nativeimage.Platform;
|
|
258 | 252 | import com.oracle.svm.hosted.snippets.SubstrateGraphBuilderPlugins;
|
259 | 253 | import com.oracle.svm.hosted.substitute.AnnotationSubstitutionProcessor;
|
260 | 254 | import com.oracle.svm.hosted.substitute.DeletedFieldsPlugin;
|
| 255 | +import com.oracle.svm.hosted.substitute.SubstitutionInvocationPlugins; |
261 | 256 | import com.oracle.svm.hosted.util.CPUTypeAArch64;
|
262 | 257 | import com.oracle.svm.hosted.util.CPUTypeAMD64;
|
263 | 258 | import com.oracle.svm.hosted.util.CPUTypeRISCV64;
|
|
293 | 288 | import jdk.graal.compiler.nodes.graphbuilderconf.ClassInitializationPlugin;
|
294 | 289 | import jdk.graal.compiler.nodes.graphbuilderconf.GeneratedPluginFactory;
|
295 | 290 | import jdk.graal.compiler.nodes.graphbuilderconf.GraphBuilderConfiguration;
|
296 |
| -import jdk.graal.compiler.nodes.graphbuilderconf.InvocationPlugin; |
297 |
| -import jdk.graal.compiler.nodes.graphbuilderconf.InvocationPlugins; |
298 | 291 | import jdk.graal.compiler.nodes.spi.CoreProviders;
|
299 | 292 | import jdk.graal.compiler.nodes.spi.LoweringProvider;
|
300 | 293 | import jdk.graal.compiler.nodes.spi.StampProvider;
|
@@ -1362,86 +1355,6 @@ protected boolean isStubBasedPluginsSupported() {
|
1362 | 1355 | return !SubstrateOptions.useLLVMBackend();
|
1363 | 1356 | }
|
1364 | 1357 |
|
1365 |
| - @Platforms(Platform.HOSTED_ONLY.class) |
1366 |
| - static class SubstitutionInvocationPlugins extends InvocationPlugins { |
1367 |
| - |
1368 |
| - private final AnnotationSubstitutionProcessor annotationSubstitutionProcessor; |
1369 |
| - private EconomicMap<String, Integer> missingIntrinsicMetrics; |
1370 |
| - |
1371 |
| - SubstitutionInvocationPlugins(AnnotationSubstitutionProcessor annotationSubstitutionProcessor) { |
1372 |
| - this.annotationSubstitutionProcessor = annotationSubstitutionProcessor; |
1373 |
| - this.missingIntrinsicMetrics = null; |
1374 |
| - } |
1375 |
| - |
1376 |
| - @Override |
1377 |
| - protected void register(Type declaringClass, InvocationPlugin plugin, boolean allowOverwrite) { |
1378 |
| - Type targetClass; |
1379 |
| - if (declaringClass instanceof Class<?> annotatedClass) { |
1380 |
| - targetClass = annotationSubstitutionProcessor.getTargetClass(annotatedClass); |
1381 |
| - if (targetClass != declaringClass) { |
1382 |
| - /* Found a target class. Check if it is included. */ |
1383 |
| - Executable annotatedMethod = plugin.name.equals("<init>") ? resolveConstructor(annotatedClass, plugin) : resolveMethod(annotatedClass, plugin); |
1384 |
| - String originalName = annotationSubstitutionProcessor.findOriginalElementName(annotatedMethod, (Class<?>) targetClass); |
1385 |
| - if (originalName == null) { |
1386 |
| - /* |
1387 |
| - * If the name is null, the element should not be substituted. Thus, we |
1388 |
| - * should also not register the invocation plugin. |
1389 |
| - */ |
1390 |
| - return; |
1391 |
| - } |
1392 |
| - if (!originalName.equals(plugin.name)) { |
1393 |
| - throw VMError.unimplemented(String.format(""" |
1394 |
| - InvocationPlugins cannot yet deal with substitution methods that set the target name via the @TargetElement(name = ...) property. |
1395 |
| - Annotated method "%s" vs target method "%s".""", plugin.name, originalName)); |
1396 |
| - } |
1397 |
| - } |
1398 |
| - } else { |
1399 |
| - targetClass = declaringClass; |
1400 |
| - } |
1401 |
| - super.register(targetClass, plugin, allowOverwrite); |
1402 |
| - } |
1403 |
| - |
1404 |
| - @Override |
1405 |
| - public void notifyNoPlugin(ResolvedJavaMethod targetMethod, OptionValues options) { |
1406 |
| - if (Options.WarnMissingIntrinsic.getValue(options)) { |
1407 |
| - for (Class<?> annotationType : AnnotationAccess.getAnnotationTypes(targetMethod)) { |
1408 |
| - if (ClassUtil.getUnqualifiedName(annotationType).contains("IntrinsicCandidate")) { |
1409 |
| - String method = String.format("%s.%s%s", targetMethod.getDeclaringClass().toJavaName().replace('.', '/'), targetMethod.getName(), |
1410 |
| - targetMethod.getSignature().toMethodDescriptor()); |
1411 |
| - synchronized (this) { |
1412 |
| - if (missingIntrinsicMetrics == null) { |
1413 |
| - missingIntrinsicMetrics = EconomicMap.create(); |
1414 |
| - try { |
1415 |
| - Runtime.getRuntime().addShutdownHook(new Thread(() -> { |
1416 |
| - if (missingIntrinsicMetrics.size() > 0) { |
1417 |
| - System.out.format("[Warning] Missing intrinsics found: %d%n", missingIntrinsicMetrics.size()); |
1418 |
| - List<Pair<String, Integer>> data = new ArrayList<>(); |
1419 |
| - final MapCursor<String, Integer> cursor = missingIntrinsicMetrics.getEntries(); |
1420 |
| - while (cursor.advance()) { |
1421 |
| - data.add(Pair.create(cursor.getKey(), cursor.getValue())); |
1422 |
| - } |
1423 |
| - data.stream().sorted(Comparator.comparing(Pair::getRight, Comparator.reverseOrder())).forEach( |
1424 |
| - pair -> System.out.format(" - %d occurrences during parsing: %s%n", pair.getRight(), pair.getLeft())); |
1425 |
| - } |
1426 |
| - })); |
1427 |
| - } catch (IllegalStateException e) { |
1428 |
| - // shutdown in progress, no need to register the hook |
1429 |
| - } |
1430 |
| - } |
1431 |
| - if (missingIntrinsicMetrics.containsKey(method)) { |
1432 |
| - missingIntrinsicMetrics.put(method, missingIntrinsicMetrics.get(method) + 1); |
1433 |
| - } else { |
1434 |
| - System.out.format("[Warning] Missing intrinsic %s found during parsing.%n", method); |
1435 |
| - missingIntrinsicMetrics.put(method, 1); |
1436 |
| - } |
1437 |
| - } |
1438 |
| - break; |
1439 |
| - } |
1440 |
| - } |
1441 |
| - } |
1442 |
| - } |
1443 |
| - } |
1444 |
| - |
1445 | 1358 | public static void registerGraphBuilderPlugins(FeatureHandler featureHandler, RuntimeConfiguration runtimeConfig, HostedProviders providers, AnalysisMetaAccess aMetaAccess,
|
1446 | 1359 | AnalysisUniverse aUniverse, NativeLibraries nativeLibs, ImageClassLoader loader, ParsingReason reason,
|
1447 | 1360 | AnnotationSubstitutionProcessor annotationSubstitutionProcessor, ClassInitializationPlugin classInitializationPlugin,
|
|
0 commit comments