Skip to content

Commit e82ad46

Browse files
author
Chris Bieneman
committedDec 9, 2015
[CMake] Provide options for toggling on and off various runtime libraries.
Summary: Rather than having to add new "experimental" options each time someone wants to work on bringing a sanitizer to a new platform, this patch makes options for all of them. The default values for the options are set by the platform checks that would have enabled them, but they can be overridden on or off. Reviewers: kubabrecka, samsonov Subscribers: llvm-commits Differential Revision: http://reviews.llvm.org/D14846 llvm-svn: 255170
1 parent ed11bd2 commit e82ad46

File tree

10 files changed

+98
-113
lines changed

10 files changed

+98
-113
lines changed
 

‎compiler-rt/cmake/Modules/CompilerRTUtils.cmake

+19
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,16 @@ macro(append_list_if condition value)
3636
endif()
3737
endmacro()
3838

39+
# Appends values to list if it isn't already there
40+
macro(append_list_unique list)
41+
foreach(val ${ARGN})
42+
list(FIND ${list} ${val} idx)
43+
if(idx EQUAL -1)
44+
list(APPEND ${list} ${val})
45+
endif()
46+
endforeach()
47+
endmacro()
48+
3949
# Appends value to all strings in ARGN, if the condition is true.
4050
macro(append_string_if condition value)
4151
if(${condition})
@@ -67,3 +77,12 @@ macro(list_union output input1 input2)
6777
endif()
6878
endforeach()
6979
endmacro()
80+
81+
macro(check_list_contains outvar list input)
82+
list(FIND ${list} ${input} idx)
83+
if(idx GREATER -1)
84+
set(${outvar} True)
85+
else()
86+
set(${outvar} False)
87+
endif()
88+
endmacro()

‎compiler-rt/cmake/config-ix.cmake

+47-43
Original file line numberDiff line numberDiff line change
@@ -505,78 +505,82 @@ endif()
505505
if (SANITIZER_COMMON_SUPPORTED_ARCH AND NOT LLVM_USE_SANITIZER AND
506506
(OS_NAME MATCHES "Android|Darwin|Linux|FreeBSD" OR
507507
(OS_NAME MATCHES "Windows" AND MSVC)))
508-
set(COMPILER_RT_HAS_SANITIZER_COMMON TRUE)
509-
else()
510-
set(COMPILER_RT_HAS_SANITIZER_COMMON FALSE)
508+
list(APPEND DEFAULT_RUNTIMES sanitizer_common)
511509
endif()
512510

513-
if (COMPILER_RT_HAS_SANITIZER_COMMON AND
514-
(NOT OS_NAME MATCHES "Windows" OR CMAKE_SIZEOF_VOID_P EQUAL 4))
515-
set(COMPILER_RT_HAS_INTERCEPTION TRUE)
516-
else()
517-
set(COMPILER_RT_HAS_INTERCEPTION FALSE)
511+
if (NOT OS_NAME MATCHES "Windows" OR CMAKE_SIZEOF_VOID_P EQUAL 4)
512+
list(APPEND DEFAULT_RUNTIMES interception)
513+
list(APPEND REQUIRES_COMMON interception)
518514
endif()
519515

