forked from OSchip/llvm-project
[asan] allow asan to use SizeClassAllocator32 on a 64-bit platform (if SANITIZER_CAN_USE_ALLOCATOR64=0). No functionality change by default is intended
llvm-svn: 198044
This commit is contained in:
parent
a13f8b4f36
commit
2b5fddbc75
|
@ -50,27 +50,31 @@ struct AsanMapUnmapCallback {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
#if SANITIZER_WORDSIZE == 64
|
#if SANITIZER_CAN_USE_ALLOCATOR64
|
||||||
#if defined(__powerpc64__)
|
# if defined(__powerpc64__)
|
||||||
const uptr kAllocatorSpace = 0xa0000000000ULL;
|
const uptr kAllocatorSpace = 0xa0000000000ULL;
|
||||||
const uptr kAllocatorSize = 0x20000000000ULL; // 2T.
|
const uptr kAllocatorSize = 0x20000000000ULL; // 2T.
|
||||||
#else
|
# else
|
||||||
const uptr kAllocatorSpace = 0x600000000000ULL;
|
const uptr kAllocatorSpace = 0x600000000000ULL;
|
||||||
const uptr kAllocatorSize = 0x40000000000ULL; // 4T.
|
const uptr kAllocatorSize = 0x40000000000ULL; // 4T.
|
||||||
#endif
|
# endif
|
||||||
typedef DefaultSizeClassMap SizeClassMap;
|
typedef DefaultSizeClassMap SizeClassMap;
|
||||||
typedef SizeClassAllocator64<kAllocatorSpace, kAllocatorSize, 0 /*metadata*/,
|
typedef SizeClassAllocator64<kAllocatorSpace, kAllocatorSize, 0 /*metadata*/,
|
||||||
SizeClassMap, AsanMapUnmapCallback> PrimaryAllocator;
|
SizeClassMap, AsanMapUnmapCallback> PrimaryAllocator;
|
||||||
#elif SANITIZER_WORDSIZE == 32
|
#else // Fallback to SizeClassAllocator32.
|
||||||
static const u64 kAddressSpaceSize = 1ULL << 32;
|
|
||||||
typedef CompactSizeClassMap SizeClassMap;
|
|
||||||
static const uptr kRegionSizeLog = 20;
|
static const uptr kRegionSizeLog = 20;
|
||||||
static const uptr kFlatByteMapSize = kAddressSpaceSize >> kRegionSizeLog;
|
static const uptr kNumRegions = SANITIZER_MMAP_RANGE_SIZE >> kRegionSizeLog;
|
||||||
typedef SizeClassAllocator32<0, kAddressSpaceSize, 16,
|
# if SANITIZER_WORDSIZE == 32
|
||||||
|
typedef FlatByteMap<kNumRegions> ByteMap;
|
||||||
|
# elif SANITIZER_WORDSIZE == 64
|
||||||
|
typedef TwoLevelByteMap<(kNumRegions >> 12), 1 << 12> ByteMap;
|
||||||
|
# endif
|
||||||
|
typedef CompactSizeClassMap SizeClassMap;
|
||||||
|
typedef SizeClassAllocator32<0, SANITIZER_MMAP_RANGE_SIZE, 16,
|
||||||
SizeClassMap, kRegionSizeLog,
|
SizeClassMap, kRegionSizeLog,
|
||||||
FlatByteMap<kFlatByteMapSize>,
|
ByteMap,
|
||||||
AsanMapUnmapCallback> PrimaryAllocator;
|
AsanMapUnmapCallback> PrimaryAllocator;
|
||||||
#endif
|
#endif // SANITIZER_CAN_USE_ALLOCATOR64
|
||||||
|
|
||||||
typedef SizeClassAllocatorLocalCache<PrimaryAllocator> AllocatorCache;
|
typedef SizeClassAllocatorLocalCache<PrimaryAllocator> AllocatorCache;
|
||||||
typedef LargeMmapAllocator<AsanMapUnmapCallback> SecondaryAllocator;
|
typedef LargeMmapAllocator<AsanMapUnmapCallback> SecondaryAllocator;
|
||||||
|
|
|
@ -24,14 +24,13 @@ namespace __sanitizer {
|
||||||
typedef CompactSizeClassMap InternalSizeClassMap;
|
typedef CompactSizeClassMap InternalSizeClassMap;
|
||||||
|
|
||||||
static const uptr kInternalAllocatorSpace = 0;
|
static const uptr kInternalAllocatorSpace = 0;
|
||||||
|
static const u64 kInternalAllocatorSize = SANITIZER_MMAP_RANGE_SIZE;
|
||||||
#if SANITIZER_WORDSIZE == 32
|
#if SANITIZER_WORDSIZE == 32
|
||||||
static const u64 kInternalAllocatorSize = (1ULL << 32);
|
|
||||||
static const uptr kInternalAllocatorRegionSizeLog = 20;
|
static const uptr kInternalAllocatorRegionSizeLog = 20;
|
||||||
static const uptr kInternalAllocatorNumRegions =
|
static const uptr kInternalAllocatorNumRegions =
|
||||||
kInternalAllocatorSize >> kInternalAllocatorRegionSizeLog;
|
kInternalAllocatorSize >> kInternalAllocatorRegionSizeLog;
|
||||||
typedef FlatByteMap<kInternalAllocatorNumRegions> ByteMap;
|
typedef FlatByteMap<kInternalAllocatorNumRegions> ByteMap;
|
||||||
#else
|
#else
|
||||||
static const u64 kInternalAllocatorSize = (1ULL << 47);
|
|
||||||
static const uptr kInternalAllocatorRegionSizeLog = 24;
|
static const uptr kInternalAllocatorRegionSizeLog = 24;
|
||||||
static const uptr kInternalAllocatorNumRegions =
|
static const uptr kInternalAllocatorNumRegions =
|
||||||
kInternalAllocatorSize >> kInternalAllocatorRegionSizeLog;
|
kInternalAllocatorSize >> kInternalAllocatorRegionSizeLog;
|
||||||
|
|
|
@ -314,12 +314,6 @@ INLINE int ToLower(int c) {
|
||||||
return (c >= 'A' && c <= 'Z') ? (c + 'a' - 'A') : c;
|
return (c >= 'A' && c <= 'Z') ? (c + 'a' - 'A') : c;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if SANITIZER_WORDSIZE == 64
|
|
||||||
# define FIRST_32_SECOND_64(a, b) (b)
|
|
||||||
#else
|
|
||||||
# define FIRST_32_SECOND_64(a, b) (a)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// A low-level vector based on mmap. May incur a significant memory overhead for
|
// A low-level vector based on mmap. May incur a significant memory overhead for
|
||||||
// small vectors.
|
// small vectors.
|
||||||
// WARNING: The current implementation supports only POD types.
|
// WARNING: The current implementation supports only POD types.
|
||||||
|
|
|
@ -34,12 +34,6 @@
|
||||||
# define SANITIZER_SUPPORTS_WEAK_HOOKS 0
|
# define SANITIZER_SUPPORTS_WEAK_HOOKS 0
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if __LP64__ || defined(_WIN64)
|
|
||||||
# define SANITIZER_WORDSIZE 64
|
|
||||||
#else
|
|
||||||
# define SANITIZER_WORDSIZE 32
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// GCC does not understand __has_feature
|
// GCC does not understand __has_feature
|
||||||
#if !defined(__has_feature)
|
#if !defined(__has_feature)
|
||||||
# define __has_feature(x) 0
|
# define __has_feature(x) 0
|
||||||
|
|
|
@ -50,4 +50,31 @@
|
||||||
|
|
||||||
#define SANITIZER_POSIX (SANITIZER_LINUX || SANITIZER_MAC)
|
#define SANITIZER_POSIX (SANITIZER_LINUX || SANITIZER_MAC)
|
||||||
|
|
||||||
|
#if __LP64__ || defined(_WIN64)
|
||||||
|
# define SANITIZER_WORDSIZE 64
|
||||||
|
#else
|
||||||
|
# define SANITIZER_WORDSIZE 32
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if SANITIZER_WORDSIZE == 64
|
||||||
|
# define FIRST_32_SECOND_64(a, b) (b)
|
||||||
|
#else
|
||||||
|
# define FIRST_32_SECOND_64(a, b) (a)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// By default we allow to use SizeClassAllocator64 on 64-bit platform.
|
||||||
|
// But in some cases (e.g. AArch64's 39-bit address space) SizeClassAllocator64
|
||||||
|
// does not work well and we need to fallback to SizeClassAllocator32.
|
||||||
|
// For such platforms build this code with -DSANITIZER_CAN_USE_ALLOCATOR64=0 or
|
||||||
|
// change the definition of SANITIZER_CAN_USE_ALLOCATOR64 here.
|
||||||
|
#ifndef SANITIZER_CAN_USE_ALLOCATOR64
|
||||||
|
# define SANITIZER_CAN_USE_ALLOCATOR64 (SANITIZER_WORDSIZE == 64)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// The range of addresses which can be returned my mmap.
|
||||||
|
// FIXME: this value should be different on different platforms,
|
||||||
|
// e.g. on AArch64 it is most likely (1ULL << 39). Larger values will still work
|
||||||
|
// but will consume more memory for TwoLevelByteMap.
|
||||||
|
#define SANITIZER_MMAP_RANGE_SIZE FIRST_32_SECOND_64(1ULL << 32, 1ULL << 47)
|
||||||
|
|
||||||
#endif // SANITIZER_PLATFORM_H
|
#endif // SANITIZER_PLATFORM_H
|
||||||
|
|
Loading…
Reference in New Issue