604 C2V_VMENTRY(jobject, lookupAppendixInPool, (JNIEnv*, jobject, jobject jvmci_constant_pool, jint index))
605 constantPoolHandle cp = CompilerToVM::asConstantPool(jvmci_constant_pool);
606 oop appendix_oop = ConstantPool::appendix_at_if_loaded(cp, index);
607 return JNIHandles::make_local(THREAD, appendix_oop);
608 C2V_END
609
610 C2V_VMENTRY(jobject, lookupMethodInPool, (JNIEnv*, jobject, jobject jvmci_constant_pool, jint index, jbyte opcode))
611 constantPoolHandle cp = CompilerToVM::asConstantPool(jvmci_constant_pool);
612 instanceKlassHandle pool_holder(cp->pool_holder());
613 Bytecodes::Code bc = (Bytecodes::Code) (((int) opcode) & 0xFF);
614 methodHandle method = JVMCIEnv::get_method_by_index(cp, index, bc, pool_holder);
615 oop result = CompilerToVM::get_jvmci_method(method, CHECK_NULL);
616 return JNIHandles::make_local(THREAD, result);
617 C2V_END
618
619 C2V_VMENTRY(jint, constantPoolRemapInstructionOperandFromCache, (JNIEnv*, jobject, jobject jvmci_constant_pool, jint index))
620 constantPoolHandle cp = CompilerToVM::asConstantPool(jvmci_constant_pool);
621 return cp->remap_instruction_operand_from_cache(index);
622 C2V_END
623
624 C2V_VMENTRY(jobject, resolveFieldInPool, (JNIEnv*, jobject, jobject jvmci_constant_pool, jint index, jbyte opcode, jlongArray info_handle))
625 ResourceMark rm;
626 constantPoolHandle cp = CompilerToVM::asConstantPool(jvmci_constant_pool);
627 Bytecodes::Code code = (Bytecodes::Code)(((int) opcode) & 0xFF);
628 fieldDescriptor fd;
629 LinkInfo link_info(cp, index, CHECK_0);
630 LinkResolver::resolve_field(fd, link_info, Bytecodes::java_code(code), false, CHECK_0);
631 typeArrayOop info = (typeArrayOop) JNIHandles::resolve(info_handle);
632 assert(info != NULL && info->length() == 2, "must be");
633 info->long_at_put(0, (jlong) fd.access_flags().as_int());
634 info->long_at_put(1, (jlong) fd.offset());
635 oop field_holder = CompilerToVM::get_jvmci_type(fd.field_holder(), CHECK_NULL);
636 return JNIHandles::make_local(THREAD, field_holder);
637 C2V_END
638
639 C2V_VMENTRY(jint, getVtableIndexForInterfaceMethod, (JNIEnv *, jobject, jobject jvmci_type, jobject jvmci_method))
640 ResourceMark rm;
641 Klass* klass = CompilerToVM::asKlass(jvmci_type);
642 Method* method = CompilerToVM::asMethod(jvmci_method);
643 if (klass->is_interface()) {
644 THROW_MSG_0(vmSymbols::java_lang_InternalError(), err_msg("Interface %s should be handled in Java code", klass->external_name()));
645 }
646 if (!method->method_holder()->is_interface()) {
647 THROW_MSG_0(vmSymbols::java_lang_InternalError(), err_msg("Method %s is not held by an interface, this case should be handled in Java code", method->name_and_sig_as_C_string()));
648 }
649 if (!InstanceKlass::cast(klass)->is_linked()) {
650 THROW_MSG_0(vmSymbols::java_lang_InternalError(), err_msg("Class %s must be linked", klass->external_name()));
651 }
652 return LinkResolver::vtable_index_of_interface_method(klass, method);
653 C2V_END
654
655 C2V_VMENTRY(jobject, resolveMethod, (JNIEnv *, jobject, jobject receiver_jvmci_type, jobject jvmci_method, jobject caller_jvmci_type))
656 KlassHandle recv_klass = CompilerToVM::asKlass(receiver_jvmci_type);
657 KlassHandle caller_klass = CompilerToVM::asKlass(caller_jvmci_type);
658 methodHandle method = CompilerToVM::asMethod(jvmci_method);
659
660 KlassHandle h_resolved (THREAD, method->method_holder());
661 Symbol* h_name = method->name();
662 Symbol* h_signature = method->signature();
663
664 bool check_access = true;
665 LinkInfo link_info(h_resolved, h_name, h_signature, caller_klass, check_access);
666 methodHandle m;
667 // Only do exact lookup if receiver klass has been linked. Otherwise,
668 // the vtable has not been setup, and the LinkResolver will fail.
669 if (recv_klass->is_array_klass() ||
670 InstanceKlass::cast(recv_klass())->is_linked() && !recv_klass->is_interface()) {
671 if (h_resolved->is_interface()) {
672 m = LinkResolver::resolve_interface_call_or_null(recv_klass, link_info);
673 } else {
674 m = LinkResolver::resolve_virtual_call_or_null(recv_klass, link_info);
675 }
676 }
677
678 if (m.is_null()) {
679 // Return NULL only if there was a problem with lookup (uninitialized class, etc.)
680 return NULL;
681 }
682
683 oop result = CompilerToVM::get_jvmci_method(m, CHECK_NULL);
684 return JNIHandles::make_local(THREAD, result);
685 C2V_END
1424 {CC "getExceptionTableLength", CC "(" HS_RESOLVED_METHOD ")I", FN_PTR(getExceptionTableLength)},
1425 {CC "findUniqueConcreteMethod", CC "(" HS_RESOLVED_KLASS HS_RESOLVED_METHOD ")" HS_RESOLVED_METHOD, FN_PTR(findUniqueConcreteMethod)},
1426 {CC "getImplementor", CC "(" HS_RESOLVED_KLASS ")" HS_RESOLVED_KLASS, FN_PTR(getImplementor)},
1427 {CC "getStackTraceElement", CC "(" HS_RESOLVED_METHOD "I)" STACK_TRACE_ELEMENT, FN_PTR(getStackTraceElement)},
1428 {CC "methodIsIgnoredBySecurityStackWalk", CC "(" HS_RESOLVED_METHOD ")Z", FN_PTR(methodIsIgnoredBySecurityStackWalk)},
1429 {CC "doNotInlineOrCompile", CC "(" HS_RESOLVED_METHOD ")V", FN_PTR(doNotInlineOrCompile)},
1430 {CC "canInlineMethod", CC "(" HS_RESOLVED_METHOD ")Z", FN_PTR(canInlineMethod)},
1431 {CC "shouldInlineMethod", CC "(" HS_RESOLVED_METHOD ")Z", FN_PTR(shouldInlineMethod)},
1432 {CC "lookupType", CC "(" STRING CLASS "Z)" HS_RESOLVED_KLASS, FN_PTR(lookupType)},
1433 {CC "lookupNameInPool", CC "(" HS_CONSTANT_POOL "I)" STRING, FN_PTR(lookupNameInPool)},
1434 {CC "lookupNameAndTypeRefIndexInPool", CC "(" HS_CONSTANT_POOL "I)I", FN_PTR(lookupNameAndTypeRefIndexInPool)},
1435 {CC "lookupSignatureInPool", CC "(" HS_CONSTANT_POOL "I)" STRING, FN_PTR(lookupSignatureInPool)},
1436 {CC "lookupKlassRefIndexInPool", CC "(" HS_CONSTANT_POOL "I)I", FN_PTR(lookupKlassRefIndexInPool)},
1437 {CC "lookupKlassInPool", CC "(" HS_CONSTANT_POOL "I)Ljava/lang/Object;", FN_PTR(lookupKlassInPool)},
1438 {CC "lookupAppendixInPool", CC "(" HS_CONSTANT_POOL "I)" OBJECT, FN_PTR(lookupAppendixInPool)},
1439 {CC "lookupMethodInPool", CC "(" HS_CONSTANT_POOL "IB)" HS_RESOLVED_METHOD, FN_PTR(lookupMethodInPool)},
1440 {CC "constantPoolRemapInstructionOperandFromCache", CC "(" HS_CONSTANT_POOL "I)I", FN_PTR(constantPoolRemapInstructionOperandFromCache)},
1441 {CC "resolveConstantInPool", CC "(" HS_CONSTANT_POOL "I)" OBJECT, FN_PTR(resolveConstantInPool)},
1442 {CC "resolvePossiblyCachedConstantInPool", CC "(" HS_CONSTANT_POOL "I)" OBJECT, FN_PTR(resolvePossiblyCachedConstantInPool)},
1443 {CC "resolveTypeInPool", CC "(" HS_CONSTANT_POOL "I)" HS_RESOLVED_KLASS, FN_PTR(resolveTypeInPool)},
1444 {CC "resolveFieldInPool", CC "(" HS_CONSTANT_POOL "IB[J)" HS_RESOLVED_KLASS, FN_PTR(resolveFieldInPool)},
1445 {CC "resolveInvokeDynamicInPool", CC "(" HS_CONSTANT_POOL "I)V", FN_PTR(resolveInvokeDynamicInPool)},
1446 {CC "resolveInvokeHandleInPool", CC "(" HS_CONSTANT_POOL "I)V", FN_PTR(resolveInvokeHandleInPool)},
1447 {CC "resolveMethod", CC "(" HS_RESOLVED_KLASS HS_RESOLVED_METHOD HS_RESOLVED_KLASS ")" HS_RESOLVED_METHOD, FN_PTR(resolveMethod)},
1448 {CC "getVtableIndexForInterfaceMethod", CC "(" HS_RESOLVED_KLASS HS_RESOLVED_METHOD ")I", FN_PTR(getVtableIndexForInterfaceMethod)},
1449 {CC "getClassInitializer", CC "(" HS_RESOLVED_KLASS ")" HS_RESOLVED_METHOD, FN_PTR(getClassInitializer)},
1450 {CC "hasFinalizableSubclass", CC "(" HS_RESOLVED_KLASS ")Z", FN_PTR(hasFinalizableSubclass)},
1451 {CC "getMaxCallTargetOffset", CC "(J)J", FN_PTR(getMaxCallTargetOffset)},
1452 {CC "getResolvedJavaMethodAtSlot", CC "(" CLASS "I)" HS_RESOLVED_METHOD, FN_PTR(getResolvedJavaMethodAtSlot)},
1453 {CC "getResolvedJavaMethod", CC "(Ljava/lang/Object;J)" HS_RESOLVED_METHOD, FN_PTR(getResolvedJavaMethod)},
1454 {CC "getConstantPool", CC "(Ljava/lang/Object;J)" HS_CONSTANT_POOL, FN_PTR(getConstantPool)},
1455 {CC "getResolvedJavaType", CC "(Ljava/lang/Object;JZ)" HS_RESOLVED_KLASS, FN_PTR(getResolvedJavaType)},
1456 {CC "initializeConfiguration", CC "(" HS_CONFIG ")J", FN_PTR(initializeConfiguration)},
1457 {CC "installCode", CC "(" TARGET_DESCRIPTION HS_COMPILED_CODE INSTALLED_CODE HS_SPECULATION_LOG ")I", FN_PTR(installCode)},
1458 {CC "getMetadata", CC "(" TARGET_DESCRIPTION HS_COMPILED_CODE HS_METADATA ")I", FN_PTR(getMetadata)},
1459 {CC "resetCompilationStatistics", CC "()V", FN_PTR(resetCompilationStatistics)},
1460 {CC "disassembleCodeBlob", CC "(" INSTALLED_CODE ")" STRING, FN_PTR(disassembleCodeBlob)},
1461 {CC "executeInstalledCode", CC "([" OBJECT INSTALLED_CODE ")" OBJECT, FN_PTR(executeInstalledCode)},
1462 {CC "getLineNumberTable", CC "(" HS_RESOLVED_METHOD ")[J", FN_PTR(getLineNumberTable)},
1463 {CC "getLocalVariableTableStart", CC "(" HS_RESOLVED_METHOD ")J", FN_PTR(getLocalVariableTableStart)},
1464 {CC "getLocalVariableTableLength", CC "(" HS_RESOLVED_METHOD ")I", FN_PTR(getLocalVariableTableLength)},
|
604 C2V_VMENTRY(jobject, lookupAppendixInPool, (JNIEnv*, jobject, jobject jvmci_constant_pool, jint index))
605 constantPoolHandle cp = CompilerToVM::asConstantPool(jvmci_constant_pool);
606 oop appendix_oop = ConstantPool::appendix_at_if_loaded(cp, index);
607 return JNIHandles::make_local(THREAD, appendix_oop);
608 C2V_END
609
610 C2V_VMENTRY(jobject, lookupMethodInPool, (JNIEnv*, jobject, jobject jvmci_constant_pool, jint index, jbyte opcode))
611 constantPoolHandle cp = CompilerToVM::asConstantPool(jvmci_constant_pool);
612 instanceKlassHandle pool_holder(cp->pool_holder());
613 Bytecodes::Code bc = (Bytecodes::Code) (((int) opcode) & 0xFF);
614 methodHandle method = JVMCIEnv::get_method_by_index(cp, index, bc, pool_holder);
615 oop result = CompilerToVM::get_jvmci_method(method, CHECK_NULL);
616 return JNIHandles::make_local(THREAD, result);
617 C2V_END
618
619 C2V_VMENTRY(jint, constantPoolRemapInstructionOperandFromCache, (JNIEnv*, jobject, jobject jvmci_constant_pool, jint index))
620 constantPoolHandle cp = CompilerToVM::asConstantPool(jvmci_constant_pool);
621 return cp->remap_instruction_operand_from_cache(index);
622 C2V_END
623
624 C2V_VMENTRY(jobject, resolveFieldInPool, (JNIEnv*, jobject, jobject jvmci_constant_pool, jint index, jobject jvmci_method, jbyte opcode, jlongArray info_handle))
625 ResourceMark rm;
626 constantPoolHandle cp = CompilerToVM::asConstantPool(jvmci_constant_pool);
627 Bytecodes::Code code = (Bytecodes::Code)(((int) opcode) & 0xFF);
628 fieldDescriptor fd;
629 LinkInfo link_info(cp, index, (jvmci_method != NULL) ? CompilerToVM::asMethod(jvmci_method) : NULL, CHECK_0);
630 LinkResolver::resolve_field(fd, link_info, Bytecodes::java_code(code), false, CHECK_0);
631 typeArrayOop info = (typeArrayOop) JNIHandles::resolve(info_handle);
632 assert(info != NULL && info->length() == 2, "must be");
633 info->long_at_put(0, (jlong) fd.access_flags().as_int());
634 info->long_at_put(1, (jlong) fd.offset());
635 oop field_holder = CompilerToVM::get_jvmci_type(fd.field_holder(), CHECK_NULL);
636 return JNIHandles::make_local(THREAD, field_holder);
637 C2V_END
638
639 C2V_VMENTRY(jint, getVtableIndexForInterfaceMethod, (JNIEnv *, jobject, jobject jvmci_type, jobject jvmci_method))
640 ResourceMark rm;
641 Klass* klass = CompilerToVM::asKlass(jvmci_type);
642 Method* method = CompilerToVM::asMethod(jvmci_method);
643 if (klass->is_interface()) {
644 THROW_MSG_0(vmSymbols::java_lang_InternalError(), err_msg("Interface %s should be handled in Java code", klass->external_name()));
645 }
646 if (!method->method_holder()->is_interface()) {
647 THROW_MSG_0(vmSymbols::java_lang_InternalError(), err_msg("Method %s is not held by an interface, this case should be handled in Java code", method->name_and_sig_as_C_string()));
648 }
649 if (!InstanceKlass::cast(klass)->is_linked()) {
650 THROW_MSG_0(vmSymbols::java_lang_InternalError(), err_msg("Class %s must be linked", klass->external_name()));
651 }
652 return LinkResolver::vtable_index_of_interface_method(klass, method);
653 C2V_END
654
655 C2V_VMENTRY(jobject, resolveMethod, (JNIEnv *, jobject, jobject receiver_jvmci_type, jobject jvmci_method, jobject caller_jvmci_type))
656 KlassHandle recv_klass = CompilerToVM::asKlass(receiver_jvmci_type);
657 KlassHandle caller_klass = CompilerToVM::asKlass(caller_jvmci_type);
658 methodHandle method = CompilerToVM::asMethod(jvmci_method);
659
660 KlassHandle h_resolved (THREAD, method->method_holder());
661 Symbol* h_name = method->name();
662 Symbol* h_signature = method->signature();
663
664 bool check_access = true;
665 LinkInfo link_info(h_resolved, h_name, h_signature, caller_klass, NULL, check_access);
666 methodHandle m;
667 // Only do exact lookup if receiver klass has been linked. Otherwise,
668 // the vtable has not been setup, and the LinkResolver will fail.
669 if (recv_klass->is_array_klass() ||
670 InstanceKlass::cast(recv_klass())->is_linked() && !recv_klass->is_interface()) {
671 if (h_resolved->is_interface()) {
672 m = LinkResolver::resolve_interface_call_or_null(recv_klass, link_info);
673 } else {
674 m = LinkResolver::resolve_virtual_call_or_null(recv_klass, link_info);
675 }
676 }
677
678 if (m.is_null()) {
679 // Return NULL only if there was a problem with lookup (uninitialized class, etc.)
680 return NULL;
681 }
682
683 oop result = CompilerToVM::get_jvmci_method(m, CHECK_NULL);
684 return JNIHandles::make_local(THREAD, result);
685 C2V_END
1424 {CC "getExceptionTableLength", CC "(" HS_RESOLVED_METHOD ")I", FN_PTR(getExceptionTableLength)},
1425 {CC "findUniqueConcreteMethod", CC "(" HS_RESOLVED_KLASS HS_RESOLVED_METHOD ")" HS_RESOLVED_METHOD, FN_PTR(findUniqueConcreteMethod)},
1426 {CC "getImplementor", CC "(" HS_RESOLVED_KLASS ")" HS_RESOLVED_KLASS, FN_PTR(getImplementor)},
1427 {CC "getStackTraceElement", CC "(" HS_RESOLVED_METHOD "I)" STACK_TRACE_ELEMENT, FN_PTR(getStackTraceElement)},
1428 {CC "methodIsIgnoredBySecurityStackWalk", CC "(" HS_RESOLVED_METHOD ")Z", FN_PTR(methodIsIgnoredBySecurityStackWalk)},
1429 {CC "doNotInlineOrCompile", CC "(" HS_RESOLVED_METHOD ")V", FN_PTR(doNotInlineOrCompile)},
1430 {CC "canInlineMethod", CC "(" HS_RESOLVED_METHOD ")Z", FN_PTR(canInlineMethod)},
1431 {CC "shouldInlineMethod", CC "(" HS_RESOLVED_METHOD ")Z", FN_PTR(shouldInlineMethod)},
1432 {CC "lookupType", CC "(" STRING CLASS "Z)" HS_RESOLVED_KLASS, FN_PTR(lookupType)},
1433 {CC "lookupNameInPool", CC "(" HS_CONSTANT_POOL "I)" STRING, FN_PTR(lookupNameInPool)},
1434 {CC "lookupNameAndTypeRefIndexInPool", CC "(" HS_CONSTANT_POOL "I)I", FN_PTR(lookupNameAndTypeRefIndexInPool)},
1435 {CC "lookupSignatureInPool", CC "(" HS_CONSTANT_POOL "I)" STRING, FN_PTR(lookupSignatureInPool)},
1436 {CC "lookupKlassRefIndexInPool", CC "(" HS_CONSTANT_POOL "I)I", FN_PTR(lookupKlassRefIndexInPool)},
1437 {CC "lookupKlassInPool", CC "(" HS_CONSTANT_POOL "I)Ljava/lang/Object;", FN_PTR(lookupKlassInPool)},
1438 {CC "lookupAppendixInPool", CC "(" HS_CONSTANT_POOL "I)" OBJECT, FN_PTR(lookupAppendixInPool)},
1439 {CC "lookupMethodInPool", CC "(" HS_CONSTANT_POOL "IB)" HS_RESOLVED_METHOD, FN_PTR(lookupMethodInPool)},
1440 {CC "constantPoolRemapInstructionOperandFromCache", CC "(" HS_CONSTANT_POOL "I)I", FN_PTR(constantPoolRemapInstructionOperandFromCache)},
1441 {CC "resolveConstantInPool", CC "(" HS_CONSTANT_POOL "I)" OBJECT, FN_PTR(resolveConstantInPool)},
1442 {CC "resolvePossiblyCachedConstantInPool", CC "(" HS_CONSTANT_POOL "I)" OBJECT, FN_PTR(resolvePossiblyCachedConstantInPool)},
1443 {CC "resolveTypeInPool", CC "(" HS_CONSTANT_POOL "I)" HS_RESOLVED_KLASS, FN_PTR(resolveTypeInPool)},
1444 {CC "resolveFieldInPool", CC "(" HS_CONSTANT_POOL "I" HS_RESOLVED_METHOD "B[J)" HS_RESOLVED_KLASS, FN_PTR(resolveFieldInPool)},
1445 {CC "resolveInvokeDynamicInPool", CC "(" HS_CONSTANT_POOL "I)V", FN_PTR(resolveInvokeDynamicInPool)},
1446 {CC "resolveInvokeHandleInPool", CC "(" HS_CONSTANT_POOL "I)V", FN_PTR(resolveInvokeHandleInPool)},
1447 {CC "resolveMethod", CC "(" HS_RESOLVED_KLASS HS_RESOLVED_METHOD HS_RESOLVED_KLASS ")" HS_RESOLVED_METHOD, FN_PTR(resolveMethod)},
1448 {CC "getVtableIndexForInterfaceMethod", CC "(" HS_RESOLVED_KLASS HS_RESOLVED_METHOD ")I", FN_PTR(getVtableIndexForInterfaceMethod)},
1449 {CC "getClassInitializer", CC "(" HS_RESOLVED_KLASS ")" HS_RESOLVED_METHOD, FN_PTR(getClassInitializer)},
1450 {CC "hasFinalizableSubclass", CC "(" HS_RESOLVED_KLASS ")Z", FN_PTR(hasFinalizableSubclass)},
1451 {CC "getMaxCallTargetOffset", CC "(J)J", FN_PTR(getMaxCallTargetOffset)},
1452 {CC "getResolvedJavaMethodAtSlot", CC "(" CLASS "I)" HS_RESOLVED_METHOD, FN_PTR(getResolvedJavaMethodAtSlot)},
1453 {CC "getResolvedJavaMethod", CC "(Ljava/lang/Object;J)" HS_RESOLVED_METHOD, FN_PTR(getResolvedJavaMethod)},
1454 {CC "getConstantPool", CC "(Ljava/lang/Object;J)" HS_CONSTANT_POOL, FN_PTR(getConstantPool)},
1455 {CC "getResolvedJavaType", CC "(Ljava/lang/Object;JZ)" HS_RESOLVED_KLASS, FN_PTR(getResolvedJavaType)},
1456 {CC "initializeConfiguration", CC "(" HS_CONFIG ")J", FN_PTR(initializeConfiguration)},
1457 {CC "installCode", CC "(" TARGET_DESCRIPTION HS_COMPILED_CODE INSTALLED_CODE HS_SPECULATION_LOG ")I", FN_PTR(installCode)},
1458 {CC "getMetadata", CC "(" TARGET_DESCRIPTION HS_COMPILED_CODE HS_METADATA ")I", FN_PTR(getMetadata)},
1459 {CC "resetCompilationStatistics", CC "()V", FN_PTR(resetCompilationStatistics)},
1460 {CC "disassembleCodeBlob", CC "(" INSTALLED_CODE ")" STRING, FN_PTR(disassembleCodeBlob)},
1461 {CC "executeInstalledCode", CC "([" OBJECT INSTALLED_CODE ")" OBJECT, FN_PTR(executeInstalledCode)},
1462 {CC "getLineNumberTable", CC "(" HS_RESOLVED_METHOD ")[J", FN_PTR(getLineNumberTable)},
1463 {CC "getLocalVariableTableStart", CC "(" HS_RESOLVED_METHOD ")J", FN_PTR(getLocalVariableTableStart)},
1464 {CC "getLocalVariableTableLength", CC "(" HS_RESOLVED_METHOD ")I", FN_PTR(getLocalVariableTableLength)},
|