Summary: With rL279771, SizeClassAllocator64 was changed to accept only one template instead of 5, for the following reasons: "First, this will make the mangled names shorter. Second, this will make adding more parameters simpler". This patch mirrors that work for SizeClassAllocator32. This is in preparation for introducing the randomization of chunks in the 32-bit SizeClassAllocator in a later patch. Reviewers: kcc, alekseyshl, dvyukov Reviewed By: alekseyshl Subscribers: llvm-commits, kubamracek Differential Revision: https://reviews.llvm.org/D33141 llvm-svn: 303071
97 lines
3.1 KiB
C++
97 lines
3.1 KiB
C++
//=-- lsan_allocator.h ----------------------------------------------------===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// This file is a part of LeakSanitizer.
|
|
// Allocator for standalone LSan.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef LSAN_ALLOCATOR_H
|
|
#define LSAN_ALLOCATOR_H
|
|
|
|
#include "sanitizer_common/sanitizer_allocator.h"
|
|
#include "sanitizer_common/sanitizer_common.h"
|
|
#include "sanitizer_common/sanitizer_internal_defs.h"
|
|
#include "lsan_common.h"
|
|
|
|
namespace __lsan {
|
|
|
|
void *Allocate(const StackTrace &stack, uptr size, uptr alignment,
|
|
bool cleared);
|
|
void Deallocate(void *p);
|
|
void *Reallocate(const StackTrace &stack, void *p, uptr new_size,
|
|
uptr alignment);
|
|
uptr GetMallocUsableSize(const void *p);
|
|
|
|
template<typename Callable>
|
|
void ForEachChunk(const Callable &callback);
|
|
|
|
void GetAllocatorCacheRange(uptr *begin, uptr *end);
|
|
void AllocatorThreadFinish();
|
|
void InitializeAllocator();
|
|
|
|
const bool kAlwaysClearMemory = true;
|
|
|
|
struct ChunkMetadata {
|
|
u8 allocated : 8; // Must be first.
|
|
ChunkTag tag : 2;
|
|
#if SANITIZER_WORDSIZE == 64
|
|
uptr requested_size : 54;
|
|
#else
|
|
uptr requested_size : 32;
|
|
uptr padding : 22;
|
|
#endif
|
|
u32 stack_trace_id;
|
|
};
|
|
|
|
#if defined(__mips64) || defined(__aarch64__) || defined(__i386__) || \
|
|
defined(__arm__)
|
|
static const uptr kRegionSizeLog = 20;
|
|
static const uptr kNumRegions = SANITIZER_MMAP_RANGE_SIZE >> kRegionSizeLog;
|
|
typedef TwoLevelByteMap<(kNumRegions >> 12), 1 << 12> ByteMap;
|
|
|
|
struct AP32 {
|
|
static const uptr kSpaceBeg = 0;
|
|
static const u64 kSpaceSize = SANITIZER_MMAP_RANGE_SIZE;
|
|
static const uptr kMetadataSize = sizeof(ChunkMetadata);
|
|
typedef __sanitizer::CompactSizeClassMap SizeClassMap;
|
|
static const uptr kRegionSizeLog = __lsan::kRegionSizeLog;
|
|
typedef __lsan::ByteMap ByteMap;
|
|
typedef NoOpMapUnmapCallback MapUnmapCallback;
|
|
static const uptr kFlags = 0;
|
|
};
|
|
typedef SizeClassAllocator32<AP32> PrimaryAllocator;
|
|
#elif defined(__x86_64__) || defined(__powerpc64__)
|
|
struct AP64 { // Allocator64 parameters. Deliberately using a short name.
|
|
static const uptr kSpaceBeg = 0x600000000000ULL;
|
|
static const uptr kSpaceSize = 0x40000000000ULL; // 4T.
|
|
static const uptr kMetadataSize = sizeof(ChunkMetadata);
|
|
typedef DefaultSizeClassMap SizeClassMap;
|
|
typedef NoOpMapUnmapCallback MapUnmapCallback;
|
|
static const uptr kFlags = 0;
|
|
};
|
|
|
|
typedef SizeClassAllocator64<AP64> PrimaryAllocator;
|
|
#endif
|
|
typedef SizeClassAllocatorLocalCache<PrimaryAllocator> AllocatorCache;
|
|
|
|
AllocatorCache *GetAllocatorCache();
|
|
|
|
void *lsan_memalign(uptr alignment, uptr size, const StackTrace &stack);
|
|
void *lsan_malloc(uptr size, const StackTrace &stack);
|
|
void lsan_free(void *p);
|
|
void *lsan_realloc(void *p, uptr size, const StackTrace &stack);
|
|
void *lsan_calloc(uptr nmemb, uptr size, const StackTrace &stack);
|
|
void *lsan_valloc(uptr size, const StackTrace &stack);
|
|
uptr lsan_mz_size(const void *p);
|
|
|
|
} // namespace __lsan
|
|
|
|
#endif // LSAN_ALLOCATOR_H
|