5#ifndef V8_HEAP_MEMORY_CHUNK_H_
6#define V8_HEAP_MEMORY_CHUNK_H_
14#if V8_ENABLE_STICKY_MARK_BITS_BOOL
15#define UNREACHABLE_WITH_STICKY_MARK_BITS() UNREACHABLE()
17#define UNREACHABLE_WITH_STICKY_MARK_BITS()
23namespace debug_helper_internal {
24class ReadStringVisitor;
28class MemoryChunkMetadata;
29class ReadOnlyPageMetadata;
31class LargePageMetadata;
32class CodeStubAssembler;
33class ExternalReference;
49 IN_WRITABLE_SHARED_SPACE = 1u << 0,
53 POINTERS_TO_HERE_ARE_INTERESTING = 1u << 1,
54 POINTERS_FROM_HERE_ARE_INTERESTING = 1u << 2,
64 INCREMENTAL_MARKING = 1u << 5,
69 READ_ONLY_HEAP = 1u << 6,
73 IS_MAJOR_GC_IN_PROGRESS = 1u << 7,
77 CONTAINS_ONLY_OLD = 1u << 8,
81 BLACK_ALLOCATED = 1u << 9,
86 LARGE_PAGE = 1u << 10,
87 EVACUATION_CANDIDATE = 1u << 11,
88 NEVER_EVACUATE = 1u << 12,
92 PAGE_NEW_OLD_PROMOTION = 1u << 13,
99 FORCE_EVACUATION_CANDIDATE_FOR_TESTING = 1u << 14,
102 NEVER_ALLOCATE_ON_PAGE = 1u << 15,
106 PRE_FREED = 1u << 16,
110 COMPACTION_WAS_ABORTED = 1u << 17,
112 NEW_SPACE_BELOW_AGE_MARK = 1u << 18,
116 UNREGISTERED = 1u << 19,
124 IS_EXECUTABLE = 1u << 21,
129 IS_TRUSTED = 1u << 22,
135 IS_QUARANTINED = 1u << 23,
139 WILL_BE_PROMOTED = 1u << 24,
146 POINTERS_TO_HERE_ARE_INTERESTING;
148 POINTERS_FROM_HERE_ARE_INTERESTING;
150 EVACUATION_CANDIDATE;
172 return a & ~kAlignmentMask;
176 return reinterpret_cast<MemoryChunk*
>(BaseAddress(addr));
179 template <
typename HeapObject>
181 return FromAddress(
object.ptr());
189 return main_thread_flags_ & flag;
195 return IsFlagSet(IN_WRITABLE_SHARED_SPACE);
200 constexpr uintptr_t kYoungGenerationMask = FROM_PAGE | TO_PAGE;
201 return GetFlags() & kYoungGenerationMask;
206 constexpr uintptr_t kYoungOrSharedChunkMask =
207 FROM_PAGE | TO_PAGE | IN_WRITABLE_SHARED_SPACE;
208 return GetFlags() & kYoungOrSharedChunkMask;
211 void SetFlagSlow(
Flag flag);
212 void ClearFlagSlow(
Flag flag);
218 main_thread_flags_ = main_thread_flags_.without(flag);
223 main_thread_flags_ &= ~flags;
227 main_thread_flags_ = (main_thread_flags_ & ~mask) | (flags &
mask);
231 return SetFlagUnlocked(flag);
234 return ClearFlagUnlocked(flag);
238 return SetFlagsUnlocked(flags,
mask);
241 return ClearFlagsUnlocked(flags);
244 SetFlagUnlocked(IS_MAJOR_GC_IN_PROGRESS);
247 ClearFlagUnlocked(IS_MAJOR_GC_IN_PROGRESS);
254 void InitializationMemoryFence();
256#ifdef THREAD_SANITIZER
257 void SynchronizedLoad()
const;
258 bool InReadOnlySpace()
const;
263#ifdef V8_ENABLE_SANDBOX
267 bool SandboxSafeInReadOnlySpace()
const;
278 return !IsEvacuationCandidate() && !IsFlagSet(NEVER_ALLOCATE_ON_PAGE);
282 DCHECK(!(IsFlagSet(NEVER_EVACUATE) && IsFlagSet(EVACUATION_CANDIDATE)));
283 return IsFlagSet(EVACUATION_CANDIDATE);
288 return ((flags & kSkipEvacuationSlotsRecordingMask) != 0) &&
289 ((flags & COMPACTION_WAS_ABORTED) == 0);
298 return IsFlagSet(FROM_PAGE);
302 return IsFlagSet(TO_PAGE);
305 bool InNewSpace()
const {
return InYoungGeneration() && !IsLargePage(); }
307 return InYoungGeneration() && IsLargePage();
309 bool IsPinned()
const {
return IsFlagSet(PINNED); }
311 return GetFlags() & kIsOnlyOldOrMajorGCInProgressMask;
317 return (address & kAlignmentMask) == 0;
320 static MainThreadFlags OldGenerationPageFlags(
MarkingMode marking_mode,
322 static MainThreadFlags YoungGenerationPageFlags(
MarkingMode marking_mode);
324 void SetOldGenerationPageFlags(
MarkingMode marking_mode,
326 void SetYoungGenerationPageFlags(
MarkingMode marking_mode);
329 bool IsTrusted()
const;
331 bool IsTrusted()
const {
return IsFlagSet(IS_TRUSTED); }
340 return kAlignmentMask;
344 return static_cast<uint32_t
>(address) & kAlignmentMask;
348 size_t Offset(Address addr)
const;
351 size_t OffsetMaybeOutOfRange(Address addr)
const;
353 size_t Offset(Address addr)
const {
return addr - address(); }
357#ifdef V8_ENABLE_SANDBOX
368 static constexpr intptr_t kAlignment =
370 static constexpr intptr_t kAlignmentMask = kAlignment - 1;
372#ifdef V8_ENABLE_SANDBOX
373#ifndef V8_EXTERNAL_CODE_SPACE
374#error The global metadata pointer table requires a single external code space.
377 static constexpr intptr_t MetadataIndexOffset() {
382 static uint32_t MetadataTableIndex(Address chunk_address);
385 return IsolateGroup::current()->metadata_pointer_table();
389 friend class debug_helper_internal::ReadStringVisitor;
391 friend class ExternalReference;
392 friend class TestDebugHelper;
406#ifdef V8_ENABLE_SANDBOX
407 uint32_t metadata_index_;
434 reinterpret_cast<uintptr_t
>(chunk)) >>
450#undef UNREACHABLE_WITH_STICKY_MARK_BITS
#define DEFINE_OPERATORS_FOR_FLAGS(Type)
constexpr int kPageSizeBits
V8_INLINE bool InTrustedSpace() const
static constexpr uint32_t AddressToOffset(Address address)
MainThreadFlags main_thread_flags_
V8_INLINE bool InWritableSharedSpace() const
V8_INLINE bool IsYoungOrSharedChunk() const
static constexpr Address BaseAddress(Address a)
bool IsEvacuationCandidate() const
bool IsOnlyOldOrMajorMarkingOn() const
static constexpr intptr_t FlagsOffset()
V8_INLINE void SetMajorGCInProgress()
V8_INLINE void SetFlagNonExecutable(Flag flag)
V8_INLINE void SetFlagUnlocked(Flag flag)
size_t OffsetMaybeOutOfRange(Address addr) const
static constexpr intptr_t MetadataOffset()
Executability executable() const
V8_INLINE bool IsFlagSet(Flag flag) const
V8_INLINE Address address() const
V8_INLINE void SetFlagsNonExecutable(MainThreadFlags flags, MainThreadFlags mask=kAllFlagsMask)
static V8_INLINE MemoryChunk * FromAddress(Address addr)
V8_INLINE void ClearFlagUnlocked(Flag flag)
bool NeverEvacuate() const
V8_INLINE void SetFlagsUnlocked(MainThreadFlags flags, MainThreadFlags mask=kAllFlagsMask)
size_t Offset(Address addr) const
V8_INLINE void ResetMajorGCInProgress()
static constexpr intptr_t GetAlignmentMaskForAssembler()
V8_INLINE void ClearFlagsNonExecutable(MainThreadFlags flags)
V8_INLINE bool InYoungGeneration() const
V8_INLINE bool InCodeSpace() const
bool IsQuarantined() const
bool ShouldSkipEvacuationSlotRecording() const
V8_INLINE void ClearFlagNonExecutable(Flag flag)
static V8_INLINE MemoryChunk * FromHeapObject(Tagged< HeapObject > object)
bool InNewLargeObjectSpace() const
V8_INLINE bool InReadOnlySpace() const
MemoryChunkMetadata * metadata_
V8_INLINE void ClearFlagsUnlocked(MainThreadFlags flags)
V8_INLINE MainThreadFlags GetFlags() const
static V8_INLINE constexpr bool IsAligned(Address address)
V8_INLINE bool IsMarking() const
static intptr_t GetAlignmentForAllocation()
#define UNREACHABLE_WITH_STICKY_MARK_BITS()
Tagged(T object) -> Tagged< T >
#define DCHECK(condition)
#define V8_EXPORT_PRIVATE
V8_INLINE size_t operator()(const i::MemoryChunk *chunk) const
V8_INLINE size_t operator()(i::MemoryChunk *chunk) const