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() {