< prev index next >

src/share/vm/prims/whitebox.cpp

Print this page




 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
< prev index next >