# HG changeset patch # User Christian Wimmer # Date 1326946088 28800 # Node ID 874fcc2ddd9d57fb7534b9183619d66001ecfb68 # Parent 1e3ecb08767d07a540666339269744efebdcff70 Use HotSpot disassmblers for native code and bytecode diff -r 1e3ecb08767d -r 874fcc2ddd9d graal/com.oracle.max.graal.hotspot/src/com/oracle/max/graal/hotspot/bridge/CompilerToVM.java --- a/graal/com.oracle.max.graal.hotspot/src/com/oracle/max/graal/hotspot/bridge/CompilerToVM.java Wed Jan 18 15:04:03 2012 -0800 +++ b/graal/com.oracle.max.graal.hotspot/src/com/oracle/max/graal/hotspot/bridge/CompilerToVM.java Wed Jan 18 20:08:08 2012 -0800 @@ -107,5 +107,9 @@ long getMaxCallTargetOffset(CiRuntimeCall rtcall); + String disassembleNative(byte[] code, long address); + + String disassembleJava(HotSpotMethodResolved method); + // Checkstyle: resume } diff -r 1e3ecb08767d -r 874fcc2ddd9d graal/com.oracle.max.graal.hotspot/src/com/oracle/max/graal/hotspot/bridge/CompilerToVMImpl.java --- a/graal/com.oracle.max.graal.hotspot/src/com/oracle/max/graal/hotspot/bridge/CompilerToVMImpl.java Wed Jan 18 15:04:03 2012 -0800 +++ b/graal/com.oracle.max.graal.hotspot/src/com/oracle/max/graal/hotspot/bridge/CompilerToVMImpl.java Wed Jan 18 20:08:08 2012 -0800 @@ -153,5 +153,11 @@ @Override public native long getMaxCallTargetOffset(CiRuntimeCall rtcall); + @Override + public native String disassembleNative(byte[] code, long address); + + @Override + public native String disassembleJava(HotSpotMethodResolved method); + // Checkstyle: resume } diff -r 1e3ecb08767d -r 874fcc2ddd9d graal/com.oracle.max.graal.hotspot/src/com/oracle/max/graal/hotspot/ri/HotSpotRuntime.java --- a/graal/com.oracle.max.graal.hotspot/src/com/oracle/max/graal/hotspot/ri/HotSpotRuntime.java Wed Jan 18 15:04:03 2012 -0800 +++ b/graal/com.oracle.max.graal.hotspot/src/com/oracle/max/graal/hotspot/ri/HotSpotRuntime.java Wed Jan 18 20:08:08 2012 -0800 @@ -22,7 +22,6 @@ */ package com.oracle.max.graal.hotspot.ri; -import java.io.*; import java.lang.reflect.*; import java.util.*; @@ -45,8 +44,6 @@ import com.oracle.max.graal.nodes.extended.*; import com.oracle.max.graal.nodes.java.*; import com.oracle.max.graal.snippets.nodes.*; -import com.sun.max.asm.dis.*; -import com.sun.max.lang.*; /** * CRI runtime implementation for the HotSpot VM. @@ -78,14 +75,7 @@ @Override public String disassemble(byte[] code, long address) { - return disassemble(code, new DisassemblyPrinter(false), address); - } - - private static String disassemble(byte[] code, DisassemblyPrinter disassemblyPrinter, long address) { - final ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); - final ISA instructionSet = ISA.AMD64; - Disassembler.disassemble(byteArrayOutputStream, code, instructionSet, WordWidth.BITS_64, address, null, disassemblyPrinter); - return byteArrayOutputStream.toString(); + return compiler.getVMEntries().disassembleNative(code, address); } @Override @@ -139,7 +129,7 @@ @Override public String disassemble(RiResolvedMethod method) { - return "No disassembler available"; + return compiler.getVMEntries().disassembleJava((HotSpotMethodResolved) method); } @Override diff -r 1e3ecb08767d -r 874fcc2ddd9d mx/projects --- a/mx/projects Wed Jan 18 15:04:03 2012 -0800 +++ b/mx/projects Wed Jan 18 20:08:08 2012 -0800 @@ -44,7 +44,7 @@ # graal.hotspot project@com.oracle.max.graal.hotspot@subDir=graal project@com.oracle.max.graal.hotspot@sourceDirs=src -project@com.oracle.max.graal.hotspot@dependencies=com.oracle.max.graal.snippets,com.oracle.max.asmdis +project@com.oracle.max.graal.hotspot@dependencies=com.oracle.max.graal.snippets project@com.oracle.max.graal.hotspot@checkstyle=com.oracle.max.graal.graph # graal.graph @@ -94,18 +94,6 @@ project@com.oracle.max.asm@dependencies=com.oracle.max.criutils project@com.oracle.max.asm@checkstyle=com.oracle.max.graal.graph -# max.base -project@com.oracle.max.base@subDir=graal -project@com.oracle.max.base@sourceDirs=src,test -project@com.oracle.max.base@dependencies=JUNIT -project@com.oracle.max.base@checkstyle=com.oracle.max.graal.graph - -# max.asmdis -project@com.oracle.max.asmdis@subDir=graal -project@com.oracle.max.asmdis@sourceDirs=src,test -project@com.oracle.max.asmdis@dependencies=com.oracle.max.base -project@com.oracle.max.asmdis@checkstyle=com.oracle.max.graal.graph - # max.cri project@com.oracle.max.cri@subDir=graal project@com.oracle.max.cri@sourceDirs=src diff -r 1e3ecb08767d -r 874fcc2ddd9d src/share/vm/graal/graalCompilerToVM.cpp --- 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() {