comparison src/share/vm/prims/whitebox.cpp @ 12073:f99558245e5c

8022832: Add WB APIs for OSR compilation Reviewed-by: kvn
author iignatyev
date Wed, 14 Aug 2013 23:50:23 +0400
parents a837fa3d3f86
children 5fd8e2fbafd4
comparison
equal deleted inserted replaced
12072:6c72125a2f40 12073:f99558245e5c
194 CodeCache::mark_all_nmethods_for_deoptimization(); 194 CodeCache::mark_all_nmethods_for_deoptimization();
195 VM_Deoptimize op; 195 VM_Deoptimize op;
196 VMThread::execute(&op); 196 VMThread::execute(&op);
197 WB_END 197 WB_END
198 198
199 WB_ENTRY(jint, WB_DeoptimizeMethod(JNIEnv* env, jobject o, jobject method)) 199 WB_ENTRY(jint, WB_DeoptimizeMethod(JNIEnv* env, jobject o, jobject method, jboolean is_osr))
200 jmethodID jmid = reflected_method_to_jmid(thread, env, method); 200 jmethodID jmid = reflected_method_to_jmid(thread, env, method);
201 MutexLockerEx mu(Compile_lock); 201 MutexLockerEx mu(Compile_lock);
202 methodHandle mh(THREAD, Method::checked_resolve_jmethod_id(jmid)); 202 methodHandle mh(THREAD, Method::checked_resolve_jmethod_id(jmid));
203 int result = 0; 203 int result = 0;
204 nmethod* code = mh->code(); 204 nmethod* code;
205 if (is_osr) {
206 int bci = InvocationEntryBci;
207 while ((code = mh->lookup_osr_nmethod_for(bci, CompLevel_none, false)) != NULL) {
208 code->mark_for_deoptimization();
209 ++result;
210 bci = code->osr_entry_bci() + 1;
211 }
212 } else {
213 code = mh->code();
214 }
205 if (code != NULL) { 215 if (code != NULL) {
206 code->mark_for_deoptimization(); 216 code->mark_for_deoptimization();
207 ++result; 217 ++result;
208 } 218 }
209 result += CodeCache::mark_for_deoptimization(mh()); 219 result += CodeCache::mark_for_deoptimization(mh());
212 VMThread::execute(&op); 222 VMThread::execute(&op);
213 } 223 }
214 return result; 224 return result;
215 WB_END 225 WB_END
216 226
217 WB_ENTRY(jboolean, WB_IsMethodCompiled(JNIEnv* env, jobject o, jobject method)) 227 WB_ENTRY(jboolean, WB_IsMethodCompiled(JNIEnv* env, jobject o, jobject method, jboolean is_osr))
218 jmethodID jmid = reflected_method_to_jmid(thread, env, method); 228 jmethodID jmid = reflected_method_to_jmid(thread, env, method);
219 MutexLockerEx mu(Compile_lock); 229 MutexLockerEx mu(Compile_lock);
220 methodHandle mh(THREAD, Method::checked_resolve_jmethod_id(jmid)); 230 methodHandle mh(THREAD, Method::checked_resolve_jmethod_id(jmid));
221 nmethod* code = mh->code(); 231 nmethod* code = is_osr ? mh->lookup_osr_nmethod_for(InvocationEntryBci, CompLevel_none, false) : mh->code();
222 if (code == NULL) { 232 if (code == NULL) {
223 return JNI_FALSE; 233 return JNI_FALSE;
224 } 234 }
225 return (code->is_alive() && !code->is_marked_for_deoptimization()); 235 return (code->is_alive() && !code->is_marked_for_deoptimization());
226 WB_END 236 WB_END
227 237
228 WB_ENTRY(jboolean, WB_IsMethodCompilable(JNIEnv* env, jobject o, jobject method, jint comp_level)) 238 WB_ENTRY(jboolean, WB_IsMethodCompilable(JNIEnv* env, jobject o, jobject method, jint comp_level, jboolean is_osr))
229 jmethodID jmid = reflected_method_to_jmid(thread, env, method); 239 jmethodID jmid = reflected_method_to_jmid(thread, env, method);
230 MutexLockerEx mu(Compile_lock); 240 MutexLockerEx mu(Compile_lock);
231 methodHandle mh(THREAD, Method::checked_resolve_jmethod_id(jmid)); 241 methodHandle mh(THREAD, Method::checked_resolve_jmethod_id(jmid));
232 return CompilationPolicy::can_be_compiled(mh, comp_level); 242 if (is_osr) {
243 return CompilationPolicy::can_be_osr_compiled(mh, comp_level);
244 } else {
245 return CompilationPolicy::can_be_compiled(mh, comp_level);
246 }
233 WB_END 247 WB_END
234 248
235 WB_ENTRY(jboolean, WB_IsMethodQueuedForCompilation(JNIEnv* env, jobject o, jobject method)) 249 WB_ENTRY(jboolean, WB_IsMethodQueuedForCompilation(JNIEnv* env, jobject o, jobject method))
236 jmethodID jmid = reflected_method_to_jmid(thread, env, method); 250 jmethodID jmid = reflected_method_to_jmid(thread, env, method);
237 MutexLockerEx mu(Compile_lock); 251 MutexLockerEx mu(Compile_lock);
238 methodHandle mh(THREAD, Method::checked_resolve_jmethod_id(jmid)); 252 methodHandle mh(THREAD, Method::checked_resolve_jmethod_id(jmid));
239 return mh->queued_for_compilation(); 253 return mh->queued_for_compilation();
240 WB_END 254 WB_END
241 255
242 WB_ENTRY(jint, WB_GetMethodCompilationLevel(JNIEnv* env, jobject o, jobject method)) 256 WB_ENTRY(jint, WB_GetMethodCompilationLevel(JNIEnv* env, jobject o, jobject method, jboolean is_osr))
243 jmethodID jmid = reflected_method_to_jmid(thread, env, method); 257 jmethodID jmid = reflected_method_to_jmid(thread, env, method);
244 methodHandle mh(THREAD, Method::checked_resolve_jmethod_id(jmid)); 258 methodHandle mh(THREAD, Method::checked_resolve_jmethod_id(jmid));
245 nmethod* code = mh->code(); 259 nmethod* code = is_osr ? mh->lookup_osr_nmethod_for(InvocationEntryBci, CompLevel_none, false) : mh->code();
246 return (code != NULL ? code->comp_level() : CompLevel_none); 260 return (code != NULL ? code->comp_level() : CompLevel_none);
247 WB_END 261 WB_END
248 262
249 263 WB_ENTRY(void, WB_MakeMethodNotCompilable(JNIEnv* env, jobject o, jobject method, jint comp_level, jboolean is_osr))
250 WB_ENTRY(void, WB_MakeMethodNotCompilable(JNIEnv* env, jobject o, jobject method, jint comp_level)) 264 jmethodID jmid = reflected_method_to_jmid(thread, env, method);
251 jmethodID jmid = reflected_method_to_jmid(thread, env, method); 265 methodHandle mh(THREAD, Method::checked_resolve_jmethod_id(jmid));
252 methodHandle mh(THREAD, Method::checked_resolve_jmethod_id(jmid)); 266 if (is_osr) {
253 mh->set_not_compilable(comp_level, true /* report */, "WhiteBox"); 267 mh->set_not_osr_compilable(comp_level, true /* report */, "WhiteBox");
268 } else {
269 mh->set_not_compilable(comp_level, true /* report */, "WhiteBox");
270 }
271 WB_END
272
273 WB_ENTRY(jint, WB_GetMethodEntryBci(JNIEnv* env, jobject o, jobject method))
274 jmethodID jmid = reflected_method_to_jmid(thread, env, method);
275 methodHandle mh(THREAD, Method::checked_resolve_jmethod_id(jmid));
276 nmethod* code = mh->lookup_osr_nmethod_for(InvocationEntryBci, CompLevel_none, false);
277 return (code != NULL && code->is_osr_method() ? code->osr_entry_bci() : InvocationEntryBci);
254 WB_END 278 WB_END
255 279
256 WB_ENTRY(jboolean, WB_TestSetDontInlineMethod(JNIEnv* env, jobject o, jobject method, jboolean value)) 280 WB_ENTRY(jboolean, WB_TestSetDontInlineMethod(JNIEnv* env, jobject o, jobject method, jboolean value))
257 jmethodID jmid = reflected_method_to_jmid(thread, env, method); 281 jmethodID jmid = reflected_method_to_jmid(thread, env, method);
258 methodHandle mh(THREAD, Method::checked_resolve_jmethod_id(jmid)); 282 methodHandle mh(THREAD, Method::checked_resolve_jmethod_id(jmid));
259 bool result = mh->dont_inline(); 283 bool result = mh->dont_inline();
260 mh->set_dont_inline(value == JNI_TRUE); 284 mh->set_dont_inline(value == JNI_TRUE);
261 return result; 285 return result;
262 WB_END 286 WB_END
263 287
264 WB_ENTRY(jint, WB_GetCompileQueuesSize(JNIEnv* env, jobject o)) 288 WB_ENTRY(jint, WB_GetCompileQueueSize(JNIEnv* env, jobject o, jint comp_level))
265 return CompileBroker::queue_size(CompLevel_full_optimization) /* C2 */ + 289 if (comp_level == CompLevel_any) {
266 CompileBroker::queue_size(CompLevel_full_profile) /* C1 */; 290 return CompileBroker::queue_size(CompLevel_full_optimization) /* C2 */ +
267 WB_END 291 CompileBroker::queue_size(CompLevel_full_profile) /* C1 */;
268 292 } else {
293 return CompileBroker::queue_size(comp_level);
294 }
295 WB_END
269 296
270 WB_ENTRY(jboolean, WB_TestSetForceInlineMethod(JNIEnv* env, jobject o, jobject method, jboolean value)) 297 WB_ENTRY(jboolean, WB_TestSetForceInlineMethod(JNIEnv* env, jobject o, jobject method, jboolean value))
271 jmethodID jmid = reflected_method_to_jmid(thread, env, method); 298 jmethodID jmid = reflected_method_to_jmid(thread, env, method);
272 methodHandle mh(THREAD, Method::checked_resolve_jmethod_id(jmid)); 299 methodHandle mh(THREAD, Method::checked_resolve_jmethod_id(jmid));
273 bool result = mh->force_inline(); 300 bool result = mh->force_inline();
274 mh->set_force_inline(value == JNI_TRUE); 301 mh->set_force_inline(value == JNI_TRUE);
275 return result; 302 return result;
276 WB_END 303 WB_END
277 304
278 WB_ENTRY(jboolean, WB_EnqueueMethodForCompilation(JNIEnv* env, jobject o, jobject method, jint comp_level)) 305 WB_ENTRY(jboolean, WB_EnqueueMethodForCompilation(JNIEnv* env, jobject o, jobject method, jint comp_level, jint bci))
279 jmethodID jmid = reflected_method_to_jmid(thread, env, method); 306 jmethodID jmid = reflected_method_to_jmid(thread, env, method);
280 methodHandle mh(THREAD, Method::checked_resolve_jmethod_id(jmid)); 307 methodHandle mh(THREAD, Method::checked_resolve_jmethod_id(jmid));
281 nmethod* nm = CompileBroker::compile_method(mh, InvocationEntryBci, comp_level, mh, mh->invocation_count(), "WhiteBox", THREAD); 308 nmethod* nm = CompileBroker::compile_method(mh, bci, comp_level, mh, mh->invocation_count(), "WhiteBox", THREAD);
282 MutexLockerEx mu(Compile_lock); 309 MutexLockerEx mu(Compile_lock);
283 return (mh->queued_for_compilation() || nm != NULL); 310 return (mh->queued_for_compilation() || nm != NULL);
284 WB_END 311 WB_END
285 312
286 WB_ENTRY(void, WB_ClearMethodState(JNIEnv* env, jobject o, jobject method)) 313 WB_ENTRY(void, WB_ClearMethodState(JNIEnv* env, jobject o, jobject method))
321 ResourceMark rm(THREAD); 348 ResourceMark rm(THREAD);
322 int len; 349 int len;
323 jchar* name = java_lang_String::as_unicode_string(JNIHandles::resolve(javaString), len, CHECK_false); 350 jchar* name = java_lang_String::as_unicode_string(JNIHandles::resolve(javaString), len, CHECK_false);
324 return (StringTable::lookup(name, len) != NULL); 351 return (StringTable::lookup(name, len) != NULL);
325 WB_END 352 WB_END
326
327 353
328 WB_ENTRY(void, WB_FullGC(JNIEnv* env, jobject o)) 354 WB_ENTRY(void, WB_FullGC(JNIEnv* env, jobject o))
329 Universe::heap()->collector_policy()->set_should_clear_all_soft_refs(true); 355 Universe::heap()->collector_policy()->set_should_clear_all_soft_refs(true);
330 Universe::heap()->collect(GCCause::_last_ditch_collection); 356 Universe::heap()->collect(GCCause::_last_ditch_collection);
331 WB_END 357 WB_END
421 {CC"NMTUncommitMemory", CC"(JJ)V", (void*)&WB_NMTUncommitMemory }, 447 {CC"NMTUncommitMemory", CC"(JJ)V", (void*)&WB_NMTUncommitMemory },
422 {CC"NMTReleaseMemory", CC"(JJ)V", (void*)&WB_NMTReleaseMemory }, 448 {CC"NMTReleaseMemory", CC"(JJ)V", (void*)&WB_NMTReleaseMemory },
423 {CC"NMTWaitForDataMerge", CC"()Z", (void*)&WB_NMTWaitForDataMerge}, 449 {CC"NMTWaitForDataMerge", CC"()Z", (void*)&WB_NMTWaitForDataMerge},
424 #endif // INCLUDE_NMT 450 #endif // INCLUDE_NMT
425 {CC"deoptimizeAll", CC"()V", (void*)&WB_DeoptimizeAll }, 451 {CC"deoptimizeAll", CC"()V", (void*)&WB_DeoptimizeAll },
426 {CC"deoptimizeMethod", CC"(Ljava/lang/reflect/Executable;)I", 452 {CC"deoptimizeMethod", CC"(Ljava/lang/reflect/Executable;Z)I",
427 (void*)&WB_DeoptimizeMethod }, 453 (void*)&WB_DeoptimizeMethod },
428 {CC"isMethodCompiled", CC"(Ljava/lang/reflect/Executable;)Z", 454 {CC"isMethodCompiled", CC"(Ljava/lang/reflect/Executable;Z)Z",
429 (void*)&WB_IsMethodCompiled }, 455 (void*)&WB_IsMethodCompiled },
430 {CC"isMethodCompilable", CC"(Ljava/lang/reflect/Executable;I)Z", 456 {CC"isMethodCompilable", CC"(Ljava/lang/reflect/Executable;IZ)Z",
431 (void*)&WB_IsMethodCompilable}, 457 (void*)&WB_IsMethodCompilable},
432 {CC"isMethodQueuedForCompilation", 458 {CC"isMethodQueuedForCompilation",
433 CC"(Ljava/lang/reflect/Executable;)Z", (void*)&WB_IsMethodQueuedForCompilation}, 459 CC"(Ljava/lang/reflect/Executable;)Z", (void*)&WB_IsMethodQueuedForCompilation},
434 {CC"makeMethodNotCompilable", 460 {CC"makeMethodNotCompilable",
435 CC"(Ljava/lang/reflect/Executable;I)V", (void*)&WB_MakeMethodNotCompilable}, 461 CC"(Ljava/lang/reflect/Executable;IZ)V", (void*)&WB_MakeMethodNotCompilable},
436 {CC"testSetDontInlineMethod", 462 {CC"testSetDontInlineMethod",
437 CC"(Ljava/lang/reflect/Executable;Z)Z", (void*)&WB_TestSetDontInlineMethod}, 463 CC"(Ljava/lang/reflect/Executable;Z)Z", (void*)&WB_TestSetDontInlineMethod},
438 {CC"getMethodCompilationLevel", 464 {CC"getMethodCompilationLevel",
439 CC"(Ljava/lang/reflect/Executable;)I", (void*)&WB_GetMethodCompilationLevel}, 465 CC"(Ljava/lang/reflect/Executable;Z)I", (void*)&WB_GetMethodCompilationLevel},
440 {CC"getCompileQueuesSize", 466 {CC"getMethodEntryBci",
441 CC"()I", (void*)&WB_GetCompileQueuesSize}, 467 CC"(Ljava/lang/reflect/Executable;)I", (void*)&WB_GetMethodEntryBci},
468 {CC"getCompileQueueSize",
469 CC"(I)I", (void*)&WB_GetCompileQueueSize},
442 {CC"testSetForceInlineMethod", 470 {CC"testSetForceInlineMethod",
443 CC"(Ljava/lang/reflect/Executable;Z)Z", (void*)&WB_TestSetForceInlineMethod}, 471 CC"(Ljava/lang/reflect/Executable;Z)Z", (void*)&WB_TestSetForceInlineMethod},
444 {CC"enqueueMethodForCompilation", 472 {CC"enqueueMethodForCompilation",
445 CC"(Ljava/lang/reflect/Executable;I)Z", (void*)&WB_EnqueueMethodForCompilation}, 473 CC"(Ljava/lang/reflect/Executable;II)Z", (void*)&WB_EnqueueMethodForCompilation},
446 {CC"clearMethodState", 474 {CC"clearMethodState",
447 CC"(Ljava/lang/reflect/Executable;)V", (void*)&WB_ClearMethodState}, 475 CC"(Ljava/lang/reflect/Executable;)V", (void*)&WB_ClearMethodState},
448 {CC"isInStringTable", CC"(Ljava/lang/String;)Z", (void*)&WB_IsInStringTable }, 476 {CC"isInStringTable", CC"(Ljava/lang/String;)Z", (void*)&WB_IsInStringTable },
449 {CC"fullGC", CC"()V", (void*)&WB_FullGC }, 477 {CC"fullGC", CC"()V", (void*)&WB_FullGC },
450
451 {CC"readReservedMemory", CC"()V", (void*)&WB_ReadReservedMemory }, 478 {CC"readReservedMemory", CC"()V", (void*)&WB_ReadReservedMemory },
452 }; 479 };
453 480
454 #undef CC 481 #undef CC
455 482