Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
46 changes: 32 additions & 14 deletions v5/cmake/LibhalTesting.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -58,29 +58,47 @@ function(_libhal_add_tests_impl TARGET_NAME)

message(STATUS "Adding tests for ${TARGET_NAME}")

# Detect upstream LLVM/Clang 20 on macOS 26+, where AddressSanitizer's
# runtime initialization is known to deadlock (spins forever in
# __asan::AsanInitFromRtl / StaticSpinMutex::LockSlow before main() is
# ever reached, both under a debugger and standalone).
if(APPLE AND NOT DEFINED CACHE{LIBHAL_ASAN_MACOS26_CLANG20_CHECKED})
set(LIBHAL_ASAN_MACOS26_CLANG20_CHECKED TRUE CACHE INTERNAL "")
# Disable AddressSanitizer on macOS where it is known not to work:
#
# - Upstream LLVM/Clang 20 on macOS 26+: the ASan runtime deadlocks during
# initialization (spins forever in __asan::AsanInitFromRtl /
# StaticSpinMutex::LockSlow before main() is ever reached).
# - Upstream LLVM/Clang 22+ on macOS 14/15: llvm-toolchain links programs
# against its bundled libc++ there, but the ASan runtime is linked
# against the system libc++. Both end up in one process, objects from
# one are freed by the other, and ASan aborts (e.g. "attempting free on
# address which was not malloc()-ed" in std::locale::~locale at exit).
if(APPLE AND NOT DEFINED CACHE{LIBHAL_ASAN_MACOS_CHECKED})
set(LIBHAL_ASAN_MACOS_CHECKED TRUE CACHE INTERNAL "")
execute_process(
COMMAND sw_vers -productVersion
OUTPUT_VARIABLE LIBHAL_MACOS_VERSION
OUTPUT_STRIP_TRAILING_WHITESPACE
)
if(LIBHAL_MACOS_VERSION VERSION_GREATER_EQUAL "26" AND
CMAKE_CXX_COMPILER_ID STREQUAL "Clang" AND
CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL "20" AND
CMAKE_CXX_COMPILER_VERSION VERSION_LESS "21")
set(LIBHAL_DISABLE_ASAN FALSE CACHE INTERNAL "")
if(CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
if(LIBHAL_MACOS_VERSION VERSION_GREATER_EQUAL "26" AND
CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL "20" AND
CMAKE_CXX_COMPILER_VERSION VERSION_LESS "21")
set(LIBHAL_ASAN_DISABLE_REASON
"AddressSanitizer is known to deadlock during runtime "
"initialization on this combination.")
elseif(LIBHAL_MACOS_VERSION VERSION_GREATER_EQUAL "14" AND
LIBHAL_MACOS_VERSION VERSION_LESS "26" AND
CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL "22")
set(LIBHAL_ASAN_DISABLE_REASON
"the toolchain's bundled libc++ conflicts with the "
"system libc++ that the ASan runtime links against.")
endif()
endif()
if(DEFINED LIBHAL_ASAN_DISABLE_REASON)
set(LIBHAL_DISABLE_ASAN TRUE CACHE INTERNAL "")
string(JOIN "" LIBHAL_ASAN_DISABLE_REASON
${LIBHAL_ASAN_DISABLE_REASON})
message(WARNING
"⚠️ Detected macOS ${LIBHAL_MACOS_VERSION} with LLVM/Clang "
"${CMAKE_CXX_COMPILER_VERSION}: AddressSanitizer is known to "
"deadlock during runtime initialization on this combination. "
"${CMAKE_CXX_COMPILER_VERSION}: ${LIBHAL_ASAN_DISABLE_REASON} "
"Disabling ASan for test targets.")
else()
set(LIBHAL_DISABLE_ASAN FALSE CACHE INTERNAL "")
endif()
endif()

Expand Down
Loading