From 92a7385171bb55840351533e0761eb4a1c5e7dd4 Mon Sep 17 00:00:00 2001 From: Omer Katz Date: Thu, 20 Oct 2022 22:37:33 +0200 Subject: [PATCH] [heap] Fix 32bit msvc builds Size of ActiveSystemPages is 8 bytes even on 32bit builds, thus forcing 8 bytes alignment for MemoryChunk. Change-Id: I5ca1e18329d6e68a8b6811c3c27cb224c765cb63 Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/3966953 Commit-Queue: Omer Katz Reviewed-by: Michael Lippautz Cr-Commit-Position: refs/heads/main@{#83845} --- src/heap/memory-chunk-layout.h | 17 ++++++++++++++--- src/heap/memory-chunk.cc | 11 +++++++++++ 2 files changed, 25 insertions(+), 3 deletions(-) diff --git a/src/heap/memory-chunk-layout.h b/src/heap/memory-chunk-layout.h index 2e1d0e52bb51..8c771f8b2b41 100644 --- a/src/heap/memory-chunk-layout.h +++ b/src/heap/memory-chunk-layout.h @@ -37,8 +37,13 @@ using ActiveSystemPages = ::heap::base::ActiveSystemPages; class V8_EXPORT_PRIVATE MemoryChunkLayout { public: - static const int kNumSets = NUMBER_OF_REMEMBERED_SET_TYPES; - static const int kNumTypes = ExternalBackingStoreType::kNumTypes; + static constexpr int kNumSets = NUMBER_OF_REMEMBERED_SET_TYPES; + static constexpr int kNumTypes = ExternalBackingStoreType::kNumTypes; +#if V8_CC_MSVC && V8_TARGET_ARCH_IA32 + static constexpr int kMemoryChunkAlignment = 8; +#else + static constexpr int kMemoryChunkAlignment = sizeof(size_t); +#endif // V8_CC_MSVC && V8_TARGET_ARCH_IA32 #define FIELD(Type, Name) \ k##Name##Offset, k##Name##End = k##Name##Offset + sizeof(Type) - 1 enum Header { @@ -74,11 +79,17 @@ class V8_EXPORT_PRIVATE MemoryChunkLayout { #endif // V8_ENABLE_INNER_POINTER_RESOLUTION_OSB FIELD(size_t, WasUsedForAllocation), kMarkingBitmapOffset, - kMemoryChunkHeaderSize = kMarkingBitmapOffset, + kMemoryChunkHeaderSize = + kMarkingBitmapOffset + + ((kMarkingBitmapOffset % kMemoryChunkAlignment) == 0 + ? 0 + : kMemoryChunkAlignment - + (kMarkingBitmapOffset % kMemoryChunkAlignment)), kMemoryChunkHeaderStart = kSlotSetOffset, kBasicMemoryChunkHeaderSize = kMemoryChunkHeaderStart, kBasicMemoryChunkHeaderStart = 0, }; +#undef FIELD static size_t CodePageGuardStartOffset(); static size_t CodePageGuardSize(); static intptr_t ObjectStartOffsetInCodePage(); diff --git a/src/heap/memory-chunk.cc b/src/heap/memory-chunk.cc index 368317a1bd68..35493a0b7029 100644 --- a/src/heap/memory-chunk.cc +++ b/src/heap/memory-chunk.cc @@ -512,6 +512,17 @@ void MemoryChunk::ValidateOffsets(MemoryChunk* chunk) { DCHECK_EQ(reinterpret_cast
(&chunk->possibly_empty_buckets_) - chunk->address(), MemoryChunkLayout::kPossiblyEmptyBucketsOffset); + DCHECK_EQ(reinterpret_cast
(&chunk->active_system_pages_) - + chunk->address(), + MemoryChunkLayout::kActiveSystemPagesOffset); +#ifdef V8_ENABLE_INNER_POINTER_RESOLUTION_OSB + DCHECK_EQ(reinterpret_cast
(&chunk->object_start_bitmap_) - + chunk->address(), + MemoryChunkLayout::kObjectStartBitmapOffset); +#endif // V8_ENABLE_INNER_POINTER_RESOLUTION_OSB + DCHECK_EQ(reinterpret_cast
(&chunk->was_used_for_allocation_) - + chunk->address(), + MemoryChunkLayout::kWasUsedForAllocationOffset); } #endif