Index: cmake/config-ix.cmake =================================================================== --- cmake/config-ix.cmake +++ cmake/config-ix.cmake @@ -164,7 +164,11 @@ set(ALL_ASAN_SUPPORTED_ARCH ${X86} ${X86_64} ${ARM32} ${ARM64} ${MIPS32} ${MIPS64} ${PPC64} ${S390X}) set(ALL_DFSAN_SUPPORTED_ARCH ${X86_64} ${MIPS64} ${ARM64}) -set(ALL_LSAN_SUPPORTED_ARCH ${X86} ${X86_64} ${MIPS64} ${ARM64}) +if(APPLE) + set(ALL_LSAN_SUPPORTED_ARCH ${X86_64} ${ARM64}) +else() + set(ALL_LSAN_SUPPORTED_ARCH ${X86} ${X86_64} ${MIPS64} ${ARM64}) +endif() set(ALL_MSAN_SUPPORTED_ARCH ${X86_64} ${MIPS64} ${ARM64} ${PPC64}) set(ALL_PROFILE_SUPPORTED_ARCH ${X86} ${X86_64} ${ARM32} ${ARM64} ${PPC64} ${MIPS32} ${MIPS64} ${S390X}) @@ -477,6 +481,13 @@ set(COMPILER_RT_HAS_LSAN FALSE) endif() +if(APPLE) + option(COMPILER_RT_ENABLE_LSAN_OSX "Enable building LSan for OS X - Experimental" Off) + if(COMPILER_RT_ENABLE_LSAN_OSX) + set(COMPILER_RT_HAS_LSAN TRUE) + endif() +endif() + if (COMPILER_RT_HAS_SANITIZER_COMMON AND MSAN_SUPPORTED_ARCH AND OS_NAME MATCHES "Linux") set(COMPILER_RT_HAS_MSAN TRUE) Index: lib/asan/CMakeLists.txt =================================================================== --- lib/asan/CMakeLists.txt +++ lib/asan/CMakeLists.txt @@ -107,6 +107,7 @@ if(APPLE) add_weak_symbols("asan" WEAK_SYMBOL_LINK_FLAGS) + add_weak_symbols("lsan" WEAK_SYMBOL_LINK_FLAGS) add_weak_symbols("ubsan" WEAK_SYMBOL_LINK_FLAGS) add_weak_symbols("sanitizer_common" WEAK_SYMBOL_LINK_FLAGS) Index: lib/lsan/CMakeLists.txt =================================================================== --- lib/lsan/CMakeLists.txt +++ lib/lsan/CMakeLists.txt @@ -16,6 +16,9 @@ set(LSAN_SRC_DIR ${CMAKE_CURRENT_SOURCE_DIR}) +if(APPLE AND COMPILER_RT_HAS_LSAN) + set(LSAN_CFLAGS ${LSAN_CFLAGS} -DCAN_SANITIZE_LEAKS_MAC=1) +endif() add_compiler_rt_object_libraries(RTLSanCommon OS ${SANITIZER_COMMON_SUPPORTED_OS} ARCHS ${LSAN_COMMON_SUPPORTED_ARCH} @@ -24,16 +27,34 @@ if(COMPILER_RT_HAS_LSAN) add_compiler_rt_component(lsan) - foreach(arch ${LSAN_SUPPORTED_ARCH}) + if(APPLE) + add_weak_symbols("lsan" WEAK_SYMBOL_LINK_FLAGS) + add_weak_symbols("sanitizer_common" WEAK_SYMBOL_LINK_FLAGS) + add_compiler_rt_runtime(clang_rt.lsan - STATIC - ARCHS ${arch} + SHARED + OS ${SANITIZER_COMMON_SUPPORTED_OS} + ARCHS ${LSAN_SUPPORTED_ARCH} SOURCES ${LSAN_SOURCES} - $ - $ - $ - $ + OBJECT_LIBS RTLSanCommon + RTInterception + RTSanitizerCommon + RTSanitizerCommonLibc CFLAGS ${LSAN_CFLAGS} + LINK_FLAGS ${WEAK_SYMBOL_LINK_FLAGS} PARENT_TARGET lsan) - endforeach() + else() + foreach(arch ${LSAN_SUPPORTED_ARCH}) + add_compiler_rt_runtime(clang_rt.lsan + STATIC + ARCHS ${arch} + SOURCES ${LSAN_SOURCES} + $ + $ + $ + $ + CFLAGS ${LSAN_CFLAGS} + PARENT_TARGET lsan) + endforeach() + endif() endif() Index: lib/lsan/lsan_common.h =================================================================== --- lib/lsan/lsan_common.h +++ lib/lsan/lsan_common.h @@ -30,8 +30,9 @@ // To enable LeakSanitizer on new architecture, one need to implement // internal_clone function as well as (probably) adjust TLS machinery for // new architecture inside sanitizer library. -#if (SANITIZER_LINUX && !SANITIZER_ANDROID) && (SANITIZER_WORDSIZE == 64) \ - && (defined(__x86_64__) || defined(__mips64) || defined(__aarch64__)) +#if (SANITIZER_LINUX && !SANITIZER_ANDROID || CAN_SANITIZE_LEAKS_MAC) \ + && (SANITIZER_WORDSIZE == 64) && (defined(__x86_64__) \ + || defined(__mips64) || defined(__aarch64__)) #define CAN_SANITIZE_LEAKS 1 #elif SANITIZER_LINUX && !SANITIZER_ANDROID && defined(__i386__) #define CAN_SANITIZE_LEAKS 1 Index: lib/lsan/weak_symbols.txt =================================================================== --- /dev/null +++ lib/lsan/weak_symbols.txt @@ -0,0 +1,2 @@ +___lsan_default_suppressions +___lsan_is_turned_off