5#ifndef V8_SANDBOX_CODE_POINTER_TABLE_INL_H_
6#define V8_SANDBOX_CODE_POINTER_TABLE_INL_H_
14#ifdef V8_COMPRESS_POINTERS
19void CodePointerTableEntry::MakeCodePointerEntry(
Address code,
27 if (mark_as_alive) code |= kMarkingBit;
28 entrypoint_.store(entrypoint ^ tag, std::memory_order_relaxed);
29 code_.store(code, std::memory_order_relaxed);
33 DCHECK(!IsFreelistEntry());
34 return entrypoint_.load(std::memory_order_relaxed) ^ tag;
37void CodePointerTableEntry::SetEntrypoint(
Address value,
39 DCHECK(!IsFreelistEntry());
43 entrypoint_.store(value ^ tag, std::memory_order_relaxed);
46Address CodePointerTableEntry::GetCodeObject()
const {
47 DCHECK(!IsFreelistEntry());
50 return code_.load(std::memory_order_relaxed) | kMarkingBit;
53void CodePointerTableEntry::SetCodeObject(
Address new_value) {
54 DCHECK(!IsFreelistEntry());
59 code_.store(new_value, std::memory_order_relaxed);
62void CodePointerTableEntry::MakeFreelistEntry(uint32_t next_entry_index) {
64 entrypoint_.store(value, std::memory_order_relaxed);
68bool CodePointerTableEntry::IsFreelistEntry()
const {
69 auto entrypoint = entrypoint_.load(std::memory_order_relaxed);
73uint32_t CodePointerTableEntry::GetNextFreelistEntryIndex()
const {
74 return static_cast<uint32_t
>(entrypoint_.load(std::memory_order_relaxed));
77void CodePointerTableEntry::Mark() {
78 Address old_value =
code_.load(std::memory_order_relaxed);
79 Address new_value = old_value | kMarkingBit;
84 bool success =
code_.compare_exchange_strong(old_value, new_value,
85 std::memory_order_relaxed);
86 DCHECK(success || (old_value & kMarkingBit) == kMarkingBit);
90void CodePointerTableEntry::Unmark() {
92 value &= ~kMarkingBit;
93 code_.store(value, std::memory_order_relaxed);
96bool CodePointerTableEntry::IsMarked()
const {
98 return value & kMarkingBit;
103 uint32_t index = HandleToIndex(
handle);
104 return at(index).GetEntrypoint(tag);
108 uint32_t index = HandleToIndex(
handle);
113 return at(index).GetCodeObject();
119 uint32_t index = HandleToIndex(
handle);
121 at(index).SetEntrypoint(value, tag);
126 uint32_t index = HandleToIndex(
handle);
128 at(index).SetCodeObject(value);
133 DCHECK(space->BelongsTo(
this));
134 uint32_t index = AllocateEntry(space);
136 at(index).MakeCodePointerEntry(code, entrypoint, tag,
137 space->allocate_black());
138 return IndexToHandle(index);
142 DCHECK(space->BelongsTo(
this));
146 uint32_t index = HandleToIndex(
handle);
147 DCHECK(space->Contains(index));
153template <
typename Callback>
154void CodePointerTable::IterateActiveEntriesIn(Space* space, Callback
callback) {
155 IterateEntriesIn(space, [&](uint32_t index) {
156 if (!at(index).IsFreelistEntry()) {
157 callback(IndexToHandle(index), at(index).GetCodeObject());
ZoneList< RegExpInstruction > code_
V8_INLINE IndirectHandle< T > handle(Tagged< T > object, Isolate *isolate)
@ kFreeCodePointerTableEntryTag
IndirectPointerHandle CodePointerHandle
constexpr uint32_t kCodePointerHandleShift
constexpr CodePointerHandle kNullCodePointerHandle
static constexpr Address kNullAddress
constexpr uint32_t kCodePointerHandleMarker
RwxMemoryWriteScope CFIMetadataWriteScope
constexpr int kCodeEntrypointTagShift
#define DCHECK_NE(v1, v2)
#define DCHECK(condition)
#define DCHECK_EQ(v1, v2)