%PDF- %PDF-
| Direktori : /home/vacivi36/vittasync.vacivitta.com.br/vittasync/node/deps/v8/src/heap/ |
| Current File : /home/vacivi36/vittasync.vacivitta.com.br/vittasync/node/deps/v8/src/heap/evacuation-verifier.cc |
// Copyright 2022 the V8 project authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "src/codegen/assembler-inl.h"
#include "src/codegen/reloc-info.h"
#include "src/heap/evacuation-verifier-inl.h"
#include "src/objects/map-inl.h"
namespace v8 {
namespace internal {
#ifdef VERIFY_HEAP
EvacuationVerifier::EvacuationVerifier(Heap* heap)
: ObjectVisitorWithCageBases(heap), heap_(heap) {}
void EvacuationVerifier::Run() {
DCHECK(!heap_->sweeping_in_progress());
VerifyRoots();
VerifyEvacuation(heap_->new_space());
VerifyEvacuation(heap_->old_space());
VerifyEvacuation(heap_->code_space());
if (heap_->shared_space()) VerifyEvacuation(heap_->shared_space());
}
void EvacuationVerifier::VisitPointers(Tagged<HeapObject> host,
ObjectSlot start, ObjectSlot end) {
VerifyPointersImpl(start, end);
}
void EvacuationVerifier::VisitPointers(Tagged<HeapObject> host,
MaybeObjectSlot start,
MaybeObjectSlot end) {
VerifyPointersImpl(start, end);
}
void EvacuationVerifier::VisitInstructionStreamPointer(
Tagged<Code> host, InstructionStreamSlot slot) {
Tagged<Object> maybe_code = slot.load(code_cage_base());
Tagged<HeapObject> code;
// The slot might contain smi during Code creation, so skip it.
if (maybe_code.GetHeapObject(&code)) {
VerifyHeapObjectImpl(code);
}
}
void EvacuationVerifier::VisitRootPointers(Root root, const char* description,
FullObjectSlot start,
FullObjectSlot end) {
VerifyPointersImpl(start, end);
}
void EvacuationVerifier::VisitMapPointer(Tagged<HeapObject> object) {
VerifyHeapObjectImpl(object->map(cage_base()));
}
void EvacuationVerifier::VisitCodeTarget(Tagged<InstructionStream> host,
RelocInfo* rinfo) {
Tagged<InstructionStream> target =
InstructionStream::FromTargetAddress(rinfo->target_address());
VerifyHeapObjectImpl(target);
}
void EvacuationVerifier::VisitEmbeddedPointer(Tagged<InstructionStream> host,
RelocInfo* rinfo) {
VerifyHeapObjectImpl(rinfo->target_object(cage_base()));
}
void EvacuationVerifier::VerifyRoots() {
heap_->IterateRootsIncludingClients(
this,
base::EnumSet<SkipRoot>{SkipRoot::kWeak, SkipRoot::kConservativeStack});
}
void EvacuationVerifier::VerifyEvacuationOnPage(Address start, Address end) {
Address current = start;
while (current < end) {
Tagged<HeapObject> object = HeapObject::FromAddress(current);
if (!IsFreeSpaceOrFiller(object, cage_base())) {
object->Iterate(cage_base(), this);
}
current += ALIGN_TO_ALLOCATION_ALIGNMENT(object->Size(cage_base()));
}
}
void EvacuationVerifier::VerifyEvacuation(NewSpace* space) {
if (!space) return;
if (v8_flags.minor_ms) {
VerifyEvacuation(PagedNewSpace::From(space)->paged_space());
return;
}
for (Page* p : *space) {
VerifyEvacuationOnPage(p->area_start(), p->area_end());
}
}
void EvacuationVerifier::VerifyEvacuation(PagedSpaceBase* space) {
for (Page* p : *space) {
if (p->IsEvacuationCandidate()) continue;
VerifyEvacuationOnPage(p->area_start(), p->area_end());
}
}
#endif // VERIFY_HEAP
} // namespace internal
} // namespace v8