CMakeLists.txt 34 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786
  1. # CMake build for CompilerRT.
  2. #
  3. # An important constraint of the build is that it only produces libraries
  4. # based on the ability of the host toolchain to target various platforms.
  5. cmake_minimum_required(VERSION 3.13.4)
  6. # Check if compiler-rt is built as a standalone project.
  7. if (CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR OR COMPILER_RT_STANDALONE_BUILD)
  8. project(CompilerRT C CXX ASM)
  9. set(COMPILER_RT_STANDALONE_BUILD TRUE)
  10. set_property(GLOBAL PROPERTY USE_FOLDERS ON)
  11. if ("${CMAKE_VERSION}" VERSION_LESS "3.20.0")
  12. message(WARNING
  13. "Your CMake version is ${CMAKE_VERSION}. Starting with LLVM 17.0.0, the "
  14. "minimum version of CMake required to build LLVM will become 3.20.0, and "
  15. "using an older CMake will become an error. Please upgrade your CMake to "
  16. "at least 3.20.0 now to avoid issues in the future!")
  17. endif()
  18. endif()
  19. set(LLVM_COMMON_CMAKE_UTILS "${CMAKE_CURRENT_SOURCE_DIR}/../cmake")
  20. # Add path for custom compiler-rt modules.
  21. list(INSERT CMAKE_MODULE_PATH 0
  22. "${CMAKE_CURRENT_SOURCE_DIR}/cmake"
  23. "${CMAKE_CURRENT_SOURCE_DIR}/cmake/Modules"
  24. "${LLVM_COMMON_CMAKE_UTILS}"
  25. "${LLVM_COMMON_CMAKE_UTILS}/Modules"
  26. )
  27. if(CMAKE_CONFIGURATION_TYPES)
  28. set(CMAKE_CFG_RESOLVED_INTDIR "${CMAKE_CFG_INTDIR}/")
  29. else()
  30. set(CMAKE_CFG_RESOLVED_INTDIR "")
  31. endif()
  32. include(SetPlatformToolchainTools)
  33. include(base-config-ix)
  34. include(CompilerRTUtils)
  35. include(CMakeDependentOption)
  36. option(COMPILER_RT_BUILD_BUILTINS "Build builtins" ON)
  37. mark_as_advanced(COMPILER_RT_BUILD_BUILTINS)
  38. option(COMPILER_RT_DISABLE_AARCH64_FMV "Disable AArch64 Function Multi Versioning support" OFF)
  39. mark_as_advanced(COMPILER_RT_DISABLE_AARCH64_FMV)
  40. option(COMPILER_RT_BUILD_CRT "Build crtbegin.o/crtend.o" ON)
  41. mark_as_advanced(COMPILER_RT_BUILD_CRT)
  42. option(COMPILER_RT_CRT_USE_EH_FRAME_REGISTRY "Use eh_frame in crtbegin.o/crtend.o" ON)
  43. mark_as_advanced(COMPILER_RT_CRT_USE_EH_FRAME_REGISTRY)
  44. option(COMPILER_RT_BUILD_SANITIZERS "Build sanitizers" ON)
  45. mark_as_advanced(COMPILER_RT_BUILD_SANITIZERS)
  46. option(COMPILER_RT_BUILD_XRAY "Build xray" ON)
  47. mark_as_advanced(COMPILER_RT_BUILD_XRAY)
  48. option(COMPILER_RT_BUILD_LIBFUZZER "Build libFuzzer" ON)
  49. mark_as_advanced(COMPILER_RT_BUILD_LIBFUZZER)
  50. option(COMPILER_RT_BUILD_PROFILE "Build profile runtime" ON)
  51. mark_as_advanced(COMPILER_RT_BUILD_PROFILE)
  52. option(COMPILER_RT_BUILD_MEMPROF "Build memory profiling runtime" ON)
  53. mark_as_advanced(COMPILER_RT_BUILD_MEMPROF)
  54. option(COMPILER_RT_BUILD_XRAY_NO_PREINIT "Build xray with no preinit patching" OFF)
  55. mark_as_advanced(COMPILER_RT_BUILD_XRAY_NO_PREINIT)
  56. option(COMPILER_RT_BUILD_ORC "Build ORC runtime" ON)
  57. mark_as_advanced(COMPILER_RT_BUILD_ORC)
  58. option(COMPILER_RT_BUILD_GWP_ASAN "Build GWP-ASan, and link it into SCUDO" ON)
  59. mark_as_advanced(COMPILER_RT_BUILD_GWP_ASAN)
  60. option(COMPILER_RT_ENABLE_CET "Build Compiler RT with CET enabled" OFF)
  61. option(COMPILER_RT_SCUDO_STANDALONE_SYSROOT_PATH "Set custom sysroot for building SCUDO standalone" OFF)
  62. mark_as_advanced(COMPILER_RT_SCUDO_STANDALONE_SYSROOT_PATH)
  63. option(COMPILER_RT_SCUDO_STANDALONE_BUILD_SHARED "Build SCUDO standalone for shared libraries" ON)
  64. mark_as_advanced(COMPILER_RT_SCUDO_STANDALONE_BUILD_SHARED)
  65. option(COMPILER_RT_BUILD_SCUDO_STANDALONE_WITH_LLVM_LIBC "Build SCUDO standalone with LLVM's libc headers" OFF)
  66. mark_as_advanced(COMPILER_RT_BUILD_SCUDO_STANDALONE_WITH_LLVM_LIBC)
  67. if(FUCHSIA)
  68. set(COMPILER_RT_HWASAN_WITH_INTERCEPTORS_DEFAULT OFF)
  69. else()
  70. set(COMPILER_RT_HWASAN_WITH_INTERCEPTORS_DEFAULT ON)
  71. endif()
  72. set(COMPILER_RT_HWASAN_WITH_INTERCEPTORS ${COMPILER_RT_HWASAN_WITH_INTERCEPTORS_DEFAULT} CACHE BOOL "Enable libc interceptors in HWASan (testing mode)")
  73. set(COMPILER_RT_BAREMETAL_BUILD OFF CACHE BOOL
  74. "Build for a bare-metal target.")
  75. if (COMPILER_RT_STANDALONE_BUILD)
  76. set(CMAKE_CXX_STANDARD 17 CACHE STRING "C++ standard to conform to")
  77. set(CMAKE_CXX_STANDARD_REQUIRED YES)
  78. set(CMAKE_CXX_EXTENSIONS NO)
  79. if (NOT LLVM_RUNTIMES_BUILD)
  80. load_llvm_config()
  81. endif()
  82. if (TARGET intrinsics_gen)
  83. # Loading the llvm config causes this target to be imported so place it
  84. # under the appropriate folder in an IDE.
  85. set_target_properties(intrinsics_gen PROPERTIES FOLDER "Compiler-RT Misc")
  86. endif()
  87. find_package(Python3 COMPONENTS Interpreter)
  88. if(NOT Python3_Interpreter_FOUND)
  89. message(WARNING "Python3 not found, using python2 as a fallback")
  90. find_package(Python2 COMPONENTS Interpreter REQUIRED)
  91. if(Python2_VERSION VERSION_LESS 2.7)
  92. message(SEND_ERROR "Python 2.7 or newer is required")
  93. endif()
  94. # Treat python2 as python3
  95. add_executable(Python3::Interpreter IMPORTED)
  96. set_target_properties(Python3::Interpreter PROPERTIES
  97. IMPORTED_LOCATION ${Python2_EXECUTABLE})
  98. set(Python3_EXECUTABLE ${Python2_EXECUTABLE})
  99. endif()
  100. # Ensure that fat libraries are built correctly on Darwin
  101. if(APPLE)
  102. include(UseLibtool)
  103. endif()
  104. # Define default arguments to lit.
  105. set(LIT_ARGS_DEFAULT "-sv")
  106. if (MSVC OR XCODE)
  107. set(LIT_ARGS_DEFAULT "${LIT_ARGS_DEFAULT} --no-progress-bar")
  108. endif()
  109. set(LLVM_LIT_ARGS "${LIT_ARGS_DEFAULT}" CACHE STRING "Default options for lit")
  110. set(LLVM_LIT_OUTPUT_DIR "${COMPILER_RT_EXEC_OUTPUT_DIR}")
  111. endif()
  112. construct_compiler_rt_default_triple()
  113. if ("${COMPILER_RT_DEFAULT_TARGET_TRIPLE}" MATCHES ".*hf$")
  114. if (${COMPILER_RT_DEFAULT_TARGET_ARCH} MATCHES "^arm")
  115. set(COMPILER_RT_DEFAULT_TARGET_ARCH "armhf")
  116. CHECK_SYMBOL_EXISTS (__thumb__ "" COMPILER_RT_ARM_THUMB)
  117. endif()
  118. endif()
  119. if (${COMPILER_RT_DEFAULT_TARGET_ARCH} MATCHES "^mips")
  120. CHECK_SYMBOL_EXISTS (_MIPS_ARCH_MIPS32R6 "" COMPILER_RT_MIPS32R6)
  121. CHECK_SYMBOL_EXISTS (_MIPS_ARCH_MIPS64R6 "" COMPILER_RT_MIPS64R6)
  122. CHECK_SYMBOL_EXISTS (__mips64 "" COMPILER_RT_MIPS_64)
  123. CHECK_SYMBOL_EXISTS (__MIPSEL__ "" COMPILER_RT_MIPS_EL)
  124. if ("${COMPILER_RT_MIPS_64}")
  125. set(COMPILER_RT_DEFAULT_TARGET_ARCH "mips64")
  126. else()
  127. set(COMPILER_RT_DEFAULT_TARGET_ARCH "mips")
  128. endif()
  129. if ("${COMPILER_RT_MIPS_EL}")
  130. set(COMPILER_RT_DEFAULT_TARGET_ARCH "${COMPILER_RT_DEFAULT_TARGET_ARCH}el")
  131. endif()
  132. endif()
  133. if ("${COMPILER_RT_DEFAULT_TARGET_TRIPLE}" MATCHES ".*android.*")
  134. set(ANDROID 1)
  135. string(REGEX MATCH "-target(=| +)[^ ]+android[a-z]*([0-9]+)" ANDROID_API_LEVEL "${CMAKE_C_FLAGS}")
  136. set(ANDROID_API_LEVEL ${CMAKE_MATCH_2})
  137. endif()
  138. pythonize_bool(ANDROID)
  139. set(COMPILER_RT_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR})
  140. set(COMPILER_RT_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR})
  141. pythonize_bool(LLVM_ENABLE_PER_TARGET_RUNTIME_DIR)
  142. # We support running instrumented tests when we're not cross-compiling
  143. # and target a UNIX-like system or Windows.
  144. # We can run tests on Android even when we are cross-compiling.
  145. if(("${CMAKE_HOST_SYSTEM_NAME}" STREQUAL "${CMAKE_SYSTEM_NAME}" AND (UNIX OR WIN32))
  146. OR ANDROID OR COMPILER_RT_EMULATOR)
  147. option(COMPILER_RT_CAN_EXECUTE_TESTS "Can we execute instrumented tests" ON)
  148. else()
  149. option(COMPILER_RT_CAN_EXECUTE_TESTS "Can we execute instrumented tests" OFF)
  150. endif()
  151. option(COMPILER_RT_DEBUG "Build runtimes with full debug info" OFF)
  152. option(COMPILER_RT_EXTERNALIZE_DEBUGINFO
  153. "Generate dSYM files and strip executables and libraries (Darwin Only)" OFF)
  154. # COMPILER_RT_DEBUG_PYBOOL is used by lit.common.configured.in.
  155. pythonize_bool(COMPILER_RT_DEBUG)
  156. option(COMPILER_RT_INTERCEPT_LIBDISPATCH
  157. "Support interception of libdispatch (GCD). Requires '-fblocks'" OFF)
  158. option(COMPILER_RT_LIBDISPATCH_INSTALL_PATH
  159. "Specify if libdispatch is installed in a custom location" "")
  160. if (COMPILER_RT_INTERCEPT_LIBDISPATCH AND NOT APPLE)
  161. set(COMPILER_RT_LIBDISPATCH_CFLAGS -fblocks)
  162. set(COMPILER_RT_TEST_LIBDISPATCH_CFLAGS)
  163. if (COMPILER_RT_LIBDISPATCH_INSTALL_PATH)
  164. list(APPEND COMPILER_RT_TEST_LIBDISPATCH_CFLAGS
  165. -I${COMPILER_RT_LIBDISPATCH_INSTALL_PATH}/include
  166. -L${COMPILER_RT_LIBDISPATCH_INSTALL_PATH}/lib
  167. -Wl,-rpath=${COMPILER_RT_LIBDISPATCH_INSTALL_PATH}/lib)
  168. endif()
  169. list(APPEND COMPILER_RT_TEST_LIBDISPATCH_CFLAGS -lBlocksRuntime -ldispatch)
  170. endif()
  171. if (APPLE) # Always enable on Apple platforms.
  172. set(COMPILER_RT_INTERCEPT_LIBDISPATCH ON)
  173. endif()
  174. pythonize_bool(COMPILER_RT_INTERCEPT_LIBDISPATCH)
  175. if(APPLE AND SANITIZER_MIN_OSX_VERSION AND SANITIZER_MIN_OSX_VERSION VERSION_LESS "10.9")
  176. # Mac OS X prior to 10.9 had problems with exporting symbols from
  177. # libc++/libc++abi.
  178. set(cxxabi_supported OFF)
  179. else()
  180. set(cxxabi_supported ON)
  181. endif()
  182. option(SANITIZER_ALLOW_CXXABI "Allow use of C++ ABI details in ubsan" ON)
  183. set(SANITIZER_CAN_USE_CXXABI OFF)
  184. if (cxxabi_supported AND SANITIZER_ALLOW_CXXABI)
  185. set(SANITIZER_CAN_USE_CXXABI ON)
  186. endif()
  187. pythonize_bool(SANITIZER_CAN_USE_CXXABI)
  188. macro(handle_default_cxx_lib var)
  189. # Specifying -stdlib= in CMAKE_CXX_FLAGS overrides the defaults.
  190. if (CMAKE_CXX_FLAGS MATCHES "-stdlib=([a-zA-Z+]*)")
  191. set(${var}_LIBNAME "${CMAKE_MATCH_1}")
  192. set(${var}_SYSTEM 1)
  193. elseif (${var} STREQUAL "default")
  194. if (APPLE OR CMAKE_SYSTEM_NAME MATCHES "FreeBSD")
  195. set(${var}_LIBNAME "libc++")
  196. set(${var}_SYSTEM 1)
  197. elseif (FUCHSIA)
  198. set(${var}_LIBNAME "libc++")
  199. set(${var}_INTREE 1)
  200. else()
  201. set(${var}_LIBNAME "libstdc++")
  202. set(${var}_SYSTEM 1)
  203. endif()
  204. else()
  205. set(${var}_LIBNAME "${${var}}")
  206. set(${var}_SYSTEM 1)
  207. endif()
  208. endmacro()
  209. # This is either directly the C++ ABI library or the full C++ library
  210. # which pulls in the ABI transitively.
  211. # TODO: Mark this as internal flag, most users should use COMPILER_RT_CXX_LIBRARY.
  212. set(SANITIZER_CXX_ABI "default" CACHE STRING
  213. "Specify C++ ABI library to use.")
  214. set(CXXABIS none default libstdc++ libc++ libcxxabi)
  215. set_property(CACHE SANITIZER_CXX_ABI PROPERTY STRINGS ;${CXXABIS})
  216. handle_default_cxx_lib(SANITIZER_CXX_ABI)
  217. # This needs to be a full C++ library for linking gtest and unit tests.
  218. # TODO: Mark this as internal flag, most users should use COMPILER_RT_CXX_LIBRARY.
  219. set(SANITIZER_TEST_CXX "default" CACHE STRING
  220. "Specify C++ library to use for tests.")
  221. set(CXXLIBS none default libstdc++ libc++)
  222. set_property(CACHE SANITIZER_TEST_CXX PROPERTY STRINGS ;${CXXLIBS})
  223. handle_default_cxx_lib(SANITIZER_TEST_CXX)
  224. option(COMPILER_RT_USE_LLVM_UNWINDER "Use the LLVM unwinder." OFF)
  225. cmake_dependent_option(COMPILER_RT_ENABLE_STATIC_UNWINDER
  226. "Statically link the LLVM unwinder." OFF
  227. "COMPILER_RT_USE_LLVM_UNWINDER" OFF)
  228. set(DEFAULT_SANITIZER_USE_STATIC_LLVM_UNWINDER OFF)
  229. if (FUCHSIA)
  230. set(DEFAULT_SANITIZER_USE_STATIC_LLVM_UNWINDER ON)
  231. elseif (DEFINED LIBUNWIND_ENABLE_SHARED AND NOT LIBUNWIND_ENABLE_SHARED)
  232. set(DEFAULT_SANITIZER_USE_STATIC_LLVM_UNWINDER ON)
  233. endif()
  234. option(SANITIZER_USE_STATIC_LLVM_UNWINDER
  235. "Use static LLVM unwinder." ${DEFAULT_SANITIZER_USE_STATIC_LLVM_UNWINDER})
  236. pythonize_bool(SANITIZER_USE_STATIC_LLVM_UNWINDER)
  237. set(DEFAULT_SANITIZER_USE_STATIC_CXX_ABI OFF)
  238. if (DEFINED LIBCXXABI_ENABLE_SHARED AND NOT LIBCXXABI_ENABLE_SHARED)
  239. set(DEFAULT_SANITIZER_USE_STATIC_CXX_ABI ON)
  240. endif()
  241. option(SANITIZER_USE_STATIC_CXX_ABI
  242. "Use static libc++abi." ${DEFAULT_SANITIZER_USE_STATIC_CXX_ABI})
  243. pythonize_bool(SANITIZER_USE_STATIC_CXX_ABI)
  244. set(DEFAULT_SANITIZER_USE_STATIC_TEST_CXX OFF)
  245. if (DEFINED LIBCXX_ENABLE_SHARED AND NOT LIBCXX_ENABLE_SHARED)
  246. set(DEFAULT_SANITIZER_USE_STATIC_TEST_CXX ON)
  247. endif()
  248. option(SANITIZER_USE_STATIC_TEST_CXX
  249. "Use static libc++ for tests." ${DEFAULT_SANITIZER_USE_STATIC_TEST_CXX})
  250. pythonize_bool(SANITIZER_USE_STATIC_TEST_CXX)
  251. set(COMPILER_RT_SUPPORTED_CXX_LIBRARIES none default libcxx)
  252. set(COMPILER_RT_CXX_LIBRARY "default" CACHE STRING "Specify C++ library to use. Supported values are ${COMPILER_RT_SUPPORTED_CXX_LIBRARIES}.")
  253. if (NOT "${COMPILER_RT_CXX_LIBRARY}" IN_LIST COMPILER_RT_SUPPORTED_CXX_LIBRARIES)
  254. message(FATAL_ERROR "Unsupported C++ library: '${COMPILER_RT_CXX_LIBRARY}'. Supported values are ${COMPILER_RT_SUPPORTED_CXX_LIBRARIES}.")
  255. endif()
  256. cmake_dependent_option(COMPILER_RT_STATIC_CXX_LIBRARY
  257. "Statically link the C++ library." OFF
  258. "COMPILER_RT_CXX_LIBRARY" OFF)
  259. set(DEFAULT_COMPILER_RT_USE_BUILTINS_LIBRARY OFF)
  260. if (FUCHSIA)
  261. set(DEFAULT_COMPILER_RT_USE_BUILTINS_LIBRARY ON)
  262. endif()
  263. option(COMPILER_RT_USE_BUILTINS_LIBRARY
  264. "Use compiler-rt builtins instead of libgcc" ${DEFAULT_COMPILER_RT_USE_BUILTINS_LIBRARY})
  265. include(config-ix)
  266. #================================
  267. # Setup Compiler Flags
  268. #================================
  269. # fcf-protection is a gcc/clang option for CET support on Linux platforms.
  270. # We need to handle MSVC CET option on Windows platforms.
  271. if (NOT MSVC)
  272. if (COMPILER_RT_ENABLE_CET AND NOT COMPILER_RT_HAS_FCF_PROTECTION_FLAG)
  273. message(FATAL_ERROR "Compiler used to build compiler-rt doesn't support CET!")
  274. endif()
  275. endif()
  276. if(MSVC)
  277. # Override any existing /W flags with /W4. This is what LLVM does. Failing to
  278. # remove other /W[0-4] flags will result in a warning about overriding a
  279. # previous flag.
  280. if (COMPILER_RT_HAS_W4_FLAG)
  281. string(REGEX REPLACE " /W[0-4]" "" CMAKE_C_FLAGS "${CMAKE_C_FLAGS}")
  282. string(REGEX REPLACE " /W[0-4]" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
  283. append_string_if(COMPILER_RT_HAS_W4_FLAG /W4 CMAKE_C_FLAGS CMAKE_CXX_FLAGS)
  284. endif()
  285. else()
  286. append_string_if(COMPILER_RT_HAS_WALL_FLAG -Wall CMAKE_C_FLAGS CMAKE_CXX_FLAGS)
  287. endif()
  288. if(COMPILER_RT_ENABLE_WERROR)
  289. append_string_if(COMPILER_RT_HAS_WERROR_FLAG -Werror CMAKE_C_FLAGS CMAKE_CXX_FLAGS)
  290. append_string_if(COMPILER_RT_HAS_WX_FLAG /WX CMAKE_C_FLAGS CMAKE_CXX_FLAGS)
  291. endif()
  292. # Emulate C99 and C++11's __func__ for MSVC prior to 2013 CTP.
  293. if(NOT COMPILER_RT_HAS_FUNC_SYMBOL)
  294. add_definitions(-D__func__=__FUNCTION__)
  295. endif()
  296. # Provide some common commandline flags for Sanitizer runtimes.
  297. if("${ANDROID_API_LEVEL}" GREATER_EQUAL 29)
  298. list(APPEND SANITIZER_COMMON_CFLAGS -fno-emulated-tls)
  299. string(APPEND COMPILER_RT_TEST_COMPILER_CFLAGS " -fno-emulated-tls")
  300. endif()
  301. if(NOT WIN32)
  302. append_list_if(COMPILER_RT_HAS_FPIC_FLAG -fPIC SANITIZER_COMMON_CFLAGS)
  303. endif()
  304. append_list_if(COMPILER_RT_HAS_FNO_BUILTIN_FLAG -fno-builtin SANITIZER_COMMON_CFLAGS)
  305. append_list_if(COMPILER_RT_HAS_FNO_EXCEPTIONS_FLAG -fno-exceptions SANITIZER_COMMON_CFLAGS)
  306. if(NOT COMPILER_RT_DEBUG AND NOT APPLE)
  307. append_list_if(COMPILER_RT_HAS_FOMIT_FRAME_POINTER_FLAG -fomit-frame-pointer SANITIZER_COMMON_CFLAGS)
  308. endif()
  309. append_list_if(COMPILER_RT_HAS_FUNWIND_TABLES_FLAG -funwind-tables SANITIZER_COMMON_CFLAGS)
  310. append_list_if(COMPILER_RT_HAS_FNO_STACK_PROTECTOR_FLAG -fno-stack-protector SANITIZER_COMMON_CFLAGS)
  311. append_list_if(COMPILER_RT_HAS_FNO_SANITIZE_SAFE_STACK_FLAG -fno-sanitize=safe-stack SANITIZER_COMMON_CFLAGS)
  312. append_list_if(COMPILER_RT_HAS_FVISIBILITY_HIDDEN_FLAG -fvisibility=hidden SANITIZER_COMMON_CFLAGS)
  313. if(NOT COMPILER_RT_HAS_FVISIBILITY_HIDDEN_FLAG)
  314. append_list_if(COMPILER_RT_HAS_FVISIBILITY_INLINES_HIDDEN_FLAG -fvisibility-inlines-hidden SANITIZER_COMMON_CFLAGS)
  315. endif()
  316. append_list_if(COMPILER_RT_HAS_FNO_LTO_FLAG -fno-lto SANITIZER_COMMON_CFLAGS)
  317. # By default do not instrument or use profdata for compiler-rt.
  318. if(NOT COMPILER_RT_ENABLE_PGO)
  319. if(LLVM_PROFDATA_FILE AND COMPILER_RT_HAS_FNO_PROFILE_INSTR_USE_FLAG)
  320. list(APPEND SANITIZER_COMMON_CFLAGS "-fno-profile-instr-use")
  321. endif()
  322. if(LLVM_BUILD_INSTRUMENTED MATCHES IR AND COMPILER_RT_HAS_FNO_PROFILE_GENERATE_FLAG)
  323. list(APPEND SANITIZER_COMMON_CFLAGS "-fno-profile-generate")
  324. elseif((LLVM_BUILD_INSTRUMENTED OR LLVM_BUILD_INSTRUMENTED_COVERAGE) AND COMPILER_RT_HAS_FNO_PROFILE_INSTR_GENERATE_FLAG)
  325. list(APPEND SANITIZER_COMMON_CFLAGS "-fno-profile-instr-generate")
  326. if(LLVM_BUILD_INSTRUMENTED_COVERAGE AND COMPILER_RT_HAS_FNO_COVERAGE_MAPPING_FLAG)
  327. list(APPEND SANITIZER_COMMON_CFLAGS "-fno-coverage-mapping")
  328. endif()
  329. endif()
  330. endif()
  331. # The following is a workaround for powerpc64le. This is the only architecture
  332. # that requires -fno-function-sections to work properly. If lacking, the ASan
  333. # Linux test function-sections-are-bad.cpp fails with the following error:
  334. # 'undefined symbol: __sanitizer_unaligned_load32'.
  335. if(DEFINED TARGET_powerpc64le_CFLAGS)
  336. if(CMAKE_CXX_COMPILER_ID MATCHES "XL")
  337. append("-qnofuncsect" TARGET_powerpc64le_CFLAGS)
  338. else()
  339. append_list_if(COMPILER_RT_HAS_FNO_FUNCTION_SECTIONS_FLAG -fno-function-sections TARGET_powerpc64le_CFLAGS)
  340. endif()
  341. endif()
  342. # The following is a workaround for s390x. This avoids creation of "partial
  343. # inline" function fragments when building the asan libraries with certain
  344. # GCC versions. The presence of those fragments, in particular for the
  345. # interceptors, changes backtraces seen in asan error cases, which causes
  346. # testsuite failures.
  347. if("${COMPILER_RT_DEFAULT_TARGET_ARCH}" MATCHES "s390x")
  348. append_list_if(COMPILER_RT_HAS_FNO_PARTIAL_INLINING_FLAG -fno-partial-inlining SANITIZER_COMMON_CFLAGS)
  349. endif()
  350. if(MSVC)
  351. # Replace the /M[DT][d] flags with /MT, and strip any definitions of _DEBUG,
  352. # which cause definition mismatches at link time.
  353. # FIXME: In fact, sanitizers should support both /MT and /MD, see PR20214.
  354. if(COMPILER_RT_HAS_MT_FLAG)
  355. foreach(flag_var
  356. CMAKE_C_FLAGS CMAKE_C_FLAGS_DEBUG CMAKE_C_FLAGS_RELEASE
  357. CMAKE_C_FLAGS_MINSIZEREL CMAKE_C_FLAGS_RELWITHDEBINFO
  358. CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_RELEASE
  359. CMAKE_CXX_FLAGS_MINSIZEREL CMAKE_CXX_FLAGS_RELWITHDEBINFO)
  360. string(REGEX REPLACE "/M[DT]d" "/MT" ${flag_var} "${${flag_var}}")
  361. string(REGEX REPLACE "/MD" "/MT" ${flag_var} "${${flag_var}}")
  362. string(REGEX REPLACE "/D_DEBUG" "" ${flag_var} "${${flag_var}}")
  363. endforeach()
  364. endif()
  365. append_list_if(COMPILER_RT_HAS_Oy_FLAG /Oy- SANITIZER_COMMON_CFLAGS)
  366. append_list_if(COMPILER_RT_HAS_GS_FLAG /GS- SANITIZER_COMMON_CFLAGS)
  367. # Disable thread safe initialization for static locals. ASan shouldn't need
  368. # it. Thread safe initialization assumes that the CRT has already been
  369. # initialized, but ASan initializes before the CRT.
  370. list(APPEND SANITIZER_COMMON_CFLAGS /Zc:threadSafeInit-)
  371. endif()
  372. append_list_if(COMPILER_RT_DEBUG -DSANITIZER_DEBUG=1 SANITIZER_COMMON_CFLAGS)
  373. append_list_if(COMPILER_RT_HAS_WTHREAD_SAFETY_FLAG -Wthread-safety THREAD_SAFETY_FLAGS)
  374. append_list_if(COMPILER_RT_HAS_WTHREAD_SAFETY_REFERENCE_FLAG -Wthread-safety-reference THREAD_SAFETY_FLAGS)
  375. append_list_if(COMPILER_RT_HAS_WTHREAD_SAFETY_BETA_FLAG -Wthread-safety-beta THREAD_SAFETY_FLAGS)
  376. list(APPEND SANITIZER_COMMON_CFLAGS ${THREAD_SAFETY_FLAGS})
  377. string(REPLACE ";" " " thread_safety_flags_space_sep "${THREAD_SAFETY_FLAGS}")
  378. string(APPEND COMPILER_RT_TEST_COMPILER_CFLAGS " ${thread_safety_flags_space_sep}")
  379. # If we're using MSVC,
  380. # always respect the optimization flags set by CMAKE_BUILD_TYPE instead.
  381. if (NOT MSVC)
  382. # Build with optimization, unless we're in debug mode.
  383. if(COMPILER_RT_DEBUG)
  384. list(APPEND SANITIZER_COMMON_CFLAGS -O1)
  385. else()
  386. list(APPEND SANITIZER_COMMON_CFLAGS -O3)
  387. endif()
  388. endif()
  389. # Determine if we should restrict stack frame sizes.
  390. # Stack frames on PowerPC, Mips, SystemZ and in debug build can be much larger than
  391. # anticipated.
  392. # FIXME: Fix all sanitizers and add -Wframe-larger-than to
  393. # SANITIZER_COMMON_FLAGS
  394. if(COMPILER_RT_HAS_WFRAME_LARGER_THAN_FLAG AND NOT COMPILER_RT_DEBUG
  395. AND NOT ${COMPILER_RT_DEFAULT_TARGET_ARCH} MATCHES "powerpc|mips|s390x")
  396. set(SANITIZER_LIMIT_FRAME_SIZE TRUE)
  397. else()
  398. set(SANITIZER_LIMIT_FRAME_SIZE FALSE)
  399. endif()
  400. if(FUCHSIA OR UNIX)
  401. set(SANITIZER_USE_SYMBOLS TRUE)
  402. else()
  403. set(SANITIZER_USE_SYMBOLS FALSE)
  404. endif()
  405. # Build sanitizer runtimes with debug info.
  406. if(MSVC)
  407. # Use /Z7 instead of /Zi for the asan runtime. This avoids the LNK4099
  408. # warning from the MS linker complaining that it can't find the 'vc140.pdb'
  409. # file used by our object library compilations.
  410. list(APPEND SANITIZER_COMMON_CFLAGS /Z7)
  411. foreach(var_to_update
  412. CMAKE_CXX_FLAGS
  413. CMAKE_CXX_FLAGS_DEBUG
  414. CMAKE_CXX_FLAGS_RELWITHDEBINFO)
  415. string(REGEX REPLACE "(^| )/Z[i7I]($| )" " /Z7 "
  416. "${var_to_update}" "${${var_to_update}}")
  417. endforeach()
  418. elseif(APPLE)
  419. # On Apple platforms use full debug info (i.e. not `-gline-tables-only`)
  420. # for all build types so that the runtime can be debugged.
  421. if(NOT COMPILER_RT_HAS_G_FLAG)
  422. message(FATAL_ERROR "-g is not supported by host compiler")
  423. endif()
  424. list(APPEND SANITIZER_COMMON_CFLAGS -g)
  425. elseif(COMPILER_RT_HAS_GLINE_TABLES_ONLY_FLAG AND NOT COMPILER_RT_DEBUG)
  426. list(APPEND SANITIZER_COMMON_CFLAGS -gline-tables-only)
  427. elseif(COMPILER_RT_HAS_G_FLAG)
  428. list(APPEND SANITIZER_COMMON_CFLAGS -g)
  429. endif()
  430. if(LLVM_ENABLE_MODULES)
  431. # Sanitizers cannot be built with -fmodules. The interceptors intentionally
  432. # don't include system headers, which is incompatible with modules.
  433. list(APPEND SANITIZER_COMMON_CFLAGS -fno-modules)
  434. endif()
  435. # Turn off several warnings.
  436. append_list_if(COMPILER_RT_HAS_WGNU_FLAG -Wno-gnu SANITIZER_COMMON_CFLAGS)
  437. append_list_if(COMPILER_RT_HAS_WVARIADIC_MACROS_FLAG -Wno-variadic-macros SANITIZER_COMMON_CFLAGS)
  438. append_list_if(COMPILER_RT_HAS_WC99_EXTENSIONS_FLAG -Wno-c99-extensions SANITIZER_COMMON_CFLAGS)
  439. # format-pedantic warns about passing T* for %p, which is not useful.
  440. append_list_if(COMPILER_RT_HAS_WD4146_FLAG /wd4146 SANITIZER_COMMON_CFLAGS)
  441. append_list_if(COMPILER_RT_HAS_WD4291_FLAG /wd4291 SANITIZER_COMMON_CFLAGS)
  442. append_list_if(COMPILER_RT_HAS_WD4391_FLAG /wd4391 SANITIZER_COMMON_CFLAGS)
  443. append_list_if(COMPILER_RT_HAS_WD4722_FLAG /wd4722 SANITIZER_COMMON_CFLAGS)
  444. append_list_if(COMPILER_RT_HAS_WD4800_FLAG /wd4800 SANITIZER_COMMON_CFLAGS)
  445. append_list_if(MINGW -fms-extensions SANITIZER_COMMON_CFLAGS)
  446. # When lsan scans the stack for detecting reachable pointers, it's possible for
  447. # a leaked pointer, which was pushed to the stack on an earlier function call,
  448. # to still exist on the stack when doing a leak check if that part of the stack
  449. # was not overwritten. In particular, if there's any uninitialized data in the
  450. # lsan runtime, and the SP we start from is sufficiently deep into the runtime,
  451. # then a leaked pointer could be marked as reachable. Such instances could be
  452. # mitigated by clobbering any uninitialized data. Note that this won't cover
  453. # all possible uninitialized stack contents, such as those used for register
  454. # spill slots, unused portions for alignment, or even local variables not
  455. # yet in scope at a certain point in the function.
  456. #
  457. # Note that this type of issue was discovered with lsan, but can apply to other
  458. # sanitizers.
  459. append_list_if(COMPILER_RT_HAS_TRIVIAL_AUTO_INIT -ftrivial-auto-var-init=pattern SANITIZER_COMMON_CFLAGS)
  460. # Set common link flags.
  461. # TODO: We should consider using the same model as libc++, that is use either
  462. # -nostdlib++ and --unwindlib=none if supported, or -nodefaultlibs otherwise.
  463. append_list_if(C_SUPPORTS_NODEFAULTLIBS_FLAG -nodefaultlibs SANITIZER_COMMON_LINK_FLAGS)
  464. append_list_if(COMPILER_RT_HAS_Z_TEXT -Wl,-z,text SANITIZER_COMMON_LINK_FLAGS)
  465. # Only necessary for 32-bit SPARC. Solaris 11.2+ ld uses -z ignore/-z record
  466. # natively, but supports --as-needed/--no-as-needed for GNU ld compatibility.
  467. if("${COMPILER_RT_DEFAULT_TARGET_ARCH}" MATCHES "sparc")
  468. list(APPEND SANITIZER_COMMON_LINK_LIBS -Wl,--as-needed atomic -Wl,--no-as-needed)
  469. endif()
  470. if (COMPILER_RT_USE_BUILTINS_LIBRARY)
  471. string(REPLACE "-Wl,-z,defs" "" CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS}")
  472. else()
  473. if (ANDROID)
  474. append_list_if(COMPILER_RT_HAS_GCC_LIB gcc SANITIZER_COMMON_LINK_LIBS)
  475. else()
  476. append_list_if(COMPILER_RT_HAS_GCC_S_LIB gcc_s SANITIZER_COMMON_LINK_LIBS)
  477. endif()
  478. endif()
  479. append_list_if(COMPILER_RT_HAS_LIBC c SANITIZER_COMMON_LINK_LIBS)
  480. if("${CMAKE_SYSTEM_NAME}" STREQUAL "Fuchsia")
  481. list(APPEND SANITIZER_COMMON_LINK_LIBS zircon)
  482. endif()
  483. if("${CMAKE_SYSTEM_NAME}" STREQUAL "Fuchsia")
  484. set(SANITIZER_NO_UNDEFINED_SYMBOLS_DEFAULT ON)
  485. else()
  486. set(SANITIZER_NO_UNDEFINED_SYMBOLS_DEFAULT OFF)
  487. endif()
  488. option(SANITIZER_NO_UNDEFINED_SYMBOLS "Report error on unresolved symbol references" ${SANITIZER_NO_UNDEFINED_SYMBOLS_DEFAULT})
  489. if (SANITIZER_NO_UNDEFINED_SYMBOLS)
  490. list(APPEND SANITIZER_COMMON_LINK_FLAGS -Wl,-z,defs)
  491. endif()
  492. # TODO: COMPILER_RT_COMMON_CFLAGS and COMPILER_RT_COMMON_LINK_FLAGS are
  493. # intended for use in non-sanitizer runtimes such as libFuzzer, profile or XRay,
  494. # move these higher to include common flags, then derive SANITIZER_COMMON_CFLAGS
  495. # and SANITIZER_COMMON_LINK_FLAGS from those and append sanitizer-specific flags.
  496. set(COMPILER_RT_COMMON_CFLAGS ${SANITIZER_COMMON_CFLAGS})
  497. set(COMPILER_RT_COMMON_LINK_FLAGS ${SANITIZER_COMMON_LINK_FLAGS})
  498. # We don't use the C++ standard library, so avoid including it by mistake.
  499. append_list_if(COMPILER_RT_HAS_NOSTDINCXX_FLAG -nostdinc++ SANITIZER_COMMON_CFLAGS)
  500. append_list_if(COMPILER_RT_HAS_NOSTDLIBXX_FLAG -nostdlib++ SANITIZER_COMMON_LINK_FLAGS)
  501. # Remove -stdlib= which is unused when passing -nostdinc++...
  502. string(REGEX MATCHALL "-stdlib=[a-zA-Z+]*" stdlib_flag "${CMAKE_CXX_FLAGS}")
  503. string(REGEX REPLACE "-stdlib=[a-zA-Z+]*" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
  504. # ...we need it to build some runtimes and tests so readd it where appropriate.
  505. list(APPEND COMPILER_RT_COMMON_CFLAGS ${stdlib_flag})
  506. list(APPEND COMPILER_RT_COMMON_LINK_FLAGS ${stdlib_flag})
  507. # TODO: There's a lot of duplication across lib/*/tests/CMakeLists.txt files,
  508. # move some of the common flags to COMPILER_RT_UNITTEST_CFLAGS.
  509. # Unittests need access to C++ standard library.
  510. string(APPEND COMPILER_RT_TEST_COMPILER_CFLAGS " ${stdlib_flag}")
  511. # When cross-compiling, COMPILER_RT_TEST_COMPILER_CFLAGS help in compilation
  512. # and linking of unittests.
  513. string(REPLACE " " ";" COMPILER_RT_UNITTEST_CFLAGS "${COMPILER_RT_TEST_COMPILER_CFLAGS}")
  514. set(COMPILER_RT_UNITTEST_LINK_FLAGS ${COMPILER_RT_UNITTEST_CFLAGS})
  515. if(COMPILER_RT_USE_LLVM_UNWINDER)
  516. # We're linking directly against the libunwind that we're building so don't
  517. # try to link in the toolchain's default libunwind which may be missing.
  518. append_list_if(CXX_SUPPORTS_UNWINDLIB_NONE_FLAG --unwindlib=none COMPILER_RT_COMMON_LINK_FLAGS)
  519. append_list_if(CXX_SUPPORTS_UNWINDLIB_NONE_FLAG --unwindlib=none COMPILER_RT_UNITTEST_LINK_FLAGS)
  520. if (COMPILER_RT_ENABLE_STATIC_UNWINDER)
  521. list(APPEND COMPILER_RT_UNWINDER_LINK_LIBS "$<TARGET_LINKER_FILE:unwind_static>")
  522. else()
  523. list(APPEND COMPILER_RT_UNWINDER_LINK_LIBS "$<TARGET_LINKER_FILE:$<IF:$<TARGET_EXISTS:unwind_shared>,unwind_shared,unwind_static>>")
  524. endif()
  525. endif()
  526. if (COMPILER_RT_CXX_LIBRARY STREQUAL "libcxx")
  527. # We are using the in-tree libc++ so avoid including the default one.
  528. append_list_if(COMPILER_RT_HAS_NOSTDINCXX_FLAG -nostdinc++ COMPILER_RT_COMMON_CFLAGS)
  529. append_list_if(COMPILER_RT_HAS_NOSTDLIBXX_FLAG -nostdlib++ COMPILER_RT_COMMON_LINK_FLAGS)
  530. # Use the in-tree libc++ through explicit include and library paths.
  531. set(COMPILER_RT_CXX_CFLAGS "$<$<TARGET_EXISTS:cxx-headers>:$<IF:$<BOOL:${MSVC}>,/imsvc,-isystem>$<JOIN:$<TARGET_PROPERTY:cxx-headers,INTERFACE_INCLUDE_DIRECTORIES>,$<SEMICOLON>$<IF:$<BOOL:${MSVC}>,/imsvc,-isystem>>>")
  532. if (COMPILER_RT_STATIC_CXX_LIBRARY)
  533. set(COMPILER_RT_CXX_LINK_LIBS "$<TARGET_LINKER_FILE:cxx_static>")
  534. else()
  535. set(COMPILER_RT_CXX_LINK_LIBS "$<TARGET_LINKER_FILE:$<IF:$<TARGET_EXISTS:cxx_shared>,cxx_shared,cxx_static>>")
  536. endif()
  537. elseif (COMPILER_RT_CXX_LIBRARY STREQUAL "none")
  538. # We aren't using any C++ standard library so avoid including the default one.
  539. append_list_if(COMPILER_RT_HAS_NOSTDINCXX_FLAG -nostdinc++ COMPILER_RT_COMMON_CFLAGS)
  540. append_list_if(COMPILER_RT_HAS_NOSTDLIBXX_FLAG -nostdlib++ COMPILER_RT_COMMON_LINK_FLAGS)
  541. else()
  542. # Nothing to be done for `default`.
  543. endif()
  544. if (SANITIZER_CXX_ABI_LIBNAME STREQUAL "libc++")
  545. if (SANITIZER_CXX_ABI_INTREE)
  546. # TODO: We don't need to add --unwindlib=none to SANITIZER_COMMON_LINK_FLAGS
  547. # because we added -nodefaultlibs there earlier, and adding would result in
  548. # a warning, but if we switch to -nostdlib++, we would need to add it here.
  549. # append_list_if(CXX_SUPPORTS_UNWINDLIB_NONE_FLAG --unwindlib=none SANITIZER_COMMON_LINK_FLAGS)
  550. if(SANITIZER_USE_STATIC_CXX_ABI)
  551. if(TARGET libcxx-abi-static)
  552. set(SANITIZER_CXX_ABI_LIBRARIES libcxx-abi-static)
  553. endif()
  554. else()
  555. if(TARGET libcxx-abi-shared)
  556. set(SANITIZER_CXX_ABI_LIBRARIES libcxx-abi-shared)
  557. elseif(TARGET libcxx-abi-static)
  558. set(SANITIZER_CXX_ABI_LIBRARIES libcxx-abi-static)
  559. endif()
  560. endif()
  561. else()
  562. append_list_if(COMPILER_RT_HAS_LIBCXX c++ SANITIZER_CXX_ABI_LIBRARIES)
  563. endif()
  564. elseif (SANITIZER_CXX_ABI_LIBNAME STREQUAL "libcxxabi")
  565. list(APPEND SANITIZER_CXX_ABI_LIBRARIES "c++abi")
  566. elseif (SANITIZER_CXX_ABI_LIBNAME STREQUAL "libstdc++")
  567. append_list_if(COMPILER_RT_HAS_LIBSTDCXX stdc++ SANITIZER_CXX_ABI_LIBRARIES)
  568. endif()
  569. if (SANITIZER_TEST_CXX_LIBNAME STREQUAL "libc++")
  570. if (SANITIZER_TEST_CXX_INTREE)
  571. list(APPEND SANITIZER_TEST_CXX_CFLAGS "$<$<TARGET_EXISTS:cxx-headers>:$<IF:$<BOOL:${MSVC}>,/imsvc,-isystem>$<JOIN:$<TARGET_PROPERTY:cxx-headers,INTERFACE_INCLUDE_DIRECTORIES>,$<SEMICOLON>$<IF:$<BOOL:${MSVC}>,/imsvc,-isystem>>>")
  572. if (SANITIZER_USE_STATIC_TEST_CXX)
  573. list(APPEND SANITIZER_TEST_CXX_LIBRARIES "$<TARGET_LINKER_FILE:cxx_static>")
  574. else()
  575. list(APPEND SANITIZER_TEST_CXX_LIBRARIES "$<TARGET_LINKER_FILE:$<IF:$<TARGET_EXISTS:cxx_shared>,cxx_shared,cxx_static>>")
  576. endif()
  577. # We are using the in tree libc++ so avoid including the default one.
  578. append_list_if(COMPILER_RT_HAS_NOSTDINCXX_FLAG -nostdinc++ COMPILER_RT_UNITTEST_CFLAGS)
  579. append_list_if(COMPILER_RT_HAS_NOSTDLIBXX_FLAG -nostdlib++ COMPILER_RT_UNITTEST_LINK_FLAGS)
  580. else()
  581. append_list_if(COMPILER_RT_HAS_LIBCXX -lc++ SANITIZER_TEST_CXX_LIBRARIES)
  582. endif()
  583. elseif (SANITIZER_TEST_CXX_LIBNAME STREQUAL "libstdc++")
  584. append_list_if(COMPILER_RT_HAS_LIBSTDCXX -lstdc++ SANITIZER_TEST_CXX_LIBRARIES)
  585. endif()
  586. # Unittests support.
  587. # FIXME: When compiler-rt is build using -DLLVM_BUILD_EXTERNAL_COMPILER_RT=ON, then
  588. # The LLVM_THIRD_PARTY_DIR variable is not set.
  589. if (NOT LLVM_THIRD_PARTY_DIR)
  590. set(LLVM_THIRD_PARTY_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../third-party")
  591. endif()
  592. set(COMPILER_RT_GTEST_PATH ${LLVM_THIRD_PARTY_DIR}/unittest/googletest)
  593. set(COMPILER_RT_GTEST_SOURCE ${COMPILER_RT_GTEST_PATH}/src/gtest-all.cc)
  594. set(COMPILER_RT_GTEST_CFLAGS
  595. -DGTEST_NO_LLVM_SUPPORT=1
  596. -DGTEST_HAS_RTTI=0
  597. -I${COMPILER_RT_GTEST_PATH}/include
  598. -I${COMPILER_RT_GTEST_PATH}
  599. )
  600. # Mocking support.
  601. set(COMPILER_RT_GMOCK_PATH ${LLVM_THIRD_PARTY_DIR}/unittest/googlemock)
  602. set(COMPILER_RT_GMOCK_SOURCE ${COMPILER_RT_GMOCK_PATH}/src/gmock-all.cc)
  603. set(COMPILER_RT_GMOCK_CFLAGS
  604. -DGTEST_NO_LLVM_SUPPORT=1
  605. -DGTEST_HAS_RTTI=0
  606. -I${COMPILER_RT_GMOCK_PATH}/include
  607. -I${COMPILER_RT_GMOCK_PATH}
  608. )
  609. if(COMPILER_RT_HAS_G_FLAG)
  610. list(APPEND COMPILER_RT_UNITTEST_CFLAGS -g)
  611. endif()
  612. append_list_if(COMPILER_RT_DEBUG -DSANITIZER_DEBUG=1 COMPILER_RT_UNITTEST_CFLAGS)
  613. append_list_if(COMPILER_RT_HAS_WCOVERED_SWITCH_DEFAULT_FLAG -Wno-covered-switch-default COMPILER_RT_UNITTEST_CFLAGS)
  614. append_list_if(COMPILER_RT_HAS_WSUGGEST_OVERRIDE_FLAG -Wno-suggest-override COMPILER_RT_UNITTEST_CFLAGS)
  615. if(MSVC)
  616. # gtest use a lot of stuff marked as deprecated on Windows.
  617. list(APPEND COMPILER_RT_GTEST_CFLAGS -Wno-deprecated-declarations)
  618. endif()
  619. # Warnings to turn off for all libraries, not just sanitizers.
  620. append_string_if(COMPILER_RT_HAS_WUNUSED_PARAMETER_FLAG -Wno-unused-parameter CMAKE_C_FLAGS CMAKE_CXX_FLAGS)
  621. if (CMAKE_LINKER MATCHES "link.exe$")
  622. # Silence MSVC linker warnings caused by empty object files. The
  623. # sanitizer libraries intentionally use ifdefs that result in empty
  624. # files, rather than skipping these files in the build system.
  625. # Ideally, we would pass this flag only for the libraries that need
  626. # it, but CMake doesn't seem to have a way to set linker flags for
  627. # individual static libraries, so we enable the suppression flag for
  628. # the whole compiler-rt project.
  629. set(CMAKE_STATIC_LINKER_FLAGS "${CMAKE_STATIC_LINKER_FLAGS} /IGNORE:4221")
  630. endif()
  631. add_subdirectory(include)
  632. option(COMPILER_RT_USE_LIBCXX
  633. "Enable compiler-rt to use libc++ from the source tree" ON)
  634. if(COMPILER_RT_USE_LIBCXX)
  635. if(LLVM_ENABLE_PROJECTS_USED)
  636. # Don't use libcxx if LLVM_ENABLE_PROJECTS does not enable it.
  637. set(COMPILER_RT_LIBCXX_PATH ${LLVM_EXTERNAL_LIBCXX_SOURCE_DIR})
  638. set(COMPILER_RT_LIBCXXABI_PATH ${LLVM_EXTERNAL_LIBCXXABI_SOURCE_DIR})
  639. else()
  640. foreach(path IN ITEMS ${LLVM_MAIN_SRC_DIR}/projects/libcxx
  641. ${LLVM_MAIN_SRC_DIR}/runtimes/libcxx
  642. ${LLVM_MAIN_SRC_DIR}/../libcxx
  643. ${LLVM_EXTERNAL_LIBCXX_SOURCE_DIR})
  644. if(IS_DIRECTORY ${path})
  645. set(COMPILER_RT_LIBCXX_PATH ${path})
  646. break()
  647. endif()
  648. endforeach()
  649. foreach(path IN ITEMS ${LLVM_MAIN_SRC_DIR}/projects/libcxxabi
  650. ${LLVM_MAIN_SRC_DIR}/runtimes/libcxxabi
  651. ${LLVM_MAIN_SRC_DIR}/../libcxxabi
  652. ${LLVM_EXTERNAL_LIBCXXABI_SOURCE_DIR})
  653. if(IS_DIRECTORY ${path})
  654. set(COMPILER_RT_LIBCXXABI_PATH ${path})
  655. break()
  656. endif()
  657. endforeach()
  658. endif()
  659. endif()
  660. set(COMPILER_RT_LLD_PATH ${LLVM_MAIN_SRC_DIR}/tools/lld)
  661. if(EXISTS ${COMPILER_RT_LLD_PATH}/ AND LLVM_TOOL_LLD_BUILD)
  662. set(COMPILER_RT_HAS_LLD TRUE)
  663. else()
  664. set(COMPILER_RT_LLD_PATH ${LLVM_MAIN_SRC_DIR}/../lld)
  665. if(EXISTS ${COMPILER_RT_LLD_PATH}/ AND LLVM_TOOL_LLD_BUILD)
  666. set(COMPILER_RT_HAS_LLD TRUE)
  667. endif()
  668. endif()
  669. if(ANDROID)
  670. set(COMPILER_RT_HAS_LLD TRUE)
  671. set(COMPILER_RT_TEST_USE_LLD TRUE)
  672. append_list_if(COMPILER_RT_HAS_FUSE_LD_LLD_FLAG -fuse-ld=lld SANITIZER_COMMON_LINK_FLAGS)
  673. append_list_if(COMPILER_RT_HAS_LLD -fuse-ld=lld COMPILER_RT_UNITTEST_LINK_FLAGS)
  674. endif()
  675. pythonize_bool(COMPILER_RT_HAS_LLD)
  676. pythonize_bool(COMPILER_RT_TEST_USE_LLD)
  677. add_subdirectory(lib)
  678. if(COMPILER_RT_INCLUDE_TESTS)
  679. add_subdirectory(unittests)
  680. add_subdirectory(test)
  681. # Don't build llvm-lit for runtimes-build, it will clean up map_config.
  682. if (COMPILER_RT_STANDALONE_BUILD AND NOT LLVM_RUNTIMES_BUILD)
  683. # If we have a valid source tree, generate llvm-lit into the bin directory.
  684. # The user can still choose to have the check targets *use* a different lit
  685. # by specifying -DLLVM_EXTERNAL_LIT, but we generate it regardless.
  686. if (EXISTS ${LLVM_MAIN_SRC_DIR}/utils/llvm-lit)
  687. # Needed for lit support in standalone builds.
  688. include(AddLLVM)
  689. add_subdirectory(${LLVM_MAIN_SRC_DIR}/utils/llvm-lit ${CMAKE_CURRENT_BINARY_DIR}/llvm-lit)
  690. elseif(NOT EXISTS ${LLVM_EXTERNAL_LIT})
  691. message(WARNING "Could not find LLVM source directory and LLVM_EXTERNAL_LIT does not"
  692. "point to a valid file. You will not be able to run tests.")
  693. endif()
  694. endif()
  695. endif()
  696. add_subdirectory(tools)