[SPARC] Fix 8 and 16-bit atomic load and store.
[lldb.git] / compiler-rt / CMakeLists.txt
1 # CMake build for CompilerRT.
2 #
3 # This build assumes that CompilerRT is checked out into the
4 # 'projects/compiler-rt' inside of an LLVM tree.
5 # Standalone build system for CompilerRT is not yet ready.
6 #
7 # An important constraint of the build is that it only produces libraries
8 # based on the ability of the host toolchain to target various platforms.
9
10 # Check if compiler-rt is built as a standalone project.
11 if (CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR)
12   project(CompilerRT C CXX ASM)
13   set(COMPILER_RT_STANDALONE_BUILD TRUE)
14 else()
15   set(COMPILER_RT_STANDALONE_BUILD FALSE)
16 endif()
17
18 # The CompilerRT build system requires CMake version 2.8.8 or higher in order
19 # to use its support for building convenience "libraries" as a collection of
20 # .o files. This is particularly useful in producing larger, more complex
21 # runtime libraries.
22 if (NOT MSVC)
23   cmake_minimum_required(VERSION 2.8.8)
24 else()
25   # Version 2.8.12.1 is required to build with Visual Studio 2013.
26   cmake_minimum_required(VERSION 2.8.12.1)
27 endif()
28
29 # FIXME: It may be removed when we use 2.8.12.
30 if(CMAKE_VERSION VERSION_LESS 2.8.12)
31   # Invalidate a couple of keywords.
32   set(cmake_2_8_12_INTERFACE)
33   set(cmake_2_8_12_PRIVATE)
34   if(APPLE)
35     set(CMAKE_MACOSX_RPATH On)
36   endif()
37 else()
38   # Use ${cmake_2_8_12_KEYWORD} intead of KEYWORD in target_link_libraries().
39   set(cmake_2_8_12_INTERFACE INTERFACE)
40   set(cmake_2_8_12_PRIVATE PRIVATE)
41   if(POLICY CMP0022)
42     cmake_policy(SET CMP0022 NEW) # automatic when 2.8.12 is required
43   endif()
44   if(POLICY CMP0042)
45     cmake_policy(SET CMP0042 NEW) # automatic when 2.8.12 is required
46   endif()
47 endif()
48
49 # Add path for custom compiler-rt modules.
50 list(INSERT CMAKE_MODULE_PATH 0
51   "${CMAKE_CURRENT_SOURCE_DIR}/cmake"
52   "${CMAKE_CURRENT_SOURCE_DIR}/cmake/Modules"
53   )
54
55 include(base-config-ix)
56
57 option(COMPILER_RT_BUILD_BUILTINS "Build builtins" ON)
58 mark_as_advanced(COMPILER_RT_BUILD_BUILTINS)
59 option(COMPILER_RT_BUILD_SANITIZERS "Build sanitizers" ON)
60 mark_as_advanced(COMPILER_RT_BUILD_SANITIZERS)
61
62 if (COMPILER_RT_STANDALONE_BUILD)
63   if (NOT LLVM_CONFIG_PATH)
64     find_program(LLVM_CONFIG_PATH "llvm-config"
65                  DOC "Path to llvm-config binary")
66     if (NOT LLVM_CONFIG_PATH)
67       message(FATAL_ERROR "llvm-config not found: specify LLVM_CONFIG_PATH")
68     endif()
69   endif()
70   execute_process(
71     COMMAND ${LLVM_CONFIG_PATH} "--obj-root" "--bindir" "--libdir" "--src-root"
72     RESULT_VARIABLE HAD_ERROR
73     OUTPUT_VARIABLE CONFIG_OUTPUT)
74   if (HAD_ERROR)
75     message(FATAL_ERROR "llvm-config failed with status ${HAD_ERROR}")
76   endif()
77   string(REGEX REPLACE "[ \t]*[\r\n]+[ \t]*" ";" CONFIG_OUTPUT ${CONFIG_OUTPUT})
78   list(GET CONFIG_OUTPUT 0 LLVM_BINARY_DIR)
79   list(GET CONFIG_OUTPUT 1 LLVM_TOOLS_BINARY_DIR)
80   list(GET CONFIG_OUTPUT 2 LLVM_LIBRARY_DIR)
81   list(GET CONFIG_OUTPUT 3 LLVM_MAIN_SRC_DIR)
82
83   # Make use of LLVM CMake modules.
84   file(TO_CMAKE_PATH ${LLVM_BINARY_DIR} LLVM_BINARY_DIR_CMAKE_STYLE)
85   set(LLVM_CMAKE_PATH "${LLVM_BINARY_DIR_CMAKE_STYLE}/lib${LLVM_LIBDIR_SUFFIX}/cmake/llvm")
86   list(APPEND CMAKE_MODULE_PATH "${LLVM_CMAKE_PATH}")
87   # Get some LLVM variables from LLVMConfig.
88   include("${LLVM_CMAKE_PATH}/LLVMConfig.cmake")
89
90   set(LLVM_LIBRARY_OUTPUT_INTDIR
91     ${CMAKE_BINARY_DIR}/${CMAKE_CFG_INTDIR}/lib${LLVM_LIBDIR_SUFFIX})
92
93   # Find Python interpreter.
94   set(Python_ADDITIONAL_VERSIONS 2.7 2.6 2.5)
95   include(FindPythonInterp)
96   if(NOT PYTHONINTERP_FOUND)
97     message(FATAL_ERROR "
98       Unable to find Python interpreter required testing. Please install Python
99       or specify the PYTHON_EXECUTABLE CMake variable.")
100   endif()
101
102   # Define default arguments to lit.
103   set(LIT_ARGS_DEFAULT "-sv")
104   if (MSVC OR XCODE)
105     set(LIT_ARGS_DEFAULT "${LIT_ARGS_DEFAULT} --no-progress-bar")
106   endif()
107   set(LLVM_LIT_ARGS "${LIT_ARGS_DEFAULT}" CACHE STRING "Default options for lit")
108 endif()
109
110 set(COMPILER_RT_DEFAULT_TARGET_TRIPLE ${TARGET_TRIPLE} CACHE STRING
111     "Default triple for which compiler-rt runtimes will be built.")
112 if(DEFINED COMPILER_RT_TEST_TARGET_TRIPLE)
113   # Backwards compatibility: this variable used to be called
114   # COMPILER_RT_TEST_TARGET_TRIPLE.
115   set(COMPILER_RT_DEFAULT_TARGET_TRIPLE ${COMPILER_RT_TEST_TARGET_TRIPLE})
116 endif()
117
118 string(REPLACE "-" ";" TARGET_TRIPLE_LIST ${COMPILER_RT_DEFAULT_TARGET_TRIPLE})
119 list(GET TARGET_TRIPLE_LIST 0 COMPILER_RT_DEFAULT_TARGET_ARCH)
120 list(GET TARGET_TRIPLE_LIST 1 COMPILER_RT_DEFAULT_TARGET_OS)
121 list(GET TARGET_TRIPLE_LIST 2 COMPILER_RT_DEFAULT_TARGET_ABI)
122 # Determine if test target triple is specified explicitly, and doesn't match the
123 # default.
124 if(NOT COMPILER_RT_DEFAULT_TARGET_TRIPLE STREQUAL TARGET_TRIPLE)
125   set(COMPILER_RT_HAS_EXPLICIT_DEFAULT_TARGET_TRIPLE TRUE)
126 else()
127   set(COMPILER_RT_HAS_EXPLICIT_DEFAULT_TARGET_TRIPLE FALSE)
128 endif()
129 include(CompilerRTUtils)
130
131 set(COMPILER_RT_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR})
132 set(COMPILER_RT_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR})
133
134 # We support running instrumented tests when we're not cross compiling
135 # and target a UNIX-like system or Windows.
136 # We can run tests on Android even when we are cross-compiling.
137 if(("${CMAKE_HOST_SYSTEM}" STREQUAL "${CMAKE_SYSTEM}" AND (UNIX OR WIN32)) OR ANDROID
138    OR COMPILER_RT_EMULATOR)
139   option(COMPILER_RT_CAN_EXECUTE_TESTS "Can we execute instrumented tests" ON)
140 else()
141   option(COMPILER_RT_CAN_EXECUTE_TESTS "Can we execute instrumented tests" OFF)
142 endif()
143
144 option(COMPILER_RT_DEBUG "Build runtimes with full debug info" OFF)
145 option(COMPILER_RT_EXTERNALIZE_DEBUGINFO
146   "Generate dSYM files and strip executables and libraries (Darwin Only)" OFF)
147 # COMPILER_RT_DEBUG_PYBOOL is used by lit.common.configured.in.
148 pythonize_bool(COMPILER_RT_DEBUG)
149
150 #================================
151 # Setup Compiler Flags
152 #================================
153
154 include(config-ix)
155
156 if(MSVC)
157   append_string_if(COMPILER_RT_HAS_W3_FLAG /W3 CMAKE_C_FLAGS CMAKE_CXX_FLAGS)
158 else()
159   append_string_if(COMPILER_RT_HAS_WALL_FLAG -Wall CMAKE_C_FLAGS CMAKE_CXX_FLAGS)
160 endif()
161 if(COMPILER_RT_ENABLE_WERROR)
162   append_string_if(COMPILER_RT_HAS_WERROR_FLAG -Werror CMAKE_C_FLAGS CMAKE_CXX_FLAGS)
163   append_string_if(COMPILER_RT_HAS_WX_FLAG /WX CMAKE_C_FLAGS CMAKE_CXX_FLAGS)
164 endif()
165
166 append_string_if(COMPILER_RT_HAS_STD_CXX11_FLAG -std=c++11 CMAKE_CXX_FLAGS)
167
168 # Emulate C99 and C++11's __func__ for MSVC prior to 2013 CTP.
169 if(NOT COMPILER_RT_HAS_FUNC_SYMBOL)
170   add_definitions(-D__func__=__FUNCTION__)
171 endif()
172
173 # Provide some common commmandline flags for Sanitizer runtimes.
174 append_list_if(COMPILER_RT_HAS_FPIC_FLAG -fPIC SANITIZER_COMMON_CFLAGS)
175 append_list_if(COMPILER_RT_HAS_FNO_BUILTIN_FLAG -fno-builtin SANITIZER_COMMON_CFLAGS)
176 append_list_if(COMPILER_RT_HAS_FNO_EXCEPTIONS_FLAG -fno-exceptions SANITIZER_COMMON_CFLAGS)
177 if(NOT COMPILER_RT_DEBUG)
178   append_list_if(COMPILER_RT_HAS_FOMIT_FRAME_POINTER_FLAG -fomit-frame-pointer SANITIZER_COMMON_CFLAGS)
179 endif()
180 append_list_if(COMPILER_RT_HAS_FUNWIND_TABLES_FLAG -funwind-tables SANITIZER_COMMON_CFLAGS)
181 append_list_if(COMPILER_RT_HAS_FNO_STACK_PROTECTOR_FLAG -fno-stack-protector SANITIZER_COMMON_CFLAGS)
182 append_list_if(COMPILER_RT_HAS_FNO_SANITIZE_SAFE_STACK_FLAG -fno-sanitize=safe-stack SANITIZER_COMMON_CFLAGS)
183 append_list_if(COMPILER_RT_HAS_FVISIBILITY_HIDDEN_FLAG -fvisibility=hidden SANITIZER_COMMON_CFLAGS)
184 append_list_if(COMPILER_RT_HAS_FVISIBILITY_INLINES_HIDDEN_FLAG -fvisibility-inlines-hidden SANITIZER_COMMON_CFLAGS)
185 append_list_if(COMPILER_RT_HAS_FNO_FUNCTION_SECTIONS_FLAG -fno-function-sections SANITIZER_COMMON_CFLAGS)
186 append_list_if(COMPILER_RT_HAS_FNO_LTO_FLAG -fno-lto SANITIZER_COMMON_CFLAGS)
187
188 if(MSVC)
189   # Replace the /M[DT][d] flags with /MT, and strip any definitions of _DEBUG,
190   # which cause definition mismatches at link time.
191   # FIXME: In fact, sanitizers should support both /MT and /MD, see PR20214.
192   if(COMPILER_RT_HAS_MT_FLAG)
193     foreach(flag_var
194       CMAKE_C_FLAGS CMAKE_C_FLAGS_DEBUG CMAKE_C_FLAGS_RELEASE
195       CMAKE_C_FLAGS_MINSIZEREL CMAKE_C_FLAGS_RELWITHDEBINFO
196       CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_RELEASE
197       CMAKE_CXX_FLAGS_MINSIZEREL CMAKE_CXX_FLAGS_RELWITHDEBINFO)
198       string(REGEX REPLACE "/M[DT]d" "/MT" ${flag_var} "${${flag_var}}")
199       string(REGEX REPLACE "/MD" "/MT" ${flag_var} "${${flag_var}}")
200       string(REGEX REPLACE "/D_DEBUG" "" ${flag_var} "${${flag_var}}")
201     endforeach()
202   endif()
203   append_list_if(COMPILER_RT_HAS_Oy_FLAG /Oy- SANITIZER_COMMON_CFLAGS)
204   append_list_if(COMPILER_RT_HAS_GS_FLAG /GS- SANITIZER_COMMON_CFLAGS)
205   # VS 2015 (version 1900) added support for thread safe static initialization.
206   # However, ASan interceptors run before CRT initialization, which causes the
207   # new thread safe code to crash. Disable this feature for now.
208   if (MSVC_VERSION GREATER 1899)
209     list(APPEND SANITIZER_COMMON_CFLAGS /Zc:threadSafeInit-)
210   endif()
211 endif()
212
213 append_list_if(COMPILER_RT_DEBUG -DSANITIZER_DEBUG=1 SANITIZER_COMMON_CFLAGS)
214
215 # Build with optimization, unless we're in debug mode. If we're using MSVC,
216 # always respect the optimization flags set by CMAKE_BUILD_TYPE instead.
217 if(NOT COMPILER_RT_DEBUG AND NOT MSVC)
218   list(APPEND SANITIZER_COMMON_CFLAGS -O3)
219 endif()
220
221 # Determine if we should restrict stack frame sizes.
222 # Stack frames on PowerPC and Mips and in debug biuld can be much larger than
223 # anticipated.
224 # FIXME: Fix all sanitizers and add -Wframe-larger-than to
225 # SANITIZER_COMMON_FLAGS
226 if(COMPILER_RT_HAS_WFRAME_LARGER_THAN_FLAG AND NOT COMPILER_RT_DEBUG
227    AND NOT ${COMPILER_RT_DEFAULT_TARGET_ARCH} MATCHES "powerpc|mips")
228   set(SANITIZER_LIMIT_FRAME_SIZE TRUE)
229 else()
230   set(SANITIZER_LIMIT_FRAME_SIZE FALSE)
231 endif()
232
233 # Build sanitizer runtimes with debug info.
234 if(COMPILER_RT_HAS_GLINE_TABLES_ONLY_FLAG AND NOT COMPILER_RT_DEBUG)
235   list(APPEND SANITIZER_COMMON_CFLAGS -gline-tables-only)
236 elseif(COMPILER_RT_HAS_G_FLAG)
237   list(APPEND SANITIZER_COMMON_CFLAGS -g)
238 elseif(COMPILER_RT_HAS_Zi_FLAG)
239   list(APPEND SANITIZER_COMMON_CFLAGS /Zi)
240 endif()
241
242 # Turn off several warnings.
243 append_list_if(COMPILER_RT_HAS_WGNU_FLAG -Wno-gnu SANITIZER_COMMON_CFLAGS)
244 append_list_if(COMPILER_RT_HAS_WVARIADIC_MACROS_FLAG -Wno-variadic-macros SANITIZER_COMMON_CFLAGS)
245 append_list_if(COMPILER_RT_HAS_WC99_EXTENSIONS_FLAG -Wno-c99-extensions SANITIZER_COMMON_CFLAGS)
246 append_list_if(COMPILER_RT_HAS_WNON_VIRTUAL_DTOR_FLAG -Wno-non-virtual-dtor SANITIZER_COMMON_CFLAGS)
247 append_list_if(COMPILER_RT_HAS_WD4146_FLAG /wd4146 SANITIZER_COMMON_CFLAGS)
248 append_list_if(COMPILER_RT_HAS_WD4291_FLAG /wd4291 SANITIZER_COMMON_CFLAGS)
249 append_list_if(COMPILER_RT_HAS_WD4391_FLAG /wd4391 SANITIZER_COMMON_CFLAGS)
250 append_list_if(COMPILER_RT_HAS_WD4722_FLAG /wd4722 SANITIZER_COMMON_CFLAGS)
251 append_list_if(COMPILER_RT_HAS_WD4800_FLAG /wd4800 SANITIZER_COMMON_CFLAGS)
252
253 if(APPLE AND SANITIZER_MIN_OSX_VERSION VERSION_LESS "10.9")
254   # Mac OS X prior to 10.9 had problems with exporting symbols from
255   # libc++/libc++abi.
256   set(SANITIZER_CAN_USE_CXXABI FALSE)
257 elseif(MSVC)
258   set(SANITIZER_CAN_USE_CXXABI FALSE)
259 else()
260   set(SANITIZER_CAN_USE_CXXABI TRUE)
261 endif()
262 pythonize_bool(SANITIZER_CAN_USE_CXXABI)
263
264 add_subdirectory(include)
265
266 set(COMPILER_RT_LIBCXX_PATH ${LLVM_MAIN_SRC_DIR}/projects/libcxx)
267 if(EXISTS ${COMPILER_RT_LIBCXX_PATH}/)
268   set(COMPILER_RT_HAS_LIBCXX_SOURCES TRUE)
269 else()
270   set(COMPILER_RT_HAS_LIBCXX_SOURCES FALSE)
271 endif()
272
273 set(COMPILER_RT_LLD_PATH ${LLVM_MAIN_SRC_DIR}/tools/lld)
274 if(EXISTS ${COMPILER_RT_LLD_PATH}/)
275   set(COMPILER_RT_HAS_LLD_SOURCES TRUE)
276 else()
277   set(COMPILER_RT_HAS_LLD_SOURCES FALSE)
278 endif()
279 pythonize_bool(COMPILER_RT_HAS_LLD_SOURCES)
280
281 add_subdirectory(lib)
282
283 if(COMPILER_RT_INCLUDE_TESTS)
284   add_subdirectory(unittests)
285   add_subdirectory(test)
286 endif()