# HG changeset patch # User Doug Simon # Date 1360719376 -36000 # Node ID 016e238291471a5e8b36b9c7caa4ced12cf828a1 # Parent 0c4eaa06d504fcc2ffcf0d81d7914d24f3d45305 added HotSpot implementation of disassembling APIs diff -r 0c4eaa06d504 -r 016e23829147 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/HotSpotGraalRuntime.java --- 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(); } diff -r 0c4eaa06d504 -r 016e23829147 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/bridge/CompilerToVM.java --- 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); diff -r 0c4eaa06d504 -r 016e23829147 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/bridge/CompilerToVMImpl.java --- 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 diff -r 0c4eaa06d504 -r 016e23829147 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotInstalledCode.java --- 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; diff -r 0c4eaa06d504 -r 016e23829147 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotRuntime.java --- 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); + } } diff -r 0c4eaa06d504 -r 016e23829147 src/share/vm/graal/graalCompilerToVM.cpp --- 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)},