src/hotspot/share/prims/whitebox.cpp
branchdatagramsocketimpl-branch
changeset 58678 9cf78a70fa4f
parent 55005 9b70ebd131b4
child 58679 9c3209ff7550
equal deleted inserted replaced
58677:13588c901957 58678:9cf78a70fa4f
    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},