16#define STATIC_ASSERT_ENUM(a, b) \
17 static_assert(static_cast<int>(a) == static_cast<int>(b), \
18 "mismatching enum: " #a)
28#undef STATIC_ASSERT_ENUM
32 switch (permissions) {
48 uint8_t lhs_bits = PagePermissionsToBitset(lhs);
49 uint8_t rhs_bits = PagePermissionsToBitset(rhs);
50 return (lhs_bits & rhs_bits) == lhs_bits;
56 std::numeric_limits<uintptr_t>::max(),
61 OS::EnsureWin32MemoryAPILoaded();
65 DCHECK_GE(allocation_granularity(), page_size());
84 return reinterpret_cast<Address>(
85 OS::Allocate(
reinterpret_cast<void*
>(hint), size, alignment,
93 OS::Free(
reinterpret_cast<void*
>(address), size);
109 void* hint =
reinterpret_cast<void*
>(address);
122 OS::Free(
reinterpret_cast<void*
>(address), size);
137 reinterpret_cast<void*
>(hint), size,
149 Address hint,
size_t size,
size_t alignment,
155 std::optional<AddressSpaceReservation> reservation =
157 reinterpret_cast<void*
>(hint), size, alignment,
159 if (!reservation.has_value())
160 return std::unique_ptr<v8::VirtualAddressSpace>();
161 return std::unique_ptr<v8::VirtualAddressSpace>(
196 parent_space->allocation_granularity(),
198 reservation.size(), max_page_permissions),
199 reservation_(reservation),
200 region_allocator_(reinterpret_cast<
Address>(reservation.
base()),
202 parent_space->allocation_granularity()),
203 parent_space_(parent_space) {
236 return RoundDown(addr, allocation_granularity());
285 reinterpret_cast<void*
>(address), size,
322 reinterpret_cast<void*
>(address), size,
343std::unique_ptr<v8::VirtualAddressSpace>
350 DCHECK(
IsSubset(max_page_permissions, this->max_page_permissions()));
356 return std::unique_ptr<v8::VirtualAddressSpace>();
359 std::optional<AddressSpaceReservation> reservation =
361 reinterpret_cast<void*
>(address), size,
363 if (!reservation.has_value()) {
367 return std::unique_ptr<v8::VirtualAddressSpace>(
378 reinterpret_cast<void*
>(address), size,
V8_WARN_UNUSED_RESULT bool DiscardSystemPages(void *address, size_t size)
V8_WARN_UNUSED_RESULT bool Allocate(void *address, size_t size, OS::MemoryPermission access)
V8_WARN_UNUSED_RESULT bool RecommitPages(void *address, size_t size, OS::MemoryPermission access)
V8_WARN_UNUSED_RESULT bool Free(void *address, size_t size)
V8_WARN_UNUSED_RESULT bool SetPermissions(void *address, size_t size, OS::MemoryPermission access)
V8_WARN_UNUSED_RESULT bool DecommitPages(void *address, size_t size)
V8_WARN_UNUSED_RESULT bool FreeShared(void *address, size_t size)
V8_WARN_UNUSED_RESULT std::optional< AddressSpaceReservation > CreateSubReservation(void *address, size_t size, OS::MemoryPermission max_permission)
V8_WARN_UNUSED_RESULT bool AllocateShared(void *address, size_t size, OS::MemoryPermission access, PlatformSharedMemoryHandle handle, uint64_t offset)
static V8_WARN_UNUSED_RESULT bool FreeSubReservation(AddressSpaceReservation reservation)
static V8_WARN_UNUSED_RESULT void * AllocateShared(size_t size, MemoryPermission access)
static void * GetRandomMmapAddr()
static V8_WARN_UNUSED_RESULT bool CanReserveAddressSpace()
static V8_WARN_UNUSED_RESULT bool DiscardSystemPages(void *address, size_t size)
static void FreeAddressSpaceReservation(AddressSpaceReservation reservation)
static void FreeShared(void *address, size_t size)
static V8_WARN_UNUSED_RESULT bool SetPermissions(void *address, size_t size, MemoryPermission access)
static V8_WARN_UNUSED_RESULT bool DecommitPages(void *address, size_t size)
static V8_WARN_UNUSED_RESULT bool RecommitPages(void *address, size_t size, MemoryPermission access)
static V8_WARN_UNUSED_RESULT void * Allocate(void *address, size_t size, size_t alignment, MemoryPermission access)
static void SetRandomMmapSeed(int64_t seed)
static V8_WARN_UNUSED_RESULT std::optional< AddressSpaceReservation > CreateAddressSpaceReservation(void *hint, size_t size, size_t alignment, MemoryPermission max_permission)
static void Free(void *address, size_t size)
void SetSeed(int64_t seed)
int64_t NextInt64() V8_WARN_UNUSED_RESULT
Address AllocateRegion(size_t size)
bool AllocateRegionAt(Address requested_address, size_t size, RegionState region_state=RegionState::kAllocated)
void set_on_split_callback(SplitMergeCallback callback)
void set_on_merge_callback(SplitMergeCallback callback)
size_t FreeRegion(Address address)
static constexpr Address kAllocationFailure
virtual void FreeSubspace(VirtualAddressSubspace *subspace)=0
friend VirtualAddressSubspace
void FreePages(Address address, size_t size) override
Address AllocatePages(Address hint, size_t size, size_t alignment, PagePermissions access) override
Address RandomPageAddress() override
bool CanAllocateSubspaces() override
void FreeGuardRegion(Address address, size_t size) override
void SetRandomSeed(int64_t seed) override
void FreeSharedPages(Address address, size_t size) override
bool SetPagePermissions(Address address, size_t size, PagePermissions access) override
void FreeSubspace(VirtualAddressSubspace *subspace) override
bool RecommitPages(Address address, size_t size, PagePermissions access) override
bool DiscardSystemPages(Address address, size_t size) override
bool DecommitPages(Address address, size_t size) override
Address AllocateSharedPages(Address hint, size_t size, PagePermissions permissions, PlatformSharedMemoryHandle handle, uint64_t offset) override
bool AllocateGuardRegion(Address address, size_t size) override
std::unique_ptr< v8::VirtualAddressSpace > AllocateSubspace(Address hint, size_t size, size_t alignment, PagePermissions max_page_permissions) override
bool AllocateGuardRegion(Address address, size_t size) override
RandomNumberGenerator rng_
Address RandomPageAddress() override
bool SetPagePermissions(Address address, size_t size, PagePermissions permissions) override
bool DecommitPages(Address address, size_t size) override
void FreeGuardRegion(Address address, size_t size) override
RegionAllocator region_allocator_
void FreePages(Address address, size_t size) override
bool RecommitPages(Address address, size_t size, PagePermissions permissions) override
bool DiscardSystemPages(Address address, size_t size) override
VirtualAddressSpaceBase * parent_space_
std::unique_ptr< v8::VirtualAddressSpace > AllocateSubspace(Address hint, size_t size, size_t alignment, PagePermissions max_page_permissions) override
void FreeSubspace(VirtualAddressSubspace *subspace) override
Address AllocateSharedPages(Address hint, size_t size, PagePermissions permissions, PlatformSharedMemoryHandle handle, uint64_t offset) override
void SetRandomSeed(int64_t seed) override
~VirtualAddressSubspace() override
AddressSpaceReservation reservation_
void FreeSharedPages(Address address, size_t size) override
Address AllocatePages(Address hint, size_t size, size_t alignment, PagePermissions permissions) override
ZoneVector< RpoNumber > & result
constexpr bool IsPowerOfTwo(T value)
void FatalOOM(OOMType type, const char *msg)
bool IsSubset(PagePermissions lhs, PagePermissions rhs)
constexpr Address kNullAddress
intptr_t PlatformSharedMemoryHandle
#define STATIC_ASSERT_ENUM(a, b)
#define DCHECK_GE(v1, v2)
#define CHECK_EQ(lhs, rhs)
#define DCHECK(condition)
constexpr T RoundDown(T x, intptr_t m)
constexpr bool IsAligned(T value, U alignment)