changeset 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 1e3ecb08767d
children 403013252848
files graal/com.oracle.max.graal.hotspot/src/com/oracle/max/graal/hotspot/bridge/CompilerToVM.java graal/com.oracle.max.graal.hotspot/src/com/oracle/max/graal/hotspot/bridge/CompilerToVMImpl.java graal/com.oracle.max.graal.hotspot/src/com/oracle/max/graal/hotspot/ri/HotSpotRuntime.java mx/projects src/share/vm/graal/graalCompilerToVM.cpp
diffstat 5 files changed, 52 insertions(+), 26 deletions(-) [+]
line wrap: on
line diff
--- 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
 }
--- 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
 }
--- 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
--- 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
--- 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() {