1 // Copyright 2020 the V8 project authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef V8_HEAP_CPPGC_GLOBALS_H_ 6 #define V8_HEAP_CPPGC_GLOBALS_H_ 7 8 #include <stddef.h> 9 #include <stdint.h> 10 11 #include "include/cppgc/internal/gc-info.h" 12 #include "src/base/build_config.h" 13 14 namespace cppgc { 15 namespace internal { 16 17 using Address = uint8_t*; 18 using ConstAddress = const uint8_t*; 19 20 constexpr size_t kKB = 1024; 21 constexpr size_t kMB = kKB * 1024; 22 constexpr size_t kGB = kMB * 1024; 23 24 // AccessMode used for choosing between atomic and non-atomic accesses. 25 enum class AccessMode : uint8_t { kNonAtomic, kAtomic }; 26 27 // See 6.7.6 (http://eel.is/c++draft/basic.align) for alignment restrictions. We 28 // do not fully support all alignment restrictions (following 29 // alignof(std::max_align_t)) but limit to alignof(double). 30 // 31 // This means that any scalar type with stricter alignment requirements (in 32 // practice: long double) cannot be used unrestricted in garbage-collected 33 // objects. 34 #if defined(V8_TARGET_ARCH_64_BIT) 35 constexpr size_t kAllocationGranularity = 8; 36 #else // !V8_TARGET_ARCH_64_BIT 37 constexpr size_t kAllocationGranularity = 4; 38 #endif // !V8_TARGET_ARCH_64_BIT 39 constexpr size_t kAllocationMask = kAllocationGranularity - 1; 40 41 constexpr size_t kPageSizeLog2 = 17; 42 constexpr size_t kPageSize = 1 << kPageSizeLog2; 43 constexpr size_t kPageOffsetMask = kPageSize - 1; 44 constexpr size_t kPageBaseMask = ~kPageOffsetMask; 45 46 #if defined(V8_TARGET_ARCH_ARM64) && defined(V8_OS_MACOS) 47 // No guard pages on ARM64 macOS. This target has 16 kiB pages, meaning that 48 // the guard pages do not protect anything, since there is no inaccessible 49 // region surrounding the allocation. 50 // 51 // However, with a 4k guard page size (as below), we avoid putting any data 52 // inside the "guard pages" region. Effectively, this wastes 2 * 4kiB of memory 53 // for each 128kiB page, since this is memory we pay for (since accounting as at 54 // the OS page level), but never use. 55 // 56 // The layout of pages is broadly: 57 // | guard page | header | payload | guard page | 58 // <--- 4k ---> <--- 4k ---> 59 // <------------------ 128k --------------------> 60 // 61 // Since this is aligned on an OS page boundary (16k), the guard pages are part 62 // of the first and last OS page, respectively. So they are really private dirty 63 // memory which we never use. 64 constexpr size_t kGuardPageSize = 0; 65 #else 66 // Guard pages are always put into memory. Whether they are actually protected 67 // depends on the allocator provided to the garbage collector. 68 constexpr size_t kGuardPageSize = 4096; 69 #endif 70 71 constexpr size_t kLargeObjectSizeThreshold = kPageSize / 2; 72 73 constexpr GCInfoIndex kFreeListGCInfoIndex = 0; 74 constexpr size_t kFreeListEntrySize = 2 * sizeof(uintptr_t); 75 76 constexpr size_t kCagedHeapReservationSize = static_cast<size_t>(4) * kGB; 77 constexpr size_t kCagedHeapReservationAlignment = kCagedHeapReservationSize; 78 79 } // namespace internal 80 } // namespace cppgc 81 82 #endif // V8_HEAP_CPPGC_GLOBALS_H_ 83