7 * published by the Free Software Foundation.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 *
23 */
24
25 #include "precompiled.hpp"
26
27 #include "memory/universe.hpp"
28 #include "oops/oop.inline.hpp"
29
30 #include "classfile/stringTable.hpp"
31 #include "classfile/classLoaderData.hpp"
32
33 #include "prims/whitebox.hpp"
34 #include "prims/wbtestmethods/parserTests.hpp"
35
36 #include "runtime/thread.hpp"
37 #include "runtime/arguments.hpp"
38 #include "runtime/interfaceSupport.hpp"
39 #include "runtime/os.hpp"
40
41 #include "utilities/debug.hpp"
42 #include "utilities/macros.hpp"
43 #include "utilities/exceptions.hpp"
44
45 #if INCLUDE_ALL_GCS
46 #include "gc_implementation/g1/concurrentMark.hpp"
47 #include "gc_implementation/g1/g1CollectedHeap.inline.hpp"
48 #include "gc_implementation/g1/heapRegionRemSet.hpp"
49 #endif // INCLUDE_ALL_GCS
50
51 #ifdef INCLUDE_NMT
52 #include "services/memTracker.hpp"
53 #endif // INCLUDE_NMT
54
55 #include "compiler/compileBroker.hpp"
56 #include "runtime/compilationPolicy.hpp"
57
58 PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC
59
60 #define SIZE_T_MAX_VALUE ((size_t) -1)
709 ThreadToNativeFromVM ttn(thread);
710 jclass clazz = env->FindClass(vmSymbols::java_lang_Object()->as_C_string());
711 CHECK_JNI_EXCEPTION_(env, NULL);
712 result = env->NewObjectArray(2, clazz, NULL);
713 if (result == NULL) {
714 return result;
715 }
716
717 jobject obj = integerBox(thread, env, code->comp_level());
718 CHECK_JNI_EXCEPTION_(env, NULL);
719 env->SetObjectArrayElement(result, 0, obj);
720
721 jbyteArray insts = env->NewByteArray(insts_size);
722 CHECK_JNI_EXCEPTION_(env, NULL);
723 env->SetByteArrayRegion(insts, 0, insts_size, (jbyte*) code->insts_begin());
724 env->SetObjectArrayElement(result, 1, insts);
725
726 return result;
727 WB_END
728
729
730 WB_ENTRY(jlong, WB_GetThreadStackSize(JNIEnv* env, jobject o))
731 return (jlong) Thread::current()->stack_size();
732 WB_END
733
734 WB_ENTRY(jlong, WB_GetThreadRemainingStackSize(JNIEnv* env, jobject o))
735 JavaThread* t = JavaThread::current();
736 return (jlong) t->stack_available(os::current_stack_pointer()) - (jlong) StackShadowPages * os::vm_page_size();
737 WB_END
738
739 //Some convenience methods to deal with objects from java
740 int WhiteBox::offset_for_field(const char* field_name, oop object,
741 Symbol* signature_symbol) {
742 assert(field_name != NULL && strlen(field_name) > 0, "Field name not valid");
743 Thread* THREAD = Thread::current();
744
745 //Get the class of our object
746 Klass* arg_klass = object->klass();
747 //Turn it into an instance-klass
748 InstanceKlass* ik = InstanceKlass::cast(arg_klass);
749
750 //Create symbols to look for in the class
751 TempNewSymbol name_symbol = SymbolTable::lookup(field_name, (int) strlen(field_name),
752 THREAD);
753
754 //To be filled in with an offset of the field we're looking for
755 fieldDescriptor fd;
756
757 Klass* res = ik->find_field(name_symbol, signature_symbol, &fd);
758 if (res == NULL) {
849 {CC"setUintxVMFlag", CC"(Ljava/lang/String;J)V",(void*)&WB_SetUintxVMFlag},
850 {CC"setUint64VMFlag", CC"(Ljava/lang/String;J)V",(void*)&WB_SetUint64VMFlag},
851 {CC"setDoubleVMFlag", CC"(Ljava/lang/String;D)V",(void*)&WB_SetDoubleVMFlag},
852 {CC"setStringVMFlag", CC"(Ljava/lang/String;Ljava/lang/String;)V",
853 (void*)&WB_SetStringVMFlag},
854 {CC"getBooleanVMFlag", CC"(Ljava/lang/String;)Ljava/lang/Boolean;",
855 (void*)&WB_GetBooleanVMFlag},
856 {CC"getIntxVMFlag", CC"(Ljava/lang/String;)Ljava/lang/Long;",
857 (void*)&WB_GetIntxVMFlag},
858 {CC"getUintxVMFlag", CC"(Ljava/lang/String;)Ljava/lang/Long;",
859 (void*)&WB_GetUintxVMFlag},
860 {CC"getUint64VMFlag", CC"(Ljava/lang/String;)Ljava/lang/Long;",
861 (void*)&WB_GetUint64VMFlag},
862 {CC"getDoubleVMFlag", CC"(Ljava/lang/String;)Ljava/lang/Double;",
863 (void*)&WB_GetDoubleVMFlag},
864 {CC"getStringVMFlag", CC"(Ljava/lang/String;)Ljava/lang/String;",
865 (void*)&WB_GetStringVMFlag},
866 {CC"isInStringTable", CC"(Ljava/lang/String;)Z", (void*)&WB_IsInStringTable },
867 {CC"fullGC", CC"()V", (void*)&WB_FullGC },
868 {CC"readReservedMemory", CC"()V", (void*)&WB_ReadReservedMemory },
869 {CC"getCPUFeatures", CC"()Ljava/lang/String;", (void*)&WB_GetCPUFeatures },
870 {CC"getNMethod", CC"(Ljava/lang/reflect/Executable;Z)[Ljava/lang/Object;",
871 (void*)&WB_GetNMethod },
872 {CC"getThreadStackSize", CC"()J", (void*)&WB_GetThreadStackSize },
873 {CC"getThreadRemainingStackSize", CC"()J", (void*)&WB_GetThreadRemainingStackSize },
874 };
875
876 #undef CC
877
878 JVM_ENTRY(void, JVM_RegisterWhiteBoxMethods(JNIEnv* env, jclass wbclass))
879 {
880 if (WhiteBoxAPI) {
881 // Make sure that wbclass is loaded by the null classloader
882 instanceKlassHandle ikh = instanceKlassHandle(JNIHandles::resolve(wbclass)->klass());
883 Handle loader(ikh->class_loader());
884 if (loader.is_null()) {
885 ResourceMark rm;
886 ThreadToNativeFromVM ttnfv(thread); // can't be in VM when we call JNI
887 bool result = true;
888 // one by one registration natives for exception catching
|
7 * published by the Free Software Foundation.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 *
23 */
24
25 #include "precompiled.hpp"
26
27 #include "memory/metadataFactory.hpp"
28 #include "memory/universe.hpp"
29 #include "oops/oop.inline.hpp"
30
31 #include "classfile/stringTable.hpp"
32 #include "classfile/classLoaderData.hpp"
33
34 #include "prims/whitebox.hpp"
35 #include "prims/wbtestmethods/parserTests.hpp"
36
37 #include "runtime/thread.hpp"
38 #include "runtime/arguments.hpp"
39 #include "runtime/interfaceSupport.hpp"
40 #include "runtime/os.hpp"
41
42 #include "utilities/array.hpp"
43 #include "utilities/debug.hpp"
44 #include "utilities/macros.hpp"
45 #include "utilities/exceptions.hpp"
46
47 #if INCLUDE_ALL_GCS
48 #include "gc_implementation/g1/concurrentMark.hpp"
49 #include "gc_implementation/g1/g1CollectedHeap.inline.hpp"
50 #include "gc_implementation/g1/heapRegionRemSet.hpp"
51 #endif // INCLUDE_ALL_GCS
52
53 #ifdef INCLUDE_NMT
54 #include "services/memTracker.hpp"
55 #endif // INCLUDE_NMT
56
57 #include "compiler/compileBroker.hpp"
58 #include "runtime/compilationPolicy.hpp"
59
60 PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC
61
62 #define SIZE_T_MAX_VALUE ((size_t) -1)
711 ThreadToNativeFromVM ttn(thread);
712 jclass clazz = env->FindClass(vmSymbols::java_lang_Object()->as_C_string());
713 CHECK_JNI_EXCEPTION_(env, NULL);
714 result = env->NewObjectArray(2, clazz, NULL);
715 if (result == NULL) {
716 return result;
717 }
718
719 jobject obj = integerBox(thread, env, code->comp_level());
720 CHECK_JNI_EXCEPTION_(env, NULL);
721 env->SetObjectArrayElement(result, 0, obj);
722
723 jbyteArray insts = env->NewByteArray(insts_size);
724 CHECK_JNI_EXCEPTION_(env, NULL);
725 env->SetByteArrayRegion(insts, 0, insts_size, (jbyte*) code->insts_begin());
726 env->SetObjectArrayElement(result, 1, insts);
727
728 return result;
729 WB_END
730
731 WB_ENTRY(jlong, WB_GetThreadStackSize(JNIEnv* env, jobject o))
732 return (jlong) Thread::current()->stack_size();
733 WB_END
734
735 WB_ENTRY(jlong, WB_GetThreadRemainingStackSize(JNIEnv* env, jobject o))
736 JavaThread* t = JavaThread::current();
737 return (jlong) t->stack_available(os::current_stack_pointer()) - (jlong) StackShadowPages * os::vm_page_size();
738 WB_END
739
740 int WhiteBox::array_bytes_to_length(size_t bytes) {
741 return Array<u1>::bytes_to_length(bytes);
742 }
743
744 WB_ENTRY(jlong, WB_AllocateMetaspace(JNIEnv* env, jobject wb, jobject class_loader, jlong size))
745 if (size < 0) {
746 THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(),
747 err_msg("WB_AllocateMetaspace: size is negative: " JLONG_FORMAT, size));
748 }
749
750 oop class_loader_oop = JNIHandles::resolve(class_loader);
751 ClassLoaderData* cld = class_loader_oop != NULL
752 ? java_lang_ClassLoader::loader_data(class_loader_oop)
753 : ClassLoaderData::the_null_class_loader_data();
754
755 void* metadata = MetadataFactory::new_writeable_array<u1>(cld, WhiteBox::array_bytes_to_length((size_t)size), thread);
756
757 return (jlong)(uintptr_t)metadata;
758 WB_END
759
760 WB_ENTRY(void, WB_FreeMetaspace(JNIEnv* env, jobject wb, jobject class_loader, jlong addr, jlong size))
761 oop class_loader_oop = JNIHandles::resolve(class_loader);
762 ClassLoaderData* cld = class_loader_oop != NULL
763 ? java_lang_ClassLoader::loader_data(class_loader_oop)
764 : ClassLoaderData::the_null_class_loader_data();
765
766 MetadataFactory::free_array(cld, (Array<u1>*)(uintptr_t)addr);
767 WB_END
768
769 //Some convenience methods to deal with objects from java
770 int WhiteBox::offset_for_field(const char* field_name, oop object,
771 Symbol* signature_symbol) {
772 assert(field_name != NULL && strlen(field_name) > 0, "Field name not valid");
773 Thread* THREAD = Thread::current();
774
775 //Get the class of our object
776 Klass* arg_klass = object->klass();
777 //Turn it into an instance-klass
778 InstanceKlass* ik = InstanceKlass::cast(arg_klass);
779
780 //Create symbols to look for in the class
781 TempNewSymbol name_symbol = SymbolTable::lookup(field_name, (int) strlen(field_name),
782 THREAD);
783
784 //To be filled in with an offset of the field we're looking for
785 fieldDescriptor fd;
786
787 Klass* res = ik->find_field(name_symbol, signature_symbol, &fd);
788 if (res == NULL) {
879 {CC"setUintxVMFlag", CC"(Ljava/lang/String;J)V",(void*)&WB_SetUintxVMFlag},
880 {CC"setUint64VMFlag", CC"(Ljava/lang/String;J)V",(void*)&WB_SetUint64VMFlag},
881 {CC"setDoubleVMFlag", CC"(Ljava/lang/String;D)V",(void*)&WB_SetDoubleVMFlag},
882 {CC"setStringVMFlag", CC"(Ljava/lang/String;Ljava/lang/String;)V",
883 (void*)&WB_SetStringVMFlag},
884 {CC"getBooleanVMFlag", CC"(Ljava/lang/String;)Ljava/lang/Boolean;",
885 (void*)&WB_GetBooleanVMFlag},
886 {CC"getIntxVMFlag", CC"(Ljava/lang/String;)Ljava/lang/Long;",
887 (void*)&WB_GetIntxVMFlag},
888 {CC"getUintxVMFlag", CC"(Ljava/lang/String;)Ljava/lang/Long;",
889 (void*)&WB_GetUintxVMFlag},
890 {CC"getUint64VMFlag", CC"(Ljava/lang/String;)Ljava/lang/Long;",
891 (void*)&WB_GetUint64VMFlag},
892 {CC"getDoubleVMFlag", CC"(Ljava/lang/String;)Ljava/lang/Double;",
893 (void*)&WB_GetDoubleVMFlag},
894 {CC"getStringVMFlag", CC"(Ljava/lang/String;)Ljava/lang/String;",
895 (void*)&WB_GetStringVMFlag},
896 {CC"isInStringTable", CC"(Ljava/lang/String;)Z", (void*)&WB_IsInStringTable },
897 {CC"fullGC", CC"()V", (void*)&WB_FullGC },
898 {CC"readReservedMemory", CC"()V", (void*)&WB_ReadReservedMemory },
899 {CC"allocateMetaspace",
900 CC"(Ljava/lang/ClassLoader;J)J", (void*)&WB_AllocateMetaspace },
901 {CC"freeMetaspace",
902 CC"(Ljava/lang/ClassLoader;JJ)V", (void*)&WB_FreeMetaspace },
903 {CC"getCPUFeatures", CC"()Ljava/lang/String;", (void*)&WB_GetCPUFeatures },
904 {CC"getNMethod", CC"(Ljava/lang/reflect/Executable;Z)[Ljava/lang/Object;",
905 (void*)&WB_GetNMethod },
906 {CC"getThreadStackSize", CC"()J", (void*)&WB_GetThreadStackSize },
907 {CC"getThreadRemainingStackSize", CC"()J", (void*)&WB_GetThreadRemainingStackSize },
908 };
909
910 #undef CC
911
912 JVM_ENTRY(void, JVM_RegisterWhiteBoxMethods(JNIEnv* env, jclass wbclass))
913 {
914 if (WhiteBoxAPI) {
915 // Make sure that wbclass is loaded by the null classloader
916 instanceKlassHandle ikh = instanceKlassHandle(JNIHandles::resolve(wbclass)->klass());
917 Handle loader(ikh->class_loader());
918 if (loader.is_null()) {
919 ResourceMark rm;
920 ThreadToNativeFromVM ttnfv(thread); // can't be in VM when we call JNI
921 bool result = true;
922 // one by one registration natives for exception catching
|