changeset 6367:cc402f4396f4

deleted caching of initial mark word in HotSpotResolvedJavaType. This value is modified by the biased locking mechanism and so it not constant for a Klass
author Doug Simon <doug.simon@oracle.com>
date Wed, 12 Sep 2012 23:50:37 +0200
parents 67ee6f880ef3
children 43e274f43a9a
files graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/HotSpotVMConfig.java 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/HotSpotResolvedJavaType.java graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/target/amd64/HotSpotXirGenerator.java src/share/vm/graal/graalCompiler.cpp src/share/vm/graal/graalCompilerToVM.cpp src/share/vm/graal/graalJavaAccess.hpp
diffstat 8 files changed, 27 insertions(+), 13 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/HotSpotVMConfig.java	Wed Sep 12 23:37:39 2012 +0200
+++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/HotSpotVMConfig.java	Wed Sep 12 23:50:37 2012 +0200
@@ -60,6 +60,11 @@
     public int hubOffset;
 
     /**
+     * The offset of the _prototype_header field in a Klass.
+     */
+    public int initialMarkWordOffset;
+
+    /**
      * The offset of an the array length in an array's header.
      */
     public int arrayLengthOffset;
@@ -106,8 +111,6 @@
 
     public int threadObjectOffset;
 
-    public int instanceHeaderPrototypeOffset;
-
     public int threadExceptionOopOffset;
     public int threadExceptionPcOffset;
     public int threadMultiNewArrayStorageOffset;
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/bridge/CompilerToVM.java	Wed Sep 12 23:37:39 2012 +0200
+++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/bridge/CompilerToVM.java	Wed Sep 12 23:50:37 2012 +0200
@@ -117,5 +117,7 @@
 
     String decodePC(long pc);
 
+    long JavaType_initialMarkWord(HotSpotResolvedJavaType hotSpotResolvedJavaType);
+
     // Checkstyle: resume
 }
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/bridge/CompilerToVMImpl.java	Wed Sep 12 23:37:39 2012 +0200
+++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/bridge/CompilerToVMImpl.java	Wed Sep 12 23:50:37 2012 +0200
@@ -167,5 +167,8 @@
     @Override
     public native String decodePC(long pc);
 
+    @Override
+    public native long JavaType_initialMarkWord(HotSpotResolvedJavaType type);
+
     // Checkstyle: resume
 }
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotResolvedJavaType.java	Wed Sep 12 23:37:39 2012 +0200
+++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotResolvedJavaType.java	Wed Sep 12 23:50:37 2012 +0200
@@ -55,11 +55,6 @@
     private boolean isInitialized;
     private ResolvedJavaType arrayOfType;
 
-    /**
-     * Initial value for the mark word in a new object of this type.
-     */
-    private long initialMarkWord;
-
     private HotSpotResolvedJavaType() {
         throw new GraalInternalError(HotSpotResolvedJavaType.class + " should only be created from C++ code");
     }
@@ -294,6 +289,6 @@
     }
 
     public long initialMarkWord() {
-        return initialMarkWord;
+        return HotSpotGraalRuntime.getInstance().getCompilerToVM().JavaType_initialMarkWord(this);
     }
 }
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/target/amd64/HotSpotXirGenerator.java	Wed Sep 12 23:37:39 2012 +0200
+++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/target/amd64/HotSpotXirGenerator.java	Wed Sep 12 23:50:37 2012 +0200
@@ -294,7 +294,7 @@
 
             asm.bindInline(resume);
 
-            asm.pload(target.wordKind, temp1, hub, asm.i(config.instanceHeaderPrototypeOffset), false);
+            asm.pload(target.wordKind, temp1, hub, asm.i(config.initialMarkWordOffset), false);
             asm.pstore(target.wordKind, result, asm.i(config.markOffset), temp1, false);
             asm.mov(temp1o, hub); // need a temporary register since Intel cannot store 64-bit constants to memory
             asm.pstore(Kind.Object, result, asm.i(config.hubOffset), temp1o, false);
@@ -380,7 +380,7 @@
             asm.pstore(target.wordKind, thread, asm.i(config.threadTlabTopOffset), temp1, false);
 
             // Now the new object is in result, store mark word and klass
-            asm.pload(target.wordKind, temp1, hub, asm.i(config.instanceHeaderPrototypeOffset), false);
+            asm.pload(target.wordKind, temp1, hub, asm.i(config.initialMarkWordOffset), false);
             asm.pstore(target.wordKind, result, asm.i(config.markOffset), temp1, false);
             asm.mov(temp1o, hub); // need a temporary register since Intel cannot store 64-bit constants to memory
             asm.pstore(Kind.Object, result, asm.i(config.hubOffset), temp1o, false);
--- a/src/share/vm/graal/graalCompiler.cpp	Wed Sep 12 23:37:39 2012 +0200
+++ b/src/share/vm/graal/graalCompiler.cpp	Wed Sep 12 23:50:37 2012 +0200
@@ -273,7 +273,6 @@
   HotSpotResolvedJavaType::set_accessFlags(obj, klass->access_flags().as_int());
   HotSpotResolvedJavaType::set_isInterface(obj, klass->is_interface());
   HotSpotResolvedJavaType::set_superCheckOffset(obj, klass->super_check_offset());
