830
831 C2V_VMENTRY(void, doNotInlineOrCompile,(JNIEnv *, jobject, jobject jvmci_method))
832 methodHandle method = CompilerToVM::asMethod(jvmci_method);
833 method->set_not_c1_compilable();
834 method->set_not_c2_compilable();
835 method->set_dont_inline(true);
836 C2V_END
837
838 C2V_VMENTRY(jint, installCode, (JNIEnv *jniEnv, jobject, jobject target, jobject compiled_code, jobject installed_code, jobject speculation_log))
839 ResourceMark rm;
840 HandleMark hm;
841 Handle target_handle = JNIHandles::resolve(target);
842 Handle compiled_code_handle = JNIHandles::resolve(compiled_code);
843 CodeBlob* cb = NULL;
844 Handle installed_code_handle = JNIHandles::resolve(installed_code);
845 Handle speculation_log_handle = JNIHandles::resolve(speculation_log);
846
847 JVMCICompiler* compiler = JVMCICompiler::instance(CHECK_JNI_ERR);
848
849 TraceTime install_time("installCode", JVMCICompiler::codeInstallTimer());
850 CodeInstaller installer;
851 JVMCIEnv::CodeInstallResult result = installer.install(compiler, target_handle, compiled_code_handle, cb, installed_code_handle, speculation_log_handle, CHECK_0);
852
853 if (PrintCodeCacheOnCompilation) {
854 stringStream s;
855 // Dump code cache into a buffer before locking the tty,
856 {
857 MutexLockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag);
858 CodeCache::print_summary(&s, false);
859 }
860 ttyLocker ttyl;
861 tty->print_raw_cr(s.as_string());
862 }
863
864 if (result != JVMCIEnv::ok) {
865 assert(cb == NULL, "should be");
866 } else {
867 if (!installed_code_handle.is_null()) {
868 assert(installed_code_handle->is_a(InstalledCode::klass()), "wrong type");
869 nmethod::invalidate_installed_code(installed_code_handle, CHECK_0);
870 {
888 assert(nm->detect_scavenge_root_oops(), "nm should be scavengable if installed_code is scavengable");
889 if (!UseG1GC) {
890 assert(nm->on_scavenge_root_list(), "nm should be on scavengable list");
891 }
892 }
893 }
894 }
895 return result;
896 C2V_END
897
898 C2V_VMENTRY(jint, getMetadata, (JNIEnv *jniEnv, jobject, jobject target, jobject compiled_code, jobject metadata))
899 ResourceMark rm;
900 HandleMark hm;
901
902 Handle target_handle = JNIHandles::resolve(target);
903 Handle compiled_code_handle = JNIHandles::resolve(compiled_code);
904 Handle metadata_handle = JNIHandles::resolve(metadata);
905
906 CodeMetadata code_metadata;
907 CodeBlob *cb = NULL;
908 CodeInstaller installer;
909
910 JVMCIEnv::CodeInstallResult result = installer.gather_metadata(target_handle, compiled_code_handle, code_metadata, CHECK_0);
911 if (result != JVMCIEnv::ok) {
912 return result;
913 }
914
915 if (code_metadata.get_nr_pc_desc() > 0) {
916 typeArrayHandle pcArrayOop = oopFactory::new_byteArray(sizeof(PcDesc) * code_metadata.get_nr_pc_desc(), CHECK_(JVMCIEnv::cache_full));
917 memcpy(pcArrayOop->byte_at_addr(0), code_metadata.get_pc_desc(), sizeof(PcDesc) * code_metadata.get_nr_pc_desc());
918 HotSpotMetaData::set_pcDescBytes(metadata_handle, pcArrayOop());
919 }
920
921 if (code_metadata.get_scopes_size() > 0) {
922 typeArrayHandle scopesArrayOop = oopFactory::new_byteArray(code_metadata.get_scopes_size(), CHECK_(JVMCIEnv::cache_full));
923 memcpy(scopesArrayOop->byte_at_addr(0), code_metadata.get_scopes_desc(), code_metadata.get_scopes_size());
924 HotSpotMetaData::set_scopesDescBytes(metadata_handle, scopesArrayOop());
925 }
926
927 RelocBuffer* reloc_buffer = code_metadata.get_reloc_buffer();
928 typeArrayHandle relocArrayOop = oopFactory::new_byteArray((int) reloc_buffer->size(), CHECK_(JVMCIEnv::cache_full));
929 if (reloc_buffer->size() > 0) {
930 memcpy(relocArrayOop->byte_at_addr(0), reloc_buffer->begin(), reloc_buffer->size());
931 }
932 HotSpotMetaData::set_relocBytes(metadata_handle, relocArrayOop());
933
934 const OopMapSet* oopMapSet = installer.oopMapSet();
935 {
936 ResourceMark mark;
937 ImmutableOopMapBuilder builder(oopMapSet);
938 int oopmap_size = builder.heap_size();
939 typeArrayHandle oopMapArrayHandle = oopFactory::new_byteArray(oopmap_size, CHECK_(JVMCIEnv::cache_full));
940 builder.generate_into((address) oopMapArrayHandle->byte_at_addr(0));
941 HotSpotMetaData::set_oopMaps(metadata_handle, oopMapArrayHandle());
942 }
943
944 HotSpotMetaData::set_metadata(metadata_handle, NULL);
945
946 ExceptionHandlerTable* handler = code_metadata.get_exception_table();
947 int table_size = handler->size_in_bytes();
948 typeArrayHandle exceptionArrayOop = oopFactory::new_byteArray(table_size, CHECK_(JVMCIEnv::cache_full));
949
950 if (table_size > 0) {
951 handler->copy_bytes_to((address) exceptionArrayOop->byte_at_addr(0));
952 }
953 HotSpotMetaData::set_exceptionBytes(metadata_handle, exceptionArrayOop());
954
955 return result;
956 C2V_END
957
958 C2V_VMENTRY(void, resetCompilationStatistics, (JNIEnv *jniEnv, jobject))
959 JVMCICompiler* compiler = JVMCICompiler::instance(CHECK);
960 CompilerStatistics* stats = compiler->stats();
961 stats->_standard.reset();
962 stats->_osr.reset();
963 C2V_END
964
1476
1477 C2V_VMENTRY(int, methodDataProfileDataSize, (JNIEnv*, jobject, jlong metaspace_method_data, jint position))
1478 ResourceMark rm;
1479 MethodData* mdo = CompilerToVM::asMethodData(metaspace_method_data);
1480 ProfileData* profile_data = mdo->data_at(position);
1481 if (mdo->is_valid(profile_data)) {
1482 return profile_data->size_in_bytes();
1483 }
1484 DataLayout* data = mdo->extra_data_base();
1485 DataLayout* end = mdo->extra_data_limit();
1486 for (;; data = mdo->next_extra(data)) {
1487 assert(data < end, "moved past end of extra data");
1488 profile_data = data->data_in();
1489 if (mdo->dp_to_di(profile_data->dp()) == position) {
1490 return profile_data->size_in_bytes();
1491 }
1492 }
1493 THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(), err_msg("Invalid profile data position %d", position));
1494 C2V_END
1495
1496 C2V_VMENTRY(int, interpreterFrameSize, (JNIEnv*, jobject, jobject bytecode_frame_handle))
1497 if (bytecode_frame_handle == NULL) {
1498 THROW_0(vmSymbols::java_lang_NullPointerException());
1499 }
1500
1501 oop top_bytecode_frame = JNIHandles::resolve_non_null(bytecode_frame_handle);
1502 oop bytecode_frame = top_bytecode_frame;
1503 int size = 0;
1504 int callee_parameters = 0;
1505 int callee_locals = 0;
1506 Method* method = getMethodFromHotSpotMethod(BytecodePosition::method(bytecode_frame));
1507 int extra_args = method->max_stack() - BytecodeFrame::numStack(bytecode_frame);
1508
1509 while (bytecode_frame != NULL) {
1510 int locks = BytecodeFrame::numLocks(bytecode_frame);
1511 int temps = BytecodeFrame::numStack(bytecode_frame);
1512 bool is_top_frame = (bytecode_frame == top_bytecode_frame);
1513 Method* method = getMethodFromHotSpotMethod(BytecodePosition::method(bytecode_frame));
1514
1515 int frame_size = BytesPerWord * Interpreter::size_activation(method->max_stack(),
1604 {CC "getMetadata", CC "(" TARGET_DESCRIPTION HS_COMPILED_CODE HS_METADATA ")I", FN_PTR(getMetadata)},
1605 {CC "resetCompilationStatistics", CC "()V", FN_PTR(resetCompilationStatistics)},
1606 {CC "disassembleCodeBlob", CC "(" INSTALLED_CODE ")" STRING, FN_PTR(disassembleCodeBlob)},
1607 {CC "executeInstalledCode", CC "([" OBJECT INSTALLED_CODE ")" OBJECT, FN_PTR(executeInstalledCode)},
1608 {CC "getLineNumberTable", CC "(" HS_RESOLVED_METHOD ")[J", FN_PTR(getLineNumberTable)},
1609 {CC "getLocalVariableTableStart", CC "(" HS_RESOLVED_METHOD ")J", FN_PTR(getLocalVariableTableStart)},
1610 {CC "getLocalVariableTableLength", CC "(" HS_RESOLVED_METHOD ")I", FN_PTR(getLocalVariableTableLength)},
1611 {CC "reprofile", CC "(" HS_RESOLVED_METHOD ")V", FN_PTR(reprofile)},
1612 {CC "invalidateInstalledCode", CC "(" INSTALLED_CODE ")V", FN_PTR(invalidateInstalledCode)},
1613 {CC "collectCounters", CC "()[J", FN_PTR(collectCounters)},
1614 {CC "allocateCompileId", CC "(" HS_RESOLVED_METHOD "I)I", FN_PTR(allocateCompileId)},
1615 {CC "isMature", CC "(" METASPACE_METHOD_DATA ")Z", FN_PTR(isMature)},
1616 {CC "hasCompiledCodeForOSR", CC "(" HS_RESOLVED_METHOD "II)Z", FN_PTR(hasCompiledCodeForOSR)},
1617 {CC "getSymbol", CC "(J)" STRING, FN_PTR(getSymbol)},
1618 {CC "getNextStackFrame", CC "(" HS_STACK_FRAME_REF "[" RESOLVED_METHOD "I)" HS_STACK_FRAME_REF, FN_PTR(getNextStackFrame)},
1619 {CC "materializeVirtualObjects", CC "(" HS_STACK_FRAME_REF "Z)V", FN_PTR(materializeVirtualObjects)},
1620 {CC "shouldDebugNonSafepoints", CC "()Z", FN_PTR(shouldDebugNonSafepoints)},
1621 {CC "writeDebugOutput", CC "([BII)V", FN_PTR(writeDebugOutput)},
1622 {CC "flushDebugOutput", CC "()V", FN_PTR(flushDebugOutput)},
1623 {CC "methodDataProfileDataSize", CC "(JI)I", FN_PTR(methodDataProfileDataSize)},
1624 {CC "interpreterFrameSize", CC "(" BYTECODE_FRAME ")I", FN_PTR(interpreterFrameSize)},
1625 {CC "compileToBytecode", CC "(" OBJECT ")V", FN_PTR(compileToBytecode)},
1626 };
1627
1628 int CompilerToVM::methods_count() {
1629 return sizeof(methods) / sizeof(JNINativeMethod);
1630 }
|
830
831 C2V_VMENTRY(void, doNotInlineOrCompile,(JNIEnv *, jobject, jobject jvmci_method))
832 methodHandle method = CompilerToVM::asMethod(jvmci_method);
833 method->set_not_c1_compilable();
834 method->set_not_c2_compilable();
835 method->set_dont_inline(true);
836 C2V_END
837
838 C2V_VMENTRY(jint, installCode, (JNIEnv *jniEnv, jobject, jobject target, jobject compiled_code, jobject installed_code, jobject speculation_log))
839 ResourceMark rm;
840 HandleMark hm;
841 Handle target_handle = JNIHandles::resolve(target);
842 Handle compiled_code_handle = JNIHandles::resolve(compiled_code);
843 CodeBlob* cb = NULL;
844 Handle installed_code_handle = JNIHandles::resolve(installed_code);
845 Handle speculation_log_handle = JNIHandles::resolve(speculation_log);
846
847 JVMCICompiler* compiler = JVMCICompiler::instance(CHECK_JNI_ERR);
848
849 TraceTime install_time("installCode", JVMCICompiler::codeInstallTimer());
850 bool is_immutable_PIC = HotSpotCompiledCode::isImmutablePIC(compiled_code_handle) > 0;
851 CodeInstaller installer(is_immutable_PIC);
852 JVMCIEnv::CodeInstallResult result = installer.install(compiler, target_handle, compiled_code_handle, cb, installed_code_handle, speculation_log_handle, CHECK_0);
853
854 if (PrintCodeCacheOnCompilation) {
855 stringStream s;
856 // Dump code cache into a buffer before locking the tty,
857 {
858 MutexLockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag);
859 CodeCache::print_summary(&s, false);
860 }
861 ttyLocker ttyl;
862 tty->print_raw_cr(s.as_string());
863 }
864
865 if (result != JVMCIEnv::ok) {
866 assert(cb == NULL, "should be");
867 } else {
868 if (!installed_code_handle.is_null()) {
869 assert(installed_code_handle->is_a(InstalledCode::klass()), "wrong type");
870 nmethod::invalidate_installed_code(installed_code_handle, CHECK_0);
871 {
889 assert(nm->detect_scavenge_root_oops(), "nm should be scavengable if installed_code is scavengable");
890 if (!UseG1GC) {
891 assert(nm->on_scavenge_root_list(), "nm should be on scavengable list");
892 }
893 }
894 }
895 }
896 return result;
897 C2V_END
898
899 C2V_VMENTRY(jint, getMetadata, (JNIEnv *jniEnv, jobject, jobject target, jobject compiled_code, jobject metadata))
900 ResourceMark rm;
901 HandleMark hm;
902
903 Handle target_handle = JNIHandles::resolve(target);
904 Handle compiled_code_handle = JNIHandles::resolve(compiled_code);
905 Handle metadata_handle = JNIHandles::resolve(metadata);
906
907 CodeMetadata code_metadata;
908 CodeBlob *cb = NULL;
909 CodeInstaller installer(true /* immutable PIC compilation */);
910
911 JVMCIEnv::CodeInstallResult result = installer.gather_metadata(target_handle, compiled_code_handle, code_metadata, CHECK_0);
912 if (result != JVMCIEnv::ok) {
913 return result;
914 }
915
916 if (code_metadata.get_nr_pc_desc() > 0) {
917 typeArrayHandle pcArrayOop = oopFactory::new_byteArray(sizeof(PcDesc) * code_metadata.get_nr_pc_desc(), CHECK_(JVMCIEnv::cache_full));
918 memcpy(pcArrayOop->byte_at_addr(0), code_metadata.get_pc_desc(), sizeof(PcDesc) * code_metadata.get_nr_pc_desc());
919 HotSpotMetaData::set_pcDescBytes(metadata_handle, pcArrayOop());
920 }
921
922 if (code_metadata.get_scopes_size() > 0) {
923 typeArrayHandle scopesArrayOop = oopFactory::new_byteArray(code_metadata.get_scopes_size(), CHECK_(JVMCIEnv::cache_full));
924 memcpy(scopesArrayOop->byte_at_addr(0), code_metadata.get_scopes_desc(), code_metadata.get_scopes_size());
925 HotSpotMetaData::set_scopesDescBytes(metadata_handle, scopesArrayOop());
926 }
927
928 RelocBuffer* reloc_buffer = code_metadata.get_reloc_buffer();
929 typeArrayHandle relocArrayOop = oopFactory::new_byteArray((int) reloc_buffer->size(), CHECK_(JVMCIEnv::cache_full));
930 if (reloc_buffer->size() > 0) {
931 memcpy(relocArrayOop->byte_at_addr(0), reloc_buffer->begin(), reloc_buffer->size());
932 }
933 HotSpotMetaData::set_relocBytes(metadata_handle, relocArrayOop());
934
935 const OopMapSet* oopMapSet = installer.oopMapSet();
936 {
937 ResourceMark mark;
938 ImmutableOopMapBuilder builder(oopMapSet);
939 int oopmap_size = builder.heap_size();
940 typeArrayHandle oopMapArrayHandle = oopFactory::new_byteArray(oopmap_size, CHECK_(JVMCIEnv::cache_full));
941 builder.generate_into((address) oopMapArrayHandle->byte_at_addr(0));
942 HotSpotMetaData::set_oopMaps(metadata_handle, oopMapArrayHandle());
943 }
944
945 AOTOopRecorder* recorder = code_metadata.get_oop_recorder();
946
947 int nr_meta_strings = recorder->nr_meta_strings();
948 objArrayHandle metadataArrayHandle = oopFactory::new_objectArray(nr_meta_strings, CHECK_(JVMCIEnv::cache_full));
949 for (int i = 0; i < nr_meta_strings; ++i) {
950 const char* element = recorder->meta_element(i);
951 Handle java_string = java_lang_String::create_from_str(element, CHECK_(JVMCIEnv::cache_full));
952 metadataArrayHandle->obj_at_put(i, java_string());
953 }
954 HotSpotMetaData::set_metadata(metadata_handle, metadataArrayHandle());
955
956 ExceptionHandlerTable* handler = code_metadata.get_exception_table();
957 int table_size = handler->size_in_bytes();
958 typeArrayHandle exceptionArrayOop = oopFactory::new_byteArray(table_size, CHECK_(JVMCIEnv::cache_full));
959
960 if (table_size > 0) {
961 handler->copy_bytes_to((address) exceptionArrayOop->byte_at_addr(0));
962 }
963 HotSpotMetaData::set_exceptionBytes(metadata_handle, exceptionArrayOop());
964
965 return result;
966 C2V_END
967
968 C2V_VMENTRY(void, resetCompilationStatistics, (JNIEnv *jniEnv, jobject))
969 JVMCICompiler* compiler = JVMCICompiler::instance(CHECK);
970 CompilerStatistics* stats = compiler->stats();
971 stats->_standard.reset();
972 stats->_osr.reset();
973 C2V_END
974
1486
1487 C2V_VMENTRY(int, methodDataProfileDataSize, (JNIEnv*, jobject, jlong metaspace_method_data, jint position))
1488 ResourceMark rm;
1489 MethodData* mdo = CompilerToVM::asMethodData(metaspace_method_data);
1490 ProfileData* profile_data = mdo->data_at(position);
1491 if (mdo->is_valid(profile_data)) {
1492 return profile_data->size_in_bytes();
1493 }
1494 DataLayout* data = mdo->extra_data_base();
1495 DataLayout* end = mdo->extra_data_limit();
1496 for (;; data = mdo->next_extra(data)) {
1497 assert(data < end, "moved past end of extra data");
1498 profile_data = data->data_in();
1499 if (mdo->dp_to_di(profile_data->dp()) == position) {
1500 return profile_data->size_in_bytes();
1501 }
1502 }
1503 THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(), err_msg("Invalid profile data position %d", position));
1504 C2V_END
1505
1506 C2V_VMENTRY(jlong, getFingerprint, (JNIEnv*, jobject, jlong metaspace_klass))
1507 Klass *k = CompilerToVM::asKlass(metaspace_klass);
1508 if (k->is_instance_klass()) {
1509 return InstanceKlass::cast(k)->get_stored_fingerprint();
1510 } else {
1511 return 0;
1512 }
1513 C2V_END
1514
1515 C2V_VMENTRY(int, interpreterFrameSize, (JNIEnv*, jobject, jobject bytecode_frame_handle))
1516 if (bytecode_frame_handle == NULL) {
1517 THROW_0(vmSymbols::java_lang_NullPointerException());
1518 }
1519
1520 oop top_bytecode_frame = JNIHandles::resolve_non_null(bytecode_frame_handle);
1521 oop bytecode_frame = top_bytecode_frame;
1522 int size = 0;
1523 int callee_parameters = 0;
1524 int callee_locals = 0;
1525 Method* method = getMethodFromHotSpotMethod(BytecodePosition::method(bytecode_frame));
1526 int extra_args = method->max_stack() - BytecodeFrame::numStack(bytecode_frame);
1527
1528 while (bytecode_frame != NULL) {
1529 int locks = BytecodeFrame::numLocks(bytecode_frame);
1530 int temps = BytecodeFrame::numStack(bytecode_frame);
1531 bool is_top_frame = (bytecode_frame == top_bytecode_frame);
1532 Method* method = getMethodFromHotSpotMethod(BytecodePosition::method(bytecode_frame));
1533
1534 int frame_size = BytesPerWord * Interpreter::size_activation(method->max_stack(),
1623 {CC "getMetadata", CC "(" TARGET_DESCRIPTION HS_COMPILED_CODE HS_METADATA ")I", FN_PTR(getMetadata)},
1624 {CC "resetCompilationStatistics", CC "()V", FN_PTR(resetCompilationStatistics)},
1625 {CC "disassembleCodeBlob", CC "(" INSTALLED_CODE ")" STRING, FN_PTR(disassembleCodeBlob)},
1626 {CC "executeInstalledCode", CC "([" OBJECT INSTALLED_CODE ")" OBJECT, FN_PTR(executeInstalledCode)},
1627 {CC "getLineNumberTable", CC "(" HS_RESOLVED_METHOD ")[J", FN_PTR(getLineNumberTable)},
1628 {CC "getLocalVariableTableStart", CC "(" HS_RESOLVED_METHOD ")J", FN_PTR(getLocalVariableTableStart)},
1629 {CC "getLocalVariableTableLength", CC "(" HS_RESOLVED_METHOD ")I", FN_PTR(getLocalVariableTableLength)},
1630 {CC "reprofile", CC "(" HS_RESOLVED_METHOD ")V", FN_PTR(reprofile)},
1631 {CC "invalidateInstalledCode", CC "(" INSTALLED_CODE ")V", FN_PTR(invalidateInstalledCode)},
1632 {CC "collectCounters", CC "()[J", FN_PTR(collectCounters)},
1633 {CC "allocateCompileId", CC "(" HS_RESOLVED_METHOD "I)I", FN_PTR(allocateCompileId)},
1634 {CC "isMature", CC "(" METASPACE_METHOD_DATA ")Z", FN_PTR(isMature)},
1635 {CC "hasCompiledCodeForOSR", CC "(" HS_RESOLVED_METHOD "II)Z", FN_PTR(hasCompiledCodeForOSR)},
1636 {CC "getSymbol", CC "(J)" STRING, FN_PTR(getSymbol)},
1637 {CC "getNextStackFrame", CC "(" HS_STACK_FRAME_REF "[" RESOLVED_METHOD "I)" HS_STACK_FRAME_REF, FN_PTR(getNextStackFrame)},
1638 {CC "materializeVirtualObjects", CC "(" HS_STACK_FRAME_REF "Z)V", FN_PTR(materializeVirtualObjects)},
1639 {CC "shouldDebugNonSafepoints", CC "()Z", FN_PTR(shouldDebugNonSafepoints)},
1640 {CC "writeDebugOutput", CC "([BII)V", FN_PTR(writeDebugOutput)},
1641 {CC "flushDebugOutput", CC "()V", FN_PTR(flushDebugOutput)},
1642 {CC "methodDataProfileDataSize", CC "(JI)I", FN_PTR(methodDataProfileDataSize)},
1643 {CC "getFingerprint", CC "(J)J", FN_PTR(getFingerprint)},
1644 {CC "interpreterFrameSize", CC "(" BYTECODE_FRAME ")I", FN_PTR(interpreterFrameSize)},
1645 {CC "compileToBytecode", CC "(" OBJECT ")V", FN_PTR(compileToBytecode)},
1646 };
1647
1648 int CompilerToVM::methods_count() {
1649 return sizeof(methods) / sizeof(JNINativeMethod);
1650 }
|