comparison src/share/vm/prims/whitebox.cpp @ 17810:62c54fcc0a35

Merge
author kvn
date Tue, 25 Mar 2014 17:07:36 -0700
parents a48e16541e6b
children 4abb719c5620
comparison
equal deleted inserted replaced
17809:a433eb716ce1 17810:62c54fcc0a35
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
485 if (p == NULL) { 496 if (p == NULL) {
486 THROW_MSG(vmSymbols::java_lang_OutOfMemoryError(), "Failed to reserve memory"); 497 THROW_MSG(vmSymbols::java_lang_OutOfMemoryError(), "Failed to reserve memory");
487 } 498 }
488 499
489 c = *p; 500 c = *p;
501 WB_END
502
503 WB_ENTRY(jstring, WB_GetCPUFeatures(JNIEnv* env, jobject o))
504 const char* cpu_features = VM_Version::cpu_features();
505 ThreadToNativeFromVM ttn(thread);
506 jstring features_string = env->NewStringUTF(cpu_features);
507
508 CHECK_JNI_EXCEPTION_(env, NULL);
509
510 return features_string;
490 WB_END 511 WB_END
491 512
492 //Some convenience methods to deal with objects from java 513 //Some convenience methods to deal with objects from java
493 int WhiteBox::offset_for_field(const char* field_name, oop object, 514 int WhiteBox::offset_for_field(const char* field_name, oop object,
494 Symbol* signature_symbol) { 515 Symbol* signature_symbol) {
598 {CC"clearMethodState", 619 {CC"clearMethodState",
599 CC"(Ljava/lang/reflect/Executable;)V", (void*)&WB_ClearMethodState}, 620 CC"(Ljava/lang/reflect/Executable;)V", (void*)&WB_ClearMethodState},
600 {CC"isInStringTable", CC"(Ljava/lang/String;)Z", (void*)&WB_IsInStringTable }, 621 {CC"isInStringTable", CC"(Ljava/lang/String;)Z", (void*)&WB_IsInStringTable },
601 {CC"fullGC", CC"()V", (void*)&WB_FullGC }, 622 {CC"fullGC", CC"()V", (void*)&WB_FullGC },
602 {CC"readReservedMemory", CC"()V", (void*)&WB_ReadReservedMemory }, 623 {CC"readReservedMemory", CC"()V", (void*)&WB_ReadReservedMemory },
624 {CC"getCPUFeatures", CC"()Ljava/lang/String;", (void*)&WB_GetCPUFeatures },
603 }; 625 };
604 626
605 #undef CC 627 #undef CC
606 628
607 JVM_ENTRY(void, JVM_RegisterWhiteBoxMethods(JNIEnv* env, jclass wbclass)) 629 JVM_ENTRY(void, JVM_RegisterWhiteBoxMethods(JNIEnv* env, jclass wbclass))
614 ResourceMark rm; 636 ResourceMark rm;
615 ThreadToNativeFromVM ttnfv(thread); // can't be in VM when we call JNI 637 ThreadToNativeFromVM ttnfv(thread); // can't be in VM when we call JNI
616 bool result = true; 638 bool result = true;
617 // one by one registration natives for exception catching 639 // one by one registration natives for exception catching
618 jclass exceptionKlass = env->FindClass(vmSymbols::java_lang_NoSuchMethodError()->as_C_string()); 640 jclass exceptionKlass = env->FindClass(vmSymbols::java_lang_NoSuchMethodError()->as_C_string());
641 CHECK_JNI_EXCEPTION(env);
619 for (int i = 0, n = sizeof(methods) / sizeof(methods[0]); i < n; ++i) { 642 for (int i = 0, n = sizeof(methods) / sizeof(methods[0]); i < n; ++i) {
620 if (env->RegisterNatives(wbclass, methods + i, 1) != 0) { 643 if (env->RegisterNatives(wbclass, methods + i, 1) != 0) {
621 result = false; 644 result = false;
622 if (env->ExceptionCheck() && env->IsInstanceOf(env->ExceptionOccurred(), exceptionKlass)) { 645 jthrowable throwable_obj = env->ExceptionOccurred();
623 // j.l.NoSuchMethodError is thrown when a method can't be found or a method is not native 646 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(); 647 env->ExceptionClear();
648 if (env->IsInstanceOf(throwable_obj, exceptionKlass)) {
649 // j.l.NoSuchMethodError is thrown when a method can't be found or a method is not native
650 // ignoring the exception
651 tty->print_cr("Warning: 'NoSuchMethodError' on register of sun.hotspot.WhiteBox::%s%s", methods[i].name, methods[i].signature);
652 }
627 } else { 653 } else {
628 // register is failed w/o exception or w/ unexpected exception 654 // 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); 655 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); 656 env->UnregisterNatives(wbclass);
631 break; 657 break;