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