RFR: 8303431: [JVMCI] libgraal annotation API [v5]

Doug Simon dnsimon at openjdk.org
Wed Mar 8 22:59:23 UTC 2023


> This PR extends JVMCI with new API (`jdk.vm.ci.meta.Annotated`) for accessing annotations. The main differences from `java.lang.reflect.AnnotatedElement` are:
> * Each `Annotated` method explicitly specifies the annotation type(s) for which it wants annotation data. That is, there is no direct equivalent of `AnnotatedElement.getAnnotations()`.
> * Annotation data is returned in a map-like object (of type `jdk.vm.ci.meta.AnnotationData`) instead of in an `Annotation` object. This works better for libgraal as it avoids the need for annotation types to be loaded and included in libgraal.
>  
> To demonstrate the new API, here's an example in terms `java.lang.reflect.AnnotatedElement` (which `ResolvedJavaType` implements):
> 
>     ResolvedJavaMethod method = ...;
>     ExplodeLoop a = method.getAnnotation(ExplodeLoop.class);
>     return switch (a.kind()) {
>         case FULL_UNROLL -> LoopExplosionKind.FULL_UNROLL;
>         case FULL_UNROLL_UNTIL_RETURN -> LoopExplosionKind.FULL_UNROLL_UNTIL_RETURN;
>         ...
>     }
> 
> 
> The same code using the new API:
> 
> 
>     ResolvedJavaMethod method = ...;
>     ResolvedJavaType explodeLoopType = ...;
>     AnnotationData a = method.getAnnotationDataFor(explodeLoopType);
>     return switch (a.getEnum("kind").getName()) {
>         case "FULL_UNROLL" -> LoopExplosionKind.FULL_UNROLL;
>         case "FULL_UNROLL_UNTIL_RETURN" -> LoopExplosionKind.FULL_UNROLL_UNTIL_RETURN;
>         ...
>     }
> 
> 
> The implementation relies on new methods in `jdk.internal.vm.VMSupport` for parsing annotations and serializing/deserializing to/from a byte array. This allows the annotation data to be passed from the HotSpot heap to the libgraal heap.

Doug Simon has updated the pull request with a new target base due to a merge or a rebase. The pull request now contains seven commits:

 - Merge remote-tracking branch 'openjdk-jdk/master' into JDK-8303431
 - switched to use of lists and maps instead of arrays
 - fixed whitespace
 - added support for inherited annotations
 - Merge branch 'master' into JDK-8303431
 - made AnnotationDataDecoder package-private
 - add annotation API to JVMCI

-------------

Changes: https://git.openjdk.org/jdk/pull/12810/files
 Webrev: https://webrevs.openjdk.org/?repo=jdk&pr=12810&range=04
  Stats: 2326 lines in 34 files changed: 2273 ins; 23 del; 30 mod
  Patch: https://git.openjdk.org/jdk/pull/12810.diff
  Fetch: git fetch https://git.openjdk.org/jdk pull/12810/head:pull/12810

PR: https://git.openjdk.org/jdk/pull/12810


More information about the core-libs-dev mailing list