# HG changeset patch # User Christos Kotselidis # Date 1373625656 -7200 # Node ID c3760150dc29bfd2719620480950e85f3f3c6ced # Parent 28dc33dc456569dd906fd2ad0124a9e1c7a3779a Add function to read compressed klass pointers of constant objects natively diff -r 28dc33dc4565 -r c3760150dc29 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/HotSpotGraalRuntime.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/HotSpotGraalRuntime.java Fri Jul 12 12:24:11 2013 +0200 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/HotSpotGraalRuntime.java Fri Jul 12 12:40:56 2013 +0200 @@ -153,6 +153,13 @@ } /** + * Reads a klass pointer from a constant object. + */ + public static long unsafeReadKlassPointer(Object object) { + return instance.getCompilerToVM().readUnsafeKlassPointer(object); + } + + /** * Reads a word value from a given object. */ public static long unsafeReadWord(Object object, long offset) { diff -r 28dc33dc4565 -r c3760150dc29 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 Fri Jul 12 12:24:11 2013 +0200 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/bridge/CompilerToVM.java Fri Jul 12 12:40:56 2013 +0200 @@ -216,6 +216,8 @@ Object readUnsafeUncompressedPointer(Object o, long displacement); + long readUnsafeKlassPointer(Object o); + /** * Invalidates the profiling information and restarts profiling upon the next invocation. * diff -r 28dc33dc4565 -r c3760150dc29 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 Fri Jul 12 12:24:11 2013 +0200 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/bridge/CompilerToVMImpl.java Fri Jul 12 12:40:56 2013 +0200 @@ -173,6 +173,9 @@ public native Object readUnsafeUncompressedPointer(Object o, long displacement); @Override + public native long readUnsafeKlassPointer(Object o); + + @Override public Object executeCompiledMethod(Object arg1, Object arg2, Object arg3, HotSpotInstalledCode hotspotInstalledCode) throws InvalidInstalledCodeException { return executeCompiledMethodIntrinsic(arg1, arg2, arg3, hotspotInstalledCode); } diff -r 28dc33dc4565 -r c3760150dc29 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotRuntime.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotRuntime.java Fri Jul 12 12:24:11 2013 +0200 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotRuntime.java Fri Jul 12 12:40:56 2013 +0200 @@ -1157,7 +1157,11 @@ case Int: return Constant.forInt(base == null ? unsafe.getInt(displacement) : unsafe.getInt(base, displacement)); case Long: - return Constant.forLong(base == null ? unsafe.getLong(displacement) : unsafe.getLong(base, displacement)); + if (displacement == config().hubOffset && this.getGraalRuntime().getRuntime().config.useCompressedKlassPointers) { + return Constant.forLong(this.getGraalRuntime().getCompilerToVM().readUnsafeKlassPointer(base)); + } else { + return Constant.forLong(base == null ? unsafe.getLong(displacement) : unsafe.getLong(base, displacement)); + } case Float: return Constant.forFloat(base == null ? unsafe.getFloat(displacement) : unsafe.getFloat(base, displacement)); case Double: diff -r 28dc33dc4565 -r c3760150dc29 src/share/vm/graal/graalCompilerToVM.cpp --- a/src/share/vm/graal/graalCompilerToVM.cpp Fri Jul 12 12:24:11 2013 +0200 +++ b/src/share/vm/graal/graalCompilerToVM.cpp Fri Jul 12 12:40:56 2013 +0200 @@ -1190,6 +1190,11 @@ return JNIHandles::make_local(*((oop*)address)); C2V_END +C2V_VMENTRY(jlong, readUnsafeKlassPointer, (JNIEnv *env, jobject, jobject o)) + oop resolved_o = JNIHandles::resolve(o); + jlong klass = (jlong)(address)resolved_o->klass(); + return klass; +C2V_END #define CC (char*) /*cast a literal from (const char*)*/ #define FN_PTR(f) CAST_FROM_FN_PTR(void*, &(c2v_ ## f)) @@ -1269,6 +1274,7 @@ {CC"reprofile", CC"("METASPACE_METHOD")V", FN_PTR(reprofile)}, {CC"invalidateInstalledCode", CC"("HS_INSTALLED_CODE")V", FN_PTR(invalidateInstalledCode)}, {CC"readUnsafeUncompressedPointer", CC"("OBJECT"J)"OBJECT, FN_PTR(readUnsafeUncompressedPointer)}, + {CC"readUnsafeKlassPointer", CC"("OBJECT")J", FN_PTR(readUnsafeKlassPointer)}, }; int CompilerToVM_methods_count() {