blob: e0c85dc04a5d67a35046ba85027f31e16df02ba5 [file] [log] [blame]
//===-- 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) {
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() { assert(0); }
void *valloc() { assert(0); }
void *pvalloc() { assert(0); }
}
#endif