// Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. #ifndef RUNTIME_VM_VIRTUAL_MEMORY_COMPRESSED_H_ #define RUNTIME_VM_VIRTUAL_MEMORY_COMPRESSED_H_ #include "vm/globals.h" #include "vm/heap/pages.h" #include "vm/memory_region.h" namespace dart { #if defined(DART_COMPRESSED_POINTERS) static constexpr intptr_t kCompressedHeapSize = 4 * GB; static constexpr intptr_t kCompressedHeapAlignment = 4 * GB; static constexpr intptr_t kCompressedHeapPageSize = kOldPageSize; static constexpr intptr_t kCompressedHeapNumPages = kCompressedHeapSize / kOldPageSize; static constexpr intptr_t kCompressedHeapBitmapSize = kCompressedHeapNumPages / 8; #if !defined(HOST_OS_FUCHSIA) #define DART_COMPRESSED_HEAP #endif // !defined(HOST_OS_FUCHSIA) #endif // defined(DART_COMPRESSED_POINTERS) #if defined(DART_COMPRESSED_HEAP) // Utilities for allocating memory within a contiguous region of memory, for use // with compressed pointers. class VirtualMemoryCompressedHeap : public AllStatic { public: // Initializes the compressed heap. The callee must allocate a region of // kCompressedHeapSize bytes, aligned to kCompressedHeapSize. static void Init(void* compressed_heap_region); // Cleans up the compressed heap. The callee is responsible for freeing the // region's memory. static void Cleanup(); // Allocates a segment of the compressed heap with the given size. Returns a // heap memory region if a large enough free segment can't be found. static MemoryRegion Allocate(intptr_t size, intptr_t alignment); // Frees a segment. static void Free(void* address, intptr_t size); // Returns whether the address is within the compressed heap. static bool Contains(void* address); // Returns a pointer to the compressed heap region. static void* GetRegion(); private: static bool IsPageUsed(uword page_id); static void SetPageUsed(uword page_id); static void ClearPageUsed(uword page_id); static uword base_; static uint8_t* pages_; static uword minimum_free_page_id_; static Mutex* mutex_; }; #endif // defined(DART_COMPRESSED_HEAP) } // namespace dart #endif // RUNTIME_VM_VIRTUAL_MEMORY_COMPRESSED_H_