5#ifndef INCLUDE_CPPGC_INTERNAL_CAGED_HEAP_LOCAL_DATA_H_
6#define INCLUDE_CPPGC_INTERNAL_CAGED_HEAP_LOCAL_DATA_H_
22#if defined(CPPGC_CAGED_HEAP)
30#if defined(CPPGC_YOUNG_GENERATION)
37 static constexpr size_t kRequiredSize = 1 * api_constants::kMB;
39 api_constants::kAllocationGranularity;
43 enum class Age : uint8_t { kOld, kYoung, kMixed };
46 enum class AdjacentCardsPolicy : uint8_t { kConsider, kIgnore };
48 static constexpr size_t kCardSizeInBytes =
49 api_constants::kCagedHeapReservationSize / kRequiredSize;
51 void SetAge(uintptr_t cage_offset, Age age) {
52 table_[card(cage_offset)] = age;
55 V8_INLINE Age GetAge(uintptr_t cage_offset)
const {
56 return table_[card(cage_offset)];
59 void SetAgeForRange(uintptr_t cage_offset_begin, uintptr_t cage_offset_end,
60 Age age, AdjacentCardsPolicy adjacent_cards_policy);
62 Age GetAgeForRange(uintptr_t cage_offset_begin,
63 uintptr_t cage_offset_end)
const;
65 void ResetForTesting();
68 V8_INLINE size_t card(uintptr_t offset)
const {
69 constexpr size_t kGranularityBits =
71 std::countr_zero(
static_cast<uint32_t
>(kCardSizeInBytes));
72#elif V8_HAS_BUILTIN_CTZ
73 __builtin_ctz(
static_cast<uint32_t
>(kCardSizeInBytes));
76#if defined(CPPGC_2GB_CAGE)
82 static_assert((1 << kGranularityBits) == kCardSizeInBytes);
83 const size_t entry = offset >> kGranularityBits;
88 std::array<Age, kRequiredSize> table_;
92 "Size of AgeTable is 1MB");
96struct CagedHeapLocalData final {
97 V8_INLINE static CagedHeapLocalData& Get() {
98 return *
reinterpret_cast<CagedHeapLocalData*
>(CagedHeapBase::GetBase());
101#if defined(CPPGC_YOUNG_GENERATION)
#define CPPGC_DCHECK(condition)
constexpr size_t kAllocationGranularity