< prev index next >
src/hotspot/share/oops/oop.hpp
Print this page
*** 26,45 ****
--- 26,82 ----
#define SHARE_OOPS_OOP_HPP
#include "memory/iterator.hpp"
#include "memory/memRegion.hpp"
#include "oops/access.hpp"
+ #include "oops/arrayStorageProperties.hpp"
#include "oops/metadata.hpp"
#include "runtime/atomic.hpp"
#include "utilities/macros.hpp"
// oopDesc is the top baseclass for objects classes. The {name}Desc classes describe
// the format of Java objects so the fields can be accessed from C++.
// oopDesc is abstract.
// (see oopHierarchy for complete oop class hierarchy)
//
// no virtual functions allowed
+ //
+ // oopDesc::_mark - the "oop mark word" encoding to be found separately in markOop.hpp
+ //
+ // oopDesc::_metadata - encodes both the object's klass pointer and potentially
+ // "storage properties" (currently confined to arrays in the form of
+ // ArrayStorageProperties). Storage properties are peculiar to the
+ // *instance*, and not necessarily the "type".
+ //
+ // The overall size of the _metadata field is dependent on "UseCompressedClassPointers",
+ // hence the terms "narrow" (32 bits) vs "wide" (64 bits).
+ //
+ // "Wide" encoding of _metadata:
+ // bit number |63 0|
+ // bit length |--3|-----61-----|
+ // --------------------------------------
+ // _klass [xxx| Klass* ]
+ // _wide_storage_props [ sp| ]
+ // --------------------------------------
+ // with:
+ // xxx = klass_mask(), Klass* = Klass pointer to be masked
+ // sp = storage properties, bit number: wide_storage_props_shift
+ //
+ // "Narrow" encoding of _metadata:
+ // bit number |31 0|
+ // bit length |--3|-----29-----|
+ // ----------------------------------------
+ // _compressed_klass [xxx| narrowKlass]
+ // _narrow_storage_props [ sp| ]
+ // ----------------------------------------
+ // with:
+ // xxx = compressed_klass_mask(), narrowKlass = compressed Klass pointer to be masked
+ // narrowKlass may be further decoded (Klass::decode_klass()) to produce Klass*
+ // sp = storage properties, bit number: narrow_storage_props_shift
+ //
+ // Storage properties encodings are current confined to arrayStorageProperties.hpp
+
extern bool always_do_update_barrier;
// Forward declarations.
class OopClosure;
*** 57,66 ****
--- 94,105 ----
private:
volatile markOop _mark;
union _metadata {
Klass* _klass;
narrowKlass _compressed_klass;
+ uintptr_t _wide_storage_props;
+ uint32_t _narrow_storage_props;
} _metadata;
public:
inline markOop mark() const;
inline markOop mark_raw() const;
*** 77,86 ****
--- 116,136 ----
// Used only to re-initialize the mark word (e.g., of promoted
// objects during a GC) -- requires a valid klass pointer
inline void init_mark();
inline void init_mark_raw();
+ enum {
+ storage_props_nof_bits = LogKlassAlignmentInBytes, // This alignment gives us some "free bits"
+ narrow_storage_props_shift = (sizeof(narrowKlass) << 3) - storage_props_nof_bits,
+ wide_storage_props_shift = (sizeof(Klass*) << 3) - storage_props_nof_bits,
+ };
+
+ static inline narrowKlass compressed_klass_mask();
+ static inline narrowKlass compressed_klass_masked(narrowKlass raw);
+ static inline uintptr_t klass_mask();
+ static inline Klass* klass_masked(uintptr_t raw);
+
inline Klass* klass() const;
inline Klass* klass_or_null() const volatile;
inline Klass* klass_or_null_acquire() const volatile;
static inline Klass** klass_addr(HeapWord* mem);
static inline narrowKlass* compressed_klass_addr(HeapWord* mem);
*** 88,97 ****
--- 138,154 ----
inline narrowKlass* compressed_klass_addr();
inline void set_klass(Klass* k);
static inline void release_set_klass(HeapWord* mem, Klass* klass);
+ // Extra container metadata specific to arrays (encoded into high bits of _metadata)
+ static inline uintptr_t* wide_metadata_addr(HeapWord* mem);
+ inline ArrayStorageProperties array_storage_properties() const;
+ inline void set_metadata(ArrayStorageProperties storage_props, Klass* k);
+ static inline void release_set_metadata(HeapWord* mem, ArrayStorageProperties storage_props, Klass* klass);
+
+
// For klass field compression
inline int klass_gap() const;
inline void set_klass_gap(int z);
static inline void set_klass_gap(HeapWord* mem, int z);
// For when the klass pointer is being used as a linked list "next" field.
< prev index next >