1 //=-- lsan_allocator.h ----------------------------------------------------===// 2 // 3 // This file is distributed under the University of Illinois Open Source 4 // License. See LICENSE.TXT for details. 5 // 6 //===----------------------------------------------------------------------===// 7 // 8 // This file is a part of LeakSanitizer. 9 // Allocator for standalone LSan. 10 // 11 //===----------------------------------------------------------------------===// 12 13 #ifndef LSAN_ALLOCATOR_H 14 #define LSAN_ALLOCATOR_H 15 16 #include "sanitizer_common/sanitizer_allocator.h" 17 #include "sanitizer_common/sanitizer_common.h" 18 #include "sanitizer_common/sanitizer_internal_defs.h" 19 #include "lsan_common.h" 20 21 namespace __lsan { 22 23 void *Allocate(const StackTrace &stack, uptr size, uptr alignment, 24 bool cleared); 25 void Deallocate(void *p); 26 void *Reallocate(const StackTrace &stack, void *p, uptr new_size, 27 uptr alignment); 28 uptr GetMallocUsableSize(const void *p); 29 30 template<typename Callable> 31 void ForEachChunk(const Callable &callback); 32 33 void GetAllocatorCacheRange(uptr *begin, uptr *end); 34 void AllocatorThreadFinish(); 35 void InitializeAllocator(); 36 37 const bool kAlwaysClearMemory = true; 38 39 struct ChunkMetadata { 40 u8 allocated : 8; // Must be first. 41 ChunkTag tag : 2; 42 #if SANITIZER_WORDSIZE == 64 43 uptr requested_size : 54; 44 #else 45 uptr requested_size : 32; 46 uptr padding : 22; 47 #endif 48 u32 stack_trace_id; 49 }; 50 51 #if defined(__aarch64__) || defined(__i386__) || defined(__arm__) || \ 52 ((defined(__sparc__) || \ 53 defined(__powerpc__) || \ 54 defined(__m68k__) || \ 55 defined(__hppa__) || \ 56 defined(__sh3__) || \ 57 defined(__vax__) || \ 58 defined(__riscv) || \ 59 defined(__mips__)) && !defined(_LP64)) 60 static const uptr kRegionSizeLog = 20; 61 static const uptr kNumRegions = SANITIZER_MMAP_RANGE_SIZE >> kRegionSizeLog; 62 typedef TwoLevelByteMap<(kNumRegions >> 12), 1 << 12> ByteMap; 63 64 struct AP32 { 65 static const uptr kSpaceBeg = 0; 66 static const u64 kSpaceSize = SANITIZER_MMAP_RANGE_SIZE; 67 static const uptr kMetadataSize = sizeof(ChunkMetadata); 68 typedef __sanitizer::CompactSizeClassMap SizeClassMap; 69 static const uptr kRegionSizeLog = __lsan::kRegionSizeLog; 70 typedef __lsan::ByteMap ByteMap; 71 typedef NoOpMapUnmapCallback MapUnmapCallback; 72 static const uptr kFlags = 0; 73 }; 74 typedef SizeClassAllocator32<AP32> PrimaryAllocator; 75 #elif defined(__x86_64__) || defined(__powerpc64__) || defined(__sparc64__) || \ 76 defined(__ia64__) || defined(__alpha__) || \ 77 defined(__mips64) || defined(__riscv) 78 # if defined(__powerpc64__) 79 const uptr kAllocatorSpace = 0xa0000000000ULL; 80 const uptr kAllocatorSize = 0x20000000000ULL; // 2T. 81 # else 82 const uptr kAllocatorSpace = 0x600000000000ULL; 83 const uptr kAllocatorSize = 0x40000000000ULL; // 4T. 84 # endif 85 struct AP64 { // Allocator64 parameters. Deliberately using a short name. 86 static const uptr kSpaceBeg = kAllocatorSpace; 87 static const uptr kSpaceSize = kAllocatorSize; 88 static const uptr kMetadataSize = sizeof(ChunkMetadata); 89 typedef DefaultSizeClassMap SizeClassMap; 90 typedef NoOpMapUnmapCallback MapUnmapCallback; 91 static const uptr kFlags = 0; 92 }; 93 94 typedef SizeClassAllocator64<AP64> PrimaryAllocator; 95 #else 96 #error "unsupported lsan platform" 97 #endif 98 typedef SizeClassAllocatorLocalCache<PrimaryAllocator> AllocatorCache; 99 100 AllocatorCache *GetAllocatorCache(); 101 102 int lsan_posix_memalign(void **memptr, uptr alignment, uptr size, 103 const StackTrace &stack); 104 void *lsan_aligned_alloc(uptr alignment, uptr size, const StackTrace &stack); 105 void *lsan_memalign(uptr alignment, uptr size, const StackTrace &stack); 106 void *lsan_malloc(uptr size, const StackTrace &stack); 107 void lsan_free(void *p); 108 void *lsan_realloc(void *p, uptr size, const StackTrace &stack); 109 void *lsan_calloc(uptr nmemb, uptr size, const StackTrace &stack); 110 void *lsan_valloc(uptr size, const StackTrace &stack); 111 void *lsan_pvalloc(uptr size, const StackTrace &stack); 112 uptr lsan_mz_size(const void *p); 113 114 } // namespace __lsan 115 116 #endif // LSAN_ALLOCATOR_H 117