Commit 6b810dad authored by Rodrigo Bruno's avatar Rodrigo Bruno Committed by Commit Bot

[heap] Updated spaces Verify to check external memory count.

Bug: chromium:845409
Change-Id: Ieb690f2d6ed699f306f1ff351cb5f62d9e2db860
Reviewed-on: https://chromium-review.googlesource.com/1114820Reviewed-by: 's avatarUlan Degenbaev <ulan@chromium.org>
Commit-Queue: Rodrigo Bruno <rfbpb@google.com>
Cr-Commit-Position: refs/heads/master@{#54035}
parent e50f6432
...@@ -1897,6 +1897,12 @@ void PagedSpace::Print() {} ...@@ -1897,6 +1897,12 @@ void PagedSpace::Print() {}
void PagedSpace::Verify(Isolate* isolate, ObjectVisitor* visitor) { void PagedSpace::Verify(Isolate* isolate, ObjectVisitor* visitor) {
bool allocation_pointer_found_in_space = bool allocation_pointer_found_in_space =
(allocation_info_.top() == allocation_info_.limit()); (allocation_info_.top() == allocation_info_.limit());
size_t external_backing_store_bytes[kNumTypes];
for (int i = 0; i < kNumTypes; i++) {
external_backing_store_bytes[static_cast<ExternalBackingStoreType>(i)] = 0;
}
for (Page* page : *this) { for (Page* page : *this) {
CHECK(page->owner() == this); CHECK(page->owner() == this);
if (page == Page::FromAllocationAreaAddress(allocation_info_.top())) { if (page == Page::FromAllocationAreaAddress(allocation_info_.top())) {
...@@ -1906,6 +1912,12 @@ void PagedSpace::Verify(Isolate* isolate, ObjectVisitor* visitor) { ...@@ -1906,6 +1912,12 @@ void PagedSpace::Verify(Isolate* isolate, ObjectVisitor* visitor) {
HeapObjectIterator it(page); HeapObjectIterator it(page);
Address end_of_previous_object = page->area_start(); Address end_of_previous_object = page->area_start();
Address top = page->area_end(); Address top = page->area_end();
for (int i = 0; i < kNumTypes; i++) {
ExternalBackingStoreType t = static_cast<ExternalBackingStoreType>(i);
external_backing_store_bytes[t] += page->ExternalBackingStoreBytes(t);
}
for (HeapObject* object = it.Next(); object != nullptr; for (HeapObject* object = it.Next(); object != nullptr;
object = it.Next()) { object = it.Next()) {
CHECK(end_of_previous_object <= object->address()); CHECK(end_of_previous_object <= object->address());
...@@ -1934,6 +1946,10 @@ void PagedSpace::Verify(Isolate* isolate, ObjectVisitor* visitor) { ...@@ -1934,6 +1946,10 @@ void PagedSpace::Verify(Isolate* isolate, ObjectVisitor* visitor) {
end_of_previous_object = object->address() + size; end_of_previous_object = object->address() + size;
} }
} }
for (int i = 0; i < kNumTypes; i++) {
ExternalBackingStoreType t = static_cast<ExternalBackingStoreType>(i);
CHECK_EQ(external_backing_store_bytes[t], ExternalBackingStoreBytes(t));
}
CHECK(allocation_pointer_found_in_space); CHECK(allocation_pointer_found_in_space);
#ifdef DEBUG #ifdef DEBUG
VerifyCountersAfterSweeping(); VerifyCountersAfterSweeping();
...@@ -2632,6 +2648,12 @@ void SemiSpace::Print() {} ...@@ -2632,6 +2648,12 @@ void SemiSpace::Print() {}
#ifdef VERIFY_HEAP #ifdef VERIFY_HEAP
void SemiSpace::Verify() { void SemiSpace::Verify() {
bool is_from_space = (id_ == kFromSpace); bool is_from_space = (id_ == kFromSpace);
size_t external_backing_store_bytes[kNumTypes];
for (int i = 0; i < kNumTypes; i++) {
external_backing_store_bytes[static_cast<ExternalBackingStoreType>(i)] = 0;
}
for (Page* page : *this) { for (Page* page : *this) {
CHECK_EQ(page->owner(), this); CHECK_EQ(page->owner(), this);
CHECK(page->InNewSpace()); CHECK(page->InNewSpace());
...@@ -2650,9 +2672,18 @@ void SemiSpace::Verify() { ...@@ -2650,9 +2672,18 @@ void SemiSpace::Verify() {
!page->IsFlagSet(MemoryChunk::POINTERS_FROM_HERE_ARE_INTERESTING)); !page->IsFlagSet(MemoryChunk::POINTERS_FROM_HERE_ARE_INTERESTING));
} }
} }
for (int i = 0; i < kNumTypes; i++) {
ExternalBackingStoreType t = static_cast<ExternalBackingStoreType>(i);
external_backing_store_bytes[t] += page->ExternalBackingStoreBytes(t);
}
CHECK_IMPLIES(page->list_node().prev(), CHECK_IMPLIES(page->list_node().prev(),
page->list_node().prev()->list_node().next() == page); page->list_node().prev()->list_node().next() == page);
} }
for (int i = 0; i < kNumTypes; i++) {
ExternalBackingStoreType t = static_cast<ExternalBackingStoreType>(i);
CHECK_EQ(external_backing_store_bytes[t], ExternalBackingStoreBytes(t));
}
} }
#endif #endif
...@@ -3478,6 +3509,12 @@ std::unique_ptr<ObjectIterator> LargeObjectSpace::GetObjectIterator() { ...@@ -3478,6 +3509,12 @@ std::unique_ptr<ObjectIterator> LargeObjectSpace::GetObjectIterator() {
// We do not assume that the large object iterator works, because it depends // We do not assume that the large object iterator works, because it depends
// on the invariants we are checking during verification. // on the invariants we are checking during verification.
void LargeObjectSpace::Verify(Isolate* isolate) { void LargeObjectSpace::Verify(Isolate* isolate) {
size_t external_backing_store_bytes[kNumTypes];
for (int i = 0; i < kNumTypes; i++) {
external_backing_store_bytes[static_cast<ExternalBackingStoreType>(i)] = 0;
}
for (LargePage* chunk = first_page(); chunk != nullptr; for (LargePage* chunk = first_page(); chunk != nullptr;
chunk = chunk->next_page()) { chunk = chunk->next_page()) {
// Each chunk contains an object that starts at the large object page's // Each chunk contains an object that starts at the large object page's
...@@ -3534,6 +3571,14 @@ void LargeObjectSpace::Verify(Isolate* isolate) { ...@@ -3534,6 +3571,14 @@ void LargeObjectSpace::Verify(Isolate* isolate) {
} }
} }
} }
for (int i = 0; i < kNumTypes; i++) {
ExternalBackingStoreType t = static_cast<ExternalBackingStoreType>(i);
external_backing_store_bytes[t] += chunk->ExternalBackingStoreBytes(t);
}
}
for (int i = 0; i < kNumTypes; i++) {
ExternalBackingStoreType t = static_cast<ExternalBackingStoreType>(i);
CHECK_EQ(external_backing_store_bytes[t], ExternalBackingStoreBytes(t));
} }
} }
#endif #endif
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment