30 #include "classfile/modules.hpp" |
30 #include "classfile/modules.hpp" |
31 #include "classfile/protectionDomainCache.hpp" |
31 #include "classfile/protectionDomainCache.hpp" |
32 #include "classfile/stringTable.hpp" |
32 #include "classfile/stringTable.hpp" |
33 #include "classfile/symbolTable.hpp" |
33 #include "classfile/symbolTable.hpp" |
34 #include "code/codeCache.hpp" |
34 #include "code/codeCache.hpp" |
|
35 #include "compiler/compilationPolicy.hpp" |
35 #include "compiler/methodMatcher.hpp" |
36 #include "compiler/methodMatcher.hpp" |
36 #include "compiler/directivesParser.hpp" |
37 #include "compiler/directivesParser.hpp" |
37 #include "gc/shared/gcConfig.hpp" |
38 #include "gc/shared/gcConfig.hpp" |
38 #include "gc/shared/genArguments.hpp" |
39 #include "gc/shared/genArguments.hpp" |
39 #include "gc/shared/genCollectedHeap.hpp" |
40 #include "gc/shared/genCollectedHeap.hpp" |
56 #include "oops/typeArrayOop.inline.hpp" |
57 #include "oops/typeArrayOop.inline.hpp" |
57 #include "prims/resolvedMethodTable.hpp" |
58 #include "prims/resolvedMethodTable.hpp" |
58 #include "prims/wbtestmethods/parserTests.hpp" |
59 #include "prims/wbtestmethods/parserTests.hpp" |
59 #include "prims/whitebox.inline.hpp" |
60 #include "prims/whitebox.inline.hpp" |
60 #include "runtime/arguments.hpp" |
61 #include "runtime/arguments.hpp" |
61 #include "runtime/compilationPolicy.hpp" |
|
62 #include "runtime/deoptimization.hpp" |
62 #include "runtime/deoptimization.hpp" |
63 #include "runtime/fieldDescriptor.inline.hpp" |
63 #include "runtime/fieldDescriptor.inline.hpp" |
64 #include "runtime/flags/jvmFlag.hpp" |
64 #include "runtime/flags/jvmFlag.hpp" |
65 #include "runtime/frame.inline.hpp" |
65 #include "runtime/frame.inline.hpp" |
66 #include "runtime/handles.inline.hpp" |
66 #include "runtime/handles.inline.hpp" |
240 #ifndef PRODUCT |
240 #ifndef PRODUCT |
241 // Forward declaration |
241 // Forward declaration |
242 void TestReservedSpace_test(); |
242 void TestReservedSpace_test(); |
243 void TestReserveMemorySpecial_test(); |
243 void TestReserveMemorySpecial_test(); |
244 void TestVirtualSpace_test(); |
244 void TestVirtualSpace_test(); |
245 void TestMetaspaceUtils_test(); |
|
246 #endif |
245 #endif |
247 |
246 |
248 WB_ENTRY(void, WB_RunMemoryUnitTests(JNIEnv* env, jobject o)) |
247 WB_ENTRY(void, WB_RunMemoryUnitTests(JNIEnv* env, jobject o)) |
249 #ifndef PRODUCT |
248 #ifndef PRODUCT |
250 TestReservedSpace_test(); |
249 TestReservedSpace_test(); |
251 TestReserveMemorySpecial_test(); |
250 TestReserveMemorySpecial_test(); |
252 TestVirtualSpace_test(); |
251 TestVirtualSpace_test(); |
253 TestMetaspaceUtils_test(); |
|
254 #endif |
252 #endif |
255 WB_END |
253 WB_END |
256 |
254 |
257 WB_ENTRY(void, WB_ReadFromNoaccessArea(JNIEnv* env, jobject o)) |
255 WB_ENTRY(void, WB_ReadFromNoaccessArea(JNIEnv* env, jobject o)) |
258 size_t granularity = os::vm_allocation_granularity(); |
256 size_t granularity = os::vm_allocation_granularity(); |
516 G1CollectedHeap* g1h = G1CollectedHeap::heap(); |
514 G1CollectedHeap* g1h = G1CollectedHeap::heap(); |
517 if (g1h->is_heterogeneous_heap()) { |
515 if (g1h->is_heterogeneous_heap()) { |
518 uint end_region = HeterogeneousHeapRegionManager::manager()->end_index_of_dram(); |
516 uint end_region = HeterogeneousHeapRegionManager::manager()->end_index_of_dram(); |
519 return (jlong)(g1h->base() + (end_region + 1) * HeapRegion::GrainBytes - 1); |
517 return (jlong)(g1h->base() + (end_region + 1) * HeapRegion::GrainBytes - 1); |
520 } else { |
518 } else { |
521 return (jlong)g1h->base() + G1Arguments::heap_reserved_size_bytes(); |
519 return (jlong)g1h->base() + G1Arguments::heap_max_size_bytes(); |
522 } |
520 } |
523 } |
521 } |
524 #endif // INCLUDE_G1GC |
522 #endif // INCLUDE_G1GC |
525 #if INCLUDE_PARALLELGC |
523 #if INCLUDE_PARALLELGC |
526 if (UseParallelGC) { |
524 if (UseParallelGC) { |
917 WB_ENTRY(void, WB_MakeMethodNotCompilable(JNIEnv* env, jobject o, jobject method, jint comp_level, jboolean is_osr)) |
915 WB_ENTRY(void, WB_MakeMethodNotCompilable(JNIEnv* env, jobject o, jobject method, jint comp_level, jboolean is_osr)) |
918 jmethodID jmid = reflected_method_to_jmid(thread, env, method); |
916 jmethodID jmid = reflected_method_to_jmid(thread, env, method); |
919 CHECK_JNI_EXCEPTION(env); |
917 CHECK_JNI_EXCEPTION(env); |
920 methodHandle mh(THREAD, Method::checked_resolve_jmethod_id(jmid)); |
918 methodHandle mh(THREAD, Method::checked_resolve_jmethod_id(jmid)); |
921 if (is_osr) { |
919 if (is_osr) { |
922 mh->set_not_osr_compilable(comp_level, true /* report */, "WhiteBox"); |
920 mh->set_not_osr_compilable("WhiteBox", comp_level); |
923 } else { |
921 } else { |
924 mh->set_not_compilable(comp_level, true /* report */, "WhiteBox"); |
922 mh->set_not_compilable("WhiteBox", comp_level); |
925 } |
923 } |
926 WB_END |
924 WB_END |
927 |
925 |
928 WB_ENTRY(jint, WB_GetMethodEntryBci(JNIEnv* env, jobject o, jobject method)) |
926 WB_ENTRY(jint, WB_GetMethodEntryBci(JNIEnv* env, jobject o, jobject method)) |
929 jmethodID jmid = reflected_method_to_jmid(thread, env, method); |
927 jmethodID jmid = reflected_method_to_jmid(thread, env, method); |
1134 #endif |
1132 #endif |
1135 } |
1133 } |
1136 WB_END |
1134 WB_END |
1137 |
1135 |
1138 template <typename T> |
1136 template <typename T> |
1139 static bool GetVMFlag(JavaThread* thread, JNIEnv* env, jstring name, T* value, JVMFlag::Error (*TAt)(const char*, T*, bool, bool)) { |
1137 static bool GetVMFlag(JavaThread* thread, JNIEnv* env, jstring name, T* value, JVMFlag::Error (*TAt)(const JVMFlag*, T*)) { |
1140 if (name == NULL) { |
1138 if (name == NULL) { |
1141 return false; |
1139 return false; |
1142 } |
1140 } |
1143 ThreadToNativeFromVM ttnfv(thread); // can't be in VM when we call JNI |
1141 ThreadToNativeFromVM ttnfv(thread); // can't be in VM when we call JNI |
1144 const char* flag_name = env->GetStringUTFChars(name, NULL); |
1142 const char* flag_name = env->GetStringUTFChars(name, NULL); |
1145 CHECK_JNI_EXCEPTION_(env, false); |
1143 CHECK_JNI_EXCEPTION_(env, false); |
1146 JVMFlag::Error result = (*TAt)(flag_name, value, true, true); |
1144 const JVMFlag* flag = JVMFlag::find_declared_flag(flag_name); |
|
1145 JVMFlag::Error result = (*TAt)(flag, value); |
1147 env->ReleaseStringUTFChars(name, flag_name); |
1146 env->ReleaseStringUTFChars(name, flag_name); |
1148 return (result == JVMFlag::SUCCESS); |
1147 return (result == JVMFlag::SUCCESS); |
1149 } |
1148 } |
1150 |
1149 |
1151 template <typename T> |
1150 template <typename T> |
1152 static bool SetVMFlag(JavaThread* thread, JNIEnv* env, jstring name, T* value, JVMFlag::Error (*TAtPut)(const char*, T*, JVMFlag::Flags)) { |
1151 static bool SetVMFlag(JavaThread* thread, JNIEnv* env, jstring name, T* value, JVMFlag::Error (*TAtPut)(JVMFlag* flag, T*, JVMFlag::Flags)) { |
1153 if (name == NULL) { |
1152 if (name == NULL) { |
1154 return false; |
1153 return false; |
1155 } |
1154 } |
1156 ThreadToNativeFromVM ttnfv(thread); // can't be in VM when we call JNI |
1155 ThreadToNativeFromVM ttnfv(thread); // can't be in VM when we call JNI |
1157 const char* flag_name = env->GetStringUTFChars(name, NULL); |
1156 const char* flag_name = env->GetStringUTFChars(name, NULL); |
1158 CHECK_JNI_EXCEPTION_(env, false); |
1157 CHECK_JNI_EXCEPTION_(env, false); |
1159 JVMFlag::Error result = (*TAtPut)(flag_name, value, JVMFlag::INTERNAL); |
1158 JVMFlag* flag = JVMFlag::find_flag(flag_name); |
|
1159 JVMFlag::Error result = (*TAtPut)(flag, value, JVMFlag::INTERNAL); |
1160 env->ReleaseStringUTFChars(name, flag_name); |
1160 env->ReleaseStringUTFChars(name, flag_name); |
1161 return (result == JVMFlag::SUCCESS); |
1161 return (result == JVMFlag::SUCCESS); |
1162 } |
1162 } |
1163 |
1163 |
1164 template <typename T> |
1164 template <typename T> |
1189 }*/ |
1189 }*/ |
1190 static jobject doubleBox(JavaThread* thread, JNIEnv* env, jdouble value) { |
1190 static jobject doubleBox(JavaThread* thread, JNIEnv* env, jdouble value) { |
1191 return box(thread, env, vmSymbols::java_lang_Double(), vmSymbols::Double_valueOf_signature(), value); |
1191 return box(thread, env, vmSymbols::java_lang_Double(), vmSymbols::Double_valueOf_signature(), value); |
1192 } |
1192 } |
1193 |
1193 |
1194 static JVMFlag* getVMFlag(JavaThread* thread, JNIEnv* env, jstring name) { |
1194 static const JVMFlag* getVMFlag(JavaThread* thread, JNIEnv* env, jstring name) { |
1195 ThreadToNativeFromVM ttnfv(thread); // can't be in VM when we call JNI |
1195 ThreadToNativeFromVM ttnfv(thread); // can't be in VM when we call JNI |
1196 const char* flag_name = env->GetStringUTFChars(name, NULL); |
1196 const char* flag_name = env->GetStringUTFChars(name, NULL); |
1197 CHECK_JNI_EXCEPTION_(env, NULL); |
1197 CHECK_JNI_EXCEPTION_(env, NULL); |
1198 JVMFlag* result = JVMFlag::find_flag(flag_name, strlen(flag_name), true, true); |
1198 const JVMFlag* result = JVMFlag::find_declared_flag(flag_name); |
1199 env->ReleaseStringUTFChars(name, flag_name); |
1199 env->ReleaseStringUTFChars(name, flag_name); |
1200 return result; |
1200 return result; |
1201 } |
1201 } |
1202 |
1202 |
1203 WB_ENTRY(jboolean, WB_IsConstantVMFlag(JNIEnv* env, jobject o, jstring name)) |
1203 WB_ENTRY(jboolean, WB_IsConstantVMFlag(JNIEnv* env, jobject o, jstring name)) |
1204 JVMFlag* flag = getVMFlag(thread, env, name); |
1204 const JVMFlag* flag = getVMFlag(thread, env, name); |
1205 return (flag != NULL) && flag->is_constant_in_binary(); |
1205 return (flag != NULL) && flag->is_constant_in_binary(); |
1206 WB_END |
1206 WB_END |
1207 |
1207 |
1208 WB_ENTRY(jboolean, WB_IsLockedVMFlag(JNIEnv* env, jobject o, jstring name)) |
1208 WB_ENTRY(jboolean, WB_IsLockedVMFlag(JNIEnv* env, jobject o, jstring name)) |
1209 JVMFlag* flag = getVMFlag(thread, env, name); |
1209 const JVMFlag* flag = getVMFlag(thread, env, name); |
1210 return (flag != NULL) && !(flag->is_unlocked() || flag->is_unlocker()); |
1210 return (flag != NULL) && !(flag->is_unlocked() || flag->is_unlocker()); |
1211 WB_END |
1211 WB_END |
1212 |
1212 |
1213 WB_ENTRY(jobject, WB_GetBooleanVMFlag(JNIEnv* env, jobject o, jstring name)) |
1213 WB_ENTRY(jobject, WB_GetBooleanVMFlag(JNIEnv* env, jobject o, jstring name)) |
1214 bool result; |
1214 bool result; |
1733 WB_ENTRY(jlong, WB_MetaspaceReserveAlignment(JNIEnv* env, jobject wb)) |
1733 WB_ENTRY(jlong, WB_MetaspaceReserveAlignment(JNIEnv* env, jobject wb)) |
1734 return (jlong)Metaspace::reserve_alignment(); |
1734 return (jlong)Metaspace::reserve_alignment(); |
1735 WB_END |
1735 WB_END |
1736 |
1736 |
1737 WB_ENTRY(void, WB_AssertMatchingSafepointCalls(JNIEnv* env, jobject o, jboolean mutexSafepointValue, jboolean attemptedNoSafepointValue)) |
1737 WB_ENTRY(void, WB_AssertMatchingSafepointCalls(JNIEnv* env, jobject o, jboolean mutexSafepointValue, jboolean attemptedNoSafepointValue)) |
1738 Monitor::SafepointCheckRequired sfpt_check_required = mutexSafepointValue ? |
1738 Mutex::SafepointCheckRequired sfpt_check_required = mutexSafepointValue ? |
1739 Monitor::_safepoint_check_always : |
1739 Mutex::_safepoint_check_always : |
1740 Monitor::_safepoint_check_never; |
1740 Mutex::_safepoint_check_never; |
1741 Monitor::SafepointCheckFlag sfpt_check_attempted = attemptedNoSafepointValue ? |
1741 Mutex::SafepointCheckFlag sfpt_check_attempted = attemptedNoSafepointValue ? |
1742 Monitor::_no_safepoint_check_flag : |
1742 Mutex::_no_safepoint_check_flag : |
1743 Monitor::_safepoint_check_flag; |
1743 Mutex::_safepoint_check_flag; |
1744 MutexLocker ml(new Mutex(Mutex::leaf, "SFPT_Test_lock", true, sfpt_check_required), |
1744 MutexLocker ml(new Mutex(Mutex::leaf, "SFPT_Test_lock", true, sfpt_check_required), |
1745 sfpt_check_attempted); |
1745 sfpt_check_attempted); |
1746 WB_END |
1746 WB_END |
1747 |
1747 |
|
1748 WB_ENTRY(void, WB_AssertSpecialLock(JNIEnv* env, jobject o, jboolean allowVMBlock, jboolean safepointCheck)) |
|
1749 // Create a special lock violating condition in value |
|
1750 Mutex::SafepointCheckRequired sfpt_check_required = safepointCheck ? |
|
1751 Mutex::_safepoint_check_always : |
|
1752 Mutex::_safepoint_check_never; |
|
1753 Mutex::SafepointCheckFlag safepoint_check = safepointCheck ? |
|
1754 Monitor::_safepoint_check_flag : |
|
1755 Monitor::_no_safepoint_check_flag; |
|
1756 |
|
1757 MutexLocker ml(new Mutex(Mutex::special, "SpecialTest_lock", allowVMBlock, sfpt_check_required), safepoint_check); |
|
1758 // If the lock above succeeds, try to safepoint to test the NSV implied with this special lock. |
|
1759 ThreadBlockInVM tbivm(JavaThread::current()); |
|
1760 WB_END |
|
1761 |
1748 WB_ENTRY(jboolean, WB_IsMonitorInflated(JNIEnv* env, jobject wb, jobject obj)) |
1762 WB_ENTRY(jboolean, WB_IsMonitorInflated(JNIEnv* env, jobject wb, jobject obj)) |
1749 oop obj_oop = JNIHandles::resolve(obj); |
1763 oop obj_oop = JNIHandles::resolve(obj); |
1750 return (jboolean) obj_oop->mark()->has_monitor(); |
1764 return (jboolean) obj_oop->mark().has_monitor(); |
1751 WB_END |
1765 WB_END |
1752 |
1766 |
1753 WB_ENTRY(void, WB_ForceSafepoint(JNIEnv* env, jobject wb)) |
1767 WB_ENTRY(void, WB_ForceSafepoint(JNIEnv* env, jobject wb)) |
1754 VM_ForceSafepoint force_safepoint_op; |
1768 VM_ForceSafepoint force_safepoint_op; |
1755 VMThread::execute(&force_safepoint_op); |
1769 VMThread::execute(&force_safepoint_op); |
2320 {CC"AddModuleExportsToAllUnnamed", CC"(Ljava/lang/Object;Ljava/lang/String;)V", |
2334 {CC"AddModuleExportsToAllUnnamed", CC"(Ljava/lang/Object;Ljava/lang/String;)V", |
2321 (void*)&WB_AddModuleExportsToAllUnnamed }, |
2335 (void*)&WB_AddModuleExportsToAllUnnamed }, |
2322 {CC"AddModuleExportsToAll", CC"(Ljava/lang/Object;Ljava/lang/String;)V", |
2336 {CC"AddModuleExportsToAll", CC"(Ljava/lang/Object;Ljava/lang/String;)V", |
2323 (void*)&WB_AddModuleExportsToAll }, |
2337 (void*)&WB_AddModuleExportsToAll }, |
2324 {CC"assertMatchingSafepointCalls", CC"(ZZ)V", (void*)&WB_AssertMatchingSafepointCalls }, |
2338 {CC"assertMatchingSafepointCalls", CC"(ZZ)V", (void*)&WB_AssertMatchingSafepointCalls }, |
|
2339 {CC"assertSpecialLock", CC"(ZZ)V", (void*)&WB_AssertSpecialLock }, |
2325 {CC"isMonitorInflated0", CC"(Ljava/lang/Object;)Z", (void*)&WB_IsMonitorInflated }, |
2340 {CC"isMonitorInflated0", CC"(Ljava/lang/Object;)Z", (void*)&WB_IsMonitorInflated }, |
2326 {CC"forceSafepoint", CC"()V", (void*)&WB_ForceSafepoint }, |
2341 {CC"forceSafepoint", CC"()V", (void*)&WB_ForceSafepoint }, |
2327 {CC"getConstantPool0", CC"(Ljava/lang/Class;)J", (void*)&WB_GetConstantPool }, |
2342 {CC"getConstantPool0", CC"(Ljava/lang/Class;)J", (void*)&WB_GetConstantPool }, |
2328 {CC"getConstantPoolCacheIndexTag0", CC"()I", (void*)&WB_GetConstantPoolCacheIndexTag}, |
2343 {CC"getConstantPoolCacheIndexTag0", CC"()I", (void*)&WB_GetConstantPoolCacheIndexTag}, |
2329 {CC"getConstantPoolCacheLength0", CC"(Ljava/lang/Class;)I", (void*)&WB_GetConstantPoolCacheLength}, |
2344 {CC"getConstantPoolCacheLength0", CC"(Ljava/lang/Class;)I", (void*)&WB_GetConstantPoolCacheLength}, |