diff options
Diffstat (limited to 'lib/sanitizer_common/tests/sanitizer_allocator64_testlib.cc')
-rw-r--r-- | lib/sanitizer_common/tests/sanitizer_allocator64_testlib.cc | 99 |
1 files changed, 99 insertions, 0 deletions
diff --git a/lib/sanitizer_common/tests/sanitizer_allocator64_testlib.cc b/lib/sanitizer_common/tests/sanitizer_allocator64_testlib.cc new file mode 100644 index 000000000000..cff782342a6a --- /dev/null +++ b/lib/sanitizer_common/tests/sanitizer_allocator64_testlib.cc @@ -0,0 +1,99 @@ +//===-- sanitizer_allocator64_testlib.cc ----------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +// Malloc replacement library based on CombinedAllocator. +// The primary purpose of this file is an end-to-end integration test +// for CombinedAllocator. +//===----------------------------------------------------------------------===// +#include "sanitizer_common/sanitizer_allocator64.h" +#include <stddef.h> +#include <stdio.h> +#include <unistd.h> +#include <assert.h> + +namespace { +static const uptr kAllocatorSpace = 0x600000000000ULL; +static const uptr kAllocatorSize = 0x10000000000; // 1T. + +typedef SizeClassAllocator64<kAllocatorSpace, kAllocatorSize, 16, + DefaultSizeClassMap> PrimaryAllocator; +typedef SizeClassAllocatorLocalCache<PrimaryAllocator::kNumClasses, + PrimaryAllocator> AllocatorCache; +typedef LargeMmapAllocator SecondaryAllocator; +typedef CombinedAllocator<PrimaryAllocator, AllocatorCache, + SecondaryAllocator> Allocator; + +static THREADLOCAL AllocatorCache cache; +static Allocator allocator; + +static int inited = 0; + +__attribute__((constructor)) +void Init() { + if (inited) return; + inited = true; // this must happen before any threads are created. + allocator.Init(); +} + +} // namespace + +namespace __sanitizer { +void NORETURN Die() { + _exit(77); +} +void NORETURN CheckFailed(const char *file, int line, const char *cond, + u64 v1, u64 v2) { + fprintf(stderr, "CheckFailed: %s:%d %s (%lld %lld)\n", + file, line, cond, v1, v2); + Die(); +} +} + +#if 1 +extern "C" { +void *malloc(size_t size) { + Init(); + assert(inited); + return allocator.Allocate(&cache, size, 8); +} + +void free(void *p) { + assert(inited); + allocator.Deallocate(&cache, p); +} + +void *calloc(size_t nmemb, size_t size) { + assert(inited); + return allocator.Allocate(&cache, nmemb * size, 8, /*cleared=*/true); +} + +void *realloc(void *p, size_t new_size) { + assert(inited); + return allocator.Reallocate(&cache, p, new_size, 8); +} + +void *memalign() { assert(0); } + +int posix_memalign(void **memptr, size_t alignment, size_t size) { + *memptr = allocator.Allocate(&cache, size, alignment); + CHECK_EQ(((uptr)*memptr & (alignment - 1)), 0); + return 0; +} + +void *valloc(size_t size) { + assert(inited); + return allocator.Allocate(&cache, size, kPageSize); +} + +void *pvalloc(size_t size) { + assert(inited); + if (size == 0) size = kPageSize; + return allocator.Allocate(&cache, size, kPageSize); +} +} +#endif |