Mercurial > hg > truffle
diff 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 |
line wrap: on
line diff
--- a/src/share/vm/graal/graalCompilerToVM.cpp Wed Jan 18 15:04:03 2012 -0800 +++ b/src/share/vm/graal/graalCompilerToVM.cpp Wed Jan 18 20:08:08 2012 -0800 @@ -974,6 +974,42 @@ return id; } +// public String disassembleNative(byte[] code, long address); +JNIEXPORT jobject JNICALL Java_com_oracle_max_graal_hotspot_bridge_CompilerToVMImpl_disassembleNative(JNIEnv *jniEnv, jobject, jbyteArray code, jlong start_address) { + TRACE_graal_3("CompilerToVM::disassembleNative"); + VM_ENTRY_MARK; + ResourceMark rm; + HandleMark hm; + + stringStream(st); + arrayOop code_oop = (arrayOop) JNIHandles::resolve(code); + int len = code_oop->length(); + address begin = (address) code_oop->base(T_BYTE); + address end = begin + len; + Disassembler::decode(begin, end, &st); + + Handle result = java_lang_String::create_from_platform_dependent_str(st.as_string(), CHECK_NULL); + return JNIHandles::make_local(result()); +} + +// public String disassembleJava(HotSpotMethodResolved method); +JNIEXPORT jobject JNICALL Java_com_oracle_max_graal_hotspot_bridge_CompilerToVMImpl_disassembleJava(JNIEnv *env, jobject, jobject hotspot_method) { + TRACE_graal_3("CompilerToVM::disassembleJava"); + + // Important: The bytecode printing functions are all NOT PRODUCT code, so this method returns an empty string for a product VM build. + + VM_ENTRY_MARK; + ResourceMark rm; + HandleMark hm; + + methodHandle method = getMethodFromHotSpotMethod(hotspot_method); + // Note: cannot use resource-allocated stringStream because print_code_on has its own ResourceMark. + bufferedStream(st); + method->print_codes_on(&st); + + Handle result = java_lang_String::create_from_platform_dependent_str(st.as_string(), CHECK_NULL); + return JNIHandles::make_local(result()); +} #define CC (char*) /*cast a literal from (const char*)*/ @@ -1034,7 +1070,9 @@ {CC"getType", CC"("CLASS")"TYPE, FN_PTR(getType)}, {CC"getConfiguration", CC"()"CONFIG, FN_PTR(getConfiguration)}, {CC"installMethod", CC"("TARGET_METHOD"Z)"HS_COMP_METHOD, FN_PTR(installMethod)}, - {CC"installStub", CC"("TARGET_METHOD")"PROXY, FN_PTR(installStub)} + {CC"installStub", CC"("TARGET_METHOD")"PROXY, FN_PTR(installStub)}, + {CC"disassembleNative", CC"([BJ)"STRING, FN_PTR(disassembleNative)}, + {CC"disassembleJava", CC"("RESOLVED_METHOD")"STRING, FN_PTR(disassembleJava)}, }; int CompilerToVM_methods_count() {