diff a/src/hotspot/share/oops/fieldInfo.hpp b/src/hotspot/share/oops/fieldInfo.hpp
--- a/src/hotspot/share/oops/fieldInfo.hpp
+++ b/src/hotspot/share/oops/fieldInfo.hpp
@@ -64,28 +64,34 @@
  public:
 
   class FieldFlags {
     friend class VMStructs;
     friend class JVMCIVMStructs;
+    friend class FieldDesc;
 
     // The ordering of this enum is totally internal.  More frequent
     // flags should come earlier than less frequent ones, because
     // earlier ones compress better.
     enum FieldFlagBitPosition {
+      _ff_null_free_inline_type,  // field's type is an inline type and the field is null free
+      _ff_flat,         // field is a flat field
       _ff_initialized,  // has ConstantValue initializer attribute
       _ff_injected,     // internal field injected by the JVM
       _ff_generic,      // has a generic signature
       _ff_stable,       // trust as stable b/c declared as @Stable
       _ff_contended,    // is contended, may have contention-group
+      _ff_null_marker,  // field has a null marker, optional section include the null marker offset
+      _ff_internal_null_marker // null marker is internal (inside the layout of a flat field)
     };
 
     // Some but not all of the flag bits signal the presence of an
     // additional 32-bit item in the field record.
     static const u4 _optional_item_bit_mask =
       flag_mask((int)_ff_initialized) |
       flag_mask((int)_ff_generic)     |
-      flag_mask((int)_ff_contended);
+      flag_mask((int)_ff_contended)   |
+      flag_mask((int)_ff_null_marker);
 
     // boilerplate:
     u4 _flags;
 
     bool test_flag(FieldFlagBitPosition pos) const {
@@ -104,20 +110,28 @@
     bool has_any_optionals() const {
       return (_flags & _optional_item_bit_mask) != 0;
     }
 
     bool is_initialized() const     { return test_flag(_ff_initialized); }
+    bool is_null_free_inline_type() const { return test_flag(_ff_null_free_inline_type); }
+    bool is_flat() const            { return test_flag(_ff_flat); }
     bool is_injected() const        { return test_flag(_ff_injected); }
     bool is_generic() const         { return test_flag(_ff_generic); }
     bool is_stable() const          { return test_flag(_ff_stable); }
     bool is_contended() const       { return test_flag(_ff_contended); }
+    bool has_null_marker() const    { return test_flag(_ff_null_marker); }
+    bool is_null_marker_internal() const {return test_flag(_ff_internal_null_marker); }
 
     void update_initialized(bool z) { update_flag(_ff_initialized, z); }
+    void update_null_free_inline_type(bool z) { update_flag(_ff_null_free_inline_type, z); }
+    void update_flat(bool z)        { update_flag(_ff_flat, z); }
     void update_injected(bool z)    { update_flag(_ff_injected, z); }
     void update_generic(bool z)     { update_flag(_ff_generic, z); }
     void update_stable(bool z)      { update_flag(_ff_stable, z); }
     void update_contended(bool z)   { update_flag(_ff_contended, z); }
+    void update_null_marker(bool z) { update_flag(_ff_null_marker, z); }
+    void update_internal_null_marker(bool z) { update_flag(_ff_internal_null_marker, z); }
   };
 
  private:
   // The following items are the unpacked bitwise information content
   // of a field record.  Per-field metadata extracted from the class
@@ -129,10 +143,11 @@
   u2 _name_index;               // index in CP of name
   u2 _signature_index;          // index in CP of descriptor
   u4 _offset;                   // offset in object layout
   AccessFlags _access_flags;    // access flags (JVM spec)
   FieldFlags _field_flags;      // VM defined flags (not JVM spec)
+  u4 _null_marker_offset;       // null marker offset for this field in the object layout
   u2 _initializer_index;        // index from ConstantValue attr (or 0)
   u2 _generic_signature_index;  // index from GenericSignature attr (or 0)
   u2 _contention_group;         // index from @Contended group item (or 0)
 
  public:
@@ -140,20 +155,22 @@
   FieldInfo() : _name_index(0),
                 _signature_index(0),
                 _offset(0),
                 _access_flags(AccessFlags(0)),
                 _field_flags(FieldFlags(0)),
+                _null_marker_offset(0),
                 _initializer_index(0),
                 _generic_signature_index(0),
                 _contention_group(0) { }
 
   FieldInfo(AccessFlags access_flags, u2 name_index, u2 signature_index, u2 initval_index, FieldInfo::FieldFlags fflags) :
             _name_index(name_index),
             _signature_index(signature_index),
             _offset(0),
             _access_flags(access_flags),
             _field_flags(fflags),
+            _null_marker_offset(0),
             _initializer_index(initval_index),
             _generic_signature_index(0),
             _contention_group(0) {
               if (initval_index != 0) {
                 _field_flags.update_initialized(true);
@@ -169,10 +186,12 @@
   u4 offset() const                          { return _offset; }
   void set_offset(u4 offset)                 { _offset = offset; }
   AccessFlags access_flags() const           { return _access_flags; }
   FieldFlags field_flags() const             { return _field_flags; }
   FieldFlags* field_flags_addr()             { return &_field_flags; }
+  u4 null_marker_offset() const              { return _null_marker_offset; }
+  void set_null_marker_offset(u4 offset)     { _null_marker_offset = offset; }
   u2 initializer_index() const               { return _initializer_index; }
   void set_initializer_index(u2 index)       { _initializer_index = index; }
   u2 generic_signature_index() const         { return _generic_signature_index; }
   void set_generic_signature_index(u2 index) { _generic_signature_index = index; }
   u2 contention_group() const                { return _contention_group; }
