Skip to content

Commit 48fd4f2

Browse files
author
Doug Simon
committed
8303431: [JVMCI] libgraal annotation API
Reviewed-by: kvn, never, darcy
1 parent c57af31 commit 48fd4f2

34 files changed

+2298
-51
lines changed

src/hotspot/share/classfile/vmSymbols.hpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -756,6 +756,8 @@
756756
template(encodeThrowable_name, "encodeThrowable") \
757757
template(encodeThrowable_signature, "(Ljava/lang/Throwable;JI)I") \
758758
template(decodeAndThrowThrowable_name, "decodeAndThrowThrowable") \
759+
template(encodeAnnotations_name, "encodeAnnotations") \
760+
template(encodeAnnotations_signature, "([BLjava/lang/Class;Ljdk/internal/reflect/ConstantPool;Z[Ljava/lang/Class;)[B")\
759761
template(decodeAndThrowThrowable_signature, "(JZ)V") \
760762
template(classRedefinedCount_name, "classRedefinedCount") \
761763
template(classLoader_name, "classLoader") \

src/hotspot/share/jvmci/jvmciCompilerToVM.cpp

Lines changed: 93 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2672,9 +2672,7 @@ C2V_VMENTRY_NULL(jobject, asReflectionExecutable, (JNIEnv* env, jobject, ARGUMEN
26722672
return JNIHandles::make_local(THREAD, executable);
26732673
}
26742674

2675-
C2V_VMENTRY_NULL(jobject, asReflectionField, (JNIEnv* env, jobject, ARGUMENT_PAIR(klass), jint index))
2676-
requireInHotSpot("asReflectionField", JVMCI_CHECK_NULL);
2677-
Klass* klass = UNPACK_PAIR(Klass, klass);
2675+
static InstanceKlass* check_field(Klass* klass, jint index, JVMCI_TRAPS) {
26782676
if (!klass->is_instance_klass()) {
26792677
JVMCI_THROW_MSG_NULL(IllegalArgumentException,
26802678
err_msg("Expected non-primitive type, got %s", klass->external_name()));
@@ -2684,11 +2682,100 @@ C2V_VMENTRY_NULL(jobject, asReflectionField, (JNIEnv* env, jobject, ARGUMENT_PAI
26842682
JVMCI_THROW_MSG_NULL(IllegalArgumentException,
26852683
err_msg("Field index %d out of bounds for %s", index, klass->external_name()));
26862684
}
2685+
return iklass;
2686+
}
2687+
2688+
C2V_VMENTRY_NULL(jobject, asReflectionField, (JNIEnv* env, jobject, ARGUMENT_PAIR(klass), jint index))
2689+
requireInHotSpot("asReflectionField", JVMCI_CHECK_NULL);
2690+
Klass* klass = UNPACK_PAIR(Klass, klass);
2691+
InstanceKlass* iklass = check_field(klass, index, JVMCIENV);
26872692
fieldDescriptor fd(iklass, index);
26882693
oop reflected = Reflection::new_field(&fd, CHECK_NULL);
26892694
return JNIHandles::make_local(THREAD, reflected);
26902695
}
26912696

2697+
static jbyteArray get_encoded_annotation_data(InstanceKlass* holder, AnnotationArray* annotations_array, bool for_class,
2698+
jint filter_length, jlong filter_klass_pointers,
2699+
JavaThread* THREAD, JVMCIEnv* JVMCIENV) {
2700+
// Get a ConstantPool object for annotation parsing
2701+
Handle jcp = reflect_ConstantPool::create(CHECK_NULL);
2702+
reflect_ConstantPool::set_cp(jcp(), holder->constants());
2703+
2704+
// load VMSupport
2705+
Symbol* klass = vmSymbols::jdk_internal_vm_VMSupport();
2706+
Klass* k = SystemDictionary::resolve_or_fail(klass, true, CHECK_NULL);
2707+
2708+
InstanceKlass* vm_support = InstanceKlass::cast(k);
2709+
if (vm_support->should_be_initialized()) {
2710+
vm_support->initialize(CHECK_NULL);
2711+
}
2712+
2713+
typeArrayOop annotations_oop = Annotations::make_java_array(annotations_array, CHECK_NULL);
2714+
typeArrayHandle annotations = typeArrayHandle(THREAD, annotations_oop);
2715+
2716+
InstanceKlass** filter = filter_length == 1 ?
2717+
(InstanceKlass**) &filter_klass_pointers:
2718+
(InstanceKlass**) filter_klass_pointers;
2719+
objArrayOop filter_oop = oopFactory::new_objectArray(filter_length, CHECK_NULL);
2720+
objArrayHandle filter_classes(THREAD, filter_oop);
2721+
for (int i = 0; i < filter_length; i++) {
2722+
filter_classes->obj_at_put(i, filter[i]->java_mirror());
2723+
}
2724+
2725+
// invoke VMSupport.encodeAnnotations
2726+
JavaValue result(T_OBJECT);
2727+
JavaCallArguments args;
2728+
args.push_oop(annotations);
2729+
args.push_oop(Handle(THREAD, holder->java_mirror()));
2730+
args.push_oop(jcp);
2731+
args.push_int(for_class);
2732+
args.push_oop(filter_classes);
2733+
Symbol* signature = vmSymbols::encodeAnnotations_signature();
2734+
JavaCalls::call_static(&result,
2735+
vm_support,
2736+
vmSymbols::encodeAnnotations_name(),
2737+
signature,
2738+
&args,
2739+
CHECK_NULL);
2740+
2741+
oop res = result.get_oop();
2742+
if (JVMCIENV->is_hotspot()) {
2743+
return (jbyteArray) JNIHandles::make_local(THREAD, res);
2744+
}
2745+
2746+
typeArrayOop ba = typeArrayOop(res);
2747+
int ba_len = ba->length();
2748+
jbyte* ba_buf = NEW_RESOURCE_ARRAY_IN_THREAD_RETURN_NULL(THREAD, jbyte, ba_len);
2749+
if (ba_buf == nullptr) {
2750+
JVMCI_THROW_MSG_NULL(InternalError,
2751+
err_msg("could not allocate %d bytes", ba_len));
2752+
2753+
}
2754+
memcpy(ba_buf, ba->byte_at_addr(0), ba_len);
2755+
JVMCIPrimitiveArray ba_dest = JVMCIENV->new_byteArray(ba_len, JVMCI_CHECK_NULL);
2756+
JVMCIENV->copy_bytes_from(ba_buf, ba_dest, 0, ba_len);
2757+
return JVMCIENV->get_jbyteArray(ba_dest);
2758+
}
2759+
2760+
C2V_VMENTRY_NULL(jbyteArray, getEncodedClassAnnotationData, (JNIEnv* env, jobject, ARGUMENT_PAIR(klass),
2761+
jobject filter, jint filter_length, jlong filter_klass_pointers))
2762+
InstanceKlass* holder = InstanceKlass::cast(UNPACK_PAIR(Klass, klass));
2763+
return get_encoded_annotation_data(holder, holder->class_annotations(), true, filter_length, filter_klass_pointers, THREAD, JVMCIENV);
2764+
C2V_END
2765+
2766+
C2V_VMENTRY_NULL(jbyteArray, getEncodedExecutableAnnotationData, (JNIEnv* env, jobject, ARGUMENT_PAIR(method),
2767+
jobject filter, jint filter_length, jlong filter_klass_pointers))
2768+
methodHandle method(THREAD, UNPACK_PAIR(Method, method));
2769+
return get_encoded_annotation_data(method->method_holder(), method->annotations(), false, filter_length, filter_klass_pointers, THREAD, JVMCIENV);
2770+
C2V_END
2771+
2772+
C2V_VMENTRY_NULL(jbyteArray, getEncodedFieldAnnotationData, (JNIEnv* env, jobject, ARGUMENT_PAIR(klass), jint index,
2773+
jobject filter, jint filter_length, jlong filter_klass_pointers))
2774+
InstanceKlass* holder = check_field(InstanceKlass::cast(UNPACK_PAIR(Klass, klass)), index, JVMCIENV);
2775+
fieldDescriptor fd(holder, index);
2776+
return get_encoded_annotation_data(holder, fd.annotations(), false, filter_length, filter_klass_pointers, THREAD, JVMCIENV);
2777+
C2V_END
2778+
26922779
C2V_VMENTRY_NULL(jobjectArray, getFailedSpeculations, (JNIEnv* env, jobject, jlong failed_speculations_address, jobjectArray current))
26932780
FailedSpeculation* head = *((FailedSpeculation**)(address) failed_speculations_address);
26942781
int result_length = 0;
@@ -2969,6 +3056,9 @@ JNINativeMethod CompilerToVM::methods[] = {
29693056
{CC "getCode", CC "(" HS_INSTALLED_CODE ")[B", FN_PTR(getCode)},
29703057
{CC "asReflectionExecutable", CC "(" HS_METHOD2 ")" REFLECTION_EXECUTABLE, FN_PTR(asReflectionExecutable)},
29713058
{CC "asReflectionField", CC "(" HS_KLASS2 "I)" REFLECTION_FIELD, FN_PTR(asReflectionField)},
3059+
{CC "getEncodedClassAnnotationData", CC "(" HS_KLASS2 OBJECT "IJ)[B", FN_PTR(getEncodedClassAnnotationData)},
3060+
{CC "getEncodedExecutableAnnotationData", CC "(" HS_METHOD2 OBJECT "IJ)[B", FN_PTR(getEncodedExecutableAnnotationData)},
3061+
{CC "getEncodedFieldAnnotationData", CC "(" HS_KLASS2 "I" OBJECT "IJ)[B", FN_PTR(getEncodedFieldAnnotationData)},
29723062
{CC "getFailedSpeculations", CC "(J[[B)[[B", FN_PTR(getFailedSpeculations)},
29733063
{CC "getFailedSpeculationsAddress", CC "(" HS_METHOD2 ")J", FN_PTR(getFailedSpeculationsAddress)},
29743064
{CC "releaseFailedSpeculations", CC "(J)V", FN_PTR(releaseFailedSpeculations)},

src/hotspot/share/jvmci/vmStructs_jvmci.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,7 @@
104104
\
105105
static_field(Abstract_VM_Version, _features, uint64_t) \
106106
\
107+
nonstatic_field(Annotations, _class_annotations, AnnotationArray*) \
107108
nonstatic_field(Annotations, _fields_annotations, Array<AnnotationArray*>*) \
108109
\
109110
nonstatic_field(Array<int>, _length, int) \

0 commit comments

Comments
 (0)