Skip to content

Commit 2bbb6ad

Browse files
committedJul 28, 2017
Support compiler-rt builtins
This change adds support for compiler-rt builtins as an alternative compiler runtime to libgcc. Differential Revision: https://reviews.llvm.org/D35165 llvm-svn: 309361
1 parent a219b3d commit 2bbb6ad

File tree

9 files changed

+82
-7
lines changed

9 files changed

+82
-7
lines changed
 

‎compiler-rt/CMakeLists.txt

+16
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@ option(COMPILER_RT_EXTERNALIZE_DEBUGINFO
8484
# COMPILER_RT_DEBUG_PYBOOL is used by lit.common.configured.in.
8585
pythonize_bool(COMPILER_RT_DEBUG)
8686

87+
include(HandleCompilerRT)
8788
include(config-ix)
8889

8990
if(APPLE AND SANITIZER_MIN_OSX_VERSION AND SANITIZER_MIN_OSX_VERSION VERSION_LESS "10.9")
@@ -99,6 +100,8 @@ endif()
99100
option(SANITIZER_CAN_USE_CXXABI "Sanitizers can use cxxabi" ${use_cxxabi_default})
100101
pythonize_bool(SANITIZER_CAN_USE_CXXABI)
101102

103+
option(SANITIZER_USE_COMPILER_RT "Use compiler-rt builtins instead of libgcc" OFF)
104+
102105
#================================
103106
# Setup Compiler Flags
104107
#================================
@@ -234,6 +237,19 @@ append_list_if(COMPILER_RT_HAS_WD4391_FLAG /wd4391 SANITIZER_COMMON_CFLAGS)
234237
append_list_if(COMPILER_RT_HAS_WD4722_FLAG /wd4722 SANITIZER_COMMON_CFLAGS)
235238
append_list_if(COMPILER_RT_HAS_WD4800_FLAG /wd4800 SANITIZER_COMMON_CFLAGS)
236239

240+
# Set common link flags.
241+
append_list_if(COMPILER_RT_HAS_NODEFAULTLIBS_FLAG -nodefaultlibs SANITIZER_COMMON_LINK_FLAGS)
242+
243+
if (SANITIZER_USE_COMPILER_RT)
244+
list(APPEND SANITIZER_COMMON_LINK_FLAGS -rtlib=compiler-rt)
245+
find_compiler_rt_library(builtins COMPILER_RT_BUILTINS_LIBRARY)
246+
list(APPEND SANITIZER_COMMON_LINK_LIBS ${COMPILER_RT_BUILTINS_LIBRARY})
247+
else()
248+
append_list_if(COMPILER_RT_HAS_GCC_S_LIB gcc_s SANITIZER_COMMON_LINK_LIBS)
249+
endif()
250+
251+
append_list_if(COMPILER_RT_HAS_LIBC c SANITIZER_COMMON_LINK_LIBS)
252+
237253
# Warnings to turn off for all libraries, not just sanitizers.
238254
append_string_if(COMPILER_RT_HAS_WUNUSED_PARAMETER_FLAG -Wno-unused-parameter CMAKE_C_FLAGS CMAKE_CXX_FLAGS)
239255

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
function(find_compiler_rt_library name dest)
2+
set(dest "" PARENT_SCOPE)
3+
set(CLANG_COMMAND ${CMAKE_CXX_COMPILER} ${SANITIZER_COMMON_CFLAGS}
4+
"--rtlib=compiler-rt" "--print-libgcc-file-name")
5+
if (CMAKE_CXX_COMPILER_ID MATCHES Clang AND CMAKE_CXX_COMPILER_TARGET)
6+
list(APPEND CLANG_COMMAND "--target=${CMAKE_CXX_COMPILER_TARGET}")
7+
endif()
8+
execute_process(
9+
COMMAND ${CLANG_COMMAND}
10+
RESULT_VARIABLE HAD_ERROR
11+
OUTPUT_VARIABLE LIBRARY_FILE
12+
)
13+
string(STRIP "${LIBRARY_FILE}" LIBRARY_FILE)
14+
string(REPLACE "builtins" "${name}" LIBRARY_FILE "${LIBRARY_FILE}")
15+
if (NOT HAD_ERROR AND EXISTS "${LIBRARY_FILE}")
16+
message(STATUS "Found compiler-rt ${name} library: ${LIBRARY_FILE}")
17+
set(${dest} "${LIBRARY_FILE}" PARENT_SCOPE)
18+
else()
19+
message(STATUS "Failed to find compiler-rt ${name} library")
20+
endif()
21+
endfunction()

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

+21-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
include(CMakePushCheckState)
2+
include(CheckCCompilerFlag)
23
include(CheckCXXCompilerFlag)
34
include(CheckLibraryExists)
45
include(CheckSymbolExists)
@@ -11,6 +12,26 @@ function(check_linker_flag flag out_var)
1112
cmake_pop_check_state()
1213
endfunction()
1314

15+
check_library_exists(c fopen "" COMPILER_RT_HAS_LIBC)
16+
if (NOT SANITIZER_USE_COMPILER_RT)
17+
check_library_exists(gcc_s __gcc_personality_v0 "" COMPILER_RT_HAS_GCC_S_LIB)
18+
endif()
19+
20+
check_c_compiler_flag(-nodefaultlibs COMPILER_RT_HAS_NODEFAULTLIBS_FLAG)
21+
if (COMPILER_RT_HAS_NODEFAULTLIBS_FLAG)
22+
set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -nodefaultlibs")
23+
if (COMPILER_RT_HAS_LIBC)
24+
list(APPEND CMAKE_REQUIRED_LIBRARIES c)
25+
endif ()
26+
if (SANITIZER_USE_COMPILER_RT)
27+
list(APPEND CMAKE_REQUIRED_FLAGS -rtlib=compiler-rt)
28+
find_compiler_rt_library(builtins COMPILER_RT_BUILTINS_LIBRARY)
29+
list(APPEND CMAKE_REQUIRED_LIBRARIES "${COMPILER_RT_BUILTINS_LIBRARY}")
30+
elseif (COMPILER_RT_HAS_GCC_S_LIB)
31+
list(APPEND CMAKE_REQUIRED_LIBRARIES gcc_s)
32+
endif ()
33+
endif ()
34+
1435
# CodeGen options.
1536
check_cxx_compiler_flag(-fPIC COMPILER_RT_HAS_FPIC_FLAG)
1637
check_cxx_compiler_flag(-fPIE COMPILER_RT_HAS_FPIE_FLAG)
@@ -73,7 +94,6 @@ check_cxx_compiler_flag(/wd4800 COMPILER_RT_HAS_WD4800_FLAG)
7394
check_symbol_exists(__func__ "" COMPILER_RT_HAS_FUNC_SYMBOL)
7495

7596
# Libraries.
76-
check_library_exists(c fopen "" COMPILER_RT_HAS_LIBC)
7797
check_library_exists(dl dlopen "" COMPILER_RT_HAS_LIBDL)
7898
check_library_exists(rt shm_open "" COMPILER_RT_HAS_LIBRT)
7999
check_library_exists(m pow "" COMPILER_RT_HAS_LIBM)

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

+3-2
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ set(ASAN_CFLAGS ${SANITIZER_COMMON_CFLAGS})
4040

4141
append_rtti_flag(OFF ASAN_CFLAGS)
4242

43-
set(ASAN_DYNAMIC_LINK_FLAGS)
43+
set(ASAN_DYNAMIC_LINK_FLAGS ${SANITIZER_COMMON_LINK_FLAGS})
4444

4545
if(ANDROID)
4646
# On Android, -z global does not do what it is documented to do.
@@ -65,7 +65,8 @@ append_list_if(COMPILER_RT_HAS_FTLS_MODEL_INITIAL_EXEC
6565
-ftls-model=initial-exec ASAN_DYNAMIC_CFLAGS)
6666
append_list_if(MSVC /DEBUG ASAN_DYNAMIC_LINK_FLAGS)
6767

68-
append_list_if(COMPILER_RT_HAS_LIBC c ASAN_DYNAMIC_LIBS)
68+
set(ASAN_DYNAMIC_LIBS ${SANITIZER_COMMON_LINK_LIBS})
69+
6970
append_list_if(COMPILER_RT_HAS_LIBDL dl ASAN_DYNAMIC_LIBS)
7071
append_list_if(COMPILER_RT_HAS_LIBRT rt ASAN_DYNAMIC_LIBS)
7172
append_list_if(COMPILER_RT_HAS_LIBM m ASAN_DYNAMIC_LIBS)

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

+4-1
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@ add_compiler_rt_object_libraries(RTLSanCommon
2929
if(COMPILER_RT_HAS_LSAN)
3030
add_compiler_rt_component(lsan)
3131
if(APPLE)
32+
set(LSAN_LINK_LIBS ${SANITIZER_COMMON_LINK_LIBS})
33+
3234
add_weak_symbols("lsan" WEAK_SYMBOL_LINK_FLAGS)
3335
add_weak_symbols("sanitizer_common" WEAK_SYMBOL_LINK_FLAGS)
3436

@@ -42,7 +44,8 @@ if(COMPILER_RT_HAS_LSAN)
4244
RTSanitizerCommon
4345
RTSanitizerCommonLibc
4446
CFLAGS ${LSAN_CFLAGS}
45-
LINK_FLAGS ${WEAK_SYMBOL_LINK_FLAGS}
47+
LINK_FLAGS ${SANITIZER_COMMON_LINK_FLAGS} ${WEAK_SYMBOL_LINK_FLAGS}
48+
LINK_LIBS ${LSAN_LINK_LIBS}
4649
PARENT_TARGET lsan)
4750
else()
4851
foreach(arch ${LSAN_SUPPORTED_ARCH})

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

+4-1
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ set_target_properties(stats PROPERTIES FOLDER "Compiler-RT Misc")
66
if(APPLE)
77
set(STATS_LIB_FLAVOR SHARED)
88

9+
set(STATS_LINK_LIBS ${SANITIZER_COMMON_LINK_LIBS})
10+
911
add_weak_symbols("asan" WEAK_SYMBOL_LINK_FLAGS)
1012
add_weak_symbols("ubsan" WEAK_SYMBOL_LINK_FLAGS)
1113
add_weak_symbols("sanitizer_common" WEAK_SYMBOL_LINK_FLAGS)
@@ -23,7 +25,8 @@ add_compiler_rt_runtime(clang_rt.stats
2325
OBJECT_LIBS RTSanitizerCommon
2426
RTSanitizerCommonLibc
2527
CFLAGS ${SANITIZER_COMMON_CFLAGS}
26-
LINK_FLAGS ${WEAK_SYMBOL_LINK_FLAGS}
28+
LINK_FLAGS ${SANITIZER_COMMON_LINK_FLAGS} ${WEAK_SYMBOL_LINK_FLAGS}
29+
LINK_LIBS ${STATS_LINK_LIBS}
2730
PARENT_TARGET stats)
2831

2932
add_compiler_rt_runtime(clang_rt.stats_client

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

+4-1
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,8 @@ if(APPLE)
109109
set_source_files_properties(${TSAN_ASM_SOURCES} PROPERTIES LANGUAGE C)
110110
endif()
111111

112+
set(TSAN_LINK_LIBS ${SANITIZER_COMMON_LINK_LIBS})
113+
112114
add_weak_symbols("ubsan" WEAK_SYMBOL_LINK_FLAGS)
113115
add_weak_symbols("sanitizer_common" WEAK_SYMBOL_LINK_FLAGS)
114116

@@ -122,7 +124,8 @@ if(APPLE)
122124
RTSanitizerCommonLibc
123125
RTUbsan
124126
CFLAGS ${TSAN_RTL_CFLAGS}
125-
LINK_FLAGS ${WEAK_SYMBOL_LINK_FLAGS}
127+
LINK_FLAGS ${SANITIZER_COMMON_LINK_FLAGS} ${WEAK_SYMBOL_LINK_FLAGS}
128+
LINK_LIBS ${TSAN_LINK_LIBS}
126129
PARENT_TARGET tsan)
127130
add_compiler_rt_object_libraries(RTTsan_dynamic
128131
OS ${TSAN_SUPPORTED_OS}

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

+4-1
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,12 @@ set(DD_SOURCES
1010
dd_interceptors.cc
1111
)
1212

13-
set(DD_LINKLIBS)
13+
set(DD_LINKLIBS ${SANITIZER_COMMON_LINK_LIBS})
14+
1415
append_list_if(COMPILER_RT_HAS_LIBDL dl DD_LINKLIBS)
1516
append_list_if(COMPILER_RT_HAS_LIBRT rt DD_LINKLIBS)
1617
append_list_if(COMPILER_RT_HAS_LIBPTHREAD pthread DD_LINKLIBS)
18+
append_list_if(COMPILER_RT_HAS_LIBSTDCXX stdc++ DD_LINKLIBS)
1719

1820
add_custom_target(dd)
1921
# Deadlock detector is currently supported on 64-bit Linux only.
@@ -40,6 +42,7 @@ if(CAN_TARGET_x86_64 AND UNIX AND NOT APPLE AND NOT ANDROID)
4042
$<TARGET_OBJECTS:RTInterception.${arch}>
4143
$<TARGET_OBJECTS:RTSanitizerCommon.${arch}>
4244
$<TARGET_OBJECTS:RTSanitizerCommonLibc.${arch}>
45+
LINK_FLAGS ${SANITIZER_COMMON_LINK_FLAGS}
4346
LINK_LIBS ${DD_LINKLIBS}
4447
PARENT_TARGET dd)
4548
endif()

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

+5
Original file line numberDiff line numberDiff line change
@@ -34,10 +34,13 @@ set(UBSAN_CXXFLAGS ${SANITIZER_COMMON_CFLAGS})
3434
append_rtti_flag(ON UBSAN_CXXFLAGS)
3535
append_list_if(SANITIZER_CAN_USE_CXXABI -DUBSAN_CAN_USE_CXXABI UBSAN_CXXFLAGS)
3636

37+
set(UBSAN_DYNAMIC_LIBS ${SANITIZER_COMMON_LINK_LIBS})
38+
3739
append_list_if(COMPILER_RT_HAS_LIBDL dl UBSAN_DYNAMIC_LIBS)
3840
append_list_if(COMPILER_RT_HAS_LIBLOG log UBSAN_DYNAMIC_LIBS)
3941
append_list_if(COMPILER_RT_HAS_LIBRT rt UBSAN_DYNAMIC_LIBS)
4042
append_list_if(COMPILER_RT_HAS_LIBPTHREAD pthread UBSAN_DYNAMIC_LIBS)
43+
append_list_if(COMPILER_RT_HAS_LIBSTDCXX stdc++ UBSAN_DYNAMIC_LIBS)
4144

4245
add_compiler_rt_component(ubsan)
4346

@@ -156,6 +159,7 @@ else()
156159
RTSanitizerCommonLibc
157160
RTUbsan
158161
CFLAGS ${UBSAN_CFLAGS}
162+
LINK_FLAGS ${SANITIZER_COMMON_LINK_FLAGS}
159163
LINK_LIBS ${UBSAN_DYNAMIC_LIBS}
160164
PARENT_TARGET ubsan)
161165

@@ -167,6 +171,7 @@ else()
167171
RTUbsan
168172
RTUbsan_cxx
169173
CFLAGS ${UBSAN_CXXFLAGS}
174+
LINK_FLAGS ${SANITIZER_COMMON_LINK_FLAGS}
170175
LINK_LIBS ${UBSAN_DYNAMIC_LIBS}
171176
PARENT_TARGET ubsan)
172177

0 commit comments

Comments
 (0)
Please sign in to comment.