[libcxx] [libcxxabi] [llvm] [libcxx][libcxxabi][cmake] Deduplicate sanitizer flags function (PR #221757)
via llvm-commits
llvm-commits at lists.llvm.org
Tue Sep 8 01:12:42 PDT 2026
llvmorg-github-actions[bot] wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-libcxxabi
Author: David Spickett (DavidSpickett)
<details>
<summary>Changes</summary>
While experimenting with flang-rt builds I realised there were two copies of this function.
We don't need it in flang-rt right now but I figure reducing duplication is good anyway.
---
Full diff: https://github.com/llvm/llvm-project/pull/221757.diff
3 Files Affected:
- (modified) libcxx/CMakeLists.txt (+1-44)
- (modified) libcxxabi/CMakeLists.txt (+1-40)
- (added) runtimes/cmake/Modules/GetSanitizerFlags.cmake (+40)
``````````diff
diff --git a/libcxx/CMakeLists.txt b/libcxx/CMakeLists.txt
index e28bbfaa0605d..8841f5d07aaf6 100644
--- a/libcxx/CMakeLists.txt
+++ b/libcxx/CMakeLists.txt
@@ -643,50 +643,7 @@ function(cxx_add_module_flags target)
endif()
endfunction()
-string(TOUPPER "${CMAKE_BUILD_TYPE}" uppercase_CMAKE_BUILD_TYPE)
-
-# Sanitizer flags =============================================================
-
-function(get_sanitizer_flags OUT_VAR USE_SANITIZER)
- set(SANITIZER_FLAGS)
- set(USE_SANITIZER "${USE_SANITIZER}")
- # NOTE: LLVM_USE_SANITIZER checks for a UNIX like system instead of MSVC.
- # But we don't have LLVM_ON_UNIX so checking for MSVC is the best we can do.
- if (USE_SANITIZER AND NOT MSVC)
- append_flags_if_supported(SANITIZER_FLAGS "-fno-omit-frame-pointer")
- append_flags_if_supported(SANITIZER_FLAGS "-gline-tables-only")
-
- if (NOT uppercase_CMAKE_BUILD_TYPE STREQUAL "DEBUG" AND
- NOT uppercase_CMAKE_BUILD_TYPE STREQUAL "RELWITHDEBINFO")
- append_flags_if_supported(SANITIZER_FLAGS "-gline-tables-only")
- endif()
- if (USE_SANITIZER STREQUAL "Address")
- append_flags(SANITIZER_FLAGS "-fsanitize=address")
- elseif (USE_SANITIZER STREQUAL "HWAddress")
- append_flags(SANITIZER_FLAGS "-fsanitize=hwaddress")
- elseif (USE_SANITIZER MATCHES "Memory(WithOrigins)?")
- append_flags(SANITIZER_FLAGS -fsanitize=memory)
- if (USE_SANITIZER STREQUAL "MemoryWithOrigins")
- append_flags(SANITIZER_FLAGS "-fsanitize-memory-track-origins")
- endif()
- elseif (USE_SANITIZER STREQUAL "Undefined")
- append_flags(SANITIZER_FLAGS "-fsanitize=undefined" "-fno-sanitize=vptr,function" "-fno-sanitize-recover=all")
- elseif (USE_SANITIZER STREQUAL "Address;Undefined" OR
- USE_SANITIZER STREQUAL "Undefined;Address")
- append_flags(SANITIZER_FLAGS "-fsanitize=address,undefined" "-fno-sanitize=vptr,function" "-fno-sanitize-recover=all")
- elseif (USE_SANITIZER STREQUAL "Thread")
- append_flags(SANITIZER_FLAGS -fsanitize=thread)
- elseif (USE_SANITIZER STREQUAL "DataFlow")
- append_flags(SANITIZER_FLAGS -fsanitize=dataflow)
- else()
- message(WARNING "Unsupported value of LLVM_USE_SANITIZER: ${USE_SANITIZER}")
- endif()
- elseif(USE_SANITIZER AND MSVC)
- message(WARNING "LLVM_USE_SANITIZER is not supported on this platform.")
- endif()
- set(${OUT_VAR} "${SANITIZER_FLAGS}" PARENT_SCOPE)
-endfunction()
-
+include(GetSanitizerFlags)
get_sanitizer_flags(SANITIZER_FLAGS "${LLVM_USE_SANITIZER}")
add_library(cxx-sanitizer-flags INTERFACE)
target_compile_options(cxx-sanitizer-flags INTERFACE ${SANITIZER_FLAGS})
diff --git a/libcxxabi/CMakeLists.txt b/libcxxabi/CMakeLists.txt
index 902d4247fe6f7..6ea3cea30bdbc 100644
--- a/libcxxabi/CMakeLists.txt
+++ b/libcxxabi/CMakeLists.txt
@@ -296,46 +296,7 @@ if (CXX_SUPPORTS_NOSTDINCXX_FLAG)
string(REPLACE "-stdlib=libstdc++" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
endif()
-function(get_sanitizer_flags OUT_VAR USE_SANITIZER)
- set(SANITIZER_FLAGS)
- set(USE_SANITIZER "${USE_SANITIZER}")
- # NOTE: LLVM_USE_SANITIZER checks for a UNIX like system instead of MSVC.
- # But we don't have LLVM_ON_UNIX so checking for MSVC is the best we can do.
- if (USE_SANITIZER AND NOT MSVC)
- append_flags_if_supported(SANITIZER_FLAGS "-fno-omit-frame-pointer")
- append_flags_if_supported(SANITIZER_FLAGS "-gline-tables-only")
-
- if (NOT uppercase_CMAKE_BUILD_TYPE STREQUAL "DEBUG" AND
- NOT uppercase_CMAKE_BUILD_TYPE STREQUAL "RELWITHDEBINFO")
- append_flags_if_supported(SANITIZER_FLAGS "-gline-tables-only")
- endif()
- if (USE_SANITIZER STREQUAL "Address")
- append_flags(SANITIZER_FLAGS "-fsanitize=address")
- elseif (USE_SANITIZER STREQUAL "HWAddress")
- append_flags(SANITIZER_FLAGS "-fsanitize=hwaddress")
- elseif (USE_SANITIZER MATCHES "Memory(WithOrigins)?")
- append_flags(SANITIZER_FLAGS -fsanitize=memory)
- if (USE_SANITIZER STREQUAL "MemoryWithOrigins")
- append_flags(SANITIZER_FLAGS "-fsanitize-memory-track-origins")
- endif()
- elseif (USE_SANITIZER STREQUAL "Undefined")
- append_flags(SANITIZER_FLAGS "-fsanitize=undefined" "-fno-sanitize=vptr,function" "-fno-sanitize-recover=all")
- elseif (USE_SANITIZER STREQUAL "Address;Undefined" OR
- USE_SANITIZER STREQUAL "Undefined;Address")
- append_flags(SANITIZER_FLAGS "-fsanitize=address,undefined" "-fno-sanitize=vptr,function" "-fno-sanitize-recover=all")
- elseif (USE_SANITIZER STREQUAL "Thread")
- append_flags(SANITIZER_FLAGS -fsanitize=thread)
- elseif (USE_SANITIZER STREQUAL "DataFlow")
- append_flags(SANITIZER_FLAGS -fsanitize=dataflow)
- else()
- message(WARNING "Unsupported value of LLVM_USE_SANITIZER: ${USE_SANITIZER}")
- endif()
- elseif(USE_SANITIZER AND MSVC)
- message(WARNING "LLVM_USE_SANITIZER is not supported on this platform.")
- endif()
- set(${OUT_VAR} "${SANITIZER_FLAGS}" PARENT_SCOPE)
-endfunction()
-
+include(GetSanitizerFlags)
get_sanitizer_flags(SANITIZER_FLAGS "${LLVM_USE_SANITIZER}")
list(APPEND LIBCXXABI_COMPILE_FLAGS ${SANITIZER_FLAGS})
diff --git a/runtimes/cmake/Modules/GetSanitizerFlags.cmake b/runtimes/cmake/Modules/GetSanitizerFlags.cmake
new file mode 100644
index 0000000000000..b3ed48d3212be
--- /dev/null
+++ b/runtimes/cmake/Modules/GetSanitizerFlags.cmake
@@ -0,0 +1,40 @@
+function(get_sanitizer_flags OUT_VAR USE_SANITIZER)
+ set(SANITIZER_FLAGS)
+ set(USE_SANITIZER "${USE_SANITIZER}")
+ string(TOUPPER "${CMAKE_BUILD_TYPE}" uppercase_CMAKE_BUILD_TYPE)
+ # NOTE: LLVM_USE_SANITIZER checks for a UNIX like system instead of MSVC.
+ # But we don't have LLVM_ON_UNIX so checking for MSVC is the best we can do.
+ if (USE_SANITIZER AND NOT MSVC)
+ append_flags_if_supported(SANITIZER_FLAGS "-fno-omit-frame-pointer")
+ append_flags_if_supported(SANITIZER_FLAGS "-gline-tables-only")
+
+ if (NOT uppercase_CMAKE_BUILD_TYPE STREQUAL "DEBUG" AND
+ NOT uppercase_CMAKE_BUILD_TYPE STREQUAL "RELWITHDEBINFO")
+ append_flags_if_supported(SANITIZER_FLAGS "-gline-tables-only")
+ endif()
+ if (USE_SANITIZER STREQUAL "Address")
+ append_flags(SANITIZER_FLAGS "-fsanitize=address")
+ elseif (USE_SANITIZER STREQUAL "HWAddress")
+ append_flags(SANITIZER_FLAGS "-fsanitize=hwaddress")
+ elseif (USE_SANITIZER MATCHES "Memory(WithOrigins)?")
+ append_flags(SANITIZER_FLAGS -fsanitize=memory)
+ if (USE_SANITIZER STREQUAL "MemoryWithOrigins")
+ append_flags(SANITIZER_FLAGS "-fsanitize-memory-track-origins")
+ endif()
+ elseif (USE_SANITIZER STREQUAL "Undefined")
+ append_flags(SANITIZER_FLAGS "-fsanitize=undefined" "-fno-sanitize=vptr,function" "-fno-sanitize-recover=all")
+ elseif (USE_SANITIZER STREQUAL "Address;Undefined" OR
+ USE_SANITIZER STREQUAL "Undefined;Address")
+ append_flags(SANITIZER_FLAGS "-fsanitize=address,undefined" "-fno-sanitize=vptr,function" "-fno-sanitize-recover=all")
+ elseif (USE_SANITIZER STREQUAL "Thread")
+ append_flags(SANITIZER_FLAGS -fsanitize=thread)
+ elseif (USE_SANITIZER STREQUAL "DataFlow")
+ append_flags(SANITIZER_FLAGS -fsanitize=dataflow)
+ else()
+ message(WARNING "Unsupported value of LLVM_USE_SANITIZER: ${USE_SANITIZER}")
+ endif()
+ elseif(USE_SANITIZER AND MSVC)
+ message(WARNING "LLVM_USE_SANITIZER is not supported on this platform.")
+ endif()
+ set(${OUT_VAR} "${SANITIZER_FLAGS}" PARENT_SCOPE)
+endfunction()
``````````
</details>
https://github.com/llvm/llvm-project/pull/221757
More information about the llvm-commits
mailing list