80 JavaCalls::call_static(&result, SystemDictionary::HotSpotResolvedObjectTypeImpl_klass(), vmSymbols::fromMetaspace_name(), vmSymbols::klass_fromMetaspace_signature(), &args, CHECK_NULL); |
80 JavaCalls::call_static(&result, SystemDictionary::HotSpotResolvedObjectTypeImpl_klass(), vmSymbols::fromMetaspace_name(), vmSymbols::klass_fromMetaspace_signature(), &args, CHECK_NULL); |
81 |
81 |
82 return (oop)result.get_jobject(); |
82 return (oop)result.get_jobject(); |
83 } |
83 } |
84 return NULL; |
84 return NULL; |
85 } |
|
86 |
|
87 void CompilerToVM::invalidate_installed_code(Handle installedCode, TRAPS) { |
|
88 if (installedCode() == NULL) { |
|
89 THROW(vmSymbols::java_lang_NullPointerException()); |
|
90 } |
|
91 jlong nativeMethod = InstalledCode::address(installedCode); |
|
92 nmethod* nm = (nmethod*)nativeMethod; |
|
93 assert(nm == NULL || nm->jvmci_installed_code() == installedCode(), "sanity check"); |
|
94 if (nm != NULL && nm->is_alive()) { |
|
95 // The nmethod state machinery maintains the link between the |
|
96 // HotSpotInstalledCode and nmethod* so as long as the nmethod appears to be |
|
97 // alive assume there is work to do and deoptimize the nmethod. |
|
98 nm->mark_for_deoptimization(); |
|
99 VM_Deoptimize op; |
|
100 VMThread::execute(&op); |
|
101 } |
|
102 InstalledCode::set_address(installedCode, 0); |
|
103 } |
85 } |
104 |
86 |
105 extern "C" { |
87 extern "C" { |
106 extern VMStructEntry* gHotSpotVMStructs; |
88 extern VMStructEntry* gHotSpotVMStructs; |
107 extern uint64_t gHotSpotVMStructEntryTypeNameOffset; |
89 extern uint64_t gHotSpotVMStructEntryTypeNameOffset; |
686 if (result != JVMCIEnv::ok) { |
668 if (result != JVMCIEnv::ok) { |
687 assert(cb == NULL, "should be"); |
669 assert(cb == NULL, "should be"); |
688 } else { |
670 } else { |
689 if (!installed_code_handle.is_null()) { |
671 if (!installed_code_handle.is_null()) { |
690 assert(installed_code_handle->is_a(InstalledCode::klass()), "wrong type"); |
672 assert(installed_code_handle->is_a(InstalledCode::klass()), "wrong type"); |
691 CompilerToVM::invalidate_installed_code(installed_code_handle, CHECK_0); |
673 nmethod::invalidate_installed_code(installed_code_handle, CHECK_0); |
692 InstalledCode::set_address(installed_code_handle, (jlong) cb); |
674 { |
693 InstalledCode::set_version(installed_code_handle, InstalledCode::version(installed_code_handle) + 1); |
675 // Ensure that all updates to the InstalledCode fields are consistent. |
694 if (cb->is_nmethod()) { |
676 MutexLockerEx pl(Patching_lock, Mutex::_no_safepoint_check_flag); |
695 InstalledCode::set_entryPoint(installed_code_handle, (jlong) cb->as_nmethod_or_null()->verified_entry_point()); |
677 InstalledCode::set_address(installed_code_handle, (jlong) cb); |
696 } else { |
678 InstalledCode::set_version(installed_code_handle, InstalledCode::version(installed_code_handle) + 1); |
697 InstalledCode::set_entryPoint(installed_code_handle, (jlong) cb->code_begin()); |
679 if (cb->is_nmethod()) { |
698 } |
680 InstalledCode::set_entryPoint(installed_code_handle, (jlong) cb->as_nmethod_or_null()->verified_entry_point()); |
699 if (installed_code_handle->is_a(HotSpotInstalledCode::klass())) { |
681 } else { |
700 HotSpotInstalledCode::set_size(installed_code_handle, cb->size()); |
682 InstalledCode::set_entryPoint(installed_code_handle, (jlong) cb->code_begin()); |
701 HotSpotInstalledCode::set_codeStart(installed_code_handle, (jlong) cb->code_begin()); |
683 } |
702 HotSpotInstalledCode::set_codeSize(installed_code_handle, cb->code_size()); |
684 if (installed_code_handle->is_a(HotSpotInstalledCode::klass())) { |
|
685 HotSpotInstalledCode::set_size(installed_code_handle, cb->size()); |
|
686 HotSpotInstalledCode::set_codeStart(installed_code_handle, (jlong) cb->code_begin()); |
|
687 HotSpotInstalledCode::set_codeSize(installed_code_handle, cb->code_size()); |
|
688 } |
703 } |
689 } |
704 nmethod* nm = cb->as_nmethod_or_null(); |
690 nmethod* nm = cb->as_nmethod_or_null(); |
705 if (nm != NULL && installed_code_handle->is_scavengable()) { |
691 if (nm != NULL && installed_code_handle->is_scavengable()) { |
706 assert(nm->detect_scavenge_root_oops(), "nm should be scavengable if installed_code is scavengable"); |
692 assert(nm->detect_scavenge_root_oops(), "nm should be scavengable if installed_code is scavengable"); |
707 if (!UseG1GC) { |
693 if (!UseG1GC) { |
969 C2V_END |
955 C2V_END |
970 |
956 |
971 |
957 |
972 C2V_VMENTRY(void, invalidateInstalledCode, (JNIEnv*, jobject, jobject installed_code)) |
958 C2V_VMENTRY(void, invalidateInstalledCode, (JNIEnv*, jobject, jobject installed_code)) |
973 Handle installed_code_handle = JNIHandles::resolve(installed_code); |
959 Handle installed_code_handle = JNIHandles::resolve(installed_code); |
974 CompilerToVM::invalidate_installed_code(installed_code_handle, CHECK); |
960 nmethod::invalidate_installed_code(installed_code_handle, CHECK); |
975 C2V_END |
961 C2V_END |
976 |
962 |
977 C2V_VMENTRY(jobject, readUncompressedOop, (JNIEnv*, jobject, jlong addr)) |
963 C2V_VMENTRY(jobject, readUncompressedOop, (JNIEnv*, jobject, jlong addr)) |
978 oop ret = oopDesc::load_decode_heap_oop((oop*)(address)addr); |
964 oop ret = oopDesc::load_decode_heap_oop((oop*)(address)addr); |
979 return JNIHandles::make_local(THREAD, ret); |
965 return JNIHandles::make_local(THREAD, ret); |