5#ifndef V8_SANDBOX_CPPHEAP_POINTER_TABLE_H_
6#define V8_SANDBOX_CPPHEAP_POINTER_TABLE_H_
18#ifdef V8_COMPRESS_POINTERS
39struct CppHeapPointerTableEntry {
42 inline void MakePointerEntry(Address value, CppHeapPointerTag tag,
49 inline Address GetPointer(CppHeapPointerTagRange tag_range)
const;
53 inline void SetPointer(Address value, CppHeapPointerTag tag);
57 inline bool HasPointer(CppHeapPointerTagRange tag_range)
const;
61 inline void MakeZappedEntry();
65 inline void MakeFreelistEntry(uint32_t next_entry_index);
71 inline uint32_t GetNextFreelistEntryIndex()
const;
75 inline void MakeEvacuationEntry(Address handle_location);
78 inline bool HasEvacuationEntry()
const;
83 inline void Evacuate(CppHeapPointerTableEntry& dest);
88 static constexpr bool IsWriteProtected =
false;
91 friend class CppHeapPointerTable;
94 Payload(Address pointer, CppHeapPointerTag tag)
95 : encoded_word_(Tag(pointer, tag)) {}
97 Address Untag(CppHeapPointerTagRange tag_range)
const {
98 Address content = encoded_word_;
99 if (
V8_LIKELY(tag_range.CheckTagOf(content))) {
124 Address Untag(CppHeapPointerTag tag)
const {
125 return Untag(CppHeapPointerTagRange(tag, tag));
128 static Address Tag(Address pointer, CppHeapPointerTag tag) {
129 return (pointer << kCppHeapPointerPayloadShift) |
133 bool IsTaggedWithTagIn(CppHeapPointerTagRange tag_range)
const {
134 return tag_range.CheckTagOf(encoded_word_);
137 bool IsTaggedWith(CppHeapPointerTag tag)
const {
138 return IsTaggedWithTagIn(CppHeapPointerTagRange(tag, tag));
143 void ClearMarkBit() { encoded_word_ &= ~kCppHeapPointerMarkBit; }
145 bool HasMarkBitSet()
const {
149 uint32_t ExtractFreelistLink()
const {
150 return static_cast<uint32_t
>(encoded_word_ >>
156 bool ContainsFreelistLink()
const {
157 return IsTaggedWith(CppHeapPointerTag::kFreeEntryTag);
160 bool ContainsEvacuationEntry()
const {
161 return IsTaggedWith(CppHeapPointerTag::kEvacuationEntryTag);
164 Address ExtractEvacuationEntryHandleLocation()
const {
165 return Untag(CppHeapPointerTag::kEvacuationEntryTag);
168 bool ContainsPointer()
const {
169 return !ContainsFreelistLink() && !ContainsEvacuationEntry();
173 return encoded_word_ == other.encoded_word_;
177 return encoded_word_ != other.encoded_word_;
184 inline Payload GetRawPayload() {
185 return payload_.load(std::memory_order_relaxed);
187 inline void SetRawPayload(Payload new_payload) {
188 return payload_.store(new_payload, std::memory_order_relaxed);
193 std::atomic<Payload> payload_;
197static_assert(
sizeof(CppHeapPointerTableEntry) == 8);
213 :
public CompactibleExternalEntityTable<
214 CppHeapPointerTableEntry, kCppHeapPointerTableReservationSize> {
216 CompactibleExternalEntityTable<CppHeapPointerTableEntry,
217 kCppHeapPointerTableReservationSize>;
221 CppHeapPointerTable() =
default;
222 CppHeapPointerTable(
const CppHeapPointerTable&) =
delete;
223 CppHeapPointerTable& operator=(
const CppHeapPointerTable&) =
delete;
226 class Space :
public Base::Space {
228 bool allocate_black() {
return allocate_black_; }
229 void set_allocate_black(
bool allocate_black) {
230 allocate_black_ = allocate_black;
234 bool allocate_black_ =
false;
242 inline Address Get(CppHeapPointerHandle handle,
243 CppHeapPointerTagRange tag_range)
const;
248 inline void Set(CppHeapPointerHandle handle, Address value,
249 CppHeapPointerTag tag);
256 Address initial_value,
257 CppHeapPointerTag tag);
267 inline void Mark(Space* space, CppHeapPointerHandle handle,
268 Address handle_location);
270 uint32_t SweepAndCompact(Space* space, Counters* counters);
272 inline bool Contains(Space* space, CppHeapPointerHandle handle)
const;
275 static inline bool IsValidHandle(CppHeapPointerHandle handle);
276 static inline uint32_t HandleToIndex(CppHeapPointerHandle handle);
279 void ResolveEvacuationEntryDuringSweeping(
280 uint32_t index, CppHeapPointerHandle* handle_location,
281 uint32_t start_of_evacuation_area);
bool operator==(PointerWithPayload< PointerType, PayloadType, NumPayloadBits > lhs, PointerWithPayload< PointerType, PayloadType, NumPayloadBits > rhs)
V8_INLINE const Operation & Get(const Graph &graph, OpIndex index)
constexpr uint64_t kCppHeapPointerMarkBit
bool operator!=(ExternalReference lhs, ExternalReference rhs)
constexpr size_t kMaxCppHeapPointers
constexpr uint64_t kCppHeapPointerPayloadShift
constexpr uint64_t kCppHeapPointerTagShift
uint32_t CppHeapPointerHandle
#define V8_EXPORT_PRIVATE
#define V8_LIKELY(condition)