hotspot/src/share/vm/jvmci/jvmciCompilerToVM.cpp
changeset 33632 038347770a9e
parent 33160 c59f1676d27e
child 33638 ef49ed90010b
child 34153 cbcfa2a6fe0b
equal deleted inserted replaced
33631:3eee32561662 33632:038347770a9e
    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);
    85 }
   103 }
    86 
   104 
    87 extern "C" {
   105 extern "C" {
    88 extern VMStructEntry* gHotSpotVMStructs;
   106 extern VMStructEntry* gHotSpotVMStructs;
    89 extern uint64_t gHotSpotVMStructEntryTypeNameOffset;
   107 extern uint64_t gHotSpotVMStructEntryTypeNameOffset;
   536     THROW_MSG_0(vmSymbols::java_lang_InternalError(), err_msg("Interface %s should be handled in Java code", klass->external_name()));
   554     THROW_MSG_0(vmSymbols::java_lang_InternalError(), err_msg("Interface %s should be handled in Java code", klass->external_name()));
   537   }
   555   }
   538   if (!method->method_holder()->is_interface()) {
   556   if (!method->method_holder()->is_interface()) {
   539     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()));
   557     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()));
   540   }
   558   }
   541   if (!InstanceKlass::cast(klass)->is_initialized()) {
   559   if (!InstanceKlass::cast(klass)->is_linked()) {
   542     THROW_MSG_0(vmSymbols::java_lang_InternalError(), err_msg("Class %s must be initialized", klass->external_name()));
   560     THROW_MSG_0(vmSymbols::java_lang_InternalError(), err_msg("Class %s must be linked", klass->external_name()));
   543   }
   561   }
   544   return LinkResolver::vtable_index_of_interface_method(klass, method);
   562   return LinkResolver::vtable_index_of_interface_method(klass, method);
   545 C2V_END
   563 C2V_END
   546 
   564 
   547 C2V_VMENTRY(jobject, resolveMethod, (JNIEnv *, jobject, jobject receiver_jvmci_type, jobject jvmci_method, jobject caller_jvmci_type))
   565 C2V_VMENTRY(jobject, resolveMethod, (JNIEnv *, jobject, jobject receiver_jvmci_type, jobject jvmci_method, jobject caller_jvmci_type))
   668   if (result != JVMCIEnv::ok) {
   686   if (result != JVMCIEnv::ok) {
   669     assert(cb == NULL, "should be");
   687     assert(cb == NULL, "should be");
   670   } else {
   688   } else {
   671     if (!installed_code_handle.is_null()) {
   689     if (!installed_code_handle.is_null()) {
   672       assert(installed_code_handle->is_a(InstalledCode::klass()), "wrong type");
   690       assert(installed_code_handle->is_a(InstalledCode::klass()), "wrong type");
       
   691       CompilerToVM::invalidate_installed_code(installed_code_handle, CHECK_0);
   673       InstalledCode::set_address(installed_code_handle, (jlong) cb);
   692       InstalledCode::set_address(installed_code_handle, (jlong) cb);
   674       InstalledCode::set_version(installed_code_handle, InstalledCode::version(installed_code_handle) + 1);
   693       if (cb->is_nmethod()) {
       
   694         InstalledCode::set_entryPoint(installed_code_handle, (jlong) cb->as_nmethod_or_null()->verified_entry_point());
       
   695       } else {
       
   696         InstalledCode::set_entryPoint(installed_code_handle, (jlong) cb->code_begin());
       
   697       }
   675       if (installed_code_handle->is_a(HotSpotInstalledCode::klass())) {
   698       if (installed_code_handle->is_a(HotSpotInstalledCode::klass())) {
   676         HotSpotInstalledCode::set_size(installed_code_handle, cb->size());
   699         HotSpotInstalledCode::set_size(installed_code_handle, cb->size());
   677         HotSpotInstalledCode::set_codeStart(installed_code_handle, (jlong) cb->code_begin());
   700         HotSpotInstalledCode::set_codeStart(installed_code_handle, (jlong) cb->code_begin());
   678         HotSpotInstalledCode::set_codeSize(installed_code_handle, cb->code_size());
   701         HotSpotInstalledCode::set_codeSize(installed_code_handle, cb->code_size());
   679       }
   702       }
   780   CompilerStatistics* stats = compiler->stats();
   803   CompilerStatistics* stats = compiler->stats();
   781   stats->_standard.reset();
   804   stats->_standard.reset();
   782   stats->_osr.reset();
   805   stats->_osr.reset();
   783 C2V_END
   806 C2V_END
   784 
   807 
   785 C2V_VMENTRY(jobject, disassembleCodeBlob, (JNIEnv *jniEnv, jobject, jlong codeBlob))
   808 C2V_VMENTRY(jobject, disassembleCodeBlob, (JNIEnv *jniEnv, jobject, jobject installedCode))
   786   ResourceMark rm;
   809   ResourceMark rm;
   787   HandleMark hm;
   810   HandleMark hm;
       
   811 
       
   812   if (installedCode == NULL) {
       
   813     THROW_MSG_NULL(vmSymbols::java_lang_NullPointerException(), "installedCode is null");
       
   814   }
       
   815 
       
   816   jlong codeBlob = InstalledCode::address(installedCode);
       
   817   if (codeBlob == 0L) {
       
   818     return NULL;
       
   819   }
   788 
   820 
   789   CodeBlob* cb = (CodeBlob*) (address) codeBlob;
   821   CodeBlob* cb = (CodeBlob*) (address) codeBlob;
   790   if (cb == NULL) {
   822   if (cb == NULL) {
   791     return NULL;
   823     return NULL;
   792   }
   824   }
   934     method_data->initialize();
   966     method_data->initialize();
   935   }
   967   }
   936 C2V_END
   968 C2V_END
   937 
   969 
   938 
   970 
   939 C2V_VMENTRY(void, invalidateInstalledCode, (JNIEnv*, jobject, jobject hotspotInstalledCode))
   971 C2V_VMENTRY(void, invalidateInstalledCode, (JNIEnv*, jobject, jobject installed_code))
   940   jlong nativeMethod = InstalledCode::address(hotspotInstalledCode);
   972   Handle installed_code_handle = JNIHandles::resolve(installed_code);
   941   nmethod* m = (nmethod*)nativeMethod;
   973   CompilerToVM::invalidate_installed_code(installed_code_handle, CHECK);
   942   if (m != NULL && !m->is_not_entrant()) {
       
   943     m->mark_for_deoptimization();
       
   944     VM_Deoptimize op;
       
   945     VMThread::execute(&op);
       
   946   }
       
   947   InstalledCode::set_address(hotspotInstalledCode, 0);
       
   948 C2V_END
   974 C2V_END
   949 
   975 
   950 C2V_VMENTRY(jobject, readUncompressedOop, (JNIEnv*, jobject, jlong addr))
   976 C2V_VMENTRY(jobject, readUncompressedOop, (JNIEnv*, jobject, jlong addr))
   951   oop ret = oopDesc::load_decode_heap_oop((oop*)(address)addr);
   977   oop ret = oopDesc::load_decode_heap_oop((oop*)(address)addr);
   952   return JNIHandles::make_local(THREAD, ret);
   978   return JNIHandles::make_local(THREAD, ret);
   989 
  1015 
   990 bool matches(jobjectArray methods, Method* method) {
  1016 bool matches(jobjectArray methods, Method* method) {
   991   objArrayOop methods_oop = (objArrayOop) JNIHandles::resolve(methods);
  1017   objArrayOop methods_oop = (objArrayOop) JNIHandles::resolve(methods);
   992 
  1018 
   993   for (int i = 0; i < methods_oop->length(); i++) {
  1019   for (int i = 0; i < methods_oop->length(); i++) {
   994     if (CompilerToVM::asMethod(methods_oop->obj_at(i)) == method) {
  1020     oop resolved = methods_oop->obj_at(i);
       
  1021     if (resolved->is_a(HotSpotResolvedJavaMethodImpl::klass()) && CompilerToVM::asMethod(resolved) == method) {
   995       return true;
  1022       return true;
   996     }
  1023     }
   997   }
  1024   }
   998   return false;
  1025   return false;
   999 }
  1026 }
  1282 
  1309 
  1283 C2V_VMENTRY(void, flushDebugOutput, (JNIEnv*, jobject))
  1310 C2V_VMENTRY(void, flushDebugOutput, (JNIEnv*, jobject))
  1284   tty->flush();
  1311   tty->flush();
  1285 C2V_END
  1312 C2V_END
  1286 
  1313 
       
  1314 C2V_VMENTRY(int, methodDataProfileDataSize, (JNIEnv*, jobject, jlong metaspace_method_data, jint position))
       
  1315   ResourceMark rm;
       
  1316   MethodData* mdo = CompilerToVM::asMethodData(metaspace_method_data);
       
  1317   ProfileData* profile_data = mdo->data_at(position);
       
  1318   if (mdo->is_valid(profile_data)) {
       
  1319     return profile_data->size_in_bytes();
       
  1320   }
       
  1321   DataLayout* data    = mdo->extra_data_base();
       
  1322   DataLayout* end   = mdo->extra_data_limit();
       
  1323   for (;; data = mdo->next_extra(data)) {
       
  1324     assert(data < end, "moved past end of extra data");
       
  1325     profile_data = data->data_in();
       
  1326     if (mdo->dp_to_di(profile_data->dp()) == position) {
       
  1327       return profile_data->size_in_bytes();
       
  1328     }
       
  1329   }
       
  1330   THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(), err_msg("Invalid profile data position %d", position));
       
  1331 C2V_END
       
  1332 
  1287 
  1333 
  1288 #define CC (char*)  /*cast a literal from (const char*)*/
  1334 #define CC (char*)  /*cast a literal from (const char*)*/
  1289 #define FN_PTR(f) CAST_FROM_FN_PTR(void*, &(c2v_ ## f))
  1335 #define FN_PTR(f) CAST_FROM_FN_PTR(void*, &(c2v_ ## f))
  1290 
  1336 
  1291 #define SPECULATION_LOG       "Ljdk/vm/ci/meta/SpeculationLog;"
       
  1292 #define STRING                "Ljava/lang/String;"
  1337 #define STRING                "Ljava/lang/String;"
  1293 #define OBJECT                "Ljava/lang/Object;"
  1338 #define OBJECT                "Ljava/lang/Object;"
  1294 #define CLASS                 "Ljava/lang/Class;"
  1339 #define CLASS                 "Ljava/lang/Class;"
  1295 #define STACK_TRACE_ELEMENT   "Ljava/lang/StackTraceElement;"
  1340 #define STACK_TRACE_ELEMENT   "Ljava/lang/StackTraceElement;"
  1296 #define INSTALLED_CODE        "Ljdk/vm/ci/code/InstalledCode;"
  1341 #define INSTALLED_CODE        "Ljdk/vm/ci/code/InstalledCode;"
  1298 #define RESOLVED_METHOD       "Ljdk/vm/ci/meta/ResolvedJavaMethod;"
  1343 #define RESOLVED_METHOD       "Ljdk/vm/ci/meta/ResolvedJavaMethod;"
  1299 #define HS_RESOLVED_METHOD    "Ljdk/vm/ci/hotspot/HotSpotResolvedJavaMethodImpl;"
  1344 #define HS_RESOLVED_METHOD    "Ljdk/vm/ci/hotspot/HotSpotResolvedJavaMethodImpl;"
  1300 #define HS_RESOLVED_KLASS     "Ljdk/vm/ci/hotspot/HotSpotResolvedObjectTypeImpl;"
  1345 #define HS_RESOLVED_KLASS     "Ljdk/vm/ci/hotspot/HotSpotResolvedObjectTypeImpl;"
  1301 #define HS_CONSTANT_POOL      "Ljdk/vm/ci/hotspot/HotSpotConstantPool;"
  1346 #define HS_CONSTANT_POOL      "Ljdk/vm/ci/hotspot/HotSpotConstantPool;"
  1302 #define HS_COMPILED_CODE      "Ljdk/vm/ci/hotspot/HotSpotCompiledCode;"
  1347 #define HS_COMPILED_CODE      "Ljdk/vm/ci/hotspot/HotSpotCompiledCode;"
       
  1348 #define HS_CONFIG             "Ljdk/vm/ci/hotspot/HotSpotVMConfig;"
  1303 #define HS_METADATA           "Ljdk/vm/ci/hotspot/HotSpotMetaData;"
  1349 #define HS_METADATA           "Ljdk/vm/ci/hotspot/HotSpotMetaData;"
  1304 #define HS_STACK_FRAME_REF    "Ljdk/vm/ci/hotspot/HotSpotStackFrameReference;"
  1350 #define HS_STACK_FRAME_REF    "Ljdk/vm/ci/hotspot/HotSpotStackFrameReference;"
       
  1351 #define HS_SPECULATION_LOG    "Ljdk/vm/ci/hotspot/HotSpotSpeculationLog;"
  1305 #define METASPACE_METHOD_DATA "J"
  1352 #define METASPACE_METHOD_DATA "J"
  1306 
  1353 
  1307 JNINativeMethod CompilerToVM::methods[] = {
  1354 JNINativeMethod CompilerToVM::methods[] = {
  1308   {CC"getBytecode",                                  CC"("HS_RESOLVED_METHOD")[B",                                                     FN_PTR(getBytecode)},
  1355   {CC"getBytecode",                                  CC"("HS_RESOLVED_METHOD")[B",                                                     FN_PTR(getBytecode)},
  1309   {CC"getExceptionTableStart",                       CC"("HS_RESOLVED_METHOD")J",                                                      FN_PTR(getExceptionTableStart)},
  1356   {CC"getExceptionTableStart",                       CC"("HS_RESOLVED_METHOD")J",                                                      FN_PTR(getExceptionTableStart)},
  1337   {CC"getMaxCallTargetOffset",                       CC"(J)J",                                                                         FN_PTR(getMaxCallTargetOffset)},
  1384   {CC"getMaxCallTargetOffset",                       CC"(J)J",                                                                         FN_PTR(getMaxCallTargetOffset)},
  1338   {CC"getResolvedJavaMethodAtSlot",                  CC"("CLASS"I)"HS_RESOLVED_METHOD,                                                 FN_PTR(getResolvedJavaMethodAtSlot)},
  1385   {CC"getResolvedJavaMethodAtSlot",                  CC"("CLASS"I)"HS_RESOLVED_METHOD,                                                 FN_PTR(getResolvedJavaMethodAtSlot)},
  1339   {CC"getResolvedJavaMethod",                        CC"(Ljava/lang/Object;J)"HS_RESOLVED_METHOD,                                      FN_PTR(getResolvedJavaMethod)},
  1386   {CC"getResolvedJavaMethod",                        CC"(Ljava/lang/Object;J)"HS_RESOLVED_METHOD,                                      FN_PTR(getResolvedJavaMethod)},
  1340   {CC"getConstantPool",                              CC"(Ljava/lang/Object;J)"HS_CONSTANT_POOL,                                        FN_PTR(getConstantPool)},
  1387   {CC"getConstantPool",                              CC"(Ljava/lang/Object;J)"HS_CONSTANT_POOL,                                        FN_PTR(getConstantPool)},
  1341   {CC"getResolvedJavaType",                          CC"(Ljava/lang/Object;JZ)"HS_RESOLVED_KLASS,                                      FN_PTR(getResolvedJavaType)},
  1388   {CC"getResolvedJavaType",                          CC"(Ljava/lang/Object;JZ)"HS_RESOLVED_KLASS,                                      FN_PTR(getResolvedJavaType)},
  1342   {CC"initializeConfiguration",                      CC"()J",                                                                          FN_PTR(initializeConfiguration)},
  1389   {CC"initializeConfiguration",                      CC"("HS_CONFIG")J",                                                               FN_PTR(initializeConfiguration)},
  1343   {CC"installCode",                                  CC"("TARGET_DESCRIPTION HS_COMPILED_CODE INSTALLED_CODE SPECULATION_LOG")I",      FN_PTR(installCode)},
  1390   {CC"installCode",                                  CC"("TARGET_DESCRIPTION HS_COMPILED_CODE INSTALLED_CODE HS_SPECULATION_LOG")I",   FN_PTR(installCode)},
  1344   {CC"getMetadata",                                  CC"("TARGET_DESCRIPTION HS_COMPILED_CODE HS_METADATA")I",                         FN_PTR(getMetadata)},
  1391   {CC"getMetadata",                                  CC"("TARGET_DESCRIPTION HS_COMPILED_CODE HS_METADATA")I",                         FN_PTR(getMetadata)},
  1345   {CC"notifyCompilationStatistics",                  CC"(I"HS_RESOLVED_METHOD"ZIJJ"INSTALLED_CODE")V",                                 FN_PTR(notifyCompilationStatistics)},
  1392   {CC"notifyCompilationStatistics",                  CC"(I"HS_RESOLVED_METHOD"ZIJJ"INSTALLED_CODE")V",                                 FN_PTR(notifyCompilationStatistics)},
  1346   {CC"resetCompilationStatistics",                   CC"()V",                                                                          FN_PTR(resetCompilationStatistics)},
  1393   {CC"resetCompilationStatistics",                   CC"()V",                                                                          FN_PTR(resetCompilationStatistics)},
  1347   {CC"disassembleCodeBlob",                          CC"(J)"STRING,                                                                    FN_PTR(disassembleCodeBlob)},
  1394   {CC"disassembleCodeBlob",                          CC"("INSTALLED_CODE")"STRING,                                                     FN_PTR(disassembleCodeBlob)},
  1348   {CC"executeInstalledCode",                         CC"(["OBJECT INSTALLED_CODE")"OBJECT,                                             FN_PTR(executeInstalledCode)},
  1395   {CC"executeInstalledCode",                         CC"(["OBJECT INSTALLED_CODE")"OBJECT,                                             FN_PTR(executeInstalledCode)},
  1349   {CC"getLineNumberTable",                           CC"("HS_RESOLVED_METHOD")[J",                                                     FN_PTR(getLineNumberTable)},
  1396   {CC"getLineNumberTable",                           CC"("HS_RESOLVED_METHOD")[J",                                                     FN_PTR(getLineNumberTable)},
  1350   {CC"getLocalVariableTableStart",                   CC"("HS_RESOLVED_METHOD")J",                                                      FN_PTR(getLocalVariableTableStart)},
  1397   {CC"getLocalVariableTableStart",                   CC"("HS_RESOLVED_METHOD")J",                                                      FN_PTR(getLocalVariableTableStart)},
  1351   {CC"getLocalVariableTableLength",                  CC"("HS_RESOLVED_METHOD")I",                                                      FN_PTR(getLocalVariableTableLength)},
  1398   {CC"getLocalVariableTableLength",                  CC"("HS_RESOLVED_METHOD")I",                                                      FN_PTR(getLocalVariableTableLength)},
  1352   {CC"reprofile",                                    CC"("HS_RESOLVED_METHOD")V",                                                      FN_PTR(reprofile)},
  1399   {CC"reprofile",                                    CC"("HS_RESOLVED_METHOD")V",                                                      FN_PTR(reprofile)},
  1355   {CC"collectCounters",                              CC"()[J",                                                                         FN_PTR(collectCounters)},
  1402   {CC"collectCounters",                              CC"()[J",                                                                         FN_PTR(collectCounters)},
  1356   {CC"allocateCompileId",                            CC"("HS_RESOLVED_METHOD"I)I",                                                     FN_PTR(allocateCompileId)},
  1403   {CC"allocateCompileId",                            CC"("HS_RESOLVED_METHOD"I)I",                                                     FN_PTR(allocateCompileId)},
  1357   {CC"isMature",                                     CC"("METASPACE_METHOD_DATA")Z",                                                   FN_PTR(isMature)},
  1404   {CC"isMature",                                     CC"("METASPACE_METHOD_DATA")Z",                                                   FN_PTR(isMature)},
  1358   {CC"hasCompiledCodeForOSR",                        CC"("HS_RESOLVED_METHOD"II)Z",                                                    FN_PTR(hasCompiledCodeForOSR)},
  1405   {CC"hasCompiledCodeForOSR",                        CC"("HS_RESOLVED_METHOD"II)Z",                                                    FN_PTR(hasCompiledCodeForOSR)},
  1359   {CC"getSymbol",                                    CC"(J)"STRING,                                                                    FN_PTR(getSymbol)},
  1406   {CC"getSymbol",                                    CC"(J)"STRING,                                                                    FN_PTR(getSymbol)},
  1360   {CC"getNextStackFrame",                            CC"("HS_STACK_FRAME_REF "["HS_RESOLVED_METHOD"I)"HS_STACK_FRAME_REF,              FN_PTR(getNextStackFrame)},
  1407   {CC"getNextStackFrame",                            CC"("HS_STACK_FRAME_REF "["RESOLVED_METHOD"I)"HS_STACK_FRAME_REF,                 FN_PTR(getNextStackFrame)},
  1361   {CC"materializeVirtualObjects",                    CC"("HS_STACK_FRAME_REF"Z)V",                                                     FN_PTR(materializeVirtualObjects)},
  1408   {CC"materializeVirtualObjects",                    CC"("HS_STACK_FRAME_REF"Z)V",                                                     FN_PTR(materializeVirtualObjects)},
  1362   {CC"shouldDebugNonSafepoints",                     CC"()Z",                                                                          FN_PTR(shouldDebugNonSafepoints)},
  1409   {CC"shouldDebugNonSafepoints",                     CC"()Z",                                                                          FN_PTR(shouldDebugNonSafepoints)},
  1363   {CC"writeDebugOutput",                             CC"([BII)V",                                                                      FN_PTR(writeDebugOutput)},
  1410   {CC"writeDebugOutput",                             CC"([BII)V",                                                                      FN_PTR(writeDebugOutput)},
  1364   {CC"flushDebugOutput",                             CC"()V",                                                                          FN_PTR(flushDebugOutput)},
  1411   {CC"flushDebugOutput",                             CC"()V",                                                                          FN_PTR(flushDebugOutput)},
       
  1412   {CC"methodDataProfileDataSize",                    CC"(JI)I",                                                                        FN_PTR(methodDataProfileDataSize)},
  1365 };
  1413 };
  1366 
  1414 
  1367 int CompilerToVM::methods_count() {
  1415 int CompilerToVM::methods_count() {
  1368   return sizeof(methods) / sizeof(JNINativeMethod);
  1416   return sizeof(methods) / sizeof(JNINativeMethod);
  1369 }
  1417 }