comparison src/share/vm/prims/whitebox.cpp @ 9080:b84fd7d73702

8007288: Additional WB API for compiler's testing Reviewed-by: kvn, vlivanov
author iignatyev
date Tue, 09 Apr 2013 09:54:17 -0700
parents ede380e13960
children 7a5aec879506
comparison
equal deleted inserted replaced
9079:f67065f02409 9080:b84fd7d73702
47 #ifdef INCLUDE_NMT 47 #ifdef INCLUDE_NMT
48 #include "services/memTracker.hpp" 48 #include "services/memTracker.hpp"
49 #endif // INCLUDE_NMT 49 #endif // INCLUDE_NMT
50 50
51 #include "compiler/compileBroker.hpp" 51 #include "compiler/compileBroker.hpp"
52 #include "runtime/compilationPolicy.hpp"
52 53
53 bool WhiteBox::_used = false; 54 bool WhiteBox::_used = false;
54 55
55 WB_ENTRY(jlong, WB_GetObjectAddress(JNIEnv* env, jobject o, jobject obj)) 56 WB_ENTRY(jlong, WB_GetObjectAddress(JNIEnv* env, jobject o, jobject obj))
56 return (jlong)(void*)JNIHandles::resolve(obj); 57 return (jlong)(void*)JNIHandles::resolve(obj);
211 return JNI_FALSE; 212 return JNI_FALSE;
212 } 213 }
213 return (code->is_alive() && !code->is_marked_for_deoptimization()); 214 return (code->is_alive() && !code->is_marked_for_deoptimization());
214 WB_END 215 WB_END
215 216
216 WB_ENTRY(jboolean, WB_IsMethodCompilable(JNIEnv* env, jobject o, jobject method)) 217 WB_ENTRY(jboolean, WB_IsMethodCompilable(JNIEnv* env, jobject o, jobject method, jint comp_level))
217 jmethodID jmid = reflected_method_to_jmid(thread, env, method); 218 jmethodID jmid = reflected_method_to_jmid(thread, env, method);
218 MutexLockerEx mu(Compile_lock); 219 MutexLockerEx mu(Compile_lock);
219 methodHandle mh(THREAD, Method::checked_resolve_jmethod_id(jmid)); 220 methodHandle mh(THREAD, Method::checked_resolve_jmethod_id(jmid));
220 return !mh->is_not_compilable(); 221 return CompilationPolicy::can_be_compiled(mh, comp_level);
221 WB_END 222 WB_END
222 223
223 WB_ENTRY(jboolean, WB_IsMethodQueuedForCompilation(JNIEnv* env, jobject o, jobject method)) 224 WB_ENTRY(jboolean, WB_IsMethodQueuedForCompilation(JNIEnv* env, jobject o, jobject method))
224 jmethodID jmid = reflected_method_to_jmid(thread, env, method); 225 jmethodID jmid = reflected_method_to_jmid(thread, env, method);
225 MutexLockerEx mu(Compile_lock); 226 MutexLockerEx mu(Compile_lock);
239 jmethodID jmid = reflected_method_to_jmid(thread, env, method); 240 jmethodID jmid = reflected_method_to_jmid(thread, env, method);
240 methodHandle mh(THREAD, Method::checked_resolve_jmethod_id(jmid)); 241 methodHandle mh(THREAD, Method::checked_resolve_jmethod_id(jmid));
241 mh->set_not_compilable(); 242 mh->set_not_compilable();
242 WB_END 243 WB_END
243 244
244 WB_ENTRY(jboolean, WB_SetDontInlineMethod(JNIEnv* env, jobject o, jobject method, jboolean value)) 245 WB_ENTRY(jboolean, WB_TestSetDontInlineMethod(JNIEnv* env, jobject o, jobject method, jboolean value))
245 jmethodID jmid = reflected_method_to_jmid(thread, env, method); 246 jmethodID jmid = reflected_method_to_jmid(thread, env, method);
246 methodHandle mh(THREAD, Method::checked_resolve_jmethod_id(jmid)); 247 methodHandle mh(THREAD, Method::checked_resolve_jmethod_id(jmid));
247 bool result = mh->dont_inline(); 248 bool result = mh->dont_inline();
248 mh->set_dont_inline(value == JNI_TRUE); 249 mh->set_dont_inline(value == JNI_TRUE);
249 return result; 250 return result;
250 WB_END 251 WB_END
251 252
252 WB_ENTRY(jint, WB_GetCompileQueuesSize(JNIEnv* env, jobject o)) 253 WB_ENTRY(jint, WB_GetCompileQueuesSize(JNIEnv* env, jobject o))
253 return CompileBroker::queue_size(CompLevel_full_optimization) /* C2 */ + 254 return CompileBroker::queue_size(CompLevel_full_optimization) /* C2 */ +
254 CompileBroker::queue_size(CompLevel_full_profile) /* C1 */; 255 CompileBroker::queue_size(CompLevel_full_profile) /* C1 */;
256 WB_END
257
258
259 WB_ENTRY(jboolean, WB_TestSetForceInlineMethod(JNIEnv* env, jobject o, jobject method, jboolean value))
260 jmethodID jmid = reflected_method_to_jmid(thread, env, method);
261 methodHandle mh(THREAD, Method::checked_resolve_jmethod_id(jmid));
262 bool result = mh->force_inline();
263 mh->set_force_inline(value == JNI_TRUE);
264 return result;
265 WB_END
266
267 WB_ENTRY(jboolean, WB_EnqueueMethodForCompilation(JNIEnv* env, jobject o, jobject method, jint comp_level))
268 jmethodID jmid = reflected_method_to_jmid(thread, env, method);
269 methodHandle mh(THREAD, Method::checked_resolve_jmethod_id(jmid));
270 nmethod* nm = CompileBroker::compile_method(mh, InvocationEntryBci, comp_level, mh, mh->invocation_count(), "WhiteBox", THREAD);
271 MutexLockerEx mu(Compile_lock);
272 return (mh->queued_for_compilation() || nm != NULL);
273 WB_END
274
275 WB_ENTRY(void, WB_ClearMethodState(JNIEnv* env, jobject o, jobject method))
276 jmethodID jmid = reflected_method_to_jmid(thread, env, method);
277 methodHandle mh(THREAD, Method::checked_resolve_jmethod_id(jmid));
278 MutexLockerEx mu(Compile_lock);
279 MethodData* mdo = mh->method_data();
280
281 if (mdo != NULL) {
282 mdo->init();
283 ResourceMark rm;
284 int arg_count = mdo->method()->size_of_parameters();
285 for (int i = 0; i < arg_count; i++) {
286 mdo->set_arg_modified(i, 0);
287 }
288 }
289
290 mh->backedge_counter()->init();
291 mh->invocation_counter()->init();
292 mh->set_interpreter_invocation_count(0);
293 mh->set_interpreter_throwout_count(0);
294 mh->clear_not_c1_compilable();
295 mh->clear_not_c2_compilable();
296 mh->clear_not_c2_osr_compilable();
297 NOT_PRODUCT(mh->set_compiled_invocation_count(0));
298
299 #ifdef TIERED
300 mh->set_rate(0.0F);
301 mh->set_prev_event_count(0);
302 mh->set_prev_time(0);
303 #endif
255 WB_END 304 WB_END
256 305
257 WB_ENTRY(jboolean, WB_IsInStringTable(JNIEnv* env, jobject o, jstring javaString)) 306 WB_ENTRY(jboolean, WB_IsInStringTable(JNIEnv* env, jobject o, jstring javaString))
258 ResourceMark rm(THREAD); 307 ResourceMark rm(THREAD);
259 int len; 308 int len;
268 317
269 WB_ENTRY(void, WB_FullGC(JNIEnv* env, jobject o)) 318 WB_ENTRY(void, WB_FullGC(JNIEnv* env, jobject o))
270 Universe::heap()->collector_policy()->set_should_clear_all_soft_refs(true); 319 Universe::heap()->collector_policy()->set_should_clear_all_soft_refs(true);
271 Universe::heap()->collect(GCCause::_last_ditch_collection); 320 Universe::heap()->collect(GCCause::_last_ditch_collection);
272 WB_END 321 WB_END
273
274 322
275 //Some convenience methods to deal with objects from java 323 //Some convenience methods to deal with objects from java
276 int WhiteBox::offset_for_field(const char* field_name, oop object, 324 int WhiteBox::offset_for_field(const char* field_name, oop object,
277 Symbol* signature_symbol) { 325 Symbol* signature_symbol) {
278 assert(field_name != NULL && strlen(field_name) > 0, "Field name not valid"); 326 assert(field_name != NULL && strlen(field_name) > 0, "Field name not valid");
347 {CC"deoptimizeAll", CC"()V", (void*)&WB_DeoptimizeAll }, 395 {CC"deoptimizeAll", CC"()V", (void*)&WB_DeoptimizeAll },
348 {CC"deoptimizeMethod", CC"(Ljava/lang/reflect/Method;)I", 396 {CC"deoptimizeMethod", CC"(Ljava/lang/reflect/Method;)I",
349 (void*)&WB_DeoptimizeMethod }, 397 (void*)&WB_DeoptimizeMethod },
350 {CC"isMethodCompiled", CC"(Ljava/lang/reflect/Method;)Z", 398 {CC"isMethodCompiled", CC"(Ljava/lang/reflect/Method;)Z",
351 (void*)&WB_IsMethodCompiled }, 399 (void*)&WB_IsMethodCompiled },
352 {CC"isMethodCompilable", CC"(Ljava/lang/reflect/Method;)Z", 400 {CC"isMethodCompilable", CC"(Ljava/lang/reflect/Method;I)Z",
353 (void*)&WB_IsMethodCompilable}, 401 (void*)&WB_IsMethodCompilable},
354 {CC"isMethodQueuedForCompilation", 402 {CC"isMethodQueuedForCompilation",
355 CC"(Ljava/lang/reflect/Method;)Z", (void*)&WB_IsMethodQueuedForCompilation}, 403 CC"(Ljava/lang/reflect/Method;)Z", (void*)&WB_IsMethodQueuedForCompilation},
356 {CC"makeMethodNotCompilable", 404 {CC"makeMethodNotCompilable",
357 CC"(Ljava/lang/reflect/Method;)V", (void*)&WB_MakeMethodNotCompilable}, 405 CC"(Ljava/lang/reflect/Method;)V", (void*)&WB_MakeMethodNotCompilable},
358 {CC"setDontInlineMethod", 406 {CC"testSetDontInlineMethod",
359 CC"(Ljava/lang/reflect/Method;Z)Z", (void*)&WB_SetDontInlineMethod}, 407 CC"(Ljava/lang/reflect/Method;Z)Z", (void*)&WB_TestSetDontInlineMethod},
360 {CC"getMethodCompilationLevel", 408 {CC"getMethodCompilationLevel",
361 CC"(Ljava/lang/reflect/Method;)I", (void*)&WB_GetMethodCompilationLevel}, 409 CC"(Ljava/lang/reflect/Method;)I", (void*)&WB_GetMethodCompilationLevel},
362 {CC"getCompileQueuesSize", 410 {CC"getCompileQueuesSize",
363 CC"()I", (void*)&WB_GetCompileQueuesSize}, 411 CC"()I", (void*)&WB_GetCompileQueuesSize},
412 {CC"testSetForceInlineMethod",
413 CC"(Ljava/lang/reflect/Method;Z)Z", (void*)&WB_TestSetForceInlineMethod},
414 {CC"enqueueMethodForCompilation",
415 CC"(Ljava/lang/reflect/Method;I)Z", (void*)&WB_EnqueueMethodForCompilation},
416 {CC"clearMethodState",
417 CC"(Ljava/lang/reflect/Method;)V", (void*)&WB_ClearMethodState},
364 {CC"isInStringTable", CC"(Ljava/lang/String;)Z", (void*)&WB_IsInStringTable }, 418 {CC"isInStringTable", CC"(Ljava/lang/String;)Z", (void*)&WB_IsInStringTable },
365 {CC"fullGC", CC"()V", (void*)&WB_FullGC }, 419 {CC"fullGC", CC"()V", (void*)&WB_FullGC },
366 }; 420 };
367 421
368 #undef CC 422 #undef CC