changeset 11381:001c41b01d13

HotSpotInstalledCode: moved getCode to Java and added the ability to get the whole blob
author twisti
date Tue, 20 Aug 2013 12:48:28 -0700
parents d9bcf8789d57
children 423c53e2fa7e
files graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotInstalledCode.java graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotNmethod.java graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotRuntimeStub.java src/share/vm/graal/graalCompilerToGPU.cpp src/share/vm/graal/graalCompilerToVM.cpp src/share/vm/graal/graalJavaAccess.hpp
diffstat 6 files changed, 68 insertions(+), 35 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotInstalledCode.java	Tue Aug 20 20:04:33 2013 +0200
+++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotInstalledCode.java	Tue Aug 20 12:48:28 2013 -0700
@@ -22,11 +22,13 @@
  */
 package com.oracle.graal.hotspot.meta;
 
-import static com.oracle.graal.hotspot.HotSpotGraalRuntime.*;
+import static com.oracle.graal.graph.UnsafeAccess.*;
 
 import com.oracle.graal.api.code.*;
 import com.oracle.graal.hotspot.*;
 
+import sun.misc.*;
+
 /**
  * Implementation of {@link InstalledCode} for HotSpot.
  */
@@ -34,21 +36,69 @@
 
     private static final long serialVersionUID = 156632908220561612L;
 
-    long codeBlob;
-    long start;
+    /**
+     * Raw address of this code blob.
+     */
+    private long codeBlob;
+
+    /**
+     * Total size of the code blob.
+     */
+    private int size;
 
+    /**
+     * Start address of the code.
+     */
+    private long codeStart;
+
+    /**
+     * Size of the code.
+     */
+    private int codeSize;
+
+    /**
+     * @return the address of this code blob
+     */
     public long getCodeBlob() {
         return codeBlob;
     }
 
+    /**
+     * @return the total size of this code blob
+     */
+    public int getSize() {
+        return size;
+    }
+
+    /**
+     * @returns a copy of this code blob if it is {@linkplain #isValid() valid}, null otherwise.
+     */
+    public byte[] getBlob() {
+        if (!isValid()) {
+            return null;
+        }
+        byte[] blob = new byte[size];
+        unsafe.copyMemory(null, codeBlob, blob, Unsafe.ARRAY_BYTE_BASE_OFFSET, size);
+        return blob;
+    }
+
     @Override
     public abstract String toString();
 
     public long getStart() {
-        return start;
+        return codeStart;
+    }
+
+    public long getCodeSize() {
+        return codeSize;
     }
 
     public byte[] getCode() {
-        return graalRuntime().getCompilerToVM().getCode(codeBlob);
+        if (!isValid()) {
+            return null;
+        }
+        byte[] code = new byte[codeSize];
+        unsafe.copyMemory(null, codeStart, code, Unsafe.ARRAY_BYTE_BASE_OFFSET, codeSize);
+        return code;
     }
 }
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotNmethod.java	Tue Aug 20 20:04:33 2013 +0200
+++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotNmethod.java	Tue Aug 20 12:48:28 2013 -0700
@@ -82,7 +82,7 @@
 
     @Override
     public boolean isValid() {
-        return codeBlob != 0;
+        return getCodeBlob() != 0;
     }
 
     @Override
@@ -92,7 +92,7 @@
 
     @Override
     public String toString() {
-        return String.format("InstalledNmethod[method=%s, codeBlob=0x%x, isDefault=%b]", method, codeBlob, isDefault);
+        return String.format("InstalledNmethod[method=%s, codeBlob=0x%x, isDefault=%b]", method, getCodeBlob(), isDefault);
     }
 
     @Override
