[asan] initialize kHighMemEnd at startup (instead of at compile time) to simplify further changes for various address space layouts. Fix asan_allocator2 for PowerPC (tested on 44-bit address space)
llvm-svn: 173260
This commit is contained in:
parent
420d7d333e
commit
8f267137c2
|
|
@ -57,7 +57,11 @@ struct AsanMapUnmapCallback {
|
|||
};
|
||||
|
||||
#if SANITIZER_WORDSIZE == 64
|
||||
#if defined(__powerpc64__)
|
||||
const uptr kAllocatorSpace = 0xa0000000000ULL;
|
||||
#else
|
||||
const uptr kAllocatorSpace = 0x600000000000ULL;
|
||||
#endif
|
||||
const uptr kAllocatorSize = 0x10000000000ULL; // 1T.
|
||||
typedef DefaultSizeClassMap SizeClassMap;
|
||||
typedef SizeClassAllocator64<kAllocatorSpace, kAllocatorSize, 0 /*metadata*/,
|
||||
|
|
|
|||
|
|
@ -43,20 +43,9 @@ extern SANITIZER_INTERFACE_ATTRIBUTE uptr __asan_mapping_offset;
|
|||
#endif // ASAN_FLEXIBLE_MAPPING_AND_OFFSET
|
||||
|
||||
#define SHADOW_GRANULARITY (1ULL << SHADOW_SCALE)
|
||||
#define MEM_TO_SHADOW(mem) (((mem) >> SHADOW_SCALE) | (SHADOW_OFFSET))
|
||||
#define MEM_TO_SHADOW(mem) (((mem) >> SHADOW_SCALE) + (SHADOW_OFFSET))
|
||||
#define SHADOW_TO_MEM(shadow) (((shadow) - SHADOW_OFFSET) << SHADOW_SCALE)
|
||||
|
||||
#if SANITIZER_WORDSIZE == 64
|
||||
# if defined(__powerpc64__)
|
||||
static const uptr kHighMemEnd = 0x00000fffffffffffUL;
|
||||
# else
|
||||
static const uptr kHighMemEnd = 0x00007fffffffffffUL;
|
||||
# endif
|
||||
#else // SANITIZER_WORDSIZE == 32
|
||||
static const uptr kHighMemEnd = 0xffffffff;
|
||||
#endif // SANITIZER_WORDSIZE
|
||||
|
||||
|
||||
#define kLowMemBeg 0
|
||||
#define kLowMemEnd (SHADOW_OFFSET ? SHADOW_OFFSET - 1 : 0)
|
||||
|
||||
|
|
@ -78,6 +67,8 @@ extern SANITIZER_INTERFACE_ATTRIBUTE uptr __asan_mapping_offset;
|
|||
|
||||
namespace __asan {
|
||||
|
||||
extern uptr kHighMemEnd; // Initialized in __asan_init.
|
||||
|
||||
static inline bool AddrIsInLowMem(uptr a) {
|
||||
return a < kLowMemEnd;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -164,6 +164,7 @@ void InitializeFlags(Flags *f, const char *env) {
|
|||
int asan_inited;
|
||||
bool asan_init_is_running;
|
||||
void (*death_callback)(void);
|
||||
uptr kHighMemEnd;
|
||||
|
||||
// -------------------------- Misc ---------------- {{{1
|
||||
void ShowStatsAndAbort() {
|
||||
|
|
@ -263,6 +264,24 @@ static void asan_atexit() {
|
|||
__asan_print_accumulated_stats();
|
||||
}
|
||||
|
||||
static void InitializeHighMemEnd() {
|
||||
#if SANITIZER_WORDSIZE == 64
|
||||
# if defined(__powerpc64__)
|
||||
// FIXME:
|
||||
// On PowerPC64 we have two different address space layouts: 44- and 46-bit.
|
||||
// We somehow need to figure our which one we are using now and choose
|
||||
// one of 0x00000fffffffffffUL and 0x00003fffffffffffUL.
|
||||
// Note that with 'ulimit -s unlimited' the stack is moved away from the top
|
||||
// of the address space, so simply checking the stack address is not enough.
|
||||
kHighMemEnd = (1ULL << 44) - 1; // 0x00000fffffffffffUL
|
||||
# else
|
||||
kHighMemEnd = (1ULL << 47) - 1; // 0x00007fffffffffffUL;
|
||||
# endif
|
||||
#else // SANITIZER_WORDSIZE == 32
|
||||
kHighMemEnd = (1ULL << 32) - 1; // 0xffffffff;
|
||||
#endif // SANITIZER_WORDSIZE
|
||||
}
|
||||
|
||||
} // namespace __asan
|
||||
|
||||
// ---------------------- Interface ---------------- {{{1
|
||||
|
|
@ -299,6 +318,7 @@ void __asan_init() {
|
|||
if (asan_inited) return;
|
||||
CHECK(!asan_init_is_running && "ASan init calls itself!");
|
||||
asan_init_is_running = true;
|
||||
InitializeHighMemEnd();
|
||||
|
||||
// Make sure we are not statically linked.
|
||||
AsanDoesNotSupportStaticLinkage();
|
||||
|
|
|
|||
|
|
@ -326,6 +326,7 @@ TEST(AddressSanitizer, ThreadedOneSizeMallocStressTest) {
|
|||
}
|
||||
|
||||
TEST(AddressSanitizer, MemsetWildAddressTest) {
|
||||
using __asan::kHighMemEnd;
|
||||
typedef void*(*memset_p)(void*, int, size_t);
|
||||
// Prevent inlining of memset().
|
||||
volatile memset_p libc_memset = (memset_p)memset;
|
||||
|
|
|
|||
Loading…
Reference in New Issue