178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov//===-- msan_allocator.cc --------------------------- ---------------------===// 278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov// 378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov// The LLVM Compiler Infrastructure 478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov// 578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov// This file is distributed under the University of Illinois Open Source 678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov// License. See LICENSE.TXT for details. 778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov// 878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov//===----------------------------------------------------------------------===// 978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov// 1078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov// This file is a part of MemorySanitizer. 1178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov// 1278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov// MemorySanitizer allocator. 1378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov//===----------------------------------------------------------------------===// 1478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 1578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov#include "sanitizer_common/sanitizer_allocator.h" 165d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines#include "sanitizer_common/sanitizer_allocator_interface.h" 1778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov#include "sanitizer_common/sanitizer_stackdepot.h" 1878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov#include "msan.h" 192d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#include "msan_allocator.h" 202d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#include "msan_chained_origin_depot.h" 212d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#include "msan_origin.h" 222d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#include "msan_thread.h" 2378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 2478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanovnamespace __msan { 2578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 2678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanovstruct Metadata { 2778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov uptr requested_size; 2878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov}; 2978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 302d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesstruct MsanMapUnmapCallback { 312d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines void OnMap(uptr p, uptr size) const {} 322d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines void OnUnmap(uptr p, uptr size) const { 332d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines __msan_unpoison((void *)p, size); 342d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 352d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines // We are about to unmap a chunk of user memory. 362d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines // Mark the corresponding shadow memory as not needed. 372d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines FlushUnneededShadowMemory(MEM_TO_SHADOW(p), size); 382d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines if (__msan_get_track_origins()) 392d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines FlushUnneededShadowMemory(MEM_TO_ORIGIN(p), size); 402d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines } 412d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines}; 422d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 4378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanovstatic const uptr kAllocatorSpace = 0x600000000000ULL; 4478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanovstatic const uptr kAllocatorSize = 0x80000000000; // 8T. 4578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanovstatic const uptr kMetadataSize = sizeof(Metadata); 46600d51680fb20f670695e931de60df4d88616e96Evgeniy Stepanovstatic const uptr kMaxAllowedMallocSize = 8UL << 30; 4778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 4878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanovtypedef SizeClassAllocator64<kAllocatorSpace, kAllocatorSize, kMetadataSize, 492d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines DefaultSizeClassMap, 502d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines MsanMapUnmapCallback> PrimaryAllocator; 5178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanovtypedef SizeClassAllocatorLocalCache<PrimaryAllocator> AllocatorCache; 522d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinestypedef LargeMmapAllocator<MsanMapUnmapCallback> SecondaryAllocator; 5378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanovtypedef CombinedAllocator<PrimaryAllocator, AllocatorCache, 5478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov SecondaryAllocator> Allocator; 5578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 5678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanovstatic Allocator allocator; 572d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesstatic AllocatorCache fallback_allocator_cache; 582d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesstatic SpinMutex fallback_mutex; 5978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 6078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanovstatic int inited = 0; 6178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 6278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanovstatic inline void Init() { 6378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (inited) return; 6478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __msan_init(); 6578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov inited = true; // this must happen before any threads are created. 6678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov allocator.Init(); 6778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 6878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 692d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesAllocatorCache *GetAllocatorCache(MsanThreadLocalMallocStorage *ms) { 702d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines CHECK(ms); 712d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines CHECK_LE(sizeof(AllocatorCache), sizeof(ms->allocator_cache)); 722d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines return reinterpret_cast<AllocatorCache *>(ms->allocator_cache); 737c6bd4060e60f5b148cc629c8791c2a8bf3d3347Evgeniy Stepanov} 747c6bd4060e60f5b148cc629c8791c2a8bf3d3347Evgeniy Stepanov 752d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesvoid MsanThreadLocalMallocStorage::CommitBack() { 762d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines allocator.SwallowCache(GetAllocatorCache(this)); 772d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines} 782d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 792d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesstatic void *MsanAllocate(StackTrace *stack, uptr size, uptr alignment, 802d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines bool zeroise) { 8178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov Init(); 82600d51680fb20f670695e931de60df4d88616e96Evgeniy Stepanov if (size > kMaxAllowedMallocSize) { 83600d51680fb20f670695e931de60df4d88616e96Evgeniy Stepanov Report("WARNING: MemorySanitizer failed to allocate %p bytes\n", 84600d51680fb20f670695e931de60df4d88616e96Evgeniy Stepanov (void *)size); 85600d51680fb20f670695e931de60df4d88616e96Evgeniy Stepanov return AllocatorReturnNull(); 86600d51680fb20f670695e931de60df4d88616e96Evgeniy Stepanov } 872d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines MsanThread *t = GetCurrentThread(); 882d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines void *allocated; 892d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines if (t) { 902d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines AllocatorCache *cache = GetAllocatorCache(&t->malloc_storage()); 912d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines allocated = allocator.Allocate(cache, size, alignment, false); 922d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines } else { 932d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines SpinMutexLock l(&fallback_mutex); 942d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines AllocatorCache *cache = &fallback_allocator_cache; 952d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines allocated = allocator.Allocate(cache, size, alignment, false); 962d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines } 972d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines Metadata *meta = 982d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines reinterpret_cast<Metadata *>(allocator.GetMetaData(allocated)); 9978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov meta->requested_size = size; 100effdc7e483708cfa4dc597c21f246c5dbc09daa0Evgeniy Stepanov if (zeroise) { 1012d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines __msan_clear_and_unpoison(allocated, size); 102effdc7e483708cfa4dc597c21f246c5dbc09daa0Evgeniy Stepanov } else if (flags()->poison_in_malloc) { 1032d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines __msan_poison(allocated, size); 104effdc7e483708cfa4dc597c21f246c5dbc09daa0Evgeniy Stepanov if (__msan_get_track_origins()) { 105effdc7e483708cfa4dc597c21f246c5dbc09daa0Evgeniy Stepanov u32 stack_id = StackDepotPut(stack->trace, stack->size); 106effdc7e483708cfa4dc597c21f246c5dbc09daa0Evgeniy Stepanov CHECK(stack_id); 1072d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines u32 id; 1082d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ChainedOriginDepotPut(stack_id, Origin::kHeapRoot, &id); 1092d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines __msan_set_origin(allocated, size, Origin(id, 1).raw_id()); 110effdc7e483708cfa4dc597c21f246c5dbc09daa0Evgeniy Stepanov } 11178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov } 1122d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines MSAN_MALLOC_HOOK(allocated, size); 1132d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines return allocated; 11478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 11578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 116effdc7e483708cfa4dc597c21f246c5dbc09daa0Evgeniy Stepanovvoid MsanDeallocate(StackTrace *stack, void *p) { 11778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov CHECK(p); 11878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov Init(); 1195c48a8c4a8b3f7cd3f03f26c6aadc0ee606fc9b7Evgeniy Stepanov MSAN_FREE_HOOK(p); 1205d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines Metadata *meta = reinterpret_cast<Metadata *>(allocator.GetMetaData(p)); 12178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov uptr size = meta->requested_size; 1225c48a8c4a8b3f7cd3f03f26c6aadc0ee606fc9b7Evgeniy Stepanov meta->requested_size = 0; 12378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov // This memory will not be reused by anyone else, so we are free to keep it 12478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov // poisoned. 125effdc7e483708cfa4dc597c21f246c5dbc09daa0Evgeniy Stepanov if (flags()->poison_in_free) { 126effdc7e483708cfa4dc597c21f246c5dbc09daa0Evgeniy Stepanov __msan_poison(p, size); 127effdc7e483708cfa4dc597c21f246c5dbc09daa0Evgeniy Stepanov if (__msan_get_track_origins()) { 128effdc7e483708cfa4dc597c21f246c5dbc09daa0Evgeniy Stepanov u32 stack_id = StackDepotPut(stack->trace, stack->size); 129effdc7e483708cfa4dc597c21f246c5dbc09daa0Evgeniy Stepanov CHECK(stack_id); 1302d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines u32 id; 1312d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ChainedOriginDepotPut(stack_id, Origin::kHeapRoot, &id); 1325d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines __msan_set_origin(p, size, Origin(id, 1).raw_id()); 133effdc7e483708cfa4dc597c21f246c5dbc09daa0Evgeniy Stepanov } 134effdc7e483708cfa4dc597c21f246c5dbc09daa0Evgeniy Stepanov } 1352d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines MsanThread *t = GetCurrentThread(); 1362d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines if (t) { 1372d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines AllocatorCache *cache = GetAllocatorCache(&t->malloc_storage()); 1382d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines allocator.Deallocate(cache, p); 1392d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines } else { 1402d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines SpinMutexLock l(&fallback_mutex); 1412d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines AllocatorCache *cache = &fallback_allocator_cache; 1422d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines allocator.Deallocate(cache, p); 1432d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines } 14478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 14578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 14678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanovvoid *MsanReallocate(StackTrace *stack, void *old_p, uptr new_size, 14778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov uptr alignment, bool zeroise) { 14878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (!old_p) 14978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return MsanAllocate(stack, new_size, alignment, zeroise); 15078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (!new_size) { 151effdc7e483708cfa4dc597c21f246c5dbc09daa0Evgeniy Stepanov MsanDeallocate(stack, old_p); 15278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return 0; 15378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov } 15478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov Metadata *meta = reinterpret_cast<Metadata*>(allocator.GetMetaData(old_p)); 15578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov uptr old_size = meta->requested_size; 15678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov uptr actually_allocated_size = allocator.GetActuallyAllocatedSize(old_p); 15778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (new_size <= actually_allocated_size) { 15878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov // We are not reallocating here. 15978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov meta->requested_size = new_size; 16078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (new_size > old_size) 16178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __msan_poison((char*)old_p + old_size, new_size - old_size); 16278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return old_p; 16378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov } 16478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov uptr memcpy_size = Min(new_size, old_size); 16578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov void *new_p = MsanAllocate(stack, new_size, alignment, zeroise); 16678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov // Printf("realloc: old_size %zd new_size %zd\n", old_size, new_size); 167600d51680fb20f670695e931de60df4d88616e96Evgeniy Stepanov if (new_p) { 16878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __msan_memcpy(new_p, old_p, memcpy_size); 169600d51680fb20f670695e931de60df4d88616e96Evgeniy Stepanov MsanDeallocate(stack, old_p); 170600d51680fb20f670695e931de60df4d88616e96Evgeniy Stepanov } 17178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return new_p; 17278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 17378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 1745c48a8c4a8b3f7cd3f03f26c6aadc0ee606fc9b7Evgeniy Stepanovstatic uptr AllocationSize(const void *p) { 1755d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines if (p == 0) return 0; 1765c48a8c4a8b3f7cd3f03f26c6aadc0ee606fc9b7Evgeniy Stepanov const void *beg = allocator.GetBlockBegin(p); 1775d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines if (beg != p) return 0; 1785d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines Metadata *b = (Metadata *)allocator.GetMetaData(p); 1795c48a8c4a8b3f7cd3f03f26c6aadc0ee606fc9b7Evgeniy Stepanov return b->requested_size; 1805c48a8c4a8b3f7cd3f03f26c6aadc0ee606fc9b7Evgeniy Stepanov} 1815c48a8c4a8b3f7cd3f03f26c6aadc0ee606fc9b7Evgeniy Stepanov 18278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} // namespace __msan 1835c48a8c4a8b3f7cd3f03f26c6aadc0ee606fc9b7Evgeniy Stepanov 1845c48a8c4a8b3f7cd3f03f26c6aadc0ee606fc9b7Evgeniy Stepanovusing namespace __msan; 1855c48a8c4a8b3f7cd3f03f26c6aadc0ee606fc9b7Evgeniy Stepanov 1865d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hinesuptr __sanitizer_get_current_allocated_bytes() { 1875d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines uptr stats[AllocatorStatCount]; 1885c48a8c4a8b3f7cd3f03f26c6aadc0ee606fc9b7Evgeniy Stepanov allocator.GetStats(stats); 1895d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines return stats[AllocatorStatAllocated]; 1905d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines} 1915d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hinesuptr __msan_get_current_allocated_bytes() { 1925d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines return __sanitizer_get_current_allocated_bytes(); 1935c48a8c4a8b3f7cd3f03f26c6aadc0ee606fc9b7Evgeniy Stepanov} 1945c48a8c4a8b3f7cd3f03f26c6aadc0ee606fc9b7Evgeniy Stepanov 1955d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hinesuptr __sanitizer_get_heap_size() { 1965d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines uptr stats[AllocatorStatCount]; 1975c48a8c4a8b3f7cd3f03f26c6aadc0ee606fc9b7Evgeniy Stepanov allocator.GetStats(stats); 1985d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines return stats[AllocatorStatMapped]; 1995d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines} 2005d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hinesuptr __msan_get_heap_size() { 2015d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines return __sanitizer_get_heap_size(); 2025c48a8c4a8b3f7cd3f03f26c6aadc0ee606fc9b7Evgeniy Stepanov} 2035c48a8c4a8b3f7cd3f03f26c6aadc0ee606fc9b7Evgeniy Stepanov 2045d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hinesuptr __sanitizer_get_free_bytes() { return 1; } 2055c48a8c4a8b3f7cd3f03f26c6aadc0ee606fc9b7Evgeniy Stepanovuptr __msan_get_free_bytes() { 2065d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines return __sanitizer_get_free_bytes(); 2075c48a8c4a8b3f7cd3f03f26c6aadc0ee606fc9b7Evgeniy Stepanov} 2085c48a8c4a8b3f7cd3f03f26c6aadc0ee606fc9b7Evgeniy Stepanov 2095d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hinesuptr __sanitizer_get_unmapped_bytes() { return 1; } 2105c48a8c4a8b3f7cd3f03f26c6aadc0ee606fc9b7Evgeniy Stepanovuptr __msan_get_unmapped_bytes() { 2115d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines return __sanitizer_get_unmapped_bytes(); 2125c48a8c4a8b3f7cd3f03f26c6aadc0ee606fc9b7Evgeniy Stepanov} 2135c48a8c4a8b3f7cd3f03f26c6aadc0ee606fc9b7Evgeniy Stepanov 2145d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hinesuptr __sanitizer_get_estimated_allocated_size(uptr size) { return size; } 2155c48a8c4a8b3f7cd3f03f26c6aadc0ee606fc9b7Evgeniy Stepanovuptr __msan_get_estimated_allocated_size(uptr size) { 2165d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines return __sanitizer_get_estimated_allocated_size(size); 2175c48a8c4a8b3f7cd3f03f26c6aadc0ee606fc9b7Evgeniy Stepanov} 2185c48a8c4a8b3f7cd3f03f26c6aadc0ee606fc9b7Evgeniy Stepanov 2195d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hinesint __sanitizer_get_ownership(const void *p) { return AllocationSize(p) != 0; } 22013c379073b8af7eb5ea4706078428d1594c487abEvgeniy Stepanovint __msan_get_ownership(const void *p) { 2215d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines return __sanitizer_get_ownership(p); 2225c48a8c4a8b3f7cd3f03f26c6aadc0ee606fc9b7Evgeniy Stepanov} 2235c48a8c4a8b3f7cd3f03f26c6aadc0ee606fc9b7Evgeniy Stepanov 2245d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hinesuptr __sanitizer_get_allocated_size(const void *p) { return AllocationSize(p); } 2255c48a8c4a8b3f7cd3f03f26c6aadc0ee606fc9b7Evgeniy Stepanovuptr __msan_get_allocated_size(const void *p) { 2265d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines return __sanitizer_get_allocated_size(p); 2275c48a8c4a8b3f7cd3f03f26c6aadc0ee606fc9b7Evgeniy Stepanov} 228