-  HotSpotResolvedJavaType::set_initialMarkWord(obj, (jlong) klass->prototype_header());
   HotSpotResolvedJavaType::set_isInstanceClass(obj, klass->oop_is_instance());
 
   if (klass->oop_is_javaArray()) {
--- a/src/share/vm/graal/graalCompilerToVM.cpp	Wed Sep 12 23:37:39 2012 +0200
+++ b/src/share/vm/graal/graalCompilerToVM.cpp	Wed Sep 12 23:50:37 2012 +0200
@@ -551,6 +551,18 @@
 }
 
 // public JavaType JavaType_superType(HotSpotResolvedType klass);
+JNIEXPORT jlong JNICALL Java_com_oracle_graal_hotspot_bridge_CompilerToVMImpl_JavaType_initialMarkWord(JNIEnv *, jobject, jobject klass) {
+  TRACE_graal_3("CompilerToVM::JavaType_superType");
+  VM_ENTRY_MARK;
+  KlassHandle klass_handle(java_lang_Class::as_klassOop(HotSpotResolvedJavaType::javaMirror(klass)));
+  if (klass_handle->oop_is_array()) {
+    return (int32_t)(intptr_t) markOopDesc::prototype();
+  } else {
+    return (jlong) (intptr_t) klass_handle->prototype_header();
+  }
+}
+
+// public JavaType JavaType_superType(HotSpotResolvedType klass);
 JNIEXPORT jobject JNICALL Java_com_oracle_graal_hotspot_bridge_CompilerToVMImpl_JavaType_1superType(JNIEnv *, jobject, jobject klass) {
   TRACE_graal_3("CompilerToVM::JavaType_superType");
   VM_ENTRY_MARK;
@@ -724,6 +736,7 @@
   set_int(env, config, "stackShadowPages", StackShadowPages);
   set_int(env, config, "hubOffset", oopDesc::klass_offset_in_bytes());
   set_int(env, config, "markOffset", oopDesc::mark_offset_in_bytes());
+  set_int(env, config, "initialMarkWordOffset", in_bytes(Klass::prototype_header_offset()));
   set_int(env, config, "superCheckOffsetOffset", in_bytes(Klass::super_check_offset_offset()));
   set_int(env, config, "secondarySuperCacheOffset", in_bytes(Klass::secondary_super_cache_offset()));
   set_int(env, config, "secondarySupersOffset", in_bytes(Klass::secondary_supers_offset()));
@@ -733,7 +746,6 @@
   set_int(env, config, "threadTlabTopOffset", in_bytes(JavaThread::tlab_top_offset()));
   set_int(env, config, "threadTlabEndOffset", in_bytes(JavaThread::tlab_end_offset()));
   set_int(env, config, "threadObjectOffset", in_bytes(JavaThread::threadObj_offset()));
-  set_int(env, config, "instanceHeaderPrototypeOffset", in_bytes(Klass::prototype_header_offset()));
   set_int(env, config, "threadExceptionOopOffset", in_bytes(JavaThread::exception_oop_offset()));
   set_int(env, config, "threadExceptionPcOffset", in_bytes(JavaThread::exception_pc_offset()));
   set_int(env, config, "threadMultiNewArrayStorageOffset", in_bytes(JavaThread::graal_multinewarray_storage_offset()));
@@ -1035,6 +1047,7 @@
   {CC"JavaType_componentType",              CC"("RESOLVED_TYPE")"TYPE,                            FN_PTR(JavaType_1componentType)},
   {CC"JavaType_uniqueConcreteSubtype",      CC"("RESOLVED_TYPE")"TYPE,                            FN_PTR(JavaType_1uniqueConcreteSubtype)},
   {CC"JavaType_superType",                  CC"("RESOLVED_TYPE")"TYPE,                            FN_PTR(JavaType_1superType)},
+  {CC"JavaType_initialMarkWord",            CC"("RESOLVED_TYPE")J",                               FN_PTR(JavaType_initialMarkWord)},
   {CC"JavaType_arrayOf",                    CC"("RESOLVED_TYPE")"TYPE,                            FN_PTR(JavaType_1arrayOf)},
   {CC"JavaType_fields",                     CC"("RESOLVED_TYPE")["RESOLVED_FIELD,                 FN_PTR(JavaType_1fields)},
   {CC"JavaType_isInitialized",              CC"("RESOLVED_TYPE")Z",                               FN_PTR(JavaType_1isInitialized)},
--- a/src/share/vm/graal/graalJavaAccess.hpp	Wed Sep 12 23:37:39 2012 +0200
+++ b/src/share/vm/graal/graalJavaAccess.hpp	Wed Sep 12 23:50:37 2012 +0200
@@ -52,7 +52,6 @@
     oop_field(HotSpotResolvedJavaType, javaMirror, "Ljava/lang/Class;")                     \
     oop_field(HotSpotResolvedJavaType, simpleName, "Ljava/lang/String;")                    \
     int_field(HotSpotResolvedJavaType, accessFlags)                                         \
-    long_field(HotSpotResolvedJavaType, initialMarkWord)                                    \
     boolean_field(HotSpotResolvedJavaType, hasFinalizer)                                    \
     boolean_field(HotSpotResolvedJavaType, hasFinalizableSubclass)                          \
     int_field(HotSpotResolvedJavaType, superCheckOffset)                                    \