Commit 001814ee authored by Hannes Payer's avatar Hannes Payer Committed by Commit Bot

[heap] Initialize free space memory in the sweeper.

Bug: chromium:829771
Change-Id: Ia3b6221cdc54c5102760665076f1cb2541d16fb4
Reviewed-on: https://chromium-review.googlesource.com/999634Reviewed-by: 's avatarUlan Degenbaev <ulan@chromium.org>
Reviewed-by: 's avatarMichael Starzinger <mstarzinger@chromium.org>
Commit-Queue: Hannes Payer <hpayer@chromium.org>
Cr-Commit-Position: refs/heads/master@{#52463}
parent b7b9ad61
...@@ -420,6 +420,7 @@ const intptr_t kClearedWeakHeapObject = 3; ...@@ -420,6 +420,7 @@ const intptr_t kClearedWeakHeapObject = 3;
// Zap-value: The value used for zapping dead objects. // Zap-value: The value used for zapping dead objects.
// Should be a recognizable hex value tagged as a failure. // Should be a recognizable hex value tagged as a failure.
#ifdef V8_HOST_ARCH_64_BIT #ifdef V8_HOST_ARCH_64_BIT
constexpr uint64_t kClearedFreeMemoryValue = 0;
constexpr uint64_t kZapValue = uint64_t{0xdeadbeedbeadbeef}; constexpr uint64_t kZapValue = uint64_t{0xdeadbeedbeadbeef};
constexpr uint64_t kHandleZapValue = uint64_t{0x1baddead0baddeaf}; constexpr uint64_t kHandleZapValue = uint64_t{0x1baddead0baddeaf};
constexpr uint64_t kGlobalHandleZapValue = uint64_t{0x1baffed00baffedf}; constexpr uint64_t kGlobalHandleZapValue = uint64_t{0x1baffed00baffedf};
...@@ -428,6 +429,7 @@ constexpr uint64_t kDebugZapValue = uint64_t{0xbadbaddbbadbaddb}; ...@@ -428,6 +429,7 @@ constexpr uint64_t kDebugZapValue = uint64_t{0xbadbaddbbadbaddb};
constexpr uint64_t kSlotsZapValue = uint64_t{0xbeefdeadbeefdeef}; constexpr uint64_t kSlotsZapValue = uint64_t{0xbeefdeadbeefdeef};
constexpr uint64_t kFreeListZapValue = 0xfeed1eaffeed1eaf; constexpr uint64_t kFreeListZapValue = 0xfeed1eaffeed1eaf;
#else #else
constexpr uint32_t kClearedFreeMemoryValue = 0;
constexpr uint32_t kZapValue = 0xdeadbeef; constexpr uint32_t kZapValue = 0xdeadbeef;
constexpr uint32_t kHandleZapValue = 0xbaddeaf; constexpr uint32_t kHandleZapValue = 0xbaddeaf;
constexpr uint32_t kGlobalHandleZapValue = 0xbaffedf; constexpr uint32_t kGlobalHandleZapValue = 0xbaffedf;
......
...@@ -3028,7 +3028,8 @@ AllocationResult Heap::AllocateBytecodeArray(int length, ...@@ -3028,7 +3028,8 @@ AllocationResult Heap::AllocateBytecodeArray(int length,
} }
HeapObject* Heap::CreateFillerObjectAt(Address addr, int size, HeapObject* Heap::CreateFillerObjectAt(Address addr, int size,
ClearRecordedSlots mode) { ClearRecordedSlots clear_slots_mode,
ClearFreedMemoryMode clear_memory_mode) {
if (size == 0) return nullptr; if (size == 0) return nullptr;
HeapObject* filler = HeapObject::FromAddress(addr); HeapObject* filler = HeapObject::FromAddress(addr);
if (size == kPointerSize) { if (size == kPointerSize) {
...@@ -3039,14 +3040,22 @@ HeapObject* Heap::CreateFillerObjectAt(Address addr, int size, ...@@ -3039,14 +3040,22 @@ HeapObject* Heap::CreateFillerObjectAt(Address addr, int size,
filler->set_map_after_allocation( filler->set_map_after_allocation(
reinterpret_cast<Map*>(root(kTwoPointerFillerMapRootIndex)), reinterpret_cast<Map*>(root(kTwoPointerFillerMapRootIndex)),
SKIP_WRITE_BARRIER); SKIP_WRITE_BARRIER);
if (clear_memory_mode == ClearFreedMemoryMode::kClearFreedMemory) {
Memory::Address_at(addr + kPointerSize) =
reinterpret_cast<Address>(kClearedFreeMemoryValue);
}
} else { } else {
DCHECK_GT(size, 2 * kPointerSize); DCHECK_GT(size, 2 * kPointerSize);
filler->set_map_after_allocation( filler->set_map_after_allocation(
reinterpret_cast<Map*>(root(kFreeSpaceMapRootIndex)), reinterpret_cast<Map*>(root(kFreeSpaceMapRootIndex)),
SKIP_WRITE_BARRIER); SKIP_WRITE_BARRIER);
FreeSpace::cast(filler)->relaxed_write_size(size); FreeSpace::cast(filler)->relaxed_write_size(size);
if (clear_memory_mode == ClearFreedMemoryMode::kClearFreedMemory) {
memset(reinterpret_cast<void*>(addr + 2 * kPointerSize),
kClearedFreeMemoryValue, size - 2 * kPointerSize);
}
} }
if (mode == ClearRecordedSlots::kYes) { if (clear_slots_mode == ClearRecordedSlots::kYes) {
ClearRecordedSlotRange(addr, addr + size); ClearRecordedSlotRange(addr, addr + size);
} }
......
...@@ -453,6 +453,8 @@ enum ArrayStorageAllocationMode { ...@@ -453,6 +453,8 @@ enum ArrayStorageAllocationMode {
enum class ClearRecordedSlots { kYes, kNo }; enum class ClearRecordedSlots { kYes, kNo };
enum class ClearFreedMemoryMode { kClearFreedMemory, kDontClearFreedMemory };
enum class FixedArrayVisitationMode { kRegular, kIncremental }; enum class FixedArrayVisitationMode { kRegular, kIncremental };
enum class TraceRetainingPathMode { kEnabled, kDisabled }; enum class TraceRetainingPathMode { kEnabled, kDisabled };
...@@ -758,9 +760,13 @@ class Heap { ...@@ -758,9 +760,13 @@ class Heap {
// Initialize a filler object to keep the ability to iterate over the heap // Initialize a filler object to keep the ability to iterate over the heap
// when introducing gaps within pages. If slots could have been recorded in // when introducing gaps within pages. If slots could have been recorded in
// the freed area, then pass ClearRecordedSlots::kYes as the mode. Otherwise, // the freed area, then pass ClearRecordedSlots::kYes as the mode. Otherwise,
// pass ClearRecordedSlots::kNo. // pass ClearRecordedSlots::kNo. If the memory after the object header of
V8_EXPORT_PRIVATE HeapObject* CreateFillerObjectAt(Address addr, int size, // the filler should be cleared, pass in kClearFreedMemory. The default is
ClearRecordedSlots mode); // kDontClearFreedMemory.
V8_EXPORT_PRIVATE HeapObject* CreateFillerObjectAt(
Address addr, int size, ClearRecordedSlots clear_slots_mode,
ClearFreedMemoryMode clear_memory_mode =
ClearFreedMemoryMode::kDontClearFreedMemory);
bool CanMoveObjectStart(HeapObject* object); bool CanMoveObjectStart(HeapObject* object);
......
...@@ -288,8 +288,9 @@ int Sweeper::RawSweep(Page* p, FreeListRebuildingMode free_list_mode, ...@@ -288,8 +288,9 @@ int Sweeper::RawSweep(Page* p, FreeListRebuildingMode free_list_mode,
free_start, size, SpaceAccountingMode::kSpaceUnaccounted); free_start, size, SpaceAccountingMode::kSpaceUnaccounted);
max_freed_bytes = Max(freed_bytes, max_freed_bytes); max_freed_bytes = Max(freed_bytes, max_freed_bytes);
} else { } else {
p->heap()->CreateFillerObjectAt(free_start, static_cast<int>(size), p->heap()->CreateFillerObjectAt(
ClearRecordedSlots::kNo); free_start, static_cast<int>(size), ClearRecordedSlots::kNo,
ClearFreedMemoryMode::kClearFreedMemory);
} }
RememberedSet<OLD_TO_NEW>::RemoveRange(p, free_start, free_end, RememberedSet<OLD_TO_NEW>::RemoveRange(p, free_start, free_end,
SlotSet::KEEP_EMPTY_BUCKETS); SlotSet::KEEP_EMPTY_BUCKETS);
...@@ -328,7 +329,8 @@ int Sweeper::RawSweep(Page* p, FreeListRebuildingMode free_list_mode, ...@@ -328,7 +329,8 @@ int Sweeper::RawSweep(Page* p, FreeListRebuildingMode free_list_mode,
max_freed_bytes = Max(freed_bytes, max_freed_bytes); max_freed_bytes = Max(freed_bytes, max_freed_bytes);
} else { } else {
p->heap()->CreateFillerObjectAt(free_start, static_cast<int>(size), p->heap()->CreateFillerObjectAt(free_start, static_cast<int>(size),
ClearRecordedSlots::kNo); ClearRecordedSlots::kNo,
ClearFreedMemoryMode::kClearFreedMemory);
} }
RememberedSet<OLD_TO_NEW>::RemoveRange(p, free_start, p->area_end(), RememberedSet<OLD_TO_NEW>::RemoveRange(p, free_start, p->area_end(),
......
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