Mercurial > hg > graal-compiler
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)},