xref: /llvm-project/compiler-rt/lib/xray/CMakeLists.txt (revision ea76b2d8d83d6885bf5707832cbc4b7655e21b08)
1# Build for all components of the XRay runtime support library.
2
3# XRay runtime library implementation files.
4set(XRAY_SOURCES
5  xray_buffer_queue.cpp
6  xray_init.cpp
7  xray_flags.cpp
8  xray_interface.cpp
9  xray_log_interface.cpp
10  xray_utils.cpp
11  )
12
13set(XRAY_DSO_SOURCES
14  xray_dso_init.cpp
15  )
16
17# Implementation files for all XRay modes.
18set(XRAY_FDR_MODE_SOURCES
19  xray_fdr_flags.cpp
20  xray_fdr_logging.cpp
21  )
22
23set(XRAY_BASIC_MODE_SOURCES
24  xray_basic_flags.cpp
25  xray_basic_logging.cpp
26  )
27
28set(XRAY_PROFILING_MODE_SOURCES
29  xray_profile_collector.cpp
30  xray_profiling.cpp
31  xray_profiling_flags.cpp
32  )
33
34# Implementation files for all XRay architectures.
35set(x86_64_SOURCES
36  xray_x86_64.cpp
37  xray_trampoline_x86_64.S
38  )
39
40set(x86_64_DSO_SOURCES
41   xray_trampoline_x86_64.S
42   )
43
44
45set(arm_SOURCES
46  xray_arm.cpp
47  xray_trampoline_arm.S
48  )
49
50set(armhf_SOURCES
51  ${arm_SOURCES}
52  )
53
54set(aarch64_SOURCES
55  xray_AArch64.cpp
56  xray_trampoline_AArch64.S
57  )
58
59set(aarch64_DSO_SOURCES
60  xray_trampoline_AArch64.S
61  )
62
63set(loongarch64_SOURCES
64  xray_loongarch64.cpp
65  xray_trampoline_loongarch64.S
66  )
67
68set(mips_SOURCES
69  xray_mips.cpp
70  xray_trampoline_mips.S
71  )
72
73set(mipsel_SOURCES
74  xray_mips.cpp
75  xray_trampoline_mips.S
76  )
77
78set(mips64_SOURCES
79  xray_mips64.cpp
80  xray_trampoline_mips64.S
81  )
82
83set(mips64el_SOURCES
84  xray_mips64.cpp
85  xray_trampoline_mips64.S
86  )
87
88set(powerpc64le_SOURCES
89  xray_powerpc64.cpp
90  xray_trampoline_powerpc64.cpp
91  xray_trampoline_powerpc64_asm.S
92  )
93
94set(hexagon_SOURCES
95  xray_hexagon.cpp
96  xray_trampoline_hexagon.S
97  )
98
99set(riscv32_SOURCES
100  xray_riscv.cpp
101  xray_trampoline_riscv32.S
102  )
103
104set(riscv64_SOURCES
105  xray_riscv.cpp
106  xray_trampoline_riscv64.S
107  )
108
109set(XRAY_SOURCE_ARCHS
110  arm
111  armhf
112  aarch64
113  hexagon
114  mips
115  mipsel
116  mips64
117  mips64el
118  powerpc64le
119  x86_64
120  )
121
122set(XRAY_IMPL_HEADERS
123  xray_allocator.h
124  xray_basic_flags.h
125  xray_basic_flags.inc
126  xray_basic_logging.h
127  xray_buffer_queue.h
128  xray_defs.h
129  xray_fdr_controller.h
130  xray_fdr_flags.h
131  xray_fdr_flags.inc
132  xray_fdr_log_records.h
133  xray_fdr_log_writer.h
134  xray_fdr_logging.h
135  xray_flags.h
136  xray_flags.inc
137  xray_function_call_trie.h
138  xray_interface_internal.h
139  xray_powerpc64.inc
140  xray_profile_collector.h
141  xray_profiling_flags.h
142  xray_profiling_flags.inc
143  xray_recursion_guard.h
144  xray_segmented_array.h
145  xray_tsc.h
146  xray_utils.h
147  xray_x86_64.inc
148  )
149
150# Create list of all source files for
151# consumption by tests.
152set(XRAY_ALL_SOURCE_FILES
153  ${XRAY_SOURCES}
154  ${XRAY_DSO_SOURCES}
155  ${XRAY_FDR_MODE_SOURCES}
156  ${XRAY_BASIC_MODE_SOURCES}
157  ${XRAY_PROFILING_MODE_SOURCES}
158  ${x86_64_SOURCES}
159  ${x86_64_DSO_SOURCES}
160  ${arm_SOURCES}
161  ${armhf_SOURCES}
162  ${hexagon_SOURCES}
163  ${loongarch64_SOURCES}
164  ${mips_SOURCES}
165  ${mipsel_SOURCES}
166  ${mips64_SOURCES}
167  ${mips64el_SOURCES}
168  ${powerpc64le_SOURCES}
169  ${riscv32_SOURCES}
170  ${riscv64_SOURCES}
171  ${XRAY_IMPL_HEADERS}
172  )
173list(REMOVE_DUPLICATES XRAY_ALL_SOURCE_FILES)
174# Make list that uses absolute paths
175set(XRAY_ALL_SOURCE_FILES_ABS_PATHS "")
176foreach (src_file ${XRAY_ALL_SOURCE_FILES})
177  list(APPEND
178    XRAY_ALL_SOURCE_FILES_ABS_PATHS
179    "${CMAKE_CURRENT_SOURCE_DIR}/${src_file}")
180endforeach()
181
182
183# Now put it all together...
184include_directories(..)
185include_directories(../../include)
186
187set(XRAY_CFLAGS
188  ${COMPILER_RT_COMMON_CFLAGS}
189  ${COMPILER_RT_CXX_CFLAGS})
190set(XRAY_COMMON_DEFINITIONS SANITIZER_COMMON_NO_REDEFINE_BUILTINS XRAY_HAS_EXCEPTIONS=1)
191
192# DSO trampolines need to be compiled with GOT addressing
193set(XRAY_COMMON_DEFINITIONS_DSO ${XRAY_COMMON_DEFINITIONS} XRAY_PIC)
194
195# Too many existing bugs, needs cleanup.
196append_list_if(COMPILER_RT_HAS_WNO_FORMAT -Wno-format XRAY_CFLAGS)
197
198# We don't need RTTI in XRay, so turn that off.
199append_rtti_flag(OFF XRAY_CFLAGS)
200
201set(XRAY_LINK_FLAGS ${COMPILER_RT_COMMON_LINK_FLAGS})
202set(XRAY_LINK_LIBS
203  ${COMPILER_RT_UNWINDER_LINK_LIBS}
204  ${COMPILER_RT_CXX_LINK_LIBS})
205
206append_list_if(
207  COMPILER_RT_HAS_XRAY_COMPILER_FLAG XRAY_SUPPORTED=1 XRAY_COMMON_DEFINITIONS)
208append_list_if(
209  COMPILER_RT_BUILD_XRAY_NO_PREINIT XRAY_NO_PREINIT XRAY_COMMON_DEFINITIONS)
210
211add_compiler_rt_component(xray)
212
213set(XRAY_COMMON_RUNTIME_OBJECT_LIBS
214    RTSanitizerCommon
215    RTSanitizerCommonLibc)
216
217# XRay uses C++ standard library headers.
218if (TARGET cxx-headers OR HAVE_LIBCXX)
219  set(XRAY_DEPS cxx-headers)
220endif()
221
222if (APPLE)
223  add_weak_symbols("sanitizer_common" WEAK_SYMBOL_LINK_FLAGS)
224  add_weak_symbols("xray" WEAK_SYMBOL_LINK_FLAGS)
225
226  add_compiler_rt_object_libraries(RTXray
227    OS ${XRAY_SUPPORTED_OS}
228    ARCHS ${XRAY_SUPPORTED_ARCH}
229    SOURCES ${XRAY_SOURCES}
230    ADDITIONAL_HEADERS ${XRAY_IMPL_HEADERS}
231    CFLAGS ${XRAY_CFLAGS}
232    DEFS ${XRAY_COMMON_DEFINITIONS}
233    DEPS ${XRAY_DEPS})
234  add_compiler_rt_object_libraries(RTXrayDSO
235    OS ${XRAY_SUPPORTED_OS}
236    ARCHS ${XRAY_DSO_SUPPORTED_ARCH}
237    SOURCES ${XRAY_DSO_SOURCES}
238    ADDITIONAL_HEADERS ${XRAY_IMPL_HEADERS}
239    CFLAGS ${XRAY_CFLAGS}
240    DEFS ${XRAY_COMMON_DEFINITIONS_DSO}
241    DEPS ${XRAY_DEPS})
242  set(XRAY_RTXRAY_ARCH_LIBS "")
243  set(XRAY_DSO_RTXRAY_ARCH_LIBS "")
244  foreach(arch ${XRAY_SUPPORTED_ARCH})
245    if(NOT ${arch} IN_LIST XRAY_SOURCE_ARCHS)
246      continue()
247    endif()
248    add_compiler_rt_object_libraries(RTXray_${arch}
249      OS ${XRAY_SUPPORTED_OS}
250      ARCHS ${arch}
251      SOURCES ${${arch}_SOURCES}
252      ADDITIONAL_HEADERS ${XRAY_IMPL_HEADERS}
253      CFLAGS ${XRAY_CFLAGS}
254      DEFS ${XRAY_COMMON_DEFINITIONS}
255      DEPS ${XRAY_DEPS})
256    list(APPEND XRAY_RTXRAY_ARCH_LIBS RTXray_${arch})
257    if (${arch} IN_LIST XRAY_DSO_SUPPORTED_ARCH)
258      add_compiler_rt_object_libraries(RTXrayDSO_${arch}
259        OS ${XRAY_SUPPORTED_OS}
260        ARCHS ${arch}
261        SOURCES ${${arch}_DSO_SOURCES}
262        ADDITIONAL_HEADERS ${XRAY_IMPL_HEADERS}
263        CFLAGS ${XRAY_CFLAGS}
264        DEFS ${XRAY_COMMON_DEFINITIONS_DSO}
265        DEPS ${XRAY_DEPS})
266      list(APPEND XRAY_DSO_RTXRAY_ARCH_LIBS RTXrayDSO_${arch})
267    endif()
268  endforeach()
269  add_compiler_rt_object_libraries(RTXrayFDR
270    OS ${XRAY_SUPPORTED_OS}
271    ARCHS ${XRAY_SUPPORTED_ARCH}
272    SOURCES ${XRAY_FDR_MODE_SOURCES}
273    ADDITIONAL_HEADERS ${XRAY_IMPL_HEADERS}
274    CFLAGS ${XRAY_CFLAGS}
275    DEFS ${XRAY_COMMON_DEFINITIONS}
276    DEPS ${XRAY_DEPS})
277  add_compiler_rt_object_libraries(RTXrayBASIC
278    OS ${XRAY_SUPPORTED_OS}
279    ARCHS ${XRAY_SUPPORTED_ARCH}
280    SOURCES ${XRAY_BASIC_MODE_SOURCES}
281    ADDITIONAL_HEADERS ${XRAY_IMPL_HEADERS}
282    CFLAGS ${XRAY_CFLAGS}
283    DEFS ${XRAY_COMMON_DEFINITIONS}
284    DEPS ${XRAY_DEPS})
285  add_compiler_rt_object_libraries(RTXrayPROFILING
286    OS ${XRAY_SUPPORTED_OS}
287    ARCHS ${XRAY_SUPPORTED_ARCH}
288    SOURCES ${XRAY_PROFILING_MODE_SOURCES}
289    ADDITIONAL_HEADERS ${XRAY_IMPL_HEADERS}
290    CFLAGS ${XRAY_CFLAGS}
291    DEFS ${XRAY_COMMON_DEFINITIONS}
292    DEPS ${XRAY_DEPS})
293
294  # We only support running on osx for now.
295  add_compiler_rt_runtime(clang_rt.xray
296    STATIC
297    OS ${XRAY_SUPPORTED_OS}
298    ARCHS ${XRAY_SUPPORTED_ARCH}
299    OBJECT_LIBS ${XRAY_COMMON_RUNTIME_OBJECT_LIBS} RTXray ${XRAY_RTXRAY_ARCH_LIBS}
300    CFLAGS ${XRAY_CFLAGS}
301    DEFS ${XRAY_COMMON_DEFINITIONS}
302    LINK_FLAGS ${XRAY_LINK_FLAGS} ${WEAK_SYMBOL_LINK_FLAGS}
303    LINK_LIBS ${XRAY_LINK_LIBS}
304    PARENT_TARGET xray)
305  add_compiler_rt_runtime(clang_rt.xray-dso
306    STATIC
307    OS ${XRAY_SUPPORTED_OS}
308    ARCHS ${XRAY_DSO_SUPPORTED_ARCH}
309    OBJECT_LIBS RTXrayDSO ${XRAY_DSO_RTXRAY_ARCH_LIBS}
310    CFLAGS ${XRAY_CFLAGS}
311    DEFS ${XRAY_COMMON_DEFINITIONS}
312    LINK_FLAGS ${XRAY_LINK_FLAGS} ${WEAK_SYMBOL_LINK_FLAGS}
313    LINK_LIBS ${XRAY_LINK_LIBS}
314    PARENT_TARGET xray)
315
316  add_compiler_rt_runtime(clang_rt.xray-fdr
317    STATIC
318    OS ${XRAY_SUPPORTED_OS}
319    ARCHS ${XRAY_SUPPORTED_ARCH}
320    OBJECT_LIBS RTXrayFDR
321    CFLAGS ${XRAY_CFLAGS}
322    DEFS ${XRAY_COMMON_DEFINITIONS}
323    LINK_FLAGS ${XRAY_LINK_FLAGS} ${WEAK_SYMBOL_LINK_FLAGS}
324    LINK_LIBS ${XRAY_LINK_LIBS}
325    PARENT_TARGET xray)
326  add_compiler_rt_runtime(clang_rt.xray-basic
327    STATIC
328    OS ${XRAY_SUPPORTED_OS}
329    ARCHS ${XRAY_SUPPORTED_ARCH}
330    OBJECT_LIBS RTXrayBASIC
331    CFLAGS ${XRAY_CFLAGS}
332    DEFS ${XRAY_COMMON_DEFINITIONS}
333    LINK_FLAGS ${XRAY_LINK_FLAGS} ${WEAK_SYMBOL_LINK_FLAGS}
334    LINK_LIBS ${XRAY_LINK_LIBS}
335    PARENT_TARGET xray)
336  add_compiler_rt_runtime(clang_rt.xray-profiling
337    STATIC
338    OS ${XRAY_SUPPORTED_OS}
339    ARCHS ${XRAY_SUPPORTED_ARCH}
340    OBJECT_LIBS RTXrayPROFILING
341    CFLAGS ${XRAY_CFLAGS}
342    DEFS ${XRAY_COMMON_DEFINITIONS}
343    LINK_FLAGS ${XRAY_LINK_FLAGS} ${WEAK_SYMBOL_LINK_FLAGS}
344    LINK_LIBS ${XRAY_LINK_LIBS}
345    PARENT_TARGET xray)
346else() # not Apple
347  foreach(arch ${XRAY_SUPPORTED_ARCH})
348    if(NOT CAN_TARGET_${arch})
349      continue()
350    endif()
351    add_compiler_rt_object_libraries(RTXray
352      ARCHS ${arch}
353      SOURCES ${XRAY_SOURCES} ${${arch}_SOURCES}
354      ADDITIONAL_HEADERS ${XRAY_IMPL_HEADERS}
355      CFLAGS ${XRAY_CFLAGS}
356      DEFS ${XRAY_COMMON_DEFINITIONS}
357      DEPS ${XRAY_DEPS})
358    add_compiler_rt_object_libraries(RTXrayFDR
359      ARCHS ${arch}
360      SOURCES ${XRAY_FDR_MODE_SOURCES}
361      ADDITIONAL_HEADERS ${XRAY_IMPL_HEADERS}
362      CFLAGS ${XRAY_CFLAGS}
363      DEFS ${XRAY_COMMON_DEFINITIONS}
364      DEPS ${XRAY_DEPS})
365    add_compiler_rt_object_libraries(RTXrayBASIC
366      ARCHS ${arch}
367      SOURCES ${XRAY_BASIC_MODE_SOURCES}
368      ADDITIONAL_HEADERS ${XRAY_IMPL_HEADERS}
369      CFLAGS ${XRAY_CFLAGS}
370      DEFS ${XRAY_COMMON_DEFINITIONS}
371      DEPS ${XRAY_DEPS})
372    add_compiler_rt_object_libraries(RTXrayPROFILING
373      ARCHS ${arch}
374      SOURCES ${XRAY_PROFILING_MODE_SOURCES}
375      ADDITIONAL_HEADERS ${XRAY_IMPL_HEADERS}
376      CFLAGS ${XRAY_CFLAGS}
377      DEFS ${XRAY_COMMON_DEFINITIONS}
378      DEPS ${XRAY_DEPS})
379
380    # Common XRay archive for instrumented binaries.
381    add_compiler_rt_runtime(clang_rt.xray
382     STATIC
383     ARCHS ${arch}
384     CFLAGS ${XRAY_CFLAGS}
385     LINK_FLAGS ${XRAY_LINK_FLAGS}
386     LINK_LIBS ${XRAY_LINK_LIBS}
387     DEFS ${XRAY_COMMON_DEFINITIONS}
388     OBJECT_LIBS ${XRAY_COMMON_RUNTIME_OBJECT_LIBS} RTXray
389     PARENT_TARGET xray)
390    # FDR mode runtime archive (addon for clang_rt.xray)
391    add_compiler_rt_runtime(clang_rt.xray-fdr
392      STATIC
393      ARCHS ${arch}
394      CFLAGS ${XRAY_CFLAGS}
395      LINK_FLAGS ${XRAY_LINK_FLAGS}
396      LINK_LIBS ${XRAY_LINK_LIBS}
397      DEFS ${XRAY_COMMON_DEFINITIONS}
398      OBJECT_LIBS RTXrayFDR
399      PARENT_TARGET xray)
400    # Basic mode runtime archive (addon for clang_rt.xray)
401    add_compiler_rt_runtime(clang_rt.xray-basic
402      STATIC
403      ARCHS ${arch}
404      CFLAGS ${XRAY_CFLAGS}
405      LINK_FLAGS ${XRAY_LINK_FLAGS}
406      LINK_LIBS ${XRAY_LINK_LIBS}
407      DEFS ${XRAY_COMMON_DEFINITIONS}
408      OBJECT_LIBS RTXrayBASIC
409      PARENT_TARGET xray)
410    # Profiler Mode runtime
411    add_compiler_rt_runtime(clang_rt.xray-profiling
412      STATIC
413      ARCHS ${arch}
414      CFLAGS ${XRAY_CFLAGS}
415      LINK_FLAGS ${XRAY_LINK_FLAGS}
416      LINK_LIBS ${XRAY_LINK_LIBS}
417      DEFS ${XRAY_COMMON_DEFINITIONS}
418      OBJECT_LIBS RTXrayPROFILING
419      PARENT_TARGET xray)
420
421    if (${arch} IN_LIST XRAY_DSO_SUPPORTED_ARCH)
422      add_compiler_rt_object_libraries(RTXrayDSO
423        ARCHS ${arch}
424        SOURCES ${XRAY_DSO_SOURCES} ${${arch}_DSO_SOURCES}
425        ADDITIONAL_HEADERS ${XRAY_IMPL_HEADERS}
426        CFLAGS ${XRAY_CFLAGS}
427        DEFS ${XRAY_COMMON_DEFINITIONS_DSO}
428        DEPS ${XRAY_DEPS})
429      # DSO runtime archive
430      add_compiler_rt_runtime(clang_rt.xray-dso
431        STATIC
432        ARCHS ${arch}
433        CFLAGS ${XRAY_CFLAGS}
434        LINK_FLAGS ${XRAY_LINK_FLAGS}
435        LINK_LIBS ${XRAY_LINK_LIBS}
436        DEFS ${XRAY_COMMON_DEFINITIONS}
437        OBJECT_LIBS RTXrayDSO
438        PARENT_TARGET xray)
439    endif()
440  endforeach()
441endif() # not Apple
442
443if(COMPILER_RT_INCLUDE_TESTS)
444  add_subdirectory(tests)
445endif()
446