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 } |
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); |
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 } |