changeset 20176:03b4fa99eff8

rename CompilerToVM.readUnsafeOop to readUncompressedOop and only use it for reading oops in VM data structures since Unsafe.getObject() can be used for other cases
author Doug Simon <doug.simon@oracle.com>
date Tue, 07 Apr 2015 12:21:08 +0200
parents 655e05ece0f5
children 617943492e00
files 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/HotSpotMemoryAccessProviderImpl.java src/share/vm/graal/graalCompilerToVM.cpp
diffstat 4 files changed, 26 insertions(+), 13 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/bridge/CompilerToVM.java	Tue Apr 07 12:19:45 2015 +0200
+++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/bridge/CompilerToVM.java	Tue Apr 07 12:21:08 2015 +0200
@@ -23,11 +23,14 @@
 
 package com.oracle.graal.hotspot.bridge;
 
+import sun.misc.*;
+
 import com.oracle.graal.api.code.*;
 import com.oracle.graal.api.meta.*;
 import com.oracle.graal.compiler.common.*;
 import com.oracle.graal.hotspot.*;
 import com.oracle.graal.hotspot.meta.*;
+import com.oracle.graal.hotspotvmconfig.*;
 
 /**
  * Calls from Java into HotSpot.
@@ -290,7 +293,19 @@
 
     long readUnsafeKlassPointer(Object o);
 
-    Object readUnsafeOop(Object base, long displacement, boolean compressed);
+    /**
+     * Reads an object pointer within a VM data structures. That is, any {@link HotSpotVMField}
+     * whose {@link HotSpotVMField#type() type} is {@code "oop"} (e.g.,
+     * {@code ArrayKlass::_component_mirror}, {@code Klass::_java_mirror},
+     * {@code JavaThread::_threadObj}).
+     *
+     * Note that {@link Unsafe#getObject(Object, long)} cannot be used for this since it does a
+     * {@code narrowOop} read if the VM is using compressed oops whereas oops within VM data
+     * structures are (currently) always uncompressed.
+     *
+     * @param address address of an oop field within a VM data structure
+     */
+    Object readUncompressedOop(long address);
 
     void doNotInlineOrCompile(long metaspaceMethod);
 
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/bridge/CompilerToVMImpl.java	Tue Apr 07 12:19:45 2015 +0200
+++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/bridge/CompilerToVMImpl.java	Tue Apr 07 12:21:08 2015 +0200
@@ -160,7 +160,7 @@
     public native long readUnsafeKlassPointer(Object o);
 
     @Override
-    public native Object readUnsafeOop(Object base, long displacement, boolean compressed);
+    public native Object readUncompressedOop(long address);
 
     @Override
     public native void doNotInlineOrCompile(long metaspaceMethod);
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotMemoryAccessProviderImpl.java	Tue Apr 07 12:19:45 2015 +0200
+++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotMemoryAccessProviderImpl.java	Tue Apr 07 12:21:08 2015 +0200
@@ -133,13 +133,17 @@
     private Object readRawObject(Constant baseConstant, long initialDisplacement, boolean compressed) {
         long displacement = initialDisplacement;
 
+        Object ret;
         Object base = asObject(baseConstant);
         if (base == null) {
+            assert !compressed;
             displacement += asRawPointer(baseConstant);
+            ret = runtime.getCompilerToVM().readUncompressedOop(displacement);
+        } else {
+            assert runtime.getConfig().useCompressedOops == compressed;
+            ret = unsafe.getObject(base, displacement);
         }
-        Object ret = runtime.getCompilerToVM().readUnsafeOop(base, displacement, compressed);
         assert verifyReadRawObject(ret, baseConstant, initialDisplacement, compressed);
-
         return ret;
     }
 
--- a/src/share/vm/graal/graalCompilerToVM.cpp	Tue Apr 07 12:19:45 2015 +0200
+++ b/src/share/vm/graal/graalCompilerToVM.cpp	Tue Apr 07 12:21:08 2015 +0200
@@ -720,14 +720,8 @@
   return klass;
 C2V_END
 
-C2V_VMENTRY(jobject, readUnsafeOop, (JNIEnv*, jobject, jobject base, jlong displacement, jboolean compressed))
-  address addr = (address)JNIHandles::resolve(base);
-  oop ret;
-  if (compressed) {
-    ret = oopDesc::load_decode_heap_oop((narrowOop*)(addr + displacement));
-  } else {
-    ret = oopDesc::load_decode_heap_oop((oop*)(addr + displacement));
-  }
+C2V_VMENTRY(jobject, readUncompressedOop, (JNIEnv*, jobject, jlong addr))
+  oop ret = oopDesc::load_decode_heap_oop((oop*)(address)addr);
   return JNIHandles::make_local(ret);
 C2V_END
 
@@ -1098,7 +1092,7 @@
   {CC"invalidateInstalledCode",                      CC"("INSTALLED_CODE")V",                                                  FN_PTR(invalidateInstalledCode)},
   {CC"getJavaMirror",                                CC"("METASPACE_KLASS")"CLASS,                                             FN_PTR(getJavaMirror)},
   {CC"readUnsafeKlassPointer",                       CC"("OBJECT")J",                                                          FN_PTR(readUnsafeKlassPointer)},
-  {CC"readUnsafeOop",                                CC"("OBJECT"JZ)"OBJECT,                                                   FN_PTR(readUnsafeOop)},
+  {CC"readUncompressedOop",                          CC"(J)"OBJECT,                                                            FN_PTR(readUncompressedOop)},
   {CC"collectCounters",                              CC"()[J",                                                                 FN_PTR(collectCounters)},
   {CC"allocateCompileId",                            CC"("METASPACE_METHOD"I)I",                                               FN_PTR(allocateCompileId)},
   {CC"isMature",                                     CC"("METASPACE_METHOD_DATA")Z",                                           FN_PTR(isMature)},