From 50de4518c5f2f063edb8cac9a80776c683fcd5dd Mon Sep 17 00:00:00 2001 From: Martin Storsjo Date: Wed, 26 Sep 2018 06:53:01 +0000 Subject: [PATCH] [CMake] [MinGW] Build address sanitizer for MinGW if building with clang Differential Revision: https://reviews.llvm.org/D51885 llvm-svn: 343074 --- compiler-rt/CMakeLists.txt | 2 ++ compiler-rt/cmake/config-ix.cmake | 16 +++++++++++++++- compiler-rt/lib/asan/CMakeLists.txt | 4 +++- 3 files changed, 20 insertions(+), 2 deletions(-) diff --git a/compiler-rt/CMakeLists.txt b/compiler-rt/CMakeLists.txt index f363a511f374..fbab64394a0f 100644 --- a/compiler-rt/CMakeLists.txt +++ b/compiler-rt/CMakeLists.txt @@ -368,6 +368,8 @@ append_list_if(COMPILER_RT_HAS_WD4391_FLAG /wd4391 SANITIZER_COMMON_CFLAGS) append_list_if(COMPILER_RT_HAS_WD4722_FLAG /wd4722 SANITIZER_COMMON_CFLAGS) append_list_if(COMPILER_RT_HAS_WD4800_FLAG /wd4800 SANITIZER_COMMON_CFLAGS) +append_list_if(MINGW -fms-extensions SANITIZER_COMMON_CFLAGS) + # Set common link flags. append_list_if(COMPILER_RT_HAS_NODEFAULTLIBS_FLAG -nodefaultlibs SANITIZER_COMMON_LINK_FLAGS) diff --git a/compiler-rt/cmake/config-ix.cmake b/compiler-rt/cmake/config-ix.cmake index 7332cfd8b7cb..6ab79dc762bf 100644 --- a/compiler-rt/cmake/config-ix.cmake +++ b/compiler-rt/cmake/config-ix.cmake @@ -37,6 +37,19 @@ if (COMPILER_RT_HAS_NODEFAULTLIBS_FLAG) elseif (COMPILER_RT_HAS_GCC_LIB) list(APPEND CMAKE_REQUIRED_LIBRARIES gcc) endif () + if (MINGW) + # Mingw64 requires quite a few "C" runtime libraries in order for basic + # programs to link successfully with -nodefaultlibs. + if (COMPILER_RT_USE_BUILTINS_LIBRARY) + set(MINGW_RUNTIME ${COMPILER_RT_BUILTINS_LIBRARY}) + else () + set(MINGW_RUNTIME gcc_s gcc) + endif() + set(MINGW_LIBRARIES mingw32 ${MINGW_RUNTIME} moldname mingwex msvcrt advapi32 + shell32 user32 kernel32 mingw32 ${MINGW_RUNTIME} + moldname mingwex msvcrt) + list(APPEND CMAKE_REQUIRED_LIBRARIES ${MINGW_LIBRARIES}) + endif() endif () # CodeGen options. @@ -514,7 +527,8 @@ list_replace(COMPILER_RT_SANITIZERS_TO_BUILD all "${ALL_SANITIZERS}") if (SANITIZER_COMMON_SUPPORTED_ARCH AND NOT LLVM_USE_SANITIZER AND (OS_NAME MATCHES "Android|Darwin|Linux|FreeBSD|NetBSD|OpenBSD|Fuchsia|SunOS" OR - (OS_NAME MATCHES "Windows" AND (NOT MINGW AND NOT CYGWIN)))) + (OS_NAME MATCHES "Windows" AND NOT CYGWIN AND + (NOT MINGW OR CMAKE_CXX_COMPILER_ID MATCHES "Clang")))) set(COMPILER_RT_HAS_SANITIZER_COMMON TRUE) else() set(COMPILER_RT_HAS_SANITIZER_COMMON FALSE) diff --git a/compiler-rt/lib/asan/CMakeLists.txt b/compiler-rt/lib/asan/CMakeLists.txt index 9f2b627856c1..3ec9c500c4ae 100644 --- a/compiler-rt/lib/asan/CMakeLists.txt +++ b/compiler-rt/lib/asan/CMakeLists.txt @@ -91,6 +91,8 @@ append_list_if(COMPILER_RT_HAS_LIBRT rt ASAN_DYNAMIC_LIBS) append_list_if(COMPILER_RT_HAS_LIBM m ASAN_DYNAMIC_LIBS) append_list_if(COMPILER_RT_HAS_LIBPTHREAD pthread ASAN_DYNAMIC_LIBS) append_list_if(COMPILER_RT_HAS_LIBLOG log ASAN_DYNAMIC_LIBS) +append_list_if(MINGW "${MINGW_LIBRARIES}" ASAN_DYNAMIC_LIBS) +append_list_if(MINGW psapi ASAN_DYNAMIC_LIBS) # Compile ASan sources into an object library. @@ -216,7 +218,7 @@ else() endif() set(ASAN_DYNAMIC_WEAK_INTERCEPTION) - if (MSVC) + if (WIN32) add_compiler_rt_object_libraries(AsanWeakInterception ${SANITIZER_COMMON_SUPPORTED_OS} ARCHS ${arch}