changeset 7784:016e23829147

added HotSpot implementation of disassembling APIs
author Doug Simon <doug.simon@oracle.com>
date Wed, 13 Feb 2013 11:36:16 +1000
parents 0c4eaa06d504
children f180d2a1c3a4
files graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/HotSpotGraalRuntime.java graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/bridge/CompilerToVM.java graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/bridge/CompilerToVMImpl.java graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotInstalledCode.java graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotRuntime.java src/share/vm/graal/graalCompilerToVM.cpp
diffstat 6 files changed, 40 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/HotSpotGraalRuntime.java	Wed Feb 13 11:34:22 2013 +1000
+++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/HotSpotGraalRuntime.java	Wed Feb 13 11:36:16 2013 +1000
@@ -22,7 +22,7 @@
  */
 package com.oracle.graal.hotspot;
 
-import static com.oracle.graal.graph.FieldIntrospection.*;
+import static com.oracle.graal.graph.UnsafeAccess.*;
 
 import java.lang.reflect.*;
 import java.util.*;
@@ -261,6 +261,9 @@
         if (clazz == GraalCodeCacheProvider.class || clazz == CodeCacheProvider.class || clazz == MetaAccessProvider.class || clazz == SnippetProvider.class) {
             return (T) getRuntime();
         }
+        if (clazz == DisassemblerProvider.class || clazz == BytecodeDisassemblerProvider.class) {
+            return (T) getRuntime();
+        }
         if (clazz == GraalCompiler.class) {
             return (T) getCompiler();
         }
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/bridge/CompilerToVM.java	Wed Feb 13 11:34:22 2013 +1000
+++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/bridge/CompilerToVM.java	Wed Feb 13 11:36:16 2013 +1000
@@ -191,6 +191,8 @@
 
     String disassembleNative(byte[] code, long address);
 
+    String disassembleNMethod(long nmethod);
+
     StackTraceElement getStackTraceElement(long metaspaceMethod, int bci);
 
     Object executeCompiledMethod(long metaspaceMethod, long nmethod, Object arg1, Object arg2, Object arg3);
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/bridge/CompilerToVMImpl.java	Wed Feb 13 11:34:22 2013 +1000
+++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/bridge/CompilerToVMImpl.java	Wed Feb 13 11:36:16 2013 +1000
@@ -126,6 +126,9 @@
     public native String disassembleNative(byte[] code, long address);
 
     @Override
+    public native String disassembleNMethod(long nmethod);
+
+    @Override
     public native StackTraceElement getStackTraceElement(long metaspaceMethod, int bci);
 
     @Override
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotInstalledCode.java	Wed Feb 13 11:34:22 2013 +1000
+++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotInstalledCode.java	Wed Feb 13 11:36:16 2013 +1000
@@ -38,7 +38,7 @@
     private static final long serialVersionUID = 156632908220561612L;
 
     private final HotSpotResolvedJavaMethod method;
-    private long nmethod;
+    long nmethod;
 
     public HotSpotInstalledCode(HotSpotResolvedJavaMethod method) {
         this.method = method;
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotRuntime.java	Wed Feb 13 11:34:22 2013 +1000
+++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotRuntime.java	Wed Feb 13 11:36:16 2013 +1000
@@ -59,6 +59,7 @@
 import com.oracle.graal.hotspot.phases.*;
 import com.oracle.graal.hotspot.snippets.*;
 import com.oracle.graal.hotspot.stubs.*;
+import com.oracle.graal.java.*;
 import com.oracle.graal.nodes.*;
 import com.oracle.graal.nodes.calc.*;
 import com.oracle.graal.nodes.extended.*;
@@ -74,7 +75,7 @@
 /**
  * HotSpot implementation of {@link GraalCodeCacheProvider}.
  */
-public abstract class HotSpotRuntime implements GraalCodeCacheProvider, SnippetProvider {
+public abstract class HotSpotRuntime implements GraalCodeCacheProvider, SnippetProvider, DisassemblerProvider, BytecodeDisassemblerProvider {
 
     public final HotSpotVMConfig config;
 
@@ -951,4 +952,16 @@
     public TargetDescription getTarget() {
         return graalRuntime.getTarget();
     }
+
+    public String disassemble(InstalledCode code) {
+        if (code.isValid()) {
+            long nmethod = ((HotSpotInstalledCode) code).nmethod;
+            return graalRuntime.getCompilerToVM().disassembleNMethod(nmethod);
+        }
+        return "";
+    }
+
+    public String disassemble(ResolvedJavaMethod method) {
+        return new BytecodeDisassembler().disassemble(method);
+    }
 }
--- a/src/share/vm/graal/graalCompilerToVM.cpp	Wed Feb 13 11:34:22 2013 +1000
+++ b/src/share/vm/graal/graalCompilerToVM.cpp	Wed Feb 13 11:36:16 2013 +1000
@@ -844,6 +844,21 @@
   return JNIHandles::make_local(result());
 C2V_END
 
+C2V_VMENTRY(jobject, disassembleNMethod, (JNIEnv *jniEnv, jobject, jlong metaspace_nmethod))
+  ResourceMark rm;
+  HandleMark hm;
+
+  nmethod* nm = (nmethod*) (address) metaspace_nmethod;
+  if (nm == NULL || !nm->is_alive()) {
+    return NULL;
+  }
+  stringStream(st);
+  Disassembler::decode(nm, &st);
+
+  Handle result = java_lang_String::create_from_platform_dependent_str(st.as_string(), CHECK_NULL);
+  return JNIHandles::make_local(result());
+C2V_END
+
 C2V_VMENTRY(jobject, getStackTraceElement, (JNIEnv *env, jobject, jlong metaspace_method, int bci))
   ResourceMark rm;
   HandleMark hm;
@@ -1056,6 +1071,7 @@
   {CC"initializeConfiguration",       CC"("HS_CONFIG")V",                                               FN_PTR(initializeConfiguration)},
   {CC"installCode0",                  CC"("HS_COMP_RESULT HS_INSTALLED_CODE HS_CODE_INFO")I",           FN_PTR(installCode0)},
   {CC"disassembleNative",             CC"([BJ)"STRING,                                                  FN_PTR(disassembleNative)},
+  {CC"disassembleNMethod",            CC"(J)"STRING,                                                    FN_PTR(disassembleNMethod)},
   {CC"executeCompiledMethod",         CC"("METASPACE_METHOD NMETHOD OBJECT OBJECT OBJECT")"OBJECT,      FN_PTR(executeCompiledMethod)},
   {CC"executeCompiledMethodVarargs",  CC"("METASPACE_METHOD NMETHOD "["OBJECT")"OBJECT,                 FN_PTR(executeCompiledMethodVarargs)},
   {CC"getDeoptedLeafGraphIds",        CC"()[J",                                                         FN_PTR(getDeoptedLeafGraphIds)},