48class VerifySmisVisitor final :
public RootVisitor {
50 void VisitRootPointers(Root root,
const char* description,
51 FullObjectSlot
start, FullObjectSlot
end)
final {
63class VerifyPointersVisitor :
public HeapVisitor<VerifyPointersVisitor>,
69 void VisitPointers(Tagged<HeapObject> host, ObjectSlot
start,
70 ObjectSlot
end)
override;
71 void VisitPointers(Tagged<HeapObject> host, MaybeObjectSlot
start,
72 MaybeObjectSlot
end)
override;
73 void VisitInstructionStreamPointer(Tagged<Code> host,
74 InstructionStreamSlot slot)
override;
75 void VisitCodeTarget(Tagged<InstructionStream> host,
76 RelocInfo* rinfo)
override;
77 void VisitEmbeddedPointer(Tagged<InstructionStream> host,
78 RelocInfo* rinfo)
override;
80 void VisitRootPointers(Root root,
const char* description,
81 FullObjectSlot
start, FullObjectSlot
end)
override;
82 void VisitRootPointers(Root root,
const char* description,
83 OffHeapObjectSlot
start,
84 OffHeapObjectSlot
end)
override;
85 void VisitMapPointer(Tagged<HeapObject> host)
override;
88 V8_INLINE void VerifyHeapObjectImpl(Tagged<HeapObject> heap_object);
89 V8_INLINE void VerifyCodeObjectImpl(Tagged<HeapObject> heap_object);
91 template <
typename TSlot>
94 virtual void VerifyPointers(Tagged<HeapObject> host, MaybeObjectSlot
start,
111void VerifyPointersVisitor::VisitInstructionStreamPointer(
116 if (maybe_code.GetHeapObject(&code)) {
117 VerifyCodeObjectImpl(code);
123void VerifyPointersVisitor::VisitRootPointers(
Root root,
124 const char* description,
125 FullObjectSlot
start,
126 FullObjectSlot
end) {
130void VerifyPointersVisitor::VisitRootPointers(
Root root,
131 const char* description,
138 VerifyHeapObjectImpl(host->map(cage_base()));
141void VerifyPointersVisitor::VerifyHeapObjectImpl(
144 CHECK(IsMap(heap_object->map(cage_base())));
148 Heap::InToPage(heap_object));
151void VerifyPointersVisitor::VerifyCodeObjectImpl(
154 CHECK(IsMap(heap_object->map(cage_base())));
155 CHECK(heap_object->map(cage_base())->instance_type() ==
156 INSTRUCTION_STREAM_TYPE);
159template <
typename TSlot>
160void VerifyPointersVisitor::VerifyPointersImpl(TSlot
start, TSlot
end) {
161 for (TSlot slot =
start; slot <
end; ++slot) {
162 typename TSlot::TObject
object = slot.load(cage_base());
163#ifdef V8_ENABLE_DIRECT_HANDLE
167 if (
object.GetHeapObject(&heap_object)) {
168 VerifyHeapObjectImpl(heap_object);
191 VerifyHeapObjectImpl(target);
196 VerifyHeapObjectImpl(rinfo->target_object(cage_base()));
199class VerifyReadOnlyPointersVisitor :
public VerifyPointersVisitor {
201 explicit VerifyReadOnlyPointersVisitor(Heap*
heap)
202 : VerifyPointersVisitor(
heap) {}
205 void VerifyPointers(Tagged<HeapObject> host, MaybeObjectSlot
start,
206 MaybeObjectSlot
end)
override {
207 if (!host.is_null()) {
208 CHECK(ReadOnlyHeap::Contains(host->map()));
210 VerifyPointersVisitor::VerifyPointers(host,
start,
end);
213 Tagged<HeapObject> heap_object;
214 if ((*current).GetHeapObject(&heap_object)) {
215 CHECK(ReadOnlyHeap::Contains(heap_object));
221class VerifySharedHeapObjectVisitor :
public VerifyPointersVisitor {
223 explicit VerifySharedHeapObjectVisitor(Heap*
heap)
224 : VerifyPointersVisitor(
heap),
225 shared_space_(
heap->shared_space()),
226 shared_trusted_space_(
heap->shared_trusted_space()),
227 shared_lo_space_(
heap->shared_lo_space()),
228 shared_trusted_lo_space_(
heap->shared_trusted_lo_space()) {
234 void VerifyPointers(Tagged<HeapObject> host, MaybeObjectSlot
start,
235 MaybeObjectSlot
end)
override {
236 if (!host.is_null()) {
237 Tagged<Map> map = host->map();
238 CHECK(ReadOnlyHeap::Contains(map) || shared_space_->Contains(map));
240 VerifyPointersVisitor::VerifyPointers(host,
start,
end);
243 Tagged<HeapObject> heap_object;
244 if ((*current).GetHeapObject(&heap_object)) {
245 MemoryChunk* chunk = MemoryChunk::FromHeapObject(heap_object);
246 CHECK(chunk->InReadOnlySpace() || chunk->InWritableSharedSpace());
247 CHECK(ReadOnlyHeap::Contains(heap_object) ||
248 shared_space_->Contains(heap_object) ||
249 shared_lo_space_->Contains(heap_object) ||
250 shared_trusted_space_->Contains(heap_object) ||
251 shared_trusted_lo_space_->Contains(heap_object));
257 SharedSpace* shared_space_;
258 SharedTrustedSpace* shared_trusted_space_;
259 SharedLargeObjectSpace* shared_lo_space_;
260 SharedTrustedLargeObjectSpace* shared_trusted_lo_space_;
263class HeapVerification final :
public SpaceVerificationVisitor {
265 explicit HeapVerification(Heap*
heap)
269 void VerifyReadOnlyHeap();
270 void VerifySharedHeap(Isolate* initiator);
273 void VerifySpace(BaseSpace* space);
275 void VerifyPage(
const MemoryChunkMetadata* chunk)
final;
276 void VerifyPageDone(
const MemoryChunkMetadata* chunk)
final;
278 void VerifyObject(Tagged<HeapObject>
object)
final;
279 void VerifyObjectMap(Tagged<HeapObject>
object);
280 void VerifyOutgoingPointers(Tagged<HeapObject>
object);
283 void VerifyRememberedSetFor(Tagged<HeapObject>
object);
285 ReadOnlySpace* read_only_space()
const {
return heap_->read_only_space(); }
286 NewSpace* new_space()
const {
return heap_->new_space(); }
287 OldSpace* old_space()
const {
return heap_->old_space(); }
288 SharedSpace* shared_space()
const {
return heap_->shared_space(); }
289 CodeSpace* code_space()
const {
return heap_->code_space(); }
290 LargeObjectSpace* lo_space()
const {
return heap_->lo_space(); }
291 SharedLargeObjectSpace* shared_lo_space()
const {
292 return heap_->shared_lo_space();
294 CodeLargeObjectSpace* code_lo_space()
const {
return heap_->code_lo_space(); }
295 NewLargeObjectSpace* new_lo_space()
const {
return heap_->new_lo_space(); }
296 TrustedSpace* trusted_space()
const {
return heap_->trusted_space(); }
297 SharedTrustedSpace* shared_trusted_space()
const {
298 return heap_->shared_trusted_space();
300 TrustedLargeObjectSpace* trusted_lo_space()
const {
301 return heap_->trusted_lo_space();
303 SharedTrustedLargeObjectSpace* shared_trusted_lo_space()
const {
304 return heap_->shared_trusted_lo_space();
311 return *current_space_identity_;
316 const PtrComprCageBase cage_base_;
317 std::optional<AllocationSpace> current_space_identity_;
318 std::optional<const MemoryChunkMetadata*> current_chunk_;
321void HeapVerification::Verify() {
327 SafepointScope safepoint_scope(
isolate(), safepoint_kind);
330 heap()->MakeHeapIterable();
331 heap()->FreeLinearAllocationAreas();
335 VerifyPointersVisitor visitor(
heap());
336 heap()->IterateRoots(&visitor,
340 !
isolate()->raw_native_context().is_null()) {
344 if (IsNormalizedMapCache(normalized_map_cache)) {
346 ->NormalizedMapCacheVerify(
isolate());
350#if V8_ENABLE_WEBASSEMBLY
353 for (
int i = 0, e = canonical_rtts->
length();
i < e; ++
i) {
355 if (maybe_rtt.IsCleared())
continue;
356 CHECK(maybe_rtt.IsWeak());
357 CHECK(IsMap(maybe_rtt.GetHeapObjectAssumeWeak()));
362 for (
int i = 0, e = wrappers->
length();
i < e; ++
i) {
364 if (maybe_wrapper.IsCleared())
continue;
365 CHECK(maybe_wrapper.IsWeak());
366 CHECK(IsCodeWrapper(maybe_wrapper.GetHeapObjectAssumeWeak()));
374 if (
isolate()->has_active_deserializer())
return;
376 VerifySmisVisitor smis_visitor;
377 heap()->IterateSmiRoots(&smis_visitor);
379 VerifySpace(new_space());
381 VerifySpace(old_space());
382 VerifySpace(shared_space());
383 VerifySpace(code_space());
385 VerifySpace(lo_space());
386 VerifySpace(new_lo_space());
387 VerifySpace(shared_lo_space());
388 VerifySpace(code_lo_space());
390 VerifySpace(trusted_space());
391 VerifySpace(shared_trusted_space());
392 VerifySpace(trusted_lo_space());
393 VerifySpace(shared_trusted_lo_space());
398 heap()->VerifyCommittedPhysicalMemory();
402void HeapVerification::VerifySpace(BaseSpace* space) {
404 current_space_identity_ = space->identity();
405 space->Verify(
isolate(),
this);
406 current_space_identity_.reset();
409void HeapVerification::VerifyPage(
const MemoryChunkMetadata* chunk_metadata) {
410 const MemoryChunk* chunk = chunk_metadata->Chunk();
412 CHECK(!current_chunk_.has_value());
416 CHECK(!chunk->IsQuarantined());
417 if (chunk->InReadOnlySpace()) {
421 CHECK_EQ(chunk_metadata->owner()->identity(), current_space_identity());
423 current_chunk_ = chunk_metadata;
426void HeapVerification::VerifyPageDone(
const MemoryChunkMetadata* chunk) {
428 current_chunk_.reset();
435 VerifyObjectMap(
object);
438 Object::ObjectVerify(
object,
isolate_);
441 VerifyOutgoingPointers(
object);
446 VerifyRememberedSetFor(
object);
451 switch (current_space_identity()) {
453 VerifyReadOnlyPointersVisitor visitor(
heap());
454 visitor.Visit(
object);
462 VerifySharedHeapObjectVisitor visitor(
heap());
463 visitor.Visit(
object);
475 VerifyPointersVisitor visitor(
heap());
476 visitor.Visit(
object);
485 MapWord map_word =
object->map_word(cage_base_,
kRelaxedLoad);
486 CHECK(!map_word.IsForwardingAddress());
487 Tagged<Map> map = map_word.ToMap();
488 CHECK(IsMap(map, cage_base_));
490 (shared_space() && shared_space()->Contains(map)));
494 CHECK(!IsMap(
object, cage_base_));
496 }
else if (current_space_identity() ==
RO_SPACE) {
498 CHECK(!IsJSArrayBuffer(
object));
502void HeapVerification::VerifyReadOnlyHeap() {
503 CHECK(!read_only_space()->writable());
504 VerifySpace(read_only_space());
507class SlotVerifyingVisitor :
public HeapVisitor<SlotVerifyingVisitor> {
509 SlotVerifyingVisitor(Isolate* isolate, std::set<Address>* untyped,
510 std::set<std::pair<SlotType, Address>>* typed,
511 std::set<Address>* protected_pointer)
512 : HeapVisitor(isolate),
515 protected_(protected_pointer) {}
517 virtual bool ShouldHaveBeenRecorded(Tagged<HeapObject> host,
518 Tagged<MaybeObject> target) = 0;
520 void VisitPointers(Tagged<HeapObject> host, ObjectSlot
start,
521 ObjectSlot
end)
override {
523 for (ObjectSlot slot =
start; slot <
end; ++slot) {
524 Tagged<Object> obj = slot.load(cage_base());
525 CHECK(!MapWord::IsPacked(obj.ptr()) || !HasWeakHeapObjectTag(obj));
531 void VisitPointers(Tagged<HeapObject> host, MaybeObjectSlot
start,
532 MaybeObjectSlot
end)
final {
533 for (MaybeObjectSlot slot =
start; slot <
end; ++slot) {
534 if (ShouldHaveBeenRecorded(host, slot.load(cage_base()))) {
535 CHECK_GT(untyped_->count(slot.address()), 0);
540 void VisitInstructionStreamPointer(Tagged<Code> host,
541 InstructionStreamSlot slot)
override {
542 if (ShouldHaveBeenRecorded(host, slot.load(code_cage_base()))) {
543 CHECK_GT(untyped_->count(slot.address()), 0);
547 void VisitCodeTarget(Tagged<InstructionStream> host,
548 RelocInfo* rinfo)
override {
549 Tagged<Object> target =
550 InstructionStream::FromTargetAddress(rinfo->target_address());
551 if (ShouldHaveBeenRecorded(host, target)) {
552 CHECK(InTypedSet(SlotType::kCodeEntry, rinfo->pc()) ||
553 (rinfo->IsInConstantPool() &&
554 InTypedSet(SlotType::kConstPoolCodeEntry,
555 rinfo->constant_pool_entry_address())));
559 void VisitEmbeddedPointer(Tagged<InstructionStream> host,
560 RelocInfo* rinfo)
override {
561 Tagged<Object> target = rinfo->target_object(cage_base());
562 if (ShouldHaveBeenRecorded(host, target)) {
563 CHECK(InTypedSet(SlotType::kEmbeddedObjectFull, rinfo->pc()) ||
564 InTypedSet(SlotType::kEmbeddedObjectCompressed, rinfo->pc()) ||
565 (rinfo->IsInConstantPool() &&
566 InTypedSet(SlotType::kConstPoolEmbeddedObjectCompressed,
567 rinfo->constant_pool_entry_address())) ||
568 (rinfo->IsInConstantPool() &&
569 InTypedSet(SlotType::kConstPoolEmbeddedObjectFull,
570 rinfo->constant_pool_entry_address())));
574 void VisitProtectedPointer(Tagged<TrustedObject> host,
575 ProtectedPointerSlot slot)
override {
576 if (ShouldHaveBeenRecorded(host, slot.load())) {
578 CHECK_GT(protected_->count(slot.address()), 0);
582 void VisitProtectedPointer(Tagged<TrustedObject> host,
583 ProtectedMaybeObjectSlot slot)
override {
584 if (ShouldHaveBeenRecorded(host, slot.load())) {
586 CHECK_GT(protected_->count(slot.address()), 0);
590 void VisitMapPointer(Tagged<HeapObject>
object)
override {
591 VisitPointers(
object, object->map_slot(), object->map_slot() + 1);
595 bool InUntypedSet(ObjectSlot slot) {
596 return untyped_->count(slot.address()) > 0;
600 bool InTypedSet(SlotType type, Address slot) {
601 return typed_->count(std::make_pair(type, slot)) > 0;
603 std::set<Address>* untyped_;
604 std::set<std::pair<SlotType, Address>>* typed_;
605 std::set<Address>* protected_;
608class OldToNewSlotVerifyingVisitor :
public SlotVerifyingVisitor {
610 OldToNewSlotVerifyingVisitor(
611 Isolate* isolate, std::set<Address>* untyped,
612 std::set<std::pair<SlotType, Address>>* typed,
613 EphemeronRememberedSet::TableMap* ephemeron_remembered_set)
614 : SlotVerifyingVisitor(isolate, untyped, typed, nullptr),
617 bool ShouldHaveBeenRecorded(Tagged<HeapObject> host,
618 Tagged<MaybeObject> target)
override {
621 HeapLayout::InYoungGeneration(target),
622 Heap::InToPage(target));
623 return target.IsStrongOrWeak() && HeapLayout::InYoungGeneration(target) &&
624 !HeapLayout::InYoungGeneration(host);
627 void VisitEphemeron(Tagged<HeapObject> host,
int index, ObjectSlot
key,
628 ObjectSlot target)
override {
629 VisitPointer(host, target);
633 Tagged<Object> k = *
key;
634 if (!HeapLayout::InYoungGeneration(host) &&
635 HeapLayout::InYoungGeneration(k)) {
640 EphemeronHashTable::SlotToIndex(table.address(),
key.address());
641 InternalIndex entry = EphemeronHashTable::IndexToEntry(slot_index);
642 CHECK(it->second.find(entry.as_int()) != it->second.end());
650class OldToSharedSlotVerifyingVisitor :
public SlotVerifyingVisitor {
652 OldToSharedSlotVerifyingVisitor(Isolate* isolate, std::set<Address>* untyped,
653 std::set<std::pair<SlotType, Address>>* typed,
654 std::set<Address>* protected_pointer)
655 : SlotVerifyingVisitor(isolate, untyped, typed, protected_pointer) {}
657 bool ShouldHaveBeenRecorded(Tagged<HeapObject> host,
658 Tagged<MaybeObject> target)
override {
659 Tagged<HeapObject> target_heap_object;
660 return target.GetHeapObject(&target_heap_object) &&
661 HeapLayout::InWritableSharedSpace(target_heap_object) &&
663 HeapLayout::InBlackAllocatedPage(target_heap_object)) &&
664 !HeapLayout::InYoungGeneration(host) &&
665 !HeapLayout::InWritableSharedSpace(host);
669template <RememberedSetType direction>
671 std::set<Address>* untyped,
672 std::set<std::pair<SlotType, Address>>* typed) {
676 if (
start <= slot.address() && slot.address() <
end) {
677 untyped->insert(slot.address());
685 typed->insert(std::make_pair(type, slot));
692class SlotCollectingVisitor final :
public HeapVisitor<SlotCollectingVisitor> {
694 explicit SlotCollectingVisitor(Isolate* isolate) : HeapVisitor(isolate) {}
696 static constexpr bool ShouldUseUncheckedCast() {
return true; }
698 void VisitPointers(Tagged<HeapObject> host, ObjectSlot
start,
699 ObjectSlot
end)
override {
702 void VisitPointers(Tagged<HeapObject> host, MaybeObjectSlot
start,
703 MaybeObjectSlot
end)
final {
704 for (MaybeObjectSlot p =
start; p <
end; ++p) {
709 void VisitInstructionStreamPointer(Tagged<Code> host,
710 InstructionStreamSlot slot)
override {
712#ifdef V8_EXTERNAL_CODE_SPACE
713 code_slots_.push_back(slot);
717 void VisitCodeTarget(Tagged<InstructionStream> host, RelocInfo* rinfo)
final {
721 void VisitEmbeddedPointer(Tagged<InstructionStream> host,
722 RelocInfo* rinfo)
override {
726 void VisitMapPointer(Tagged<HeapObject>
object)
override {
730 int number_of_slots() {
return static_cast<int>(slots_.size()); }
733#ifdef V8_EXTERNAL_CODE_SPACE
735 int number_of_code_slots() {
return static_cast<int>(code_slots_.size()); }
739 std::vector<MaybeObjectSlot> slots_;
740#ifdef V8_EXTERNAL_CODE_SPACE
741 std::vector<InstructionStreamSlot> code_slots_;
746 if (current_space_identity() ==
RO_SPACE ||
747 v8_flags.verify_heap_skip_remembered_set) {
756 std::set<Address> old_to_new;
757 std::set<std::pair<SlotType, Address>> typed_old_to_new;
758 CollectSlots<OLD_TO_NEW>(chunk,
start,
end, &old_to_new, &typed_old_to_new);
759 CollectSlots<OLD_TO_NEW_BACKGROUND>(chunk,
start,
end, &old_to_new,
762 OldToNewSlotVerifyingVisitor old_to_new_visitor(
763 isolate(), &old_to_new, &typed_old_to_new,
764 heap()->ephemeron_remembered_set()->
tables());
765 old_to_new_visitor.Visit(
object);
767 std::set<Address> old_to_shared;
768 std::set<std::pair<SlotType, Address>> typed_old_to_shared;
769 CollectSlots<OLD_TO_SHARED>(chunk,
start,
end, &old_to_shared,
770 &typed_old_to_shared);
771 std::set<Address> trusted_to_shared_trusted;
772 CollectSlots<TRUSTED_TO_SHARED_TRUSTED>(chunk,
start,
end,
773 &trusted_to_shared_trusted,
nullptr);
774 OldToSharedSlotVerifyingVisitor old_to_shared_visitor(
775 isolate(), &old_to_shared, &typed_old_to_shared,
776 &trusted_to_shared_trusted);
777 old_to_shared_visitor.Visit(
object);
819 HeapVerification verifier(
heap);
825 HeapVerification verifier(
heap);
826 verifier.VerifyReadOnlyHeap();
834 CHECK(IsString(
object));
837 Isolate* isolate =
heap->isolate();
838 Isolate* shared_space_isolate = isolate->is_shared_space_isolate()
840 : isolate->shared_space_isolate();
841 shared_space_isolate->global_safepoint()->AssertActive();
849void HeapVerifier::SetPendingLayoutChangeObject(Heap*
heap,
852 CHECK(pending_layout_change_object.is_null());
853 pending_layout_change_object = object;
859 Tagged<Map> new_map) {
867 PtrComprCageBase cage_base(
heap->isolate());
873 if (pending_layout_change_object.is_null()) {
876 CHECK_EQ(pending_layout_change_object,
object);
877 pending_layout_change_object = HeapObject();
884 Tagged<Map> new_map) {
885 PtrComprCageBase cage_base(
heap->isolate());
887 if (IsJSObject(
object, cage_base)) {
892 if (IsString(
object, cage_base) &&
893 (new_map == ReadOnlyRoots(
heap).thin_two_byte_string_map() ||
894 new_map == ReadOnlyRoots(
heap).thin_one_byte_string_map())) {
901 if (
v8_flags.shared_string_table && IsString(
object, cage_base) &&
912 SlotCollectingVisitor old_visitor(
heap->isolate());
913 old_visitor.Visit(
object);
915 SlotCollectingVisitor new_visitor(
heap->isolate());
916 new_visitor.Visit(new_map,
object);
917 CHECK_EQ(new_visitor.number_of_slots(), old_visitor.number_of_slots());
918 for (
int i = 0;
i < new_visitor.number_of_slots();
i++) {
919 CHECK_EQ(new_visitor.slot(
i), old_visitor.slot(
i));
921#ifdef V8_EXTERNAL_CODE_SPACE
922 CHECK_EQ(new_visitor.number_of_code_slots(),
923 old_visitor.number_of_code_slots());
924 for (
int i = 0;
i < new_visitor.number_of_code_slots();
i++) {
925 CHECK_EQ(new_visitor.code_slot(
i), old_visitor.code_slot(
i));
static V8_INLINE bool InYoungGeneration(Tagged< Object > object)
static V8_INLINE bool InWritableSharedSpace(Tagged< HeapObject > object)
static void VerifyObjectLayoutChange(Heap *heap, Tagged< HeapObject > object, Tagged< Map > new_map)
static void VerifyReadOnlyHeap(Heap *heap)
static void VerifyHeap(Heap *heap)
static void VerifyObjectLayoutChangeIsAllowed(Heap *heap, Tagged< HeapObject > object)
static void VerifySafeMapTransition(Heap *heap, Tagged< HeapObject > object, Tagged< Map > new_map)
IncrementalMarking * incremental_marking() const
bool IsMinorMarking() const
static Tagged< InstructionStream > FromTargetAddress(Address address)
bool is_shared_space_isolate() const
Tagged< NativeContext > raw_native_context()
StringTable * string_table() const
static constexpr bool IsPacked(Address)
static constexpr ObjectFields ObjectFieldsFrom(VisitorId visitor_id)
static V8_INLINE MemoryChunk * FromHeapObject(Tagged< HeapObject > object)
static V8_INLINE MutablePageMetadata * FromHeapObject(Tagged< HeapObject > o)
static V8_EXPORT_PRIVATE bool Contains(Address address)
static int IterateTyped(MutablePageMetadata *chunk, Callback callback)
static int Iterate(MutablePageMetadata *chunk, Callback callback, SlotSet::EmptyBucketMode mode)
void VerifyIfOwnedBy(Isolate *isolate)
#define V8_EXTERNAL_CODE_SPACE_BOOL
V8_INLINE constexpr bool IsExternalString(InstanceType instance_type)
V8_INLINE constexpr bool IsInternalizedString(InstanceType instance_type)
V8_INLINE constexpr bool IsAbstractCode(InstanceType instance_type)
V8_WARN_UNUSED_RESULT bool IsValidCodeObject(Heap *heap, Tagged< HeapObject > object)
constexpr Address kTaggedNullAddress
SlotTraits::TObjectSlot ObjectSlot
Tagged(T object) -> Tagged< T >
V8_INLINE constexpr bool IsSmi(TaggedImpl< kRefType, StorageType > obj)
kInterpreterTrampolineOffset Tagged< HeapObject >
SlotTraits::TInstructionStreamSlot InstructionStreamSlot
PerThreadAssertScopeDebugOnly< true, SAFEPOINTS_ASSERT, HEAP_ALLOCATION_ASSERT > AllowGarbageCollection
kMemory0SizeOffset Address kNewAllocationLimitAddressOffset Address kOldAllocationLimitAddressOffset uint8_t kGlobalsStartOffset kJumpTableStartOffset std::atomic< uint32_t > kTieringBudgetArrayOffset kDataSegmentStartsOffset kElementSegmentsOffset kInstanceObjectOffset kMemoryObjectsOffset kTaggedGlobalsBufferOffset tables
bool IsShared(Tagged< Object > obj)
@ SHARED_TRUSTED_LO_SPACE
V8_EXPORT_PRIVATE FlagValues v8_flags
SlotTraits::TOffHeapObjectSlot OffHeapObjectSlot
@ TRUSTED_TO_SHARED_TRUSTED
SlotTraits::TMaybeObjectSlot MaybeObjectSlot
V8_WARN_UNUSED_RESULT bool IsValidHeapObject(Heap *heap, Tagged< HeapObject > object)
Tagged< To > Cast(Tagged< From > value, const v8::SourceLocation &loc=INIT_SOURCE_LOCATION_IN_DEBUG)
static constexpr RelaxedLoadTag kRelaxedLoad
#define CHECK_IMPLIES(lhs, rhs)
#define CHECK_GT(lhs, rhs)
#define CHECK_NOT_NULL(val)
#define CHECK_EQ(lhs, rhs)
EphemeronRememberedSet * ephemeron_remembered_set_
#define TRACE_EVENT0(category_group, name)
#define TRACE_DISABLED_BY_DEFAULT(name)
std::unique_ptr< ValueMirror > key