520-
if (COMPILER_RT_HAS_SANITIZER_COMMON AND ASAN_SUPPORTED_ARCH AND
516+
if (ASAN_SUPPORTED_ARCH AND
521517
(NOT OS_NAME MATCHES "Windows" OR CMAKE_SIZEOF_VOID_P EQUAL 4))
522-
set(COMPILER_RT_HAS_ASAN TRUE)
523-
else()
524-
set(COMPILER_RT_HAS_ASAN FALSE)
518+
list(APPEND DEFAULT_RUNTIMES asan)
519+
list(APPEND REQUIRES_COMMON asan)
525520
endif()
526521

527522
if (OS_NAME MATCHES "Linux|FreeBSD|Windows")
528-
set(COMPILER_RT_ASAN_HAS_STATIC_RUNTIME TRUE)
529-
else()
530-
set(COMPILER_RT_ASAN_HAS_STATIC_RUNTIME FALSE)
523+
set(COMPILER_RT_ASAN_HAS_STATIC_RUNTIME On)
531524
endif()
532525

533526
# TODO: Add builtins support.
534527

535-
if (COMPILER_RT_HAS_SANITIZER_COMMON AND DFSAN_SUPPORTED_ARCH AND
528+
if (DFSAN_SUPPORTED_ARCH AND
536529
OS_NAME MATCHES "Linux")
537-
set(COMPILER_RT_HAS_DFSAN TRUE)
538-
else()
539-
set(COMPILER_RT_HAS_DFSAN FALSE)
530+
list(APPEND DEFAULT_RUNTIMES dfsan)
531+
list(APPEND REQUIRES_COMMON dfsan)
540532
endif()
541533

542-
if (COMPILER_RT_HAS_SANITIZER_COMMON AND LSAN_SUPPORTED_ARCH AND
543-
OS_NAME MATCHES "Linux|FreeBSD")
544-
set(COMPILER_RT_HAS_LSAN TRUE)
545-
else()
546-
set(COMPILER_RT_HAS_LSAN FALSE)
534+
if (LSAN_SUPPORTED_ARCH AND OS_NAME MATCHES "Linux|FreeBSD")
535+
list(APPEND DEFAULT_RUNTIMES lsan)
536+
list(APPEND REQUIRES_COMMON lsan)
547537
endif()
548538

549-
if (COMPILER_RT_HAS_SANITIZER_COMMON AND MSAN_SUPPORTED_ARCH AND
539+
if (MSAN_SUPPORTED_ARCH AND
550540
OS_NAME MATCHES "Linux")
551-
set(COMPILER_RT_HAS_MSAN TRUE)
552-
else()
553-
set(COMPILER_RT_HAS_MSAN FALSE)
541+
list(APPEND DEFAULT_RUNTIMES msan)
542+
list(APPEND REQUIRES_COMMON msan)
554543
endif()
555544

556545
if (PROFILE_SUPPORTED_ARCH AND
557546
OS_NAME MATCHES "Darwin|Linux|FreeBSD")
558-
set(COMPILER_RT_HAS_PROFILE TRUE)
559-
else()
560-
set(COMPILER_RT_HAS_PROFILE FALSE)
547+
list(APPEND DEFAULT_RUNTIMES profile)
561548
endif()
562549

563-
if (COMPILER_RT_HAS_SANITIZER_COMMON AND TSAN_SUPPORTED_ARCH AND
550+
if (TSAN_SUPPORTED_ARCH AND
564551
OS_NAME MATCHES "Darwin|Linux|FreeBSD")
565-
set(COMPILER_RT_HAS_TSAN TRUE)
566-
else()
567-
set(COMPILER_RT_HAS_TSAN FALSE)
552+
list(APPEND DEFAULT_RUNTIMES tsan)
553+
list(APPEND REQUIRES_COMMON tsan)
568554
endif()
569555

570-
if (COMPILER_RT_HAS_SANITIZER_COMMON AND UBSAN_SUPPORTED_ARCH AND
556+
if (UBSAN_SUPPORTED_ARCH AND
571557
OS_NAME MATCHES "Darwin|Linux|FreeBSD|Windows")
572-
set(COMPILER_RT_HAS_UBSAN TRUE)
573-
else()
574-
set(COMPILER_RT_HAS_UBSAN FALSE)
558+
list(APPEND DEFAULT_RUNTIMES ubsan)
559+
list(APPEND REQUIRES_COMMON ubsan)
575560
endif()
561+
list(APPEND DEFAULT_RUNTIMES cfi)
576562

577-
if (COMPILER_RT_HAS_SANITIZER_COMMON AND SAFESTACK_SUPPORTED_ARCH AND
563+
if (SAFESTACK_SUPPORTED_ARCH AND
578564
OS_NAME MATCHES "Darwin|Linux|FreeBSD")
579-
set(COMPILER_RT_HAS_SAFESTACK TRUE)
580-
else()
581-
set(COMPILER_RT_HAS_SAFESTACK FALSE)
565+
list(APPEND DEFAULT_RUNTIMES safestack)
566+
list(APPEND REQUIRES_COMMON safestack)
567+
endif()
568+
569+
set(COMPILER_RT_RUNTIMES_TO_BUILD "all"
570+
CACHE STRING "Semicolon-separated list of runtimes to build, or \"all\".")
571+
572+
if(COMPILER_RT_RUNTIMES_TO_BUILD STREQUAL "all")
573+
set(COMPILER_RT_RUNTIMES_TO_BUILD ${DEFAULT_RUNTIMES})
574+
endif()
575+
576+
# Several of the runtimes produce object libraries that are consumed by other
577+
# runtimes (i.e. asan relies on ubsan). If you're building a library that relies
578+
# on common bits we need to build this full set of libraries.
579+
list_union(SHOULD_BUILD_COMMON REQUIRES_COMMON COMPILER_RT_RUNTIMES_TO_BUILD)
580+
581+
if(SHOULD_BUILD_COMMON)
582+
append_list_unique(COMPILER_RT_RUNTIMES_TO_BUILD sanitizer_common)
583+
append_list_unique(COMPILER_RT_RUNTIMES_TO_BUILD lsan)
584+
append_list_unique(COMPILER_RT_RUNTIMES_TO_BUILD ubsan)
585+
append_list_unique(COMPILER_RT_RUNTIMES_TO_BUILD interception)
582586
endif()

‎compiler-rt/lib/CMakeLists.txt

+5-36
Original file line numberDiff line numberDiff line change
@@ -9,40 +9,9 @@ if(COMPILER_RT_BUILD_BUILTINS)
99
endif()
1010

1111
if(COMPILER_RT_BUILD_SANITIZERS)
12-
if(COMPILER_RT_HAS_INTERCEPTION)
13-
add_subdirectory(interception)
14-
endif()
15-
16-
if(COMPILER_RT_HAS_SANITIZER_COMMON)
17-
add_subdirectory(sanitizer_common)
18-
add_subdirectory(lsan)
19-
add_subdirectory(ubsan)
20-
endif()
21-
22-
add_subdirectory(cfi)
23-
24-
if(COMPILER_RT_HAS_ASAN)
25-
add_subdirectory(asan)
26-
endif()
27-
28-
if(COMPILER_RT_HAS_DFSAN)
29-
add_subdirectory(dfsan)
30-
endif()
31-
32-
if(COMPILER_RT_HAS_MSAN)
33-
add_subdirectory(msan)
34-
endif()
35-
36-
if(COMPILER_RT_HAS_PROFILE)
37-
add_subdirectory(profile)
38-
endif()
39-
40-
if(COMPILER_RT_HAS_TSAN)
41-
add_subdirectory(tsan)
42-
add_subdirectory(tsan/dd)
43-
endif()
44-
45-
if(COMPILER_RT_HAS_SAFESTACK)
46-
add_subdirectory(safestack)
47-
endif()
12+
message(STATUS "Adding runtimes...")
13+
foreach(runtime ${COMPILER_RT_RUNTIMES_TO_BUILD})
14+
message(STATUS "Adding runtime: ${runtime}")
15+
add_subdirectory(${runtime})
16+
endforeach()
4817
endif()

‎compiler-rt/lib/lsan/CMakeLists.txt

+1
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ add_compiler_rt_object_libraries(RTLSanCommon
2424
SOURCES ${LSAN_COMMON_SOURCES}
2525
CFLAGS ${LSAN_CFLAGS})
2626

27+
check_list_contains(COMPILER_RT_HAS_LSAN COMPILER_RT_RUNTIMES_TO_BUILD lsan)
2728
if(COMPILER_RT_HAS_LSAN)
2829
foreach(arch ${LSAN_SUPPORTED_ARCH})
2930
add_compiler_rt_runtime(clang_rt.lsan

‎compiler-rt/lib/tsan/CMakeLists.txt

+2
Original file line numberDiff line numberDiff line change
@@ -213,3 +213,5 @@ endif()
213213
if(COMPILER_RT_INCLUDE_TESTS)
214214
add_subdirectory(tests)
215215
endif()
216+
217+
add_subdirectory(dd)

‎compiler-rt/lib/ubsan/CMakeLists.txt

+2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
# Build for the undefined behavior sanitizer runtime support library.
22

3+
check_list_contains(COMPILER_RT_HAS_UBSAN COMPILER_RT_RUNTIMES_TO_BUILD ubsan)
4+
35
set(UBSAN_SOURCES
46
ubsan_diag.cc
57
ubsan_init.cc

‎compiler-rt/test/CMakeLists.txt

+4-31
Original file line numberDiff line numberDiff line change
@@ -36,37 +36,9 @@ endif()
3636
# Run sanitizer tests only if we're sure that clang would produce
3737
# working binaries.
3838
if(COMPILER_RT_CAN_EXECUTE_TESTS)
39-
if(COMPILER_RT_HAS_ASAN)
40-
add_subdirectory(asan)
41-
endif()
42-
if(COMPILER_RT_HAS_DFSAN)
43-
add_subdirectory(dfsan)
44-
endif()
45-
if(COMPILER_RT_HAS_LSAN)
46-
add_subdirectory(lsan)
47-
endif()
48-
if(COMPILER_RT_HAS_MSAN)
49-
add_subdirectory(msan)
50-
endif()
51-
if(COMPILER_RT_HAS_PROFILE)
52-
add_subdirectory(profile)
53-
endif()
54-
if(COMPILER_RT_HAS_SANITIZER_COMMON)
55-
add_subdirectory(sanitizer_common)
56-
endif()
57-
if(COMPILER_RT_HAS_TSAN)
58-
add_subdirectory(tsan)
59-
endif()
60-
if(COMPILER_RT_HAS_UBSAN)
61-
add_subdirectory(ubsan)
62-
endif()
63-
# CFI tests require diagnostic mode, which is implemented in UBSan.
64-
if(COMPILER_RT_HAS_UBSAN)
65-
add_subdirectory(cfi)
66-
endif()
67-
if(COMPILER_RT_HAS_SAFESTACK)
68-
add_subdirectory(safestack)
69-
endif()
39+
foreach(runtime ${COMPILER_RT_RUNTIMES_TO_BUILD})
40+
add_subdirectory(${runtime})
41+
endforeach()
7042
endif()
7143

7244
if(COMPILER_RT_STANDALONE_BUILD)
@@ -79,3 +51,4 @@ if(COMPILER_RT_STANDALONE_BUILD)
7951
${LLVM_LIT_TESTSUITES}
8052
DEPENDS ${LLVM_LIT_DEPENDS})
8153
endif()
54+

‎compiler-rt/test/cfi/CMakeLists.txt

+6
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,9 @@
1+
check_list_contains(HAS_UBSAN COMPILER_RT_RUNTIMES_TO_BUILD ubsan)
2+
# CFI tests require diagnostic mode, which is implemented in UBSan.
3+
if(NOT HAS_UBSAN)
4+
return()
5+
endif()
6+
17
configure_lit_site_cfg(
28
${CMAKE_CURRENT_SOURCE_DIR}/lit.site.cfg.in
39
${CMAKE_CURRENT_BINARY_DIR}/lit.site.cfg
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
# Placeholder to avoid special casing.

‎compiler-rt/test/ubsan/CMakeLists.txt

+11-3
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,10 @@ if(APPLE)
2020
darwin_filter_host_archs(UBSAN_SUPPORTED_ARCH UBSAN_TEST_ARCH)
2121
endif()
2222

23+
check_list_contains(HAS_ASAN COMPILER_RT_RUNTIMES_TO_BUILD asan)
24+
check_list_contains(HAS_MSAN COMPILER_RT_RUNTIMES_TO_BUILD msan)
25+
check_list_contains(HAS_TSAN COMPILER_RT_RUNTIMES_TO_BUILD tsan)
26+
2327
foreach(arch ${UBSAN_TEST_ARCH})
2428
set(UBSAN_TEST_TARGET_ARCH ${arch})
2529
if(${arch} MATCHES "arm|aarch64")
@@ -31,13 +35,17 @@ foreach(arch ${UBSAN_TEST_ARCH})
3135
endif()
3236
add_ubsan_testsuite("Standalone" ubsan ${arch})
3337

34-
if(COMPILER_RT_HAS_ASAN AND ";${ASAN_SUPPORTED_ARCH};" MATCHES ";${arch};")
38+
check_list_contains(ASAN_HAS_ARCH ASAN_SUPPORTED_ARCH ${arch})
39+
check_list_contains(MSAN_HAS_ARCH MSAN_SUPPORTED_ARCH ${arch})
40+
check_list_contains(TSAN_HAS_ARCH TSAN_SUPPORTED_ARCH ${arch})
41+
42+
if(HAS_ASAN AND ASAN_HAS_ARCH)
3543
add_ubsan_testsuite("AddressSanitizer" asan ${arch})
3644
endif()
37-
if(COMPILER_RT_HAS_MSAN AND ";${MSAN_SUPPORTED_ARCH};" MATCHES ";${arch};")
45+
if(HAS_MSAN AND MSAN_HAS_ARCH)
3846
add_ubsan_testsuite("MemorySanitizer" msan ${arch})
3947
endif()
40-
if(COMPILER_RT_HAS_TSAN AND ";${TSAN_SUPPORTED_ARCH};" MATCHES ";${arch};")
48+
if(HAS_TSAN AND TSAN_HAS_ARCH)
4149
add_ubsan_testsuite("ThreadSanitizer" tsan ${arch})
4250
endif()
4351
endforeach()

0 commit comments

Comments
 (0)
Please sign in to comment.