[llvm] [CMake][ASAN] Add support for ADDRESS_SANITIZER_BUILD compile option (PR #83595)
Christian Ulmann via llvm-commits
llvm-commits at lists.llvm.org
Sun Aug 4 03:51:48 PDT 2024
https://github.com/Dinistro updated https://github.com/llvm/llvm-project/pull/83595
>From 9bd1fffae741322f61cc408623fef2a507b1bd0f Mon Sep 17 00:00:00 2001
From: Christian Ulmann <christian.ulmann at nextsilicon.com>
Date: Fri, 1 Mar 2024 16:50:30 +0000
Subject: [PATCH 1/2] [CMake][ASAN] Add support for ADDRESS_SANITIZER_BUILD
compile option
This commit introduces the `LLVM_ADDRESS_SANITIZER_BUILD` compile option
that is set to indicate if LLVM has been built with ASAN enabled or not.
This is a necessary addition to properly control the declarations of
`__asan_*` helpers in header files. Previously, some of these
declarations relied on `__has_feature(address_sanitizer)`, which can
lead to differences between in-tree compilation units and down-stream
usages of the same headers.
The reproducer of this issue involved templates, which then lead to
violation of the ODR due to having two different instances of the same
template.
---
llvm/cmake/modules/HandleLLVMOptions.cmake | 13 +++++++++++++
llvm/include/llvm/Support/Compiler.h | 7 ++++---
2 files changed, 17 insertions(+), 3 deletions(-)
diff --git a/llvm/cmake/modules/HandleLLVMOptions.cmake b/llvm/cmake/modules/HandleLLVMOptions.cmake
index bdbd36174fc7a..468fe7c60ade1 100644
--- a/llvm/cmake/modules/HandleLLVMOptions.cmake
+++ b/llvm/cmake/modules/HandleLLVMOptions.cmake
@@ -947,6 +947,7 @@ if(LLVM_USE_SANITIZER)
if (LLVM_USE_SANITIZER STREQUAL "Address")
append_common_sanitizer_flags()
append("-fsanitize=address" CMAKE_C_FLAGS CMAKE_CXX_FLAGS)
+ set(LLVM_ADDRESS_SANITIZER_BUILD ON)
elseif (LLVM_USE_SANITIZER STREQUAL "HWAddress")
append_common_sanitizer_flags()
append("-fsanitize=hwaddress" CMAKE_C_FLAGS CMAKE_CXX_FLAGS)
@@ -968,6 +969,7 @@ if(LLVM_USE_SANITIZER)
LLVM_USE_SANITIZER STREQUAL "Undefined;Address")
append_common_sanitizer_flags()
append("-fsanitize=address" CMAKE_C_FLAGS CMAKE_CXX_FLAGS)
+ set(LLVM_ADDRESS_SANITIZER_BUILD ON)
append("${LLVM_UBSAN_FLAGS}" CMAKE_C_FLAGS CMAKE_CXX_FLAGS)
elseif (LLVM_USE_SANITIZER STREQUAL "Leaks")
append_common_sanitizer_flags()
@@ -979,6 +981,7 @@ if(LLVM_USE_SANITIZER)
if (LLVM_USE_SANITIZER STREQUAL "Address")
append_common_sanitizer_flags()
append("-fsanitize=address" CMAKE_C_FLAGS CMAKE_CXX_FLAGS)
+ set(LLVM_ADDRESS_SANITIZER_BUILD ON)
elseif (LLVM_USE_SANITIZER STREQUAL "Undefined")
append_common_sanitizer_flags()
append("${LLVM_UBSAN_FLAGS}" CMAKE_C_FLAGS CMAKE_CXX_FLAGS)
@@ -986,6 +989,7 @@ if(LLVM_USE_SANITIZER)
LLVM_USE_SANITIZER STREQUAL "Undefined;Address")
append_common_sanitizer_flags()
append("-fsanitize=address" CMAKE_C_FLAGS CMAKE_CXX_FLAGS)
+ set(LLVM_ADDRESS_SANITIZER_BUILD ON)
append("${LLVM_UBSAN_FLAGS}" CMAKE_C_FLAGS CMAKE_CXX_FLAGS)
else()
message(FATAL_ERROR "This sanitizer not yet supported in a MinGW environment: ${LLVM_USE_SANITIZER}")
@@ -1015,11 +1019,13 @@ if(LLVM_USE_SANITIZER)
append("clang_rt.asan_dynamic-${arch}.lib /wholearchive:clang_rt.asan_dynamic_runtime_thunk-${arch}.lib"
CMAKE_EXE_LINKER_FLAGS CMAKE_MODULE_LINKER_FLAGS CMAKE_SHARED_LINKER_FLAGS)
endif()
+ set(LLVM_ADDRESS_SANITIZER_BUILD ON)
endif()
endif()
if (LLVM_USE_SANITIZER MATCHES ".*Address.*")
if (NOT CLANG_CL)
append("/fsanitize=address" CMAKE_C_FLAGS CMAKE_CXX_FLAGS)
+ set(LLVM_ADDRESS_SANITIZER_BUILD ON)
# Not compatible with /RTC flags.
foreach (flags_opt_to_scrub
CMAKE_CXX_FLAGS_${uppercase_CMAKE_BUILD_TYPE} CMAKE_C_FLAGS_${uppercase_CMAKE_BUILD_TYPE})
@@ -1053,6 +1059,13 @@ if(LLVM_USE_SANITIZER)
endif()
endif()
+# Add a compile option to indicate if LLVM is building with address sanitizers.
+if(LLVM_ADDRESS_SANITIZER_BUILD)
+ add_compile_definitions(LLVM_ADDRESS_SANITIZER_BUILD=1)
+else()
+ add_compile_definitions(LLVM_ADDRESS_SANITIZER_BUILD=0)
+endif()
+
# Turn on -gsplit-dwarf if requested in debug builds.
if (LLVM_USE_SPLIT_DWARF AND
((uppercase_CMAKE_BUILD_TYPE STREQUAL "DEBUG") OR
diff --git a/llvm/include/llvm/Support/Compiler.h b/llvm/include/llvm/Support/Compiler.h
index d8e3794babc74..dadab5630770c 100644
--- a/llvm/include/llvm/Support/Compiler.h
+++ b/llvm/include/llvm/Support/Compiler.h
@@ -446,8 +446,10 @@
/// \macro LLVM_ADDRESS_SANITIZER_BUILD
/// Whether LLVM itself is built with AddressSanitizer instrumentation.
-#if __has_feature(address_sanitizer) || defined(__SANITIZE_ADDRESS__)
-# define LLVM_ADDRESS_SANITIZER_BUILD 1
+#ifndef LLVM_ADDRESS_SANITIZER_BUILD
+# define LLVM_ADDRESS_SANITIZER_BUILD 0
+#endif
+#if LLVM_ADDRESS_SANITIZER_BUILD
#if __has_include(<sanitizer/asan_interface.h>)
# include <sanitizer/asan_interface.h>
#else
@@ -463,7 +465,6 @@ void __asan_unpoison_memory_region(void const volatile *addr, size_t size);
#endif
#endif
#else
-# define LLVM_ADDRESS_SANITIZER_BUILD 0
# define __asan_poison_memory_region(p, size)
# define __asan_unpoison_memory_region(p, size)
#endif
>From cf02983f4375a32f35acfcdda98201f38e8776fe Mon Sep 17 00:00:00 2001
From: Christian Ulmann <christian.ulmann at nextsilicon.com>
Date: Sun, 4 Aug 2024 10:51:35 +0000
Subject: [PATCH 2/2] change to use llvm-config.h.cmake
---
llvm/include/llvm/Config/llvm-config.h.cmake | 3 +++
llvm/include/llvm/Support/Compiler.h | 5 -----
2 files changed, 3 insertions(+), 5 deletions(-)
diff --git a/llvm/include/llvm/Config/llvm-config.h.cmake b/llvm/include/llvm/Config/llvm-config.h.cmake
index 629977cc11d68..b26ddf707f03a 100644
--- a/llvm/include/llvm/Config/llvm-config.h.cmake
+++ b/llvm/include/llvm/Config/llvm-config.h.cmake
@@ -201,4 +201,7 @@
/* Define if logf128 is available */
#cmakedefine LLVM_HAS_LOGF128
+/* Define if building LLVM with ASAN */
+#cmakedefine01 LLVM_ADDRESS_SANITIZER_BUILD
+
#endif
diff --git a/llvm/include/llvm/Support/Compiler.h b/llvm/include/llvm/Support/Compiler.h
index dadab5630770c..b7667fdfbcf45 100644
--- a/llvm/include/llvm/Support/Compiler.h
+++ b/llvm/include/llvm/Support/Compiler.h
@@ -444,11 +444,6 @@
# define LLVM_NO_SANITIZE_MEMORY_ATTRIBUTE
#endif
-/// \macro LLVM_ADDRESS_SANITIZER_BUILD
-/// Whether LLVM itself is built with AddressSanitizer instrumentation.
-#ifndef LLVM_ADDRESS_SANITIZER_BUILD
-# define LLVM_ADDRESS_SANITIZER_BUILD 0
-#endif
#if LLVM_ADDRESS_SANITIZER_BUILD
#if __has_include(<sanitizer/asan_interface.h>)
# include <sanitizer/asan_interface.h>
More information about the llvm-commits
mailing list