Index: compiler-rt/lib/asan/asan_mapping.h =================================================================== --- compiler-rt/lib/asan/asan_mapping.h +++ compiler-rt/lib/asan/asan_mapping.h @@ -131,7 +131,11 @@ // || `[0x30000000, 0x35ffffff]` || LowShadow || // || `[0x00000000, 0x2fffffff]` || LowMem || +#if defined(_ASAN_SHADOW_SCALE) +static const u64 kDefaultShadowScale = _ASAN_SHADOW_SCALE; +#else static const u64 kDefaultShadowScale = 3; +#endif static const u64 kDefaultShadowSentinel = ~(uptr)0; static const u64 kDefaultShadowOffset32 = 1ULL << 29; // 0x20000000 static const u64 kDefaultShadowOffset64 = 1ULL << 44; Index: compiler-rt/lib/asan/tests/CMakeLists.txt =================================================================== --- compiler-rt/lib/asan/tests/CMakeLists.txt +++ compiler-rt/lib/asan/tests/CMakeLists.txt @@ -56,6 +56,10 @@ -DASAN_HAS_EXCEPTIONS=1 -DASAN_UAR=0) +if(NOT LLVM_ASAN_SHADOW_SCALE EQUAL 3) + list(APPEND ASAN_UNITTEST_COMMON_CFLAGS -D_ASAN_SHADOW_SCALE=${LLVM_ASAN_SHADOW_SCALE}) +endif() + if(APPLE) list(APPEND ASAN_UNITTEST_COMMON_CFLAGS ${DARWIN_osx_CFLAGS}) list(APPEND ASAN_UNITTEST_COMMON_LINK_FLAGS ${DARWIN_osx_LINK_FLAGS}) Index: compiler-rt/test/asan/CMakeLists.txt =================================================================== --- compiler-rt/test/asan/CMakeLists.txt +++ compiler-rt/test/asan/CMakeLists.txt @@ -56,6 +56,9 @@ string(TOLOWER "-${arch}-${OS_NAME}" ASAN_TEST_CONFIG_SUFFIX) get_bits_for_arch(${arch} ASAN_TEST_BITS) get_test_cc_for_arch(${arch} ASAN_TEST_TARGET_CC ASAN_TEST_TARGET_CFLAGS) + if(NOT LLVM_ASAN_SHADOW_SCALE EQUAL 3) + set(ASAN_TEST_TARGET_CFLAGS "-D_ASAN_SHADOW_SCALE=${LLVM_ASAN_SHADOW_SCALE} ${ASAN_TEST_TARGET_CFLAGS}") + endif() if(ANDROID) set(ASAN_TEST_DYNAMIC True) else() @@ -99,6 +102,9 @@ pythonize_bool(ASAN_TEST_IOSSIM) set(ASAN_TEST_TARGET_ARCH ${arch}) set(ASAN_TEST_TARGET_CFLAGS "-arch ${arch} -isysroot ${DARWIN_iossim_SYSROOT} ${COMPILER_RT_TEST_COMPILER_CFLAGS}") + if(NOT LLVM_ASAN_SHADOW_SCALE EQUAL 3) + set(ASAN_TEST_TARGET_CFLAGS "-D_ASAN_SHADOW_SCALE=${LLVM_ASAN_SHADOW_SCALE} ${ASAN_TEST_TARGET_CFLAGS}") + endif() set(ASAN_TEST_CONFIG_SUFFIX "-${arch}-iossim") get_bits_for_arch(${arch} ASAN_TEST_BITS) string(TOUPPER ${arch} ARCH_UPPER_CASE) @@ -117,6 +123,9 @@ pythonize_bool(ASAN_TEST_IOSSIM) set(ASAN_TEST_TARGET_ARCH ${arch}) set(ASAN_TEST_TARGET_CFLAGS "-arch ${arch} -isysroot ${DARWIN_ios_SYSROOT} ${COMPILER_RT_TEST_COMPILER_CFLAGS}") + if(NOT LLVM_ASAN_SHADOW_SCALE EQUAL 3) + set(ASAN_TEST_TARGET_CFLAGS "-D_ASAN_SHADOW_SCALE=${LLVM_ASAN_SHADOW_SCALE} ${ASAN_TEST_TARGET_CFLAGS}") + endif() set(ASAN_TEST_CONFIG_SUFFIX "-${arch}-ios") get_bits_for_arch(${arch} ASAN_TEST_BITS) string(TOUPPER ${arch} ARCH_UPPER_CASE) Index: llvm/CMakeLists.txt =================================================================== --- llvm/CMakeLists.txt +++ llvm/CMakeLists.txt @@ -549,6 +549,14 @@ set(LLVM_ADD_NATIVE_VISUALIZERS_TO_SOLUTION FALSE CACHE INTERNAL "For Visual Studio 2013, manually copy natvis files to Documents\\Visual Studio 2013\\Visualizers" FORCE) endif() +set(LLVM_ASAN_SHADOW_SCALE "3" + CACHE STRING "The Shadow Scale to use for ASan") + +# Check that LLVM_ASAN_SHADOW_SCALE is supported. +if (NOT LLVM_ASAN_SHADOW_SCALE EQUAL 3 AND NOT LLVM_ASAN_SHADOW_SCALE EQUAL 5) + message(FATAL_ERROR "Unsupported ASan Shadow Scale '${LLVM_ASAN_SHADOW_SCALE}' (Valid value: 3, 5)") +endif() + if (LLVM_BUILD_INSTRUMENTED OR LLVM_BUILD_INSTRUMENTED_COVERAGE OR LLVM_ENABLE_IR_PGO) if(NOT LLVM_PROFILE_MERGE_POOL_SIZE) Index: llvm/cmake/modules/HandleLLVMOptions.cmake =================================================================== --- llvm/cmake/modules/HandleLLVMOptions.cmake +++ llvm/cmake/modules/HandleLLVMOptions.cmake @@ -690,6 +690,10 @@ add_definitions( -D__STDC_FORMAT_MACROS ) add_definitions( -D__STDC_LIMIT_MACROS ) +if(NOT LLVM_ASAN_SHADOW_SCALE EQUAL 3) + add_definitions( -D_ASAN_SHADOW_SCALE=${LLVM_ASAN_SHADOW_SCALE} ) +endif() + # clang doesn't print colored diagnostics when invoked from Ninja if (UNIX AND CMAKE_CXX_COMPILER_ID MATCHES "Clang" AND Index: llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp =================================================================== --- llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp +++ llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp @@ -89,7 +89,11 @@ #define DEBUG_TYPE "asan" +#if defined(_ASAN_SHADOW_SCALE) +static const uint64_t kDefaultShadowScale = _ASAN_SHADOW_SCALE; +#else static const uint64_t kDefaultShadowScale = 3; +#endif static const uint64_t kDefaultShadowOffset32 = 1ULL << 29; static const uint64_t kDefaultShadowOffset64 = 1ULL << 44; static const uint64_t kDynamicShadowSentinel =