5#ifndef V8_SANDBOX_CPPHEAP_POINTER_TABLE_INL_H_
6#define V8_SANDBOX_CPPHEAP_POINTER_TABLE_INL_H_
13#ifdef V8_COMPRESS_POINTERS
18void CppHeapPointerTableEntry::MakePointerEntry(
Address value,
26 Payload new_payload(value, tag);
27 DCHECK(!new_payload.HasMarkBitSet());
29 new_payload.SetMarkBit();
31 payload_.store(new_payload, std::memory_order_relaxed);
34Address CppHeapPointerTableEntry::GetPointer(
35 CppHeapPointerTagRange tag_range)
const {
36 auto payload = payload_.load(std::memory_order_relaxed);
37 DCHECK(payload.ContainsPointer());
38 return payload.Untag(tag_range);
41void CppHeapPointerTableEntry::SetPointer(
Address value,
47 DCHECK(payload_.load(std::memory_order_relaxed).ContainsPointer());
49 Payload new_payload(value, tag);
50 payload_.store(new_payload, std::memory_order_relaxed);
53bool CppHeapPointerTableEntry::HasPointer(
54 CppHeapPointerTagRange tag_range)
const {
55 auto payload = payload_.load(std::memory_order_relaxed);
56 return payload.IsTaggedWithTagIn(tag_range);
59void CppHeapPointerTableEntry::MakeZappedEntry() {
61 payload_.store(new_payload, std::memory_order_relaxed);
64void CppHeapPointerTableEntry::MakeFreelistEntry(uint32_t next_entry_index) {
65 static_assert(kMaxCppHeapPointers <= std::numeric_limits<uint32_t>::max());
67 payload_.store(new_payload, std::memory_order_relaxed);
70uint32_t CppHeapPointerTableEntry::GetNextFreelistEntryIndex()
const {
71 auto payload = payload_.load(std::memory_order_relaxed);
72 return payload.ExtractFreelistLink();
75void CppHeapPointerTableEntry::Mark() {
76 auto old_payload = payload_.load(std::memory_order_relaxed);
77 DCHECK(old_payload.ContainsPointer());
79 auto new_payload = old_payload;
80 new_payload.SetMarkBit();
85 payload_.compare_exchange_strong(old_payload, new_payload,
86 std::memory_order_relaxed);
89void CppHeapPointerTableEntry::MakeEvacuationEntry(
Address handle_location) {
91 payload_.store(new_payload, std::memory_order_relaxed);
94bool CppHeapPointerTableEntry::HasEvacuationEntry()
const {
95 auto payload = payload_.load(std::memory_order_relaxed);
96 return payload.ContainsEvacuationEntry();
99void CppHeapPointerTableEntry::Evacuate(CppHeapPointerTableEntry& dest) {
100 auto payload = payload_.load(std::memory_order_relaxed);
102 DCHECK(payload.ContainsPointer());
108 DCHECK(!payload.HasMarkBitSet());
110 dest.payload_.store(payload, std::memory_order_relaxed);
117 CppHeapPointerTagRange tag_range)
const {
118 uint32_t index = HandleToIndex(
handle);
119 DCHECK(index == 0 || at(index).HasPointer(tag_range));
120 return at(index).GetPointer(tag_range);
126 uint32_t index = HandleToIndex(
handle);
127 at(index).SetPointer(value, tag);
132 DCHECK(space->BelongsTo(
this));
133 uint32_t index = AllocateEntry(space);
134 at(index).MakePointerEntry(initial_value, tag, space->allocate_black());
143 DCHECK(space->BelongsTo(
this));
159 uint32_t index = HandleToIndex(
handle);
160 DCHECK(space->Contains(index));
164 MaybeCreateEvacuationEntry(space, index, handle_location);
173 uint32_t index =
handle >> kCppHeapPointerIndexShift;
174 return handle == index << kCppHeapPointerIndexShift;
180 uint32_t index =
handle >> kCppHeapPointerIndexShift;
193bool CppHeapPointerTable::Contains(Space* space,
195 DCHECK(space->BelongsTo(
this));
196 return space->Contains(HandleToIndex(
handle));
static T Acquire_Load(T *addr)
V8_INLINE IndirectHandle< T > handle(Tagged< T > object, Isolate *isolate)
constexpr size_t kMaxCppHeapPointers
constexpr uint64_t kCppHeapPointerPayloadShift
constexpr int kBitsPerSystemPointer
uint32_t CppHeapPointerHandle
static constexpr Address kNullAddress
constexpr CppHeapPointerHandle kNullCppHeapPointerHandle
#define DCHECK_LE(v1, v2)
#define DCHECK_NE(v1, v2)
#define DCHECK(condition)
#define DCHECK_EQ(v1, v2)
#define V8_UNLIKELY(condition)