annotate compiler-rt/cmake/Modules/CompilerRTUtils.cmake @ 150:1d019706d866

LLVM10
author anatofuz
date Thu, 13 Feb 2020 15:10:13 +0900
parents
children 0572611fdcc8
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
150
anatofuz
parents:
diff changeset
1 include(CMakePushCheckState)
anatofuz
parents:
diff changeset
2 include(CheckSymbolExists)
anatofuz
parents:
diff changeset
3
anatofuz
parents:
diff changeset
4 # Because compiler-rt spends a lot of time setting up custom compile flags,
anatofuz
parents:
diff changeset
5 # define a handy helper function for it. The compile flags setting in CMake
anatofuz
parents:
diff changeset
6 # has serious issues that make its syntax challenging at best.
anatofuz
parents:
diff changeset
7 function(set_target_compile_flags target)
anatofuz
parents:
diff changeset
8 set(argstring "")
anatofuz
parents:
diff changeset
9 foreach(arg ${ARGN})
anatofuz
parents:
diff changeset
10 set(argstring "${argstring} ${arg}")
anatofuz
parents:
diff changeset
11 endforeach()
anatofuz
parents:
diff changeset
12 set_property(TARGET ${target} PROPERTY COMPILE_FLAGS "${argstring}")
anatofuz
parents:
diff changeset
13 endfunction()
anatofuz
parents:
diff changeset
14
anatofuz
parents:
diff changeset
15 function(set_target_link_flags target)
anatofuz
parents:
diff changeset
16 set(argstring "")
anatofuz
parents:
diff changeset
17 foreach(arg ${ARGN})
anatofuz
parents:
diff changeset
18 set(argstring "${argstring} ${arg}")
anatofuz
parents:
diff changeset
19 endforeach()
anatofuz
parents:
diff changeset
20 set_property(TARGET ${target} PROPERTY LINK_FLAGS "${argstring}")
anatofuz
parents:
diff changeset
21 endfunction()
anatofuz
parents:
diff changeset
22
anatofuz
parents:
diff changeset
23 # Set the variable var_PYBOOL to True if var holds a true-ish string,
anatofuz
parents:
diff changeset
24 # otherwise set it to False.
anatofuz
parents:
diff changeset
25 macro(pythonize_bool var)
anatofuz
parents:
diff changeset
26 if (${var})
anatofuz
parents:
diff changeset
27 set(${var}_PYBOOL True)
anatofuz
parents:
diff changeset
28 else()
anatofuz
parents:
diff changeset
29 set(${var}_PYBOOL False)
anatofuz
parents:
diff changeset
30 endif()
anatofuz
parents:
diff changeset
31 endmacro()
anatofuz
parents:
diff changeset
32
anatofuz
parents:
diff changeset
33 # Appends value to all lists in ARGN, if the condition is true.
anatofuz
parents:
diff changeset
34 macro(append_list_if condition value)
anatofuz
parents:
diff changeset
35 if(${condition})
anatofuz
parents:
diff changeset
36 foreach(list ${ARGN})
anatofuz
parents:
diff changeset
37 list(APPEND ${list} ${value})
anatofuz
parents:
diff changeset
38 endforeach()
anatofuz
parents:
diff changeset
39 endif()
anatofuz
parents:
diff changeset
40 endmacro()
anatofuz
parents:
diff changeset
41
anatofuz
parents:
diff changeset
42 # Appends value to all strings in ARGN, if the condition is true.
anatofuz
parents:
diff changeset
43 macro(append_string_if condition value)
anatofuz
parents:
diff changeset
44 if(${condition})
anatofuz
parents:
diff changeset
45 foreach(str ${ARGN})
anatofuz
parents:
diff changeset
46 set(${str} "${${str}} ${value}")
anatofuz
parents:
diff changeset
47 endforeach()
anatofuz
parents:
diff changeset
48 endif()
anatofuz
parents:
diff changeset
49 endmacro()
anatofuz
parents:
diff changeset
50
anatofuz
parents:
diff changeset
51 macro(append_rtti_flag polarity list)
anatofuz
parents:
diff changeset
52 if(${polarity})
anatofuz
parents:
diff changeset
53 append_list_if(COMPILER_RT_HAS_FRTTI_FLAG -frtti ${list})
anatofuz
parents:
diff changeset
54 append_list_if(COMPILER_RT_HAS_GR_FLAG /GR ${list})
anatofuz
parents:
diff changeset
55 else()
anatofuz
parents:
diff changeset
56 append_list_if(COMPILER_RT_HAS_FNO_RTTI_FLAG -fno-rtti ${list})
anatofuz
parents:
diff changeset
57 append_list_if(COMPILER_RT_HAS_GR_FLAG /GR- ${list})
anatofuz
parents:
diff changeset
58 endif()
anatofuz
parents:
diff changeset
59 endmacro()
anatofuz
parents:
diff changeset
60
anatofuz
parents:
diff changeset
61 macro(list_intersect output input1 input2)
anatofuz
parents:
diff changeset
62 set(${output})
anatofuz
parents:
diff changeset
63 foreach(it ${${input1}})
anatofuz
parents:
diff changeset
64 list(FIND ${input2} ${it} index)
anatofuz
parents:
diff changeset
65 if( NOT (index EQUAL -1))
anatofuz
parents:
diff changeset
66 list(APPEND ${output} ${it})
anatofuz
parents:
diff changeset
67 endif()
anatofuz
parents:
diff changeset
68 endforeach()
anatofuz
parents:
diff changeset
69 endmacro()
anatofuz
parents:
diff changeset
70
anatofuz
parents:
diff changeset
71 function(list_replace input_list old new)
anatofuz
parents:
diff changeset
72 set(replaced_list)
anatofuz
parents:
diff changeset
73 foreach(item ${${input_list}})
anatofuz
parents:
diff changeset
74 if(${item} STREQUAL ${old})
anatofuz
parents:
diff changeset
75 list(APPEND replaced_list ${new})
anatofuz
parents:
diff changeset
76 else()
anatofuz
parents:
diff changeset
77 list(APPEND replaced_list ${item})
anatofuz
parents:
diff changeset
78 endif()
anatofuz
parents:
diff changeset
79 endforeach()
anatofuz
parents:
diff changeset
80 set(${input_list} "${replaced_list}" PARENT_SCOPE)
anatofuz
parents:
diff changeset
81 endfunction()
anatofuz
parents:
diff changeset
82
anatofuz
parents:
diff changeset
83 # Takes ${ARGN} and puts only supported architectures in @out_var list.
anatofuz
parents:
diff changeset
84 function(filter_available_targets out_var)
anatofuz
parents:
diff changeset
85 set(archs ${${out_var}})
anatofuz
parents:
diff changeset
86 foreach(arch ${ARGN})
anatofuz
parents:
diff changeset
87 list(FIND COMPILER_RT_SUPPORTED_ARCH ${arch} ARCH_INDEX)
anatofuz
parents:
diff changeset
88 if(NOT (ARCH_INDEX EQUAL -1) AND CAN_TARGET_${arch})
anatofuz
parents:
diff changeset
89 list(APPEND archs ${arch})
anatofuz
parents:
diff changeset
90 endif()
anatofuz
parents:
diff changeset
91 endforeach()
anatofuz
parents:
diff changeset
92 set(${out_var} ${archs} PARENT_SCOPE)
anatofuz
parents:
diff changeset
93 endfunction()
anatofuz
parents:
diff changeset
94
anatofuz
parents:
diff changeset
95 # Add $arch as supported with no additional flags.
anatofuz
parents:
diff changeset
96 macro(add_default_target_arch arch)
anatofuz
parents:
diff changeset
97 set(TARGET_${arch}_CFLAGS "")
anatofuz
parents:
diff changeset
98 set(CAN_TARGET_${arch} 1)
anatofuz
parents:
diff changeset
99 list(APPEND COMPILER_RT_SUPPORTED_ARCH ${arch})
anatofuz
parents:
diff changeset
100 endmacro()
anatofuz
parents:
diff changeset
101
anatofuz
parents:
diff changeset
102 function(check_compile_definition def argstring out_var)
anatofuz
parents:
diff changeset
103 if("${def}" STREQUAL "")
anatofuz
parents:
diff changeset
104 set(${out_var} TRUE PARENT_SCOPE)
anatofuz
parents:
diff changeset
105 return()
anatofuz
parents:
diff changeset
106 endif()
anatofuz
parents:
diff changeset
107 cmake_push_check_state()
anatofuz
parents:
diff changeset
108 set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} ${argstring}")
anatofuz
parents:
diff changeset
109 check_symbol_exists(${def} "" ${out_var})
anatofuz
parents:
diff changeset
110 cmake_pop_check_state()
anatofuz
parents:
diff changeset
111 endfunction()
anatofuz
parents:
diff changeset
112
anatofuz
parents:
diff changeset
113 # test_target_arch(<arch> <def> <target flags...>)
anatofuz
parents:
diff changeset
114 # Checks if architecture is supported: runs host compiler with provided
anatofuz
parents:
diff changeset
115 # flags to verify that:
anatofuz
parents:
diff changeset
116 # 1) <def> is defined (if non-empty)
anatofuz
parents:
diff changeset
117 # 2) simple file can be successfully built.
anatofuz
parents:
diff changeset
118 # If successful, saves target flags for this architecture.
anatofuz
parents:
diff changeset
119 macro(test_target_arch arch def)
anatofuz
parents:
diff changeset
120 set(TARGET_${arch}_CFLAGS ${ARGN})
anatofuz
parents:
diff changeset
121 set(TARGET_${arch}_LINK_FLAGS ${ARGN})
anatofuz
parents:
diff changeset
122 set(argstring "")
anatofuz
parents:
diff changeset
123 foreach(arg ${ARGN})
anatofuz
parents:
diff changeset
124 set(argstring "${argstring} ${arg}")
anatofuz
parents:
diff changeset
125 endforeach()
anatofuz
parents:
diff changeset
126 check_compile_definition("${def}" "${argstring}" HAS_${arch}_DEF)
anatofuz
parents:
diff changeset
127 if(NOT DEFINED CAN_TARGET_${arch})
anatofuz
parents:
diff changeset
128 if(NOT HAS_${arch}_DEF)
anatofuz
parents:
diff changeset
129 set(CAN_TARGET_${arch} FALSE)
anatofuz
parents:
diff changeset
130 elseif(TEST_COMPILE_ONLY)
anatofuz
parents:
diff changeset
131 try_compile_only(CAN_TARGET_${arch} FLAGS ${TARGET_${arch}_CFLAGS})
anatofuz
parents:
diff changeset
132 else()
anatofuz
parents:
diff changeset
133 set(FLAG_NO_EXCEPTIONS "")
anatofuz
parents:
diff changeset
134 if(COMPILER_RT_HAS_FNO_EXCEPTIONS_FLAG)
anatofuz
parents:
diff changeset
135 set(FLAG_NO_EXCEPTIONS " -fno-exceptions ")
anatofuz
parents:
diff changeset
136 endif()
anatofuz
parents:
diff changeset
137 set(SAVED_CMAKE_EXE_LINKER_FLAGS ${CMAKE_EXE_LINKER_FLAGS})
anatofuz
parents:
diff changeset
138 set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${argstring}")
anatofuz
parents:
diff changeset
139 try_compile(CAN_TARGET_${arch} ${CMAKE_BINARY_DIR} ${SIMPLE_SOURCE}
anatofuz
parents:
diff changeset
140 COMPILE_DEFINITIONS "${TARGET_${arch}_CFLAGS} ${FLAG_NO_EXCEPTIONS}"
anatofuz
parents:
diff changeset
141 OUTPUT_VARIABLE TARGET_${arch}_OUTPUT)
anatofuz
parents:
diff changeset
142 set(CMAKE_EXE_LINKER_FLAGS ${SAVED_CMAKE_EXE_LINKER_FLAGS})
anatofuz
parents:
diff changeset
143 endif()
anatofuz
parents:
diff changeset
144 endif()
anatofuz
parents:
diff changeset
145 if(${CAN_TARGET_${arch}})
anatofuz
parents:
diff changeset
146 list(APPEND COMPILER_RT_SUPPORTED_ARCH ${arch})
anatofuz
parents:
diff changeset
147 elseif("${COMPILER_RT_DEFAULT_TARGET_ARCH}" STREQUAL "${arch}" AND
anatofuz
parents:
diff changeset
148 COMPILER_RT_HAS_EXPLICIT_DEFAULT_TARGET_TRIPLE)
anatofuz
parents:
diff changeset
149 # Bail out if we cannot target the architecture we plan to test.
anatofuz
parents:
diff changeset
150 message(FATAL_ERROR "Cannot compile for ${arch}:\n${TARGET_${arch}_OUTPUT}")
anatofuz
parents:
diff changeset
151 endif()
anatofuz
parents:
diff changeset
152 endmacro()
anatofuz
parents:
diff changeset
153
anatofuz
parents:
diff changeset
154 macro(detect_target_arch)
anatofuz
parents:
diff changeset
155 check_symbol_exists(__arm__ "" __ARM)
anatofuz
parents:
diff changeset
156 check_symbol_exists(__aarch64__ "" __AARCH64)
anatofuz
parents:
diff changeset
157 check_symbol_exists(__x86_64__ "" __X86_64)
anatofuz
parents:
diff changeset
158 check_symbol_exists(__i386__ "" __I386)
anatofuz
parents:
diff changeset
159 check_symbol_exists(__mips__ "" __MIPS)
anatofuz
parents:
diff changeset
160 check_symbol_exists(__mips64__ "" __MIPS64)
anatofuz
parents:
diff changeset
161 check_symbol_exists(__powerpc64__ "" __PPC64)
anatofuz
parents:
diff changeset
162 check_symbol_exists(__powerpc64le__ "" __PPC64LE)
anatofuz
parents:
diff changeset
163 check_symbol_exists(__riscv "" __RISCV)
anatofuz
parents:
diff changeset
164 check_symbol_exists(__s390x__ "" __S390X)
anatofuz
parents:
diff changeset
165 check_symbol_exists(__sparc "" __SPARC)
anatofuz
parents:
diff changeset
166 check_symbol_exists(__sparcv9 "" __SPARCV9)
anatofuz
parents:
diff changeset
167 check_symbol_exists(__wasm32__ "" __WEBASSEMBLY32)
anatofuz
parents:
diff changeset
168 check_symbol_exists(__wasm64__ "" __WEBASSEMBLY64)
anatofuz
parents:
diff changeset
169 if(__ARM)
anatofuz
parents:
diff changeset
170 add_default_target_arch(arm)
anatofuz
parents:
diff changeset
171 elseif(__AARCH64)
anatofuz
parents:
diff changeset
172 add_default_target_arch(aarch64)
anatofuz
parents:
diff changeset
173 elseif(__X86_64)
anatofuz
parents:
diff changeset
174 add_default_target_arch(x86_64)
anatofuz
parents:
diff changeset
175 elseif(__I386)
anatofuz
parents:
diff changeset
176 add_default_target_arch(i386)
anatofuz
parents:
diff changeset
177 elseif(__MIPS64) # must be checked before __MIPS
anatofuz
parents:
diff changeset
178 add_default_target_arch(mips64)
anatofuz
parents:
diff changeset
179 elseif(__MIPS)
anatofuz
parents:
diff changeset
180 add_default_target_arch(mips)
anatofuz
parents:
diff changeset
181 elseif(__PPC64)
anatofuz
parents:
diff changeset
182 add_default_target_arch(powerpc64)
anatofuz
parents:
diff changeset
183 elseif(__PPC64LE)
anatofuz
parents:
diff changeset
184 add_default_target_arch(powerpc64le)
anatofuz
parents:
diff changeset
185 elseif(__RISCV)
anatofuz
parents:
diff changeset
186 if(CMAKE_SIZEOF_VOID_P EQUAL "4")
anatofuz
parents:
diff changeset
187 add_default_target_arch(riscv32)
anatofuz
parents:
diff changeset
188 elseif(CMAKE_SIZEOF_VOID_P EQUAL "8")
anatofuz
parents:
diff changeset
189 add_default_target_arch(riscv64)
anatofuz
parents:
diff changeset
190 else()
anatofuz
parents:
diff changeset
191 message(FATAL_ERROR "Unsupport XLEN for RISC-V")
anatofuz
parents:
diff changeset
192 endif()
anatofuz
parents:
diff changeset
193 elseif(__S390X)
anatofuz
parents:
diff changeset
194 add_default_target_arch(s390x)
anatofuz
parents:
diff changeset
195 elseif(__SPARCV9)
anatofuz
parents:
diff changeset
196 add_default_target_arch(sparcv9)
anatofuz
parents:
diff changeset
197 elseif(__SPARC)
anatofuz
parents:
diff changeset
198 add_default_target_arch(sparc)
anatofuz
parents:
diff changeset
199 elseif(__WEBASSEMBLY32)
anatofuz
parents:
diff changeset
200 add_default_target_arch(wasm32)
anatofuz
parents:
diff changeset
201 elseif(__WEBASSEMBLY64)
anatofuz
parents:
diff changeset
202 add_default_target_arch(wasm64)
anatofuz
parents:
diff changeset
203 endif()
anatofuz
parents:
diff changeset
204 endmacro()
anatofuz
parents:
diff changeset
205
anatofuz
parents:
diff changeset
206 macro(load_llvm_config)
anatofuz
parents:
diff changeset
207 if (NOT LLVM_CONFIG_PATH)
anatofuz
parents:
diff changeset
208 find_program(LLVM_CONFIG_PATH "llvm-config"
anatofuz
parents:
diff changeset
209 DOC "Path to llvm-config binary")
anatofuz
parents:
diff changeset
210 if (NOT LLVM_CONFIG_PATH)
anatofuz
parents:
diff changeset
211 message(WARNING "UNSUPPORTED COMPILER-RT CONFIGURATION DETECTED: "
anatofuz
parents:
diff changeset
212 "llvm-config not found.\n"
anatofuz
parents:
diff changeset
213 "Reconfigure with -DLLVM_CONFIG_PATH=path/to/llvm-config.")
anatofuz
parents:
diff changeset
214 endif()
anatofuz
parents:
diff changeset
215 endif()
anatofuz
parents:
diff changeset
216 if (LLVM_CONFIG_PATH)
anatofuz
parents:
diff changeset
217 execute_process(
anatofuz
parents:
diff changeset
218 COMMAND ${LLVM_CONFIG_PATH} "--obj-root" "--bindir" "--libdir" "--src-root" "--includedir"
anatofuz
parents:
diff changeset
219 RESULT_VARIABLE HAD_ERROR
anatofuz
parents:
diff changeset
220 OUTPUT_VARIABLE CONFIG_OUTPUT)
anatofuz
parents:
diff changeset
221 if (HAD_ERROR)
anatofuz
parents:
diff changeset
222 message(FATAL_ERROR "llvm-config failed with status ${HAD_ERROR}")
anatofuz
parents:
diff changeset
223 endif()
anatofuz
parents:
diff changeset
224 string(REGEX REPLACE "[ \t]*[\r\n]+[ \t]*" ";" CONFIG_OUTPUT ${CONFIG_OUTPUT})
anatofuz
parents:
diff changeset
225 list(GET CONFIG_OUTPUT 0 BINARY_DIR)
anatofuz
parents:
diff changeset
226 list(GET CONFIG_OUTPUT 1 TOOLS_BINARY_DIR)
anatofuz
parents:
diff changeset
227 list(GET CONFIG_OUTPUT 2 LIBRARY_DIR)
anatofuz
parents:
diff changeset
228 list(GET CONFIG_OUTPUT 3 MAIN_SRC_DIR)
anatofuz
parents:
diff changeset
229 list(GET CONFIG_OUTPUT 4 INCLUDE_DIR)
anatofuz
parents:
diff changeset
230
anatofuz
parents:
diff changeset
231 set(LLVM_BINARY_DIR ${BINARY_DIR} CACHE PATH "Path to LLVM build tree")
anatofuz
parents:
diff changeset
232 set(LLVM_LIBRARY_DIR ${LIBRARY_DIR} CACHE PATH "Path to llvm/lib")
anatofuz
parents:
diff changeset
233 set(LLVM_MAIN_SRC_DIR ${MAIN_SRC_DIR} CACHE PATH "Path to LLVM source tree")
anatofuz
parents:
diff changeset
234 set(LLVM_TOOLS_BINARY_DIR ${TOOLS_BINARY_DIR} CACHE PATH "Path to llvm/bin")
anatofuz
parents:
diff changeset
235 set(LLVM_INCLUDE_DIR ${INCLUDE_DIR} CACHE PATH "Paths to LLVM headers")
anatofuz
parents:
diff changeset
236
anatofuz
parents:
diff changeset
237 # Detect if we have the LLVMXRay and TestingSupport library installed and
anatofuz
parents:
diff changeset
238 # available from llvm-config.
anatofuz
parents:
diff changeset
239 execute_process(
anatofuz
parents:
diff changeset
240 COMMAND ${LLVM_CONFIG_PATH} "--ldflags" "--libs" "xray"
anatofuz
parents:
diff changeset
241 RESULT_VARIABLE HAD_ERROR
anatofuz
parents:
diff changeset
242 OUTPUT_VARIABLE CONFIG_OUTPUT
anatofuz
parents:
diff changeset
243 ERROR_QUIET)
anatofuz
parents:
diff changeset
244 if (HAD_ERROR)
anatofuz
parents:
diff changeset
245 message(WARNING "llvm-config finding xray failed with status ${HAD_ERROR}")
anatofuz
parents:
diff changeset
246 set(COMPILER_RT_HAS_LLVMXRAY FALSE)
anatofuz
parents:
diff changeset
247 else()
anatofuz
parents:
diff changeset
248 string(REGEX REPLACE "[ \t]*[\r\n]+[ \t]*" ";" CONFIG_OUTPUT ${CONFIG_OUTPUT})
anatofuz
parents:
diff changeset
249 list(GET CONFIG_OUTPUT 0 LDFLAGS)
anatofuz
parents:
diff changeset
250 list(GET CONFIG_OUTPUT 1 LIBLIST)
anatofuz
parents:
diff changeset
251 file(TO_CMAKE_PATH "${LDFLAGS}" LDFLAGS)
anatofuz
parents:
diff changeset
252 file(TO_CMAKE_PATH "${LIBLIST}" LIBLIST)
anatofuz
parents:
diff changeset
253 set(LLVM_XRAY_LDFLAGS ${LDFLAGS} CACHE STRING "Linker flags for LLVMXRay library")
anatofuz
parents:
diff changeset
254 set(LLVM_XRAY_LIBLIST ${LIBLIST} CACHE STRING "Library list for LLVMXRay")
anatofuz
parents:
diff changeset
255 set(COMPILER_RT_HAS_LLVMXRAY TRUE)
anatofuz
parents:
diff changeset
256 endif()
anatofuz
parents:
diff changeset
257
anatofuz
parents:
diff changeset
258 set(COMPILER_RT_HAS_LLVMTESTINGSUPPORT FALSE)
anatofuz
parents:
diff changeset
259 execute_process(
anatofuz
parents:
diff changeset
260 COMMAND ${LLVM_CONFIG_PATH} "--ldflags" "--libs" "testingsupport"
anatofuz
parents:
diff changeset
261 RESULT_VARIABLE HAD_ERROR
anatofuz
parents:
diff changeset
262 OUTPUT_VARIABLE CONFIG_OUTPUT
anatofuz
parents:
diff changeset
263 ERROR_QUIET)
anatofuz
parents:
diff changeset
264 if (HAD_ERROR)
anatofuz
parents:
diff changeset
265 message(WARNING "llvm-config finding testingsupport failed with status ${HAD_ERROR}")
anatofuz
parents:
diff changeset
266 else()
anatofuz
parents:
diff changeset
267 string(REGEX REPLACE "[ \t]*[\r\n]+[ \t]*" ";" CONFIG_OUTPUT ${CONFIG_OUTPUT})
anatofuz
parents:
diff changeset
268 list(GET CONFIG_OUTPUT 0 LDFLAGS)
anatofuz
parents:
diff changeset
269 list(GET CONFIG_OUTPUT 1 LIBLIST)
anatofuz
parents:
diff changeset
270 if (LIBLIST STREQUAL "")
anatofuz
parents:
diff changeset
271 message(WARNING "testingsupport library not installed, some tests will be skipped")
anatofuz
parents:
diff changeset
272 else()
anatofuz
parents:
diff changeset
273 file(TO_CMAKE_PATH "${LDFLAGS}" LDFLAGS)
anatofuz
parents:
diff changeset
274 file(TO_CMAKE_PATH "${LIBLIST}" LIBLIST)
anatofuz
parents:
diff changeset
275 set(LLVM_TESTINGSUPPORT_LDFLAGS ${LDFLAGS} CACHE STRING "Linker flags for LLVMTestingSupport library")
anatofuz
parents:
diff changeset
276 set(LLVM_TESTINGSUPPORT_LIBLIST ${LIBLIST} CACHE STRING "Library list for LLVMTestingSupport")
anatofuz
parents:
diff changeset
277 set(COMPILER_RT_HAS_LLVMTESTINGSUPPORT TRUE)
anatofuz
parents:
diff changeset
278 endif()
anatofuz
parents:
diff changeset
279 endif()
anatofuz
parents:
diff changeset
280
anatofuz
parents:
diff changeset
281 # Make use of LLVM CMake modules.
anatofuz
parents:
diff changeset
282 # --cmakedir is supported since llvm r291218 (4.0 release)
anatofuz
parents:
diff changeset
283 execute_process(
anatofuz
parents:
diff changeset
284 COMMAND ${LLVM_CONFIG_PATH} --cmakedir
anatofuz
parents:
diff changeset
285 RESULT_VARIABLE HAD_ERROR
anatofuz
parents:
diff changeset
286 OUTPUT_VARIABLE CONFIG_OUTPUT)
anatofuz
parents:
diff changeset
287 if(NOT HAD_ERROR)
anatofuz
parents:
diff changeset
288 string(STRIP "${CONFIG_OUTPUT}" LLVM_CMAKE_PATH_FROM_LLVM_CONFIG)
anatofuz
parents:
diff changeset
289 file(TO_CMAKE_PATH ${LLVM_CMAKE_PATH_FROM_LLVM_CONFIG} LLVM_CMAKE_PATH)
anatofuz
parents:
diff changeset
290 else()
anatofuz
parents:
diff changeset
291 file(TO_CMAKE_PATH ${LLVM_BINARY_DIR} LLVM_BINARY_DIR_CMAKE_STYLE)
anatofuz
parents:
diff changeset
292 set(LLVM_CMAKE_PATH "${LLVM_BINARY_DIR_CMAKE_STYLE}/lib${LLVM_LIBDIR_SUFFIX}/cmake/llvm")
anatofuz
parents:
diff changeset
293 endif()
anatofuz
parents:
diff changeset
294
anatofuz
parents:
diff changeset
295 list(APPEND CMAKE_MODULE_PATH "${LLVM_CMAKE_PATH}")
anatofuz
parents:
diff changeset
296 # Get some LLVM variables from LLVMConfig.
anatofuz
parents:
diff changeset
297 include("${LLVM_CMAKE_PATH}/LLVMConfig.cmake")
anatofuz
parents:
diff changeset
298
anatofuz
parents:
diff changeset
299 set(LLVM_LIBRARY_OUTPUT_INTDIR
anatofuz
parents:
diff changeset
300 ${LLVM_BINARY_DIR}/${CMAKE_CFG_INTDIR}/lib${LLVM_LIBDIR_SUFFIX})
anatofuz
parents:
diff changeset
301 endif()
anatofuz
parents:
diff changeset
302 endmacro()
anatofuz
parents:
diff changeset
303
anatofuz
parents:
diff changeset
304 macro(construct_compiler_rt_default_triple)
anatofuz
parents:
diff changeset
305 if(COMPILER_RT_DEFAULT_TARGET_ONLY)
anatofuz
parents:
diff changeset
306 if(DEFINED COMPILER_RT_DEFAULT_TARGET_TRIPLE)
anatofuz
parents:
diff changeset
307 message(FATAL_ERROR "COMPILER_RT_DEFAULT_TARGET_TRIPLE isn't supported when building for default target only")
anatofuz
parents:
diff changeset
308 endif()
anatofuz
parents:
diff changeset
309 set(COMPILER_RT_DEFAULT_TARGET_TRIPLE ${CMAKE_C_COMPILER_TARGET})
anatofuz
parents:
diff changeset
310 else()
anatofuz
parents:
diff changeset
311 set(COMPILER_RT_DEFAULT_TARGET_TRIPLE ${TARGET_TRIPLE} CACHE STRING
anatofuz
parents:
diff changeset
312 "Default triple for which compiler-rt runtimes will be built.")
anatofuz
parents:
diff changeset
313 endif()
anatofuz
parents:
diff changeset
314
anatofuz
parents:
diff changeset
315 if(DEFINED COMPILER_RT_TEST_TARGET_TRIPLE)
anatofuz
parents:
diff changeset
316 # Backwards compatibility: this variable used to be called
anatofuz
parents:
diff changeset
317 # COMPILER_RT_TEST_TARGET_TRIPLE.
anatofuz
parents:
diff changeset
318 set(COMPILER_RT_DEFAULT_TARGET_TRIPLE ${COMPILER_RT_TEST_TARGET_TRIPLE})
anatofuz
parents:
diff changeset
319 endif()
anatofuz
parents:
diff changeset
320
anatofuz
parents:
diff changeset
321 string(REPLACE "-" ";" TARGET_TRIPLE_LIST ${COMPILER_RT_DEFAULT_TARGET_TRIPLE})
anatofuz
parents:
diff changeset
322 list(GET TARGET_TRIPLE_LIST 0 COMPILER_RT_DEFAULT_TARGET_ARCH)
anatofuz
parents:
diff changeset
323 # Determine if test target triple is specified explicitly, and doesn't match the
anatofuz
parents:
diff changeset
324 # default.
anatofuz
parents:
diff changeset
325 if(NOT COMPILER_RT_DEFAULT_TARGET_TRIPLE STREQUAL TARGET_TRIPLE)
anatofuz
parents:
diff changeset
326 set(COMPILER_RT_HAS_EXPLICIT_DEFAULT_TARGET_TRIPLE TRUE)
anatofuz
parents:
diff changeset
327 else()
anatofuz
parents:
diff changeset
328 set(COMPILER_RT_HAS_EXPLICIT_DEFAULT_TARGET_TRIPLE FALSE)
anatofuz
parents:
diff changeset
329 endif()
anatofuz
parents:
diff changeset
330 endmacro()
anatofuz
parents:
diff changeset
331
anatofuz
parents:
diff changeset
332 # Filter out generic versions of routines that are re-implemented in
anatofuz
parents:
diff changeset
333 # architecture specific manner. This prevents multiple definitions of the
anatofuz
parents:
diff changeset
334 # same symbols, making the symbol selection non-deterministic.
anatofuz
parents:
diff changeset
335 function(filter_builtin_sources output_var exclude_or_include excluded_list)
anatofuz
parents:
diff changeset
336 if(exclude_or_include STREQUAL "EXCLUDE")
anatofuz
parents:
diff changeset
337 set(filter_action GREATER)
anatofuz
parents:
diff changeset
338 set(filter_value -1)
anatofuz
parents:
diff changeset
339 elseif(exclude_or_include STREQUAL "INCLUDE")
anatofuz
parents:
diff changeset
340 set(filter_action LESS)
anatofuz
parents:
diff changeset
341 set(filter_value 0)
anatofuz
parents:
diff changeset
342 else()
anatofuz
parents:
diff changeset
343 message(FATAL_ERROR "filter_builtin_sources called without EXCLUDE|INCLUDE")
anatofuz
parents:
diff changeset
344 endif()
anatofuz
parents:
diff changeset
345
anatofuz
parents:
diff changeset
346 set(intermediate ${ARGN})
anatofuz
parents:
diff changeset
347 foreach (_file ${intermediate})
anatofuz
parents:
diff changeset
348 get_filename_component(_name_we ${_file} NAME_WE)
anatofuz
parents:
diff changeset
349 list(FIND ${excluded_list} ${_name_we} _found)
anatofuz
parents:
diff changeset
350 if(_found ${filter_action} ${filter_value})
anatofuz
parents:
diff changeset
351 list(REMOVE_ITEM intermediate ${_file})
anatofuz
parents:
diff changeset
352 elseif(${_file} MATCHES ".*/.*\\.S" OR ${_file} MATCHES ".*/.*\\.c")
anatofuz
parents:
diff changeset
353 get_filename_component(_name ${_file} NAME)
anatofuz
parents:
diff changeset
354 string(REPLACE ".S" ".c" _cname "${_name}")
anatofuz
parents:
diff changeset
355 list(REMOVE_ITEM intermediate ${_cname})
anatofuz
parents:
diff changeset
356 endif ()
anatofuz
parents:
diff changeset
357 endforeach ()
anatofuz
parents:
diff changeset
358 set(${output_var} ${intermediate} PARENT_SCOPE)
anatofuz
parents:
diff changeset
359 endfunction()
anatofuz
parents:
diff changeset
360
anatofuz
parents:
diff changeset
361 function(get_compiler_rt_target arch variable)
anatofuz
parents:
diff changeset
362 string(FIND ${COMPILER_RT_DEFAULT_TARGET_TRIPLE} "-" dash_index)
anatofuz
parents:
diff changeset
363 string(SUBSTRING ${COMPILER_RT_DEFAULT_TARGET_TRIPLE} ${dash_index} -1 triple_suffix)
anatofuz
parents:
diff changeset
364 if(COMPILER_RT_DEFAULT_TARGET_ONLY)
anatofuz
parents:
diff changeset
365 # Use exact spelling when building only for the target specified to CMake.
anatofuz
parents:
diff changeset
366 set(target "${COMPILER_RT_DEFAULT_TARGET_TRIPLE}")
anatofuz
parents:
diff changeset
367 elseif(ANDROID AND ${arch} STREQUAL "i386")
anatofuz
parents:
diff changeset
368 set(target "i686${COMPILER_RT_OS_SUFFIX}${triple_suffix}")
anatofuz
parents:
diff changeset
369 else()
anatofuz
parents:
diff changeset
370 set(target "${arch}${triple_suffix}")
anatofuz
parents:
diff changeset
371 endif()
anatofuz
parents:
diff changeset
372 set(${variable} ${target} PARENT_SCOPE)
anatofuz
parents:
diff changeset
373 endfunction()
anatofuz
parents:
diff changeset
374
anatofuz
parents:
diff changeset
375 function(get_compiler_rt_install_dir arch install_dir)
anatofuz
parents:
diff changeset
376 if(LLVM_ENABLE_PER_TARGET_RUNTIME_DIR AND NOT APPLE)
anatofuz
parents:
diff changeset
377 get_compiler_rt_target(${arch} target)
anatofuz
parents:
diff changeset
378 set(${install_dir} ${COMPILER_RT_INSTALL_PATH}/lib/${target} PARENT_SCOPE)
anatofuz
parents:
diff changeset
379 else()
anatofuz
parents:
diff changeset
380 set(${install_dir} ${COMPILER_RT_LIBRARY_INSTALL_DIR} PARENT_SCOPE)
anatofuz
parents:
diff changeset
381 endif()
anatofuz
parents:
diff changeset
382 endfunction()
anatofuz
parents:
diff changeset
383
anatofuz
parents:
diff changeset
384 function(get_compiler_rt_output_dir arch output_dir)
anatofuz
parents:
diff changeset
385 if(LLVM_ENABLE_PER_TARGET_RUNTIME_DIR AND NOT APPLE)
anatofuz
parents:
diff changeset
386 get_compiler_rt_target(${arch} target)
anatofuz
parents:
diff changeset
387 set(${output_dir} ${COMPILER_RT_OUTPUT_DIR}/lib/${target} PARENT_SCOPE)
anatofuz
parents:
diff changeset
388 else()
anatofuz
parents:
diff changeset
389 set(${output_dir} ${COMPILER_RT_LIBRARY_OUTPUT_DIR} PARENT_SCOPE)
anatofuz
parents:
diff changeset
390 endif()
anatofuz
parents:
diff changeset
391 endfunction()
anatofuz
parents:
diff changeset
392
anatofuz
parents:
diff changeset
393 # compiler_rt_process_sources(
anatofuz
parents:
diff changeset
394 # <OUTPUT_VAR>
anatofuz
parents:
diff changeset
395 # <SOURCE_FILE> ...
anatofuz
parents:
diff changeset
396 # [ADDITIONAL_HEADERS <header> ...]
anatofuz
parents:
diff changeset
397 # )
anatofuz
parents:
diff changeset
398 #
anatofuz
parents:
diff changeset
399 # Process the provided sources and write the list of new sources
anatofuz
parents:
diff changeset
400 # into `<OUTPUT_VAR>`.
anatofuz
parents:
diff changeset
401 #
anatofuz
parents:
diff changeset
402 # ADDITIONAL_HEADERS - Adds the supplied header to list of sources for IDEs.
anatofuz
parents:
diff changeset
403 #
anatofuz
parents:
diff changeset
404 # This function is very similar to `llvm_process_sources()` but exists here
anatofuz
parents:
diff changeset
405 # because we need to support standalone builds of compiler-rt.
anatofuz
parents:
diff changeset
406 function(compiler_rt_process_sources OUTPUT_VAR)
anatofuz
parents:
diff changeset
407 cmake_parse_arguments(
anatofuz
parents:
diff changeset
408 ARG
anatofuz
parents:
diff changeset
409 ""
anatofuz
parents:
diff changeset
410 ""
anatofuz
parents:
diff changeset
411 "ADDITIONAL_HEADERS"
anatofuz
parents:
diff changeset
412 ${ARGN}
anatofuz
parents:
diff changeset
413 )
anatofuz
parents:
diff changeset
414 set(sources ${ARG_UNPARSED_ARGUMENTS})
anatofuz
parents:
diff changeset
415 set(headers "")
anatofuz
parents:
diff changeset
416 if (XCODE OR MSVC_IDE OR CMAKE_EXTRA_GENERATOR)
anatofuz
parents:
diff changeset
417 # For IDEs we need to tell CMake about header files.
anatofuz
parents:
diff changeset
418 # Otherwise they won't show up in UI.
anatofuz
parents:
diff changeset
419 set(headers ${ARG_ADDITIONAL_HEADERS})
anatofuz
parents:
diff changeset
420 list(LENGTH headers headers_length)
anatofuz
parents:
diff changeset
421 if (${headers_length} GREATER 0)
anatofuz
parents:
diff changeset
422 set_source_files_properties(${headers}
anatofuz
parents:
diff changeset
423 PROPERTIES HEADER_FILE_ONLY ON)
anatofuz
parents:
diff changeset
424 endif()
anatofuz
parents:
diff changeset
425 endif()
anatofuz
parents:
diff changeset
426 set("${OUTPUT_VAR}" ${sources} ${headers} PARENT_SCOPE)
anatofuz
parents:
diff changeset
427 endfunction()
anatofuz
parents:
diff changeset
428
anatofuz
parents:
diff changeset
429 # Create install targets for a library and its parent component (if specified).
anatofuz
parents:
diff changeset
430 function(add_compiler_rt_install_targets name)
anatofuz
parents:
diff changeset
431 cmake_parse_arguments(ARG "" "PARENT_TARGET" "" ${ARGN})
anatofuz
parents:
diff changeset
432
anatofuz
parents:
diff changeset
433 if(ARG_PARENT_TARGET AND NOT TARGET install-${ARG_PARENT_TARGET})
anatofuz
parents:
diff changeset
434 # The parent install target specifies the parent component to scrape up
anatofuz
parents:
diff changeset
435 # anything not installed by the individual install targets, and to handle
anatofuz
parents:
diff changeset
436 # installation when running the multi-configuration generators.
anatofuz
parents:
diff changeset
437 add_custom_target(install-${ARG_PARENT_TARGET}
anatofuz
parents:
diff changeset
438 DEPENDS ${ARG_PARENT_TARGET}
anatofuz
parents:
diff changeset
439 COMMAND "${CMAKE_COMMAND}"
anatofuz
parents:
diff changeset
440 -DCMAKE_INSTALL_COMPONENT=${ARG_PARENT_TARGET}
anatofuz
parents:
diff changeset
441 -P "${CMAKE_BINARY_DIR}/cmake_install.cmake")
anatofuz
parents:
diff changeset
442 add_custom_target(install-${ARG_PARENT_TARGET}-stripped
anatofuz
parents:
diff changeset
443 DEPENDS ${ARG_PARENT_TARGET}
anatofuz
parents:
diff changeset
444 COMMAND "${CMAKE_COMMAND}"
anatofuz
parents:
diff changeset
445 -DCMAKE_INSTALL_COMPONENT=${ARG_PARENT_TARGET}
anatofuz
parents:
diff changeset
446 -DCMAKE_INSTALL_DO_STRIP=1
anatofuz
parents:
diff changeset
447 -P "${CMAKE_BINARY_DIR}/cmake_install.cmake")
anatofuz
parents:
diff changeset
448 set_target_properties(install-${ARG_PARENT_TARGET} PROPERTIES
anatofuz
parents:
diff changeset
449 FOLDER "Compiler-RT Misc")
anatofuz
parents:
diff changeset
450 set_target_properties(install-${ARG_PARENT_TARGET}-stripped PROPERTIES
anatofuz
parents:
diff changeset
451 FOLDER "Compiler-RT Misc")
anatofuz
parents:
diff changeset
452 add_dependencies(install-compiler-rt install-${ARG_PARENT_TARGET})
anatofuz
parents:
diff changeset
453 add_dependencies(install-compiler-rt-stripped install-${ARG_PARENT_TARGET}-stripped)
anatofuz
parents:
diff changeset
454 endif()
anatofuz
parents:
diff changeset
455
anatofuz
parents:
diff changeset
456 # We only want to generate per-library install targets if you aren't using
anatofuz
parents:
diff changeset
457 # an IDE because the extra targets get cluttered in IDEs.
anatofuz
parents:
diff changeset
458 if(NOT CMAKE_CONFIGURATION_TYPES)
anatofuz
parents:
diff changeset
459 add_custom_target(install-${name}
anatofuz
parents:
diff changeset
460 DEPENDS ${name}
anatofuz
parents:
diff changeset
461 COMMAND "${CMAKE_COMMAND}"
anatofuz
parents:
diff changeset
462 -DCMAKE_INSTALL_COMPONENT=${name}
anatofuz
parents:
diff changeset
463 -P "${CMAKE_BINARY_DIR}/cmake_install.cmake")
anatofuz
parents:
diff changeset
464 add_custom_target(install-${name}-stripped
anatofuz
parents:
diff changeset
465 DEPENDS ${name}
anatofuz
parents:
diff changeset
466 COMMAND "${CMAKE_COMMAND}"
anatofuz
parents:
diff changeset
467 -DCMAKE_INSTALL_COMPONENT=${name}
anatofuz
parents:
diff changeset
468 -DCMAKE_INSTALL_DO_STRIP=1
anatofuz
parents:
diff changeset
469 -P "${CMAKE_BINARY_DIR}/cmake_install.cmake")
anatofuz
parents:
diff changeset
470 # If you have a parent target specified, we bind the new install target
anatofuz
parents:
diff changeset
471 # to the parent install target.
anatofuz
parents:
diff changeset
472 if(LIB_PARENT_TARGET)
anatofuz
parents:
diff changeset
473 add_dependencies(install-${LIB_PARENT_TARGET} install-${name})
anatofuz
parents:
diff changeset
474 add_dependencies(install-${LIB_PARENT_TARGET}-stripped install-${name}-stripped)
anatofuz
parents:
diff changeset
475 endif()
anatofuz
parents:
diff changeset
476 endif()
anatofuz
parents:
diff changeset
477 endfunction()