< prev index next >

src/hotspot/share/runtime/vmStructs.cpp

Print this page
@@ -145,10 +145,20 @@
  
  #include CPU_HEADER(vmStructs)
  #include OS_HEADER(vmStructs)
  #include OS_CPU_HEADER(vmStructs)
  
+ // Used by VMStructs when CompactObjectHeaders are enabled.
+ // Must match the relevant parts from the real oopDesc.
+ class fakeOopDesc {
+ private:
+   union _metadata {
+     Klass*      _klass;
+     narrowKlass _compressed_klass;
+   } _metadata;
+ };
+ 
  // Note: the cross-product of (c1, c2, product, nonproduct, ...),
  // (nonstatic, static), and (unchecked, checked) has not been taken.
  // Only the macros currently needed have been defined.
  
  // A field whose type is not checked is given a null string as the

@@ -1154,10 +1164,12 @@
    declare_toplevel_type(oopDesc)                                          \
      declare_type(arrayOopDesc, oopDesc)                                   \
        declare_type(objArrayOopDesc, arrayOopDesc)                         \
      declare_type(instanceOopDesc, oopDesc)                                \
                                                                            \
+   declare_toplevel_type(fakeOopDesc)                                      \
+                                                                           \
    /**************************************************/                    \
    /* MetadataOopDesc hierarchy (NOTE: some missing) */                    \
    /**************************************************/                    \
                                                                            \
    declare_toplevel_type(MetaspaceObj)                                     \

@@ -2507,21 +2519,26 @@
                                                                            \
    declare_constant(markWord::age_bits)                                    \
    declare_constant(markWord::lock_bits)                                   \
    declare_constant(markWord::max_hash_bits)                               \
    declare_constant(markWord::hash_bits)                                   \
+   declare_constant(markWord::hash_bits_compact)                           \
                                                                            \
    declare_constant(markWord::lock_shift)                                  \
    declare_constant(markWord::age_shift)                                   \
    declare_constant(markWord::hash_shift)                                  \
+   declare_constant(markWord::hash_shift_compact)                          \
+   LP64_ONLY(declare_constant(markWord::klass_shift))                      \
                                                                            \
    declare_constant(markWord::lock_mask)                                   \
    declare_constant(markWord::lock_mask_in_place)                          \
    declare_constant(markWord::age_mask)                                    \
    declare_constant(markWord::age_mask_in_place)                           \
    declare_constant(markWord::hash_mask)                                   \
    declare_constant(markWord::hash_mask_in_place)                          \
+   declare_constant(markWord::hash_mask_compact)                           \
+   declare_constant(markWord::hash_mask_compact_in_place)                  \
                                                                            \
    declare_constant(markWord::locked_value)                                \
    declare_constant(markWord::unlocked_value)                              \
    declare_constant(markWord::monitor_value)                               \
    declare_constant(markWord::marked_value)                                \

@@ -3054,5 +3071,31 @@
  
  void vmStructs_init() {
    VMStructs::init();
  }
  #endif // ASSERT
+ 
+ void VMStructs::compact_headers_overrides() {
+   assert(UseCompactObjectHeaders, "Should have been checked before");
+ 
+   // We cannot allow SA and other facilities to poke into VM internal fields
+   // expecting the class pointers there. This will crash in the best case,
+   // or yield incorrect execution in the worst case. This code hides the
+   // risky fields from external code by replacing their original container
+   // type to a fake one. The fake type should exist for VMStructs verification
+   // code to work.
+ 
+   size_t len = localHotSpotVMStructsLength();
+   for (size_t off = 0; off < len; off++) {
+     VMStructEntry* e = &localHotSpotVMStructs[off];
+     if (e == nullptr) continue;
+     if (e->typeName == nullptr) continue;
+     if (e->fieldName == nullptr) continue;
+ 
+     if (strcmp(e->typeName, "oopDesc") == 0) {
+       if ((strcmp(e->fieldName, "_metadata._klass") == 0) ||
+           (strcmp(e->fieldName, "_metadata._compressed_klass") == 0)) {
+         e->typeName = "fakeOopDesc";
+       }
+     }
+   }
+ }
< prev index next >