14#if defined(CPPGC_CAGED_HEAP)
27 "MarkingVerifier: Encountered unmarked object.\n"
49 std::unique_ptr<cppgc::Visitor> visitor)
51 verification_state_(verification_state),
56 std::optional<size_t> expected_marked_bytes) {
70#if !defined(THREAD_SANITIZER) && !defined(CPPGC_POINTER_COMPRESSION)
71 if (stack_state == StackState::kMayContainHeapPointers) {
96 CHECK_EQ(expected_marked_bytes.value(),
141 if (!header.
IsMarked())
return true;
145#if defined(CPPGC_YOUNG_GENERATION)
148 const auto age = CagedHeapLocalData::Get().age_table.GetAge(
149 caged_heap.OffsetFromAddress(header.
ObjectStart()));
150 if (age == AgeTable::Age::kOld) {
153 }
else if (age == AgeTable::Age::kMixed) {
180 size_t expected_marked_bytes)
const {
181 v8::base::OS::PrintError(
"\n<--- Mismatch in marking verifier --->\n");
182 v8::base::OS::PrintError(
183 "Marked bytes: expected %zu vs. verifier found %zu, difference %zd\n",
186 v8::base::OS::PrintError(
187 "A list of pages with possibly mismatched marked objects follows.\n");
189 for (
auto* page : *space) {
190 size_t marked_bytes_on_page = 0;
191 if (page->is_large()) {
193 const auto& header = *large_page.ObjectHeader();
194 if (header.IsMarked())
195 marked_bytes_on_page +=
197 if (marked_bytes_on_page == large_page.marked_bytes())
continue;
202 for (
const auto& header : normal_page) {
203 if (header.IsMarked())
204 marked_bytes_on_page +=
207 if (marked_bytes_on_page == normal_page.marked_bytes())
continue;
209 for (
const auto& header : normal_page) {
218 size_t marked_bytes_on_page)
const {
219 v8::base::OS::PrintError(
220 "\nNormal page in space %zu:\n"
221 "Marked bytes: expected %zu vs. verifier found %zu, difference %zd\n",
222 page.space().index(), page.marked_bytes(), marked_bytes_on_page,
223 page.marked_bytes() - marked_bytes_on_page);
227 size_t marked_bytes_on_page)
const {
228 v8::base::OS::PrintError(
229 "\nLarge page in space %zu:\n"
230 "Marked bytes: expected %zu vs. verifier found %zu, difference %zd\n",
231 page.space().index(), page.marked_bytes(), marked_bytes_on_page,
232 page.marked_bytes() - marked_bytes_on_page);
244 v8::base::OS::PrintError(
"- %s at %p, size %zu, %s\n", name,
246 header.
IsMarked() ?
"marked" :
"unmarked");
257 state_.VerifyMarked(desc.base_object_payload);
260 void VisitWeak(
const void*, TraceDescriptor desc,
WeakCallback,
265 state_.VerifyMarked(desc.base_object_payload);
268 void VisitWeakContainer(
const void*
object, TraceDescriptor,
277 state_.VerifyMarked(weak_desc.base_object_payload);
289 std::make_unique<VerificationVisitor>(
state_)) {}
static CagedHeap & Instance()
void(ConservativeTracingVisitor *, const HeapObjectHeader &) TraceConservativelyCallback
virtual void TraceConservativelyIfNeeded(const void *)
virtual heap::base::Stack * stack()
void Traverse(RawHeap &heap)
static LargePage * From(BasePage *page)
size_t verifier_found_marked_bytes_in_pages_
void VisitInConstructionConservatively(HeapObjectHeader &, TraceConservativelyCallback) final
MarkingVerifierBase(const MarkingVerifierBase &)=delete
std::unordered_set< const HeapObjectHeader * > * in_construction_objects_
bool VisitLargePage(LargePage &)
void ReportNormalPage(const NormalPage &, size_t) const
void ReportDifferences(size_t) const
void Run(StackState, std::optional< size_t >)
size_t verifier_found_marked_bytes_
bool verifier_found_marked_bytes_are_exact_
std::unique_ptr< cppgc::Visitor > visitor_
bool VisitNormalPage(NormalPage &)
std::unordered_set< const HeapObjectHeader * > in_construction_objects_heap_
std::unordered_set< const HeapObjectHeader * > in_construction_objects_stack_
VerificationState & verification_state_
void VisitPointer(const void *) final
CollectionType collection_type_
void ReportHeapObjectHeader(const HeapObjectHeader &) const
void ReportLargePage(const LargePage &, size_t) const
bool VisitHeapObjectHeader(HeapObjectHeader &)
MarkingVerifier(HeapBase &, CollectionType)
static NormalPage * From(BasePage *page)
V8_INLINE size_t Size() const
void VerifyMarked(const void *) const
const HeapObjectHeader * parent_
void SetCurrentParent(const HeapObjectHeader *header)
bool IsParentOnStack() const
void IteratePointersUntilMarker(StackVisitor *visitor) const
CppHeap::CollectionType collection_type_
enum v8::internal::@1270::DeoptimizableCodeIterator::@67 state_
@ kUseClassNameIfSupported
void(*)(const LivenessBroker &, const void *) WeakCallback
#define CHECK_LE(lhs, rhs)
#define CHECK_NE(lhs, rhs)
#define CHECK_EQ(lhs, rhs)
#define DCHECK(condition)
#define V8_UNLIKELY(condition)