Mercurial > hg > truffle
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 |