hotspot/src/share/vm/jvmci/jvmciCompilerToVM.cpp
changeset 35092 82170e5767c3
parent 34317 e93b85bf4cc2
child 35123 b0b89d83bcf5
equal deleted inserted replaced
35091:e9d05f193287 35092:82170e5767c3
    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);