hotspot/src/share/vm/prims/whitebox.cpp
changeset 22786 86644d9539c2
parent 21571 a3999342fb24
child 22795 2b5380bc0926
equal deleted inserted replaced
22782:a3b1d68b373d 22786:86644d9539c2
   314   VMThread::execute(&op);
   314   VMThread::execute(&op);
   315 WB_END
   315 WB_END
   316 
   316 
   317 WB_ENTRY(jint, WB_DeoptimizeMethod(JNIEnv* env, jobject o, jobject method, jboolean is_osr))
   317 WB_ENTRY(jint, WB_DeoptimizeMethod(JNIEnv* env, jobject o, jobject method, jboolean is_osr))
   318   jmethodID jmid = reflected_method_to_jmid(thread, env, method);
   318   jmethodID jmid = reflected_method_to_jmid(thread, env, method);
       
   319   int result = 0;
       
   320   CHECK_JNI_EXCEPTION_(env, result);
   319   MutexLockerEx mu(Compile_lock);
   321   MutexLockerEx mu(Compile_lock);
   320   methodHandle mh(THREAD, Method::checked_resolve_jmethod_id(jmid));
   322   methodHandle mh(THREAD, Method::checked_resolve_jmethod_id(jmid));
   321   int result = 0;
       
   322   nmethod* code;
   323   nmethod* code;
   323   if (is_osr) {
   324   if (is_osr) {
   324     int bci = InvocationEntryBci;
   325     int bci = InvocationEntryBci;
   325     while ((code = mh->lookup_osr_nmethod_for(bci, CompLevel_none, false)) != NULL) {
   326     while ((code = mh->lookup_osr_nmethod_for(bci, CompLevel_none, false)) != NULL) {
   326       code->mark_for_deoptimization();
   327       code->mark_for_deoptimization();
   342   return result;
   343   return result;
   343 WB_END
   344 WB_END
   344 
   345 
   345 WB_ENTRY(jboolean, WB_IsMethodCompiled(JNIEnv* env, jobject o, jobject method, jboolean is_osr))
   346 WB_ENTRY(jboolean, WB_IsMethodCompiled(JNIEnv* env, jobject o, jobject method, jboolean is_osr))
   346   jmethodID jmid = reflected_method_to_jmid(thread, env, method);
   347   jmethodID jmid = reflected_method_to_jmid(thread, env, method);
       
   348   CHECK_JNI_EXCEPTION_(env, JNI_FALSE);
   347   MutexLockerEx mu(Compile_lock);
   349   MutexLockerEx mu(Compile_lock);
   348   methodHandle mh(THREAD, Method::checked_resolve_jmethod_id(jmid));
   350   methodHandle mh(THREAD, Method::checked_resolve_jmethod_id(jmid));
   349   nmethod* code = is_osr ? mh->lookup_osr_nmethod_for(InvocationEntryBci, CompLevel_none, false) : mh->code();
   351   nmethod* code = is_osr ? mh->lookup_osr_nmethod_for(InvocationEntryBci, CompLevel_none, false) : mh->code();
   350   if (code == NULL) {
   352   if (code == NULL) {
   351     return JNI_FALSE;
   353     return JNI_FALSE;
   353   return (code->is_alive() && !code->is_marked_for_deoptimization());
   355   return (code->is_alive() && !code->is_marked_for_deoptimization());
   354 WB_END
   356 WB_END
   355 
   357 
   356 WB_ENTRY(jboolean, WB_IsMethodCompilable(JNIEnv* env, jobject o, jobject method, jint comp_level, jboolean is_osr))
   358 WB_ENTRY(jboolean, WB_IsMethodCompilable(JNIEnv* env, jobject o, jobject method, jint comp_level, jboolean is_osr))
   357   jmethodID jmid = reflected_method_to_jmid(thread, env, method);
   359   jmethodID jmid = reflected_method_to_jmid(thread, env, method);
       
   360   CHECK_JNI_EXCEPTION_(env, JNI_FALSE);
   358   MutexLockerEx mu(Compile_lock);
   361   MutexLockerEx mu(Compile_lock);
   359   methodHandle mh(THREAD, Method::checked_resolve_jmethod_id(jmid));
   362   methodHandle mh(THREAD, Method::checked_resolve_jmethod_id(jmid));
   360   if (is_osr) {
   363   if (is_osr) {
   361     return CompilationPolicy::can_be_osr_compiled(mh, comp_level);
   364     return CompilationPolicy::can_be_osr_compiled(mh, comp_level);
   362   } else {
   365   } else {
   364   }
   367   }
   365 WB_END
   368 WB_END
   366 
   369 
   367 WB_ENTRY(jboolean, WB_IsMethodQueuedForCompilation(JNIEnv* env, jobject o, jobject method))
   370 WB_ENTRY(jboolean, WB_IsMethodQueuedForCompilation(JNIEnv* env, jobject o, jobject method))
   368   jmethodID jmid = reflected_method_to_jmid(thread, env, method);
   371   jmethodID jmid = reflected_method_to_jmid(thread, env, method);
       
   372   CHECK_JNI_EXCEPTION_(env, JNI_FALSE);
   369   MutexLockerEx mu(Compile_lock);
   373   MutexLockerEx mu(Compile_lock);
   370   methodHandle mh(THREAD, Method::checked_resolve_jmethod_id(jmid));
   374   methodHandle mh(THREAD, Method::checked_resolve_jmethod_id(jmid));
   371   return mh->queued_for_compilation();
   375   return mh->queued_for_compilation();
   372 WB_END
   376 WB_END
   373 
   377 
   374 WB_ENTRY(jint, WB_GetMethodCompilationLevel(JNIEnv* env, jobject o, jobject method, jboolean is_osr))
   378 WB_ENTRY(jint, WB_GetMethodCompilationLevel(JNIEnv* env, jobject o, jobject method, jboolean is_osr))
   375   jmethodID jmid = reflected_method_to_jmid(thread, env, method);
   379   jmethodID jmid = reflected_method_to_jmid(thread, env, method);
       
   380   CHECK_JNI_EXCEPTION_(env, CompLevel_none);
   376   methodHandle mh(THREAD, Method::checked_resolve_jmethod_id(jmid));
   381   methodHandle mh(THREAD, Method::checked_resolve_jmethod_id(jmid));
   377   nmethod* code = is_osr ? mh->lookup_osr_nmethod_for(InvocationEntryBci, CompLevel_none, false) : mh->code();
   382   nmethod* code = is_osr ? mh->lookup_osr_nmethod_for(InvocationEntryBci, CompLevel_none, false) : mh->code();
   378   return (code != NULL ? code->comp_level() : CompLevel_none);
   383   return (code != NULL ? code->comp_level() : CompLevel_none);
   379 WB_END
   384 WB_END
   380 
   385 
   381 WB_ENTRY(void, WB_MakeMethodNotCompilable(JNIEnv* env, jobject o, jobject method, jint comp_level, jboolean is_osr))
   386 WB_ENTRY(void, WB_MakeMethodNotCompilable(JNIEnv* env, jobject o, jobject method, jint comp_level, jboolean is_osr))
   382   jmethodID jmid = reflected_method_to_jmid(thread, env, method);
   387   jmethodID jmid = reflected_method_to_jmid(thread, env, method);
       
   388   CHECK_JNI_EXCEPTION(env);
   383   methodHandle mh(THREAD, Method::checked_resolve_jmethod_id(jmid));
   389   methodHandle mh(THREAD, Method::checked_resolve_jmethod_id(jmid));
   384   if (is_osr) {
   390   if (is_osr) {
   385     mh->set_not_osr_compilable(comp_level, true /* report */, "WhiteBox");
   391     mh->set_not_osr_compilable(comp_level, true /* report */, "WhiteBox");
   386   } else {
   392   } else {
   387     mh->set_not_compilable(comp_level, true /* report */, "WhiteBox");
   393     mh->set_not_compilable(comp_level, true /* report */, "WhiteBox");
   388   }
   394   }
   389 WB_END
   395 WB_END
   390 
   396 
   391 WB_ENTRY(jint, WB_GetMethodEntryBci(JNIEnv* env, jobject o, jobject method))
   397 WB_ENTRY(jint, WB_GetMethodEntryBci(JNIEnv* env, jobject o, jobject method))
   392   jmethodID jmid = reflected_method_to_jmid(thread, env, method);
   398   jmethodID jmid = reflected_method_to_jmid(thread, env, method);
       
   399   CHECK_JNI_EXCEPTION_(env, InvocationEntryBci);
   393   methodHandle mh(THREAD, Method::checked_resolve_jmethod_id(jmid));
   400   methodHandle mh(THREAD, Method::checked_resolve_jmethod_id(jmid));
   394   nmethod* code = mh->lookup_osr_nmethod_for(InvocationEntryBci, CompLevel_none, false);
   401   nmethod* code = mh->lookup_osr_nmethod_for(InvocationEntryBci, CompLevel_none, false);
   395   return (code != NULL && code->is_osr_method() ? code->osr_entry_bci() : InvocationEntryBci);
   402   return (code != NULL && code->is_osr_method() ? code->osr_entry_bci() : InvocationEntryBci);
   396 WB_END
   403 WB_END
   397 
   404 
   398 WB_ENTRY(jboolean, WB_TestSetDontInlineMethod(JNIEnv* env, jobject o, jobject method, jboolean value))
   405 WB_ENTRY(jboolean, WB_TestSetDontInlineMethod(JNIEnv* env, jobject o, jobject method, jboolean value))
   399   jmethodID jmid = reflected_method_to_jmid(thread, env, method);
   406   jmethodID jmid = reflected_method_to_jmid(thread, env, method);
       
   407   CHECK_JNI_EXCEPTION_(env, JNI_FALSE);
   400   methodHandle mh(THREAD, Method::checked_resolve_jmethod_id(jmid));
   408   methodHandle mh(THREAD, Method::checked_resolve_jmethod_id(jmid));
   401   bool result = mh->dont_inline();
   409   bool result = mh->dont_inline();
   402   mh->set_dont_inline(value == JNI_TRUE);
   410   mh->set_dont_inline(value == JNI_TRUE);
   403   return result;
   411   return result;
   404 WB_END
   412 WB_END
   412   }
   420   }
   413 WB_END
   421 WB_END
   414 
   422 
   415 WB_ENTRY(jboolean, WB_TestSetForceInlineMethod(JNIEnv* env, jobject o, jobject method, jboolean value))
   423 WB_ENTRY(jboolean, WB_TestSetForceInlineMethod(JNIEnv* env, jobject o, jobject method, jboolean value))
   416   jmethodID jmid = reflected_method_to_jmid(thread, env, method);
   424   jmethodID jmid = reflected_method_to_jmid(thread, env, method);
       
   425   CHECK_JNI_EXCEPTION_(env, JNI_FALSE);
   417   methodHandle mh(THREAD, Method::checked_resolve_jmethod_id(jmid));
   426   methodHandle mh(THREAD, Method::checked_resolve_jmethod_id(jmid));
   418   bool result = mh->force_inline();
   427   bool result = mh->force_inline();
   419   mh->set_force_inline(value == JNI_TRUE);
   428   mh->set_force_inline(value == JNI_TRUE);
   420   return result;
   429   return result;
   421 WB_END
   430 WB_END
   422 
   431 
   423 WB_ENTRY(jboolean, WB_EnqueueMethodForCompilation(JNIEnv* env, jobject o, jobject method, jint comp_level, jint bci))
   432 WB_ENTRY(jboolean, WB_EnqueueMethodForCompilation(JNIEnv* env, jobject o, jobject method, jint comp_level, jint bci))
   424   jmethodID jmid = reflected_method_to_jmid(thread, env, method);
   433   jmethodID jmid = reflected_method_to_jmid(thread, env, method);
       
   434   CHECK_JNI_EXCEPTION_(env, JNI_FALSE);
   425   methodHandle mh(THREAD, Method::checked_resolve_jmethod_id(jmid));
   435   methodHandle mh(THREAD, Method::checked_resolve_jmethod_id(jmid));
   426   nmethod* nm = CompileBroker::compile_method(mh, bci, comp_level, mh, mh->invocation_count(), "WhiteBox", THREAD);
   436   nmethod* nm = CompileBroker::compile_method(mh, bci, comp_level, mh, mh->invocation_count(), "WhiteBox", THREAD);
   427   MutexLockerEx mu(Compile_lock);
   437   MutexLockerEx mu(Compile_lock);
   428   return (mh->queued_for_compilation() || nm != NULL);
   438   return (mh->queued_for_compilation() || nm != NULL);
   429 WB_END
   439 WB_END
   430 
   440 
   431 WB_ENTRY(void, WB_ClearMethodState(JNIEnv* env, jobject o, jobject method))
   441 WB_ENTRY(void, WB_ClearMethodState(JNIEnv* env, jobject o, jobject method))
   432   jmethodID jmid = reflected_method_to_jmid(thread, env, method);
   442   jmethodID jmid = reflected_method_to_jmid(thread, env, method);
       
   443   CHECK_JNI_EXCEPTION(env);
   433   methodHandle mh(THREAD, Method::checked_resolve_jmethod_id(jmid));
   444   methodHandle mh(THREAD, Method::checked_resolve_jmethod_id(jmid));
   434   MutexLockerEx mu(Compile_lock);
   445   MutexLockerEx mu(Compile_lock);
   435   MethodData* mdo = mh->method_data();
   446   MethodData* mdo = mh->method_data();
   436   MethodCounters* mcs = mh->method_counters();
   447   MethodCounters* mcs = mh->method_counters();
   437 
   448 
   614         ResourceMark rm;
   625         ResourceMark rm;
   615         ThreadToNativeFromVM ttnfv(thread); // can't be in VM when we call JNI
   626         ThreadToNativeFromVM ttnfv(thread); // can't be in VM when we call JNI
   616         bool result = true;
   627         bool result = true;
   617         //  one by one registration natives for exception catching
   628         //  one by one registration natives for exception catching
   618         jclass exceptionKlass = env->FindClass(vmSymbols::java_lang_NoSuchMethodError()->as_C_string());
   629         jclass exceptionKlass = env->FindClass(vmSymbols::java_lang_NoSuchMethodError()->as_C_string());
       
   630         CHECK_JNI_EXCEPTION(env);
   619         for (int i = 0, n = sizeof(methods) / sizeof(methods[0]); i < n; ++i) {
   631         for (int i = 0, n = sizeof(methods) / sizeof(methods[0]); i < n; ++i) {
   620           if (env->RegisterNatives(wbclass, methods + i, 1) != 0) {
   632           if (env->RegisterNatives(wbclass, methods + i, 1) != 0) {
   621             result = false;
   633             result = false;
   622             if (env->ExceptionCheck() && env->IsInstanceOf(env->ExceptionOccurred(), exceptionKlass)) {
   634             jthrowable throwable_obj = env->ExceptionOccurred();
   623               // j.l.NoSuchMethodError is thrown when a method can't be found or a method is not native
   635             if (throwable_obj != NULL) {
   624               // ignoring the exception
       
   625               tty->print_cr("Warning: 'NoSuchMethodError' on register of sun.hotspot.WhiteBox::%s%s", methods[i].name, methods[i].signature);
       
   626               env->ExceptionClear();
   636               env->ExceptionClear();
       
   637               if (env->IsInstanceOf(throwable_obj, exceptionKlass)) {
       
   638                 // j.l.NoSuchMethodError is thrown when a method can't be found or a method is not native
       
   639                 // ignoring the exception
       
   640                 tty->print_cr("Warning: 'NoSuchMethodError' on register of sun.hotspot.WhiteBox::%s%s", methods[i].name, methods[i].signature);
       
   641               }
   627             } else {
   642             } else {
   628               // register is failed w/o exception or w/ unexpected exception
   643               // register is failed w/o exception or w/ unexpected exception
   629               tty->print_cr("Warning: unexpected error on register of sun.hotspot.WhiteBox::%s%s. All methods will be unregistered", methods[i].name, methods[i].signature);
   644               tty->print_cr("Warning: unexpected error on register of sun.hotspot.WhiteBox::%s%s. All methods will be unregistered", methods[i].name, methods[i].signature);
   630               env->UnregisterNatives(wbclass);
   645               env->UnregisterNatives(wbclass);
   631               break;
   646               break;