Index: CMakeLists.txt =================================================================== --- CMakeLists.txt +++ CMakeLists.txt @@ -90,6 +90,11 @@ option(SANITIZER_CAN_USE_CXXABI "Sanitizers can use cxxabi" ${use_cxxabi_default}) pythonize_bool(SANITIZER_CAN_USE_CXXABI) +option(SANITIZER_USE_SOFTWARE_MEMORY_MANAGER + "Experimental: Use software memory manager instead of mmap() in sanitizers." OFF) +mark_as_advanced(SANITIZER_USE_SOFTWARE_MEMORY_MANAGER) +pythonize_bool(SANITIZER_USE_SOFTWARE_MEMORY_MANAGER) + #================================ # Setup Compiler Flags #================================ Index: lib/asan/tests/CMakeLists.txt =================================================================== --- lib/asan/tests/CMakeLists.txt +++ lib/asan/tests/CMakeLists.txt @@ -34,6 +34,13 @@ -Wno-non-virtual-dtor) append_list_if(COMPILER_RT_HAS_WVARIADIC_MACROS_FLAG -Wno-variadic-macros ASAN_UNITTEST_COMMON_CFLAGS) +# With the software memory manager enabled we need the RTL to handle all +# shadow memory accesses. +if(SANITIZER_USE_SOFTWARE_MEMORY_MANAGER) + list(APPEND ASAN_UNITTEST_COMMON_CFLAGS + -mllvm -asan-instrumentation-with-call-threshold=0) +endif() + # This will ensure the target linker is used # during cross compilation set(ASAN_UNITTEST_COMMON_LINK_FLAGS @@ -328,9 +335,14 @@ darwin_filter_host_archs(ASAN_SUPPORTED_ARCH ASAN_TEST_ARCH) endif() foreach(arch ${ASAN_TEST_ARCH}) - add_asan_tests_for_arch_and_kind(${arch} "-inline") - add_asan_tests_for_arch_and_kind(${arch} "-with-calls" - -mllvm -asan-instrumentation-with-call-threshold=0) + # The software memory manager requires out-of-line instrumentation. + if(SANITIZER_USE_SOFTWARE_MEMORY_MANAGER) + add_asan_tests_for_arch_and_kind(${arch} "-with-calls") + else() + add_asan_tests_for_arch_and_kind(${arch} "-inline") + add_asan_tests_for_arch_and_kind(${arch} "-with-calls" + -mllvm -asan-instrumentation-with-call-threshold=0) + endif() endforeach() endif() Index: test/asan/lit.cfg =================================================================== --- test/asan/lit.cfg +++ test/asan/lit.cfg @@ -81,6 +81,12 @@ config.debug_info_flags + target_cflags) if config.target_arch == 's390x': clang_asan_static_cflags.append("-mbackchain") + +use_software_memory_manager = getattr(config, 'use_software_memory_manager', + False) +if use_software_memory_manager: + clang_asan_static_cflags.extend( + ["-mllvm", "-asan-instrumentation-with-call-threshold=0"]) clang_asan_static_cxxflags = config.cxx_mode_flags + clang_asan_static_cflags asan_dynamic_flags = [] Index: test/lit.common.configured.in =================================================================== --- test/lit.common.configured.in +++ test/lit.common.configured.in @@ -28,6 +28,8 @@ set_default("sanitizer_can_use_cxxabi", @SANITIZER_CAN_USE_CXXABI_PYBOOL@) set_default("has_lld", @COMPILER_RT_HAS_LLD_PYBOOL@) set_default("can_symbolize", @CAN_SYMBOLIZE@) +set_default("use_software_memory_manager", + "@SANITIZER_USE_SOFTWARE_MEMORY_MANAGER_PYBOOL@") config.available_features.add('target-is-%s' % config.target_arch) # LLVM tools dir can be passed in lit parameters, so try to