Skip to content

Commit 3de5e8b

Browse files
authored
[libc++abi] Build cxxabi with sanitizers (llvm#119612)
1 parent 51001f8 commit 3de5e8b

File tree

1 file changed

+43
-0
lines changed

1 file changed

+43
-0
lines changed

libcxxabi/CMakeLists.txt

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -264,6 +264,49 @@ if (CXX_SUPPORTS_NOSTDINCXX_FLAG)
264264
string(REPLACE "-stdlib=libstdc++" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
265265
endif()
266266

267+
function(get_sanitizer_flags OUT_VAR USE_SANITIZER)
268+
set(SANITIZER_FLAGS)
269+
set(USE_SANITIZER "${USE_SANITIZER}")
270+
# NOTE: LLVM_USE_SANITIZER checks for a UNIX like system instead of MSVC.
271+
# But we don't have LLVM_ON_UNIX so checking for MSVC is the best we can do.
272+
if (USE_SANITIZER AND NOT MSVC)
273+
append_flags_if_supported(SANITIZER_FLAGS "-fno-omit-frame-pointer")
274+
append_flags_if_supported(SANITIZER_FLAGS "-gline-tables-only")
275+
276+
if (NOT uppercase_CMAKE_BUILD_TYPE STREQUAL "DEBUG" AND
277+
NOT uppercase_CMAKE_BUILD_TYPE STREQUAL "RELWITHDEBINFO")
278+
append_flags_if_supported(SANITIZER_FLAGS "-gline-tables-only")
279+
endif()
280+
if (USE_SANITIZER STREQUAL "Address")
281+
append_flags(SANITIZER_FLAGS "-fsanitize=address")
282+
elseif (USE_SANITIZER STREQUAL "HWAddress")
283+
append_flags(SANITIZER_FLAGS "-fsanitize=hwaddress")
284+
elseif (USE_SANITIZER MATCHES "Memory(WithOrigins)?")
285+
append_flags(SANITIZER_FLAGS -fsanitize=memory)
286+
if (USE_SANITIZER STREQUAL "MemoryWithOrigins")
287+
append_flags(SANITIZER_FLAGS "-fsanitize-memory-track-origins")
288+
endif()
289+
elseif (USE_SANITIZER STREQUAL "Undefined")
290+
append_flags(SANITIZER_FLAGS "-fsanitize=undefined" "-fno-sanitize=vptr,function" "-fno-sanitize-recover=all")
291+
elseif (USE_SANITIZER STREQUAL "Address;Undefined" OR
292+
USE_SANITIZER STREQUAL "Undefined;Address")
293+
append_flags(SANITIZER_FLAGS "-fsanitize=address,undefined" "-fno-sanitize=vptr,function" "-fno-sanitize-recover=all")
294+
elseif (USE_SANITIZER STREQUAL "Thread")
295+
append_flags(SANITIZER_FLAGS -fsanitize=thread)
296+
elseif (USE_SANITIZER STREQUAL "DataFlow")
297+
append_flags(SANITIZER_FLAGS -fsanitize=dataflow)
298+
else()
299+
message(WARNING "Unsupported value of LLVM_USE_SANITIZER: ${USE_SANITIZER}")
300+
endif()
301+
elseif(USE_SANITIZER AND MSVC)
302+
message(WARNING "LLVM_USE_SANITIZER is not supported on this platform.")
303+
endif()
304+
set(${OUT_VAR} "${SANITIZER_FLAGS}" PARENT_SCOPE)
305+
endfunction()
306+
307+
get_sanitizer_flags(SANITIZER_FLAGS "${LLVM_USE_SANITIZER}")
308+
list(APPEND LIBCXXABI_COMPILE_FLAGS ${SANITIZER_FLAGS})
309+
267310
# Let the library headers know they are currently being used to build the
268311
# library.
269312
add_definitions(-D_LIBCXXABI_BUILDING_LIBRARY)

0 commit comments

Comments
 (0)