comparison src/share/vm/graal/graalCompilerToVM.cpp @ 4297:874fcc2ddd9d

Use HotSpot disassmblers for native code and bytecode
author Christian Wimmer <christian.wimmer@oracle.com>
date Wed, 18 Jan 2012 20:08:08 -0800
parents e0a4668c57a2
children b4b16e4e043f dc6f6e2f1a00
comparison
equal deleted inserted replaced
4295:1e3ecb08767d 4297:874fcc2ddd9d
972 ciEnv env(&arena); 972 ciEnv env(&arena);
973 CodeInstaller installer(targetMethodHandle, id); 973 CodeInstaller installer(targetMethodHandle, id);
974 return id; 974 return id;
975 } 975 }
976 976
977 // public String disassembleNative(byte[] code, long address);
978 JNIEXPORT jobject JNICALL Java_com_oracle_max_graal_hotspot_bridge_CompilerToVMImpl_disassembleNative(JNIEnv *jniEnv, jobject, jbyteArray code, jlong start_address) {
979 TRACE_graal_3("CompilerToVM::disassembleNative");
980 VM_ENTRY_MARK;
981 ResourceMark rm;
982 HandleMark hm;
983
984 stringStream(st);
985 arrayOop code_oop = (arrayOop) JNIHandles::resolve(code);
986 int len = code_oop->length();
987 address begin = (address) code_oop->base(T_BYTE);
988 address end = begin + len;
989 Disassembler::decode(begin, end, &st);
990
991 Handle result = java_lang_String::create_from_platform_dependent_str(st.as_string(), CHECK_NULL);
992 return JNIHandles::make_local(result());
993 }
994
995 // public String disassembleJava(HotSpotMethodResolved method);
996 JNIEXPORT jobject JNICALL Java_com_oracle_max_graal_hotspot_bridge_CompilerToVMImpl_disassembleJava(JNIEnv *env, jobject, jobject hotspot_method) {
997 TRACE_graal_3("CompilerToVM::disassembleJava");
998
999 // Important: The bytecode printing functions are all NOT PRODUCT code, so this method returns an empty string for a product VM build.
1000
1001 VM_ENTRY_MARK;
1002 ResourceMark rm;
1003 HandleMark hm;
1004
1005 methodHandle method = getMethodFromHotSpotMethod(hotspot_method);
1006 // Note: cannot use resource-allocated stringStream because print_code_on has its own ResourceMark.
1007 bufferedStream(st);
1008 method->print_codes_on(&st);
1009
1010 Handle result = java_lang_String::create_from_platform_dependent_str(st.as_string(), CHECK_NULL);
1011 return JNIHandles::make_local(result());
1012 }
977 1013
978 1014
979 #define CC (char*) /*cast a literal from (const char*)*/ 1015 #define CC (char*) /*cast a literal from (const char*)*/
980 #define FN_PTR(f) CAST_FROM_FN_PTR(void*, &(Java_com_oracle_max_graal_hotspot_bridge_CompilerToVMImpl_##f)) 1016 #define FN_PTR(f) CAST_FROM_FN_PTR(void*, &(Java_com_oracle_max_graal_hotspot_bridge_CompilerToVMImpl_##f))
981 1017
1032 {CC"getPrimitiveArrayType", CC"("CI_KIND")"TYPE, FN_PTR(getPrimitiveArrayType)}, 1068 {CC"getPrimitiveArrayType", CC"("CI_KIND")"TYPE, FN_PTR(getPrimitiveArrayType)},
1033 {CC"getMaxCallTargetOffset", CC"("CI_RUNTIME_CALL")J", FN_PTR(getMaxCallTargetOffset)}, 1069 {CC"getMaxCallTargetOffset", CC"("CI_RUNTIME_CALL")J", FN_PTR(getMaxCallTargetOffset)},
1034 {CC"getType", CC"("CLASS")"TYPE, FN_PTR(getType)}, 1070 {CC"getType", CC"("CLASS")"TYPE, FN_PTR(getType)},
1035 {CC"getConfiguration", CC"()"CONFIG, FN_PTR(getConfiguration)}, 1071 {CC"getConfiguration", CC"()"CONFIG, FN_PTR(getConfiguration)},
1036 {CC"installMethod", CC"("TARGET_METHOD"Z)"HS_COMP_METHOD, FN_PTR(installMethod)}, 1072 {CC"installMethod", CC"("TARGET_METHOD"Z)"HS_COMP_METHOD, FN_PTR(installMethod)},
1037 {CC"installStub", CC"("TARGET_METHOD")"PROXY, FN_PTR(installStub)} 1073 {CC"installStub", CC"("TARGET_METHOD")"PROXY, FN_PTR(installStub)},
1074 {CC"disassembleNative", CC"([BJ)"STRING, FN_PTR(disassembleNative)},
1075 {CC"disassembleJava", CC"("RESOLVED_METHOD")"STRING, FN_PTR(disassembleJava)},
1038 }; 1076 };
1039 1077
1040 int CompilerToVM_methods_count() { 1078 int CompilerToVM_methods_count() {
1041 return sizeof(CompilerToVM_methods) / sizeof(JNINativeMethod); 1079 return sizeof(CompilerToVM_methods) / sizeof(JNINativeMethod);
1042 } 1080 }