@@ -135,6 +135,6 @@
 
     @Override
     public long getStart() {
-        return isValid() ? start : 0;
+        return isValid() ? super.getStart() : 0;
     }
 }
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotRuntimeStub.java	Tue Aug 20 20:04:33 2013 +0200
+++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotRuntimeStub.java	Tue Aug 20 12:48:28 2013 -0700
@@ -53,7 +53,7 @@
 
     @Override
     public String toString() {
-        return String.format("InstalledRuntimeStub[stub=%s, codeBlob=0x%x]", stub, codeBlob);
+        return String.format("InstalledRuntimeStub[stub=%s, codeBlob=0x%x]", stub, getCodeBlob());
     }
 
     public Object execute(Object arg1, Object arg2, Object arg3) throws InvalidInstalledCodeException {
--- a/src/share/vm/graal/graalCompilerToGPU.cpp	Tue Aug 20 20:04:33 2013 +0200
+++ b/src/share/vm/graal/graalCompilerToGPU.cpp	Tue Aug 20 12:48:28 2013 -0700
@@ -88,7 +88,7 @@
   jca.set_alternative_target(nm);
 
   // start value is the kernel
-  jlong startValue = HotSpotInstalledCode::start(hotspotInstalledCode);
+  jlong startValue = HotSpotInstalledCode::codeStart(hotspotInstalledCode);
 
   if (!gpu::execute_kernel((address)startValue, &jca)) {
     return NULL;
--- a/src/share/vm/graal/graalCompilerToVM.cpp	Tue Aug 20 20:04:33 2013 +0200
+++ b/src/share/vm/graal/graalCompilerToVM.cpp	Tue Aug 20 12:48:28 2013 -0700
@@ -928,9 +928,11 @@
         if (TraceGPUInteraction) {
           tty->print_cr("installCode0: ExternalCompilationResult");
         }
-        HotSpotInstalledCode::set_start(installed_code_handle, ExternalCompilationResult::entryPoint(comp_result));
+        HotSpotInstalledCode::set_codeStart(installed_code_handle, ExternalCompilationResult::entryPoint(comp_result));
       } else {
-        HotSpotInstalledCode::set_start(installed_code_handle, (jlong) cb->code_begin());
+        HotSpotInstalledCode::set_size(installed_code_handle, cb->size());
+        HotSpotInstalledCode::set_codeStart(installed_code_handle, (jlong) cb->code_begin());
+        HotSpotInstalledCode::set_codeSize(installed_code_handle, cb->code_size());
       }
       nmethod* nm = cb->as_nmethod_or_null();
       assert(nm == NULL || !installed_code_handle->is_scavengable() || nm->on_scavenge_root_list(), "nm should be scavengable if installed_code is scavengable");
@@ -939,26 +941,6 @@
   return result;
 C2V_END
 
-C2V_VMENTRY(jobject, getCode, (JNIEnv *jniEnv, jobject,  jlong codeBlob))
-  ResourceMark rm;
-  HandleMark hm;
-
-  CodeBlob* cb = (CodeBlob*) (address) codeBlob;
-  if (cb == NULL) {
-    return NULL;
-  }
-  if (cb->is_nmethod()) {
-    nmethod* nm = (nmethod*) cb;
-    if (!nm->is_alive()) {
-      return NULL;
-    }
-  }
-  int length = cb->code_size();
-  arrayOop codeCopy = oopFactory::new_byteArray(length, CHECK_0);
-  memcpy(codeCopy->base(T_BYTE), cb->code_begin(), length);
-  return JNIHandles::make_local(codeCopy);
-C2V_END
-
 C2V_VMENTRY(jobject, disassembleCodeBlob, (JNIEnv *jniEnv, jobject, jlong codeBlob))
   ResourceMark rm;
   HandleMark hm;
@@ -1244,7 +1226,6 @@
   {CC"getJavaField",                  CC"("REFLECT_FIELD")"HS_RESOLVED_FIELD,                           FN_PTR(getJavaField)},
   {CC"initializeConfiguration",       CC"("HS_CONFIG")V",                                               FN_PTR(initializeConfiguration)},
   {CC"installCode0",                  CC"("HS_COMPILED_CODE HS_INSTALLED_CODE"[Z)I",                    FN_PTR(installCode0)},
-  {CC"getCode",                       CC"(J)[B",                                                        FN_PTR(getCode)},
   {CC"disassembleCodeBlob",           CC"(J)"STRING,                                                    FN_PTR(disassembleCodeBlob)},
   {CC"executeCompiledMethodVarargs",  CC"(["OBJECT HS_INSTALLED_CODE")"OBJECT,                          FN_PTR(executeCompiledMethodVarargs)},
   {CC"getDeoptedLeafGraphIds",        CC"()[J",                                                         FN_PTR(getDeoptedLeafGraphIds)},
--- a/src/share/vm/graal/graalJavaAccess.hpp	Tue Aug 20 20:04:33 2013 +0200
+++ b/src/share/vm/graal/graalJavaAccess.hpp	Tue Aug 20 12:48:28 2013 -0700
@@ -78,11 +78,13 @@
   end_class                                                                                                                                                    \
   start_class(HotSpotInstalledCode)                                                                                                                            \
     long_field(HotSpotInstalledCode, codeBlob)                                                                                                                 \
-    long_field(HotSpotInstalledCode, start)                                                                                                                    \
+    int_field(HotSpotInstalledCode, size)                                                                                                                      \
+    long_field(HotSpotInstalledCode, codeStart)                                                                                                                \
+    int_field(HotSpotInstalledCode, codeSize)                                                                                                                  \
   end_class                                                                                                                                                    \
   start_class(HotSpotNmethod)                                                                                                                                  \
     boolean_field(HotSpotNmethod, isDefault)                                                                                                                   \
-    boolean_field(HotSpotNmethod, isExternal)                                                                                                                   \
+    boolean_field(HotSpotNmethod, isExternal)                                                                                                                  \
   end_class                                                                                                                                                    \
   start_class(HotSpotCompiledCode)                                                                                                                             \
     oop_field(HotSpotCompiledCode, comp, "Lcom/oracle/graal/api/code/CompilationResult;")                                                                      \