Skip to content

Commit

Permalink
[tsan] Use large address space mapping on Apple Silicon Macs
Browse files Browse the repository at this point in the history
Differential Revision: https://reviews.llvm.org/D86377
  • Loading branch information
kubamracek committed Mar 7, 2021
1 parent 898b406 commit bde2e56
Show file tree
Hide file tree
Showing 3 changed files with 16 additions and 4 deletions.
16 changes: 14 additions & 2 deletions compiler-rt/lib/tsan/rtl/tsan_platform.h
Expand Up @@ -26,6 +26,18 @@ namespace __tsan {
#if !SANITIZER_GO

#if defined(__x86_64__)
#define HAS_48_BIT_ADDRESS_SPACE 1
#elif SANITIZER_IOSSIM // arm64 iOS simulators (order of #if matters)
#define HAS_48_BIT_ADDRESS_SPACE 1
#elif SANITIZER_IOS // arm64 iOS devices (order of #if matters)
#define HAS_48_BIT_ADDRESS_SPACE 0
#elif SANITIZER_MAC // arm64 macOS (order of #if matters)
#define HAS_48_BIT_ADDRESS_SPACE 1
#else
#define HAS_48_BIT_ADDRESS_SPACE 0
#endif

#if HAS_48_BIT_ADDRESS_SPACE
/*
C/C++ on linux/x86_64 and freebsd/x86_64
0000 0000 1000 - 0080 0000 0000: main binary and/or MAP_32BIT mappings (512GB)
Expand Down Expand Up @@ -146,7 +158,7 @@ struct Mapping {
static const uptr kVdsoBeg = 0x7000000000000000ull;
};

#elif defined(__aarch64__)
#elif defined(__aarch64__) && !defined(__APPLE__)
// AArch64 supports multiple VMA which leads to multiple address transformation
// functions. To support these multiple VMAS transformations and mappings TSAN
// runtime for AArch64 uses an external memory read (vmaSize) to select which
Expand Down Expand Up @@ -354,7 +366,7 @@ struct Mapping47 {
#define TSAN_RUNTIME_VMA 1
#endif

#elif SANITIZER_GO && !SANITIZER_WINDOWS && defined(__x86_64__)
#elif SANITIZER_GO && !SANITIZER_WINDOWS && HAS_48_BIT_ADDRESS_SPACE

/* Go on linux, darwin and freebsd on x86_64
0000 0000 1000 - 0000 1000 0000: executable
Expand Down
2 changes: 1 addition & 1 deletion compiler-rt/lib/tsan/rtl/tsan_platform_mac.cpp
Expand Up @@ -234,7 +234,7 @@ static void my_pthread_introspection_hook(unsigned int event, pthread_t thread,
#endif

void InitializePlatformEarly() {
#if !SANITIZER_GO && defined(__aarch64__)
#if !SANITIZER_GO && !HAS_48_BIT_ADDRESS_SPACE
uptr max_vm = GetMaxUserVirtualAddress() + 1;
if (max_vm != Mapping::kHiAppMemEnd) {
Printf("ThreadSanitizer: unsupported vm address limit %p, expected %p.\n",
Expand Down
2 changes: 1 addition & 1 deletion compiler-rt/lib/tsan/rtl/tsan_platform_posix.cpp
Expand Up @@ -99,7 +99,7 @@ void CheckAndProtect() {
Die();
}

#if defined(__aarch64__) && defined(__APPLE__)
#if defined(__aarch64__) && !HAS_48_BIT_ADDRESS_SPACE
ProtectRange(HeapMemEnd(), ShadowBeg());
ProtectRange(ShadowEnd(), MetaShadowBeg());
ProtectRange(MetaShadowEnd(), TraceMemBeg());
Expand Down

0 comments on commit bde2e56

Please sign in to comment.