765 766 bool WhiteBox::compile_method(Method* method, int comp_level, int bci, Thread* THREAD) { 767 // Screen for unavailable/bad comp level or null method 768 if (method == NULL || comp_level > MIN2((CompLevel) TieredStopAtLevel, CompLevel_highest_tier) || 769 CompileBroker::compiler(comp_level) == NULL) { 770 return false; 771 } 772 methodHandle mh(THREAD, method); 773 nmethod* nm = CompileBroker::compile_method(mh, bci, comp_level, mh, mh->invocation_count(), CompileTask::Reason_Whitebox, THREAD); 774 MutexLockerEx mu(Compile_lock); 775 return (mh->queued_for_compilation() || nm != NULL); 776 } 777 778 WB_ENTRY(jboolean, WB_EnqueueMethodForCompilation(JNIEnv* env, jobject o, jobject method, jint comp_level, jint bci)) 779 jmethodID jmid = reflected_method_to_jmid(thread, env, method); 780 CHECK_JNI_EXCEPTION_(env, JNI_FALSE); 781 return WhiteBox::compile_method(Method::checked_resolve_jmethod_id(jmid), comp_level, bci, THREAD); 782 WB_END 783 784 WB_ENTRY(jboolean, WB_EnqueueInitializerForCompilation(JNIEnv* env, jobject o, jclass klass, jint comp_level)) 785 instanceKlassHandle ikh(java_lang_Class::as_Klass(JNIHandles::resolve(klass))); 786 return WhiteBox::compile_method(ikh->class_initializer(), comp_level, InvocationEntryBci, THREAD); 787 WB_END 788 789 WB_ENTRY(jboolean, WB_ShouldPrintAssembly(JNIEnv* env, jobject o, jobject method, jint comp_level)) 790 jmethodID jmid = reflected_method_to_jmid(thread, env, method); 791 CHECK_JNI_EXCEPTION_(env, JNI_FALSE); 792 793 methodHandle mh(THREAD, Method::checked_resolve_jmethod_id(jmid)); 794 DirectiveSet* directive = DirectivesStack::getMatchingDirective(mh, CompileBroker::compiler(comp_level)); 795 bool result = directive->PrintAssemblyOption; 796 DirectivesStack::release(directive); 797 798 return result; 799 WB_END 800 801 WB_ENTRY(jint, WB_MatchesInline(JNIEnv* env, jobject o, jobject method, jstring pattern)) 802 jmethodID jmid = reflected_method_to_jmid(thread, env, method); 803 CHECK_JNI_EXCEPTION_(env, JNI_FALSE); 804 805 methodHandle mh(THREAD, Method::checked_resolve_jmethod_id(jmid)); 806 1500 1501 WB_ENTRY(void, WB_AssertMatchingSafepointCalls(JNIEnv* env, jobject o, jboolean mutexSafepointValue, jboolean attemptedNoSafepointValue)) 1502 Monitor::SafepointCheckRequired sfpt_check_required = mutexSafepointValue ? 1503 Monitor::_safepoint_check_always : 1504 Monitor::_safepoint_check_never; 1505 MutexLockerEx ml(new Mutex(Mutex::leaf, "SFPT_Test_lock", true, sfpt_check_required), 1506 attemptedNoSafepointValue == JNI_TRUE); 1507 WB_END 1508 1509 WB_ENTRY(jboolean, WB_IsMonitorInflated(JNIEnv* env, jobject wb, jobject obj)) 1510 oop obj_oop = JNIHandles::resolve(obj); 1511 return (jboolean) obj_oop->mark()->has_monitor(); 1512 WB_END 1513 1514 WB_ENTRY(void, WB_ForceSafepoint(JNIEnv* env, jobject wb)) 1515 VM_ForceSafepoint force_safepoint_op; 1516 VMThread::execute(&force_safepoint_op); 1517 WB_END 1518 1519 WB_ENTRY(jlong, WB_GetConstantPool(JNIEnv* env, jobject wb, jclass klass)) 1520 instanceKlassHandle ikh(java_lang_Class::as_Klass(JNIHandles::resolve(klass))); 1521 return (jlong) ikh->constants(); 1522 WB_END 1523 1524 WB_ENTRY(jint, WB_GetConstantPoolCacheIndexTag(JNIEnv* env, jobject wb)) 1525 return ConstantPool::CPCACHE_INDEX_TAG; 1526 WB_END 1527 1528 WB_ENTRY(jint, WB_GetConstantPoolCacheLength(JNIEnv* env, jobject wb, jclass klass)) 1529 instanceKlassHandle ikh(java_lang_Class::as_Klass(JNIHandles::resolve(klass))); 1530 ConstantPool* cp = ikh->constants(); 1531 if (cp->cache() == NULL) { 1532 return -1; 1533 } 1534 return cp->cache()->length(); 1535 WB_END 1536 1537 WB_ENTRY(jint, WB_ConstantPoolRemapInstructionOperandFromCache(JNIEnv* env, jobject wb, jclass klass, jint index)) 1538 instanceKlassHandle ikh(java_lang_Class::as_Klass(JNIHandles::resolve(klass))); 1539 ConstantPool* cp = ikh->constants(); 1540 if (cp->cache() == NULL) { 1541 THROW_MSG_0(vmSymbols::java_lang_IllegalStateException(), "Constant pool does not have a cache"); 1542 } 1543 jint cpci = index; 1544 jint cpciTag = ConstantPool::CPCACHE_INDEX_TAG; 1545 if (cpciTag > cpci || cpci >= cp->cache()->length() + cpciTag) { 1546 THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(), "Constant pool cache index is out of range"); 1547 } 1548 jint cpi = cp->remap_instruction_operand_from_cache(cpci); 1549 return cpi; 1550 WB_END 1551 1552 WB_ENTRY(jint, WB_ConstantPoolEncodeIndyIndex(JNIEnv* env, jobject wb, jint index)) 1553 return ConstantPool::encode_invokedynamic_index(index); 1554 WB_END 1555 1556 WB_ENTRY(void, WB_ClearInlineCaches(JNIEnv* env, jobject wb, jboolean preserve_static_stubs)) 1557 VM_ClearICs clear_ics(preserve_static_stubs == JNI_TRUE); 1558 VMThread::execute(&clear_ics); 1559 WB_END 1933 CC"(Ljava/lang/reflect/Executable;Ljava/lang/String;)Ljava/lang/String;", 1934 (void*)&WB_GetMethodStringOption}, 1935 {CC"isShared", CC"(Ljava/lang/Object;)Z", (void*)&WB_IsShared }, 1936 {CC"isSharedClass", CC"(Ljava/lang/Class;)Z", (void*)&WB_IsSharedClass }, 1937 {CC"areSharedStringsIgnored", CC"()Z", (void*)&WB_AreSharedStringsIgnored }, 1938 {CC"clearInlineCaches0", CC"(Z)V", (void*)&WB_ClearInlineCaches }, 1939 {CC"addCompilerDirective", CC"(Ljava/lang/String;)I", 1940 (void*)&WB_AddCompilerDirective }, 1941 {CC"removeCompilerDirective", CC"(I)V", (void*)&WB_RemoveCompilerDirective }, 1942 {CC"currentGC", CC"()I", (void*)&WB_CurrentGC}, 1943 {CC"allSupportedGC", CC"()I", (void*)&WB_AllSupportedGC}, 1944 {CC"gcSelectedByErgo", CC"()Z", (void*)&WB_GCSelectedByErgo}, 1945 }; 1946 1947 #undef CC 1948 1949 JVM_ENTRY(void, JVM_RegisterWhiteBoxMethods(JNIEnv* env, jclass wbclass)) 1950 { 1951 if (WhiteBoxAPI) { 1952 // Make sure that wbclass is loaded by the null classloader 1953 instanceKlassHandle ikh = instanceKlassHandle(JNIHandles::resolve(wbclass)->klass()); 1954 Handle loader(THREAD, ikh->class_loader()); 1955 if (loader.is_null()) { 1956 WhiteBox::register_methods(env, wbclass, thread, methods, sizeof(methods) / sizeof(methods[0])); 1957 WhiteBox::register_extended(env, wbclass, thread); 1958 WhiteBox::set_used(); 1959 } 1960 } 1961 } 1962 JVM_END | 765 766 bool WhiteBox::compile_method(Method* method, int comp_level, int bci, Thread* THREAD) { 767 // Screen for unavailable/bad comp level or null method 768 if (method == NULL || comp_level > MIN2((CompLevel) TieredStopAtLevel, CompLevel_highest_tier) || 769 CompileBroker::compiler(comp_level) == NULL) { 770 return false; 771 } 772 methodHandle mh(THREAD, method); 773 nmethod* nm = CompileBroker::compile_method(mh, bci, comp_level, mh, mh->invocation_count(), CompileTask::Reason_Whitebox, THREAD); 774 MutexLockerEx mu(Compile_lock); 775 return (mh->queued_for_compilation() || nm != NULL); 776 } 777 778 WB_ENTRY(jboolean, WB_EnqueueMethodForCompilation(JNIEnv* env, jobject o, jobject method, jint comp_level, jint bci)) 779 jmethodID jmid = reflected_method_to_jmid(thread, env, method); 780 CHECK_JNI_EXCEPTION_(env, JNI_FALSE); 781 return WhiteBox::compile_method(Method::checked_resolve_jmethod_id(jmid), comp_level, bci, THREAD); 782 WB_END 783 784 WB_ENTRY(jboolean, WB_EnqueueInitializerForCompilation(JNIEnv* env, jobject o, jclass klass, jint comp_level)) 785 InstanceKlass* ik = InstanceKlass::cast(java_lang_Class::as_Klass(JNIHandles::resolve(klass))); 786 return WhiteBox::compile_method(ik->class_initializer(), comp_level, InvocationEntryBci, THREAD); 787 WB_END 788 789 WB_ENTRY(jboolean, WB_ShouldPrintAssembly(JNIEnv* env, jobject o, jobject method, jint comp_level)) 790 jmethodID jmid = reflected_method_to_jmid(thread, env, method); 791 CHECK_JNI_EXCEPTION_(env, JNI_FALSE); 792 793 methodHandle mh(THREAD, Method::checked_resolve_jmethod_id(jmid)); 794 DirectiveSet* directive = DirectivesStack::getMatchingDirective(mh, CompileBroker::compiler(comp_level)); 795 bool result = directive->PrintAssemblyOption; 796 DirectivesStack::release(directive); 797 798 return result; 799 WB_END 800 801 WB_ENTRY(jint, WB_MatchesInline(JNIEnv* env, jobject o, jobject method, jstring pattern)) 802 jmethodID jmid = reflected_method_to_jmid(thread, env, method); 803 CHECK_JNI_EXCEPTION_(env, JNI_FALSE); 804 805 methodHandle mh(THREAD, Method::checked_resolve_jmethod_id(jmid)); 806 1500 1501 WB_ENTRY(void, WB_AssertMatchingSafepointCalls(JNIEnv* env, jobject o, jboolean mutexSafepointValue, jboolean attemptedNoSafepointValue)) 1502 Monitor::SafepointCheckRequired sfpt_check_required = mutexSafepointValue ? 1503 Monitor::_safepoint_check_always : 1504 Monitor::_safepoint_check_never; 1505 MutexLockerEx ml(new Mutex(Mutex::leaf, "SFPT_Test_lock", true, sfpt_check_required), 1506 attemptedNoSafepointValue == JNI_TRUE); 1507 WB_END 1508 1509 WB_ENTRY(jboolean, WB_IsMonitorInflated(JNIEnv* env, jobject wb, jobject obj)) 1510 oop obj_oop = JNIHandles::resolve(obj); 1511 return (jboolean) obj_oop->mark()->has_monitor(); 1512 WB_END 1513 1514 WB_ENTRY(void, WB_ForceSafepoint(JNIEnv* env, jobject wb)) 1515 VM_ForceSafepoint force_safepoint_op; 1516 VMThread::execute(&force_safepoint_op); 1517 WB_END 1518 1519 WB_ENTRY(jlong, WB_GetConstantPool(JNIEnv* env, jobject wb, jclass klass)) 1520 InstanceKlass* ik = InstanceKlass::cast(java_lang_Class::as_Klass(JNIHandles::resolve(klass))); 1521 return (jlong) ik->constants(); 1522 WB_END 1523 1524 WB_ENTRY(jint, WB_GetConstantPoolCacheIndexTag(JNIEnv* env, jobject wb)) 1525 return ConstantPool::CPCACHE_INDEX_TAG; 1526 WB_END 1527 1528 WB_ENTRY(jint, WB_GetConstantPoolCacheLength(JNIEnv* env, jobject wb, jclass klass)) 1529 InstanceKlass* ik = InstanceKlass::cast(java_lang_Class::as_Klass(JNIHandles::resolve(klass))); 1530 ConstantPool* cp = ik->constants(); 1531 if (cp->cache() == NULL) { 1532 return -1; 1533 } 1534 return cp->cache()->length(); 1535 WB_END 1536 1537 WB_ENTRY(jint, WB_ConstantPoolRemapInstructionOperandFromCache(JNIEnv* env, jobject wb, jclass klass, jint index)) 1538 InstanceKlass* ik = InstanceKlass::cast(java_lang_Class::as_Klass(JNIHandles::resolve(klass))); 1539 ConstantPool* cp = ik->constants(); 1540 if (cp->cache() == NULL) { 1541 THROW_MSG_0(vmSymbols::java_lang_IllegalStateException(), "Constant pool does not have a cache"); 1542 } 1543 jint cpci = index; 1544 jint cpciTag = ConstantPool::CPCACHE_INDEX_TAG; 1545 if (cpciTag > cpci || cpci >= cp->cache()->length() + cpciTag) { 1546 THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(), "Constant pool cache index is out of range"); 1547 } 1548 jint cpi = cp->remap_instruction_operand_from_cache(cpci); 1549 return cpi; 1550 WB_END 1551 1552 WB_ENTRY(jint, WB_ConstantPoolEncodeIndyIndex(JNIEnv* env, jobject wb, jint index)) 1553 return ConstantPool::encode_invokedynamic_index(index); 1554 WB_END 1555 1556 WB_ENTRY(void, WB_ClearInlineCaches(JNIEnv* env, jobject wb, jboolean preserve_static_stubs)) 1557 VM_ClearICs clear_ics(preserve_static_stubs == JNI_TRUE); 1558 VMThread::execute(&clear_ics); 1559 WB_END 1933 CC"(Ljava/lang/reflect/Executable;Ljava/lang/String;)Ljava/lang/String;", 1934 (void*)&WB_GetMethodStringOption}, 1935 {CC"isShared", CC"(Ljava/lang/Object;)Z", (void*)&WB_IsShared }, 1936 {CC"isSharedClass", CC"(Ljava/lang/Class;)Z", (void*)&WB_IsSharedClass }, 1937 {CC"areSharedStringsIgnored", CC"()Z", (void*)&WB_AreSharedStringsIgnored }, 1938 {CC"clearInlineCaches0", CC"(Z)V", (void*)&WB_ClearInlineCaches }, 1939 {CC"addCompilerDirective", CC"(Ljava/lang/String;)I", 1940 (void*)&WB_AddCompilerDirective }, 1941 {CC"removeCompilerDirective", CC"(I)V", (void*)&WB_RemoveCompilerDirective }, 1942 {CC"currentGC", CC"()I", (void*)&WB_CurrentGC}, 1943 {CC"allSupportedGC", CC"()I", (void*)&WB_AllSupportedGC}, 1944 {CC"gcSelectedByErgo", CC"()Z", (void*)&WB_GCSelectedByErgo}, 1945 }; 1946 1947 #undef CC 1948 1949 JVM_ENTRY(void, JVM_RegisterWhiteBoxMethods(JNIEnv* env, jclass wbclass)) 1950 { 1951 if (WhiteBoxAPI) { 1952 // Make sure that wbclass is loaded by the null classloader 1953 InstanceKlass* ik = InstanceKlass::cast(JNIHandles::resolve(wbclass)->klass()); 1954 Handle loader(THREAD, ik->class_loader()); 1955 if (loader.is_null()) { 1956 WhiteBox::register_methods(env, wbclass, thread, methods, sizeof(methods) / sizeof(methods[0])); 1957 WhiteBox::register_extended(env, wbclass, thread); 1958 WhiteBox::set_used(); 1959 } 1960 } 1961 } 1962 JVM_END |