# HG changeset patch # User Doug Simon # Date 1428402068 -7200 # Node ID 03b4fa99eff890961ba3a75371b9690685115a4d # Parent 655e05ece0f5e8f5ff9331b8b8ca0806d213a872 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 diff -r 655e05ece0f5 -r 03b4fa99eff8 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 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); diff -r 655e05ece0f5 -r 03b4fa99eff8 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 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); diff -r 655e05ece0f5 -r 03b4fa99eff8 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotMemoryAccessProviderImpl.java --- 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; } diff -r 655e05ece0f5 -r 03b4fa99eff8 src/share/vm/graal/graalCompilerToVM.cpp --- 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)},