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
13# Implementation files for all XRay modes.
14set(XRAY_FDR_MODE_SOURCES
15  xray_fdr_flags.cpp
16  xray_fdr_logging.cpp
17  )
18
19set(XRAY_BASIC_MODE_SOURCES
20  xray_basic_flags.cpp
21  xray_basic_logging.cpp
22  )
23
24set(XRAY_PROFILING_MODE_SOURCES
25  xray_profile_collector.cpp
26  xray_profiling.cpp
27  xray_profiling_flags.cpp
28  )
29
30# Implementation files for all XRay architectures.
31set(x86_64_SOURCES
32  xray_x86_64.cpp
33  xray_trampoline_x86_64.S
34  )
35
36set(arm_SOURCES
37  xray_arm.cpp
38  xray_trampoline_arm.S
39  )
40
41set(armhf_SOURCES
42  ${arm_SOURCES}
43  )
44
45set(aarch64_SOURCES
46  xray_AArch64.cpp
47  xray_trampoline_AArch64.S
48  )
49
50set(mips_SOURCES
51  xray_mips.cpp
52  xray_trampoline_mips.S
53  )
54
55set(mipsel_SOURCES
56  xray_mips.cpp
57  xray_trampoline_mips.S
58  )
59
60set(mips64_SOURCES
61  xray_mips64.cpp
62  xray_trampoline_mips64.S
63  )
64
65set(mips64el_SOURCES
66  xray_mips64.cpp
67  xray_trampoline_mips64.S
68  )
69
70set(powerpc64le_SOURCES
71  xray_powerpc64.cpp
72  xray_trampoline_powerpc64.cpp
73  xray_trampoline_powerpc64_asm.S
74  )
75
76set(XRAY_IMPL_HEADERS
77  xray_allocator.h
78  xray_basic_flags.h
79  xray_basic_flags.inc
80  xray_basic_logging.h
81  xray_buffer_queue.h
82  xray_defs.h
83  xray_fdr_controller.h
84  xray_fdr_flags.h
85  xray_fdr_flags.inc
86  xray_fdr_log_records.h
87  xray_fdr_log_writer.h
88  xray_fdr_logging.h
89  xray_flags.h
90  xray_flags.inc
91  xray_function_call_trie.h
92  xray_interface_internal.h
93  xray_powerpc64.inc
94  xray_profile_collector.h
95  xray_profiling_flags.h
96  xray_profiling_flags.inc
97  xray_recursion_guard.h
98  xray_segmented_array.h
99  xray_tsc.h
100  xray_utils.h
101  xray_x86_64.inc
102  )
103
104# Create list of all source files for
105# consumption by tests.
106set(XRAY_ALL_SOURCE_FILES
107  ${XRAY_SOURCES}
108  ${XRAY_FDR_MODE_SOURCES}
109  ${XRAY_BASIC_MODE_SOURCES}
110  ${XRAY_PROFILING_MODE_SOURCES}
111  ${x86_64_SOURCES}
112  ${arm_SOURCES}
113  ${armhf_SOURCES}
114  ${mips_SOURCES}
115  ${mipsel_SOURCES}
116  ${mips64_SOURCES}
117  ${mips64el_SOURCES}
118  ${powerpc64le_SOURCES}
119  ${XRAY_IMPL_HEADERS}
120  )
121list(REMOVE_DUPLICATES XRAY_ALL_SOURCE_FILES)
122# Make list that uses absolute paths
123set(XRAY_ALL_SOURCE_FILES_ABS_PATHS "")
124foreach (src_file ${XRAY_ALL_SOURCE_FILES})
125  list(APPEND
126    XRAY_ALL_SOURCE_FILES_ABS_PATHS
127    "${CMAKE_CURRENT_SOURCE_DIR}/${src_file}")
128endforeach()
129
130
131# Now put it all together...
132include_directories(..)
133include_directories(../../include)
134
135set(XRAY_CFLAGS ${SANITIZER_COMMON_CFLAGS})
136set(XRAY_COMMON_DEFINITIONS XRAY_HAS_EXCEPTIONS=1)
137
138# We don't need RTTI in XRay, so turn that off.
139append_rtti_flag(OFF XRAY_CFLAGS)
140
141append_list_if(
142  COMPILER_RT_HAS_XRAY_COMPILER_FLAG XRAY_SUPPORTED=1 XRAY_COMMON_DEFINITIONS)
143append_list_if(
144  COMPILER_RT_BUILD_XRAY_NO_PREINIT XRAY_NO_PREINIT XRAY_COMMON_DEFINITIONS)
145
146add_compiler_rt_component(xray)
147
148set(XRAY_COMMON_RUNTIME_OBJECT_LIBS
149    RTSanitizerCommon
150    RTSanitizerCommonLibc)
151
152if (TARGET cxx-headers OR HAVE_LIBCXX)
153  set(XRAY_DEPS cxx-headers)
154endif()
155
156if (APPLE)
157  set(XRAY_LINK_LIBS ${SANITIZER_COMMON_LINK_LIBS})
158  add_asm_sources(XRAY_ASM_SOURCES xray_trampoline_x86_64.S)
159
160  add_weak_symbols("sanitizer_common" WEAK_SYMBOL_LINK_FLAGS)
161  add_weak_symbols("xray" WEAK_SYMBOL_LINK_FLAGS)
162
163  add_compiler_rt_object_libraries(RTXray
164    OS ${XRAY_SUPPORTED_OS}
165    ARCHS ${XRAY_SUPPORTED_ARCH}
166    SOURCES ${XRAY_SOURCES} ${x86_64_SOURCES}
167    ADDITIONAL_HEADERS ${XRAY_IMPL_HEADERS}
168    CFLAGS ${XRAY_CFLAGS}
169    DEFS ${XRAY_COMMON_DEFINITIONS}
170    DEPS ${XRAY_DEPS})
171  add_compiler_rt_object_libraries(RTXrayFDR
172    OS ${XRAY_SUPPORTED_OS}
173    ARCHS ${XRAY_SUPPORTED_ARCH}
174    SOURCES ${XRAY_FDR_MODE_SOURCES}
175    ADDITIONAL_HEADERS ${XRAY_IMPL_HEADERS}
176    CFLAGS ${XRAY_CFLAGS}
177    DEFS ${XRAY_COMMON_DEFINITIONS}
178    DEPS ${XRAY_DEPS})
179  add_compiler_rt_object_libraries(RTXrayBASIC
180    OS ${XRAY_SUPPORTED_OS}
181    ARCHS ${XRAY_SUPPORTED_ARCH}
182    SOURCES ${XRAY_BASIC_MODE_SOURCES}
183    ADDITIONAL_HEADERS ${XRAY_IMPL_HEADERS}
184    CFLAGS ${XRAY_CFLAGS}
185    DEFS ${XRAY_COMMON_DEFINITIONS}
186    DEPS ${XRAY_DEPS})
187  add_compiler_rt_object_libraries(RTXrayPROFILING
188    OS ${XRAY_SUPPORTED_OS}
189    ARCHS ${XRAY_SUPPORTED_ARCH}
190    SOURCES ${XRAY_PROFILING_MODE_SOURCES}
191    ADDITIONAL_HEADERS ${XRAY_IMPL_HEADERS}
192    CFLAGS ${XRAY_CFLAGS}
193    DEFS ${XRAY_COMMON_DEFINITIONS}
194    DEPS ${XRAY_DEPS})
195
196  # We only support running on osx for now.
197  add_compiler_rt_runtime(clang_rt.xray
198    STATIC
199    OS ${XRAY_SUPPORTED_OS}
200    ARCHS ${XRAY_SUPPORTED_ARCH}
201    OBJECT_LIBS RTXray
202                RTSanitizerCommon
203                RTSanitizerCommonLibc
204    CFLAGS ${XRAY_CFLAGS}
205    DEFS ${XRAY_COMMON_DEFINITIONS}
206    LINK_FLAGS ${SANITIZER_COMMON_LINK_FLAGS} ${WEAK_SYMBOL_LINK_FLAGS}
207    LINK_LIBS ${XRAY_LINK_LIBS}
208    PARENT_TARGET xray)
209  add_compiler_rt_runtime(clang_rt.xray-fdr
210    STATIC
211    OS ${XRAY_SUPPORTED_OS}
212    ARCHS ${XRAY_SUPPORTED_ARCH}
213    OBJECT_LIBS RTXrayFDR
214    CFLAGS ${XRAY_CFLAGS}
215    DEFS ${XRAY_COMMON_DEFINITIONS}
216    LINK_FLAGS ${SANITIZER_COMMON_LINK_FLAGS} ${WEAK_SYMBOL_LINK_FLAGS}
217    LINK_LIBS ${XRAY_LINK_LIBS}
218    PARENT_TARGET xray)
219  add_compiler_rt_runtime(clang_rt.xray-basic
220    STATIC
221    OS ${XRAY_SUPPORTED_OS}
222    ARCHS ${XRAY_SUPPORTED_ARCH}
223    OBJECT_LIBS RTXrayBASIC
224    CFLAGS ${XRAY_CFLAGS}
225    DEFS ${XRAY_COMMON_DEFINITIONS}
226    LINK_FLAGS ${SANITIZER_COMMON_LINK_FLAGS} ${WEAK_SYMBOL_LINK_FLAGS}
227    LINK_LIBS ${XRAY_LINK_LIBS}
228    PARENT_TARGET xray)
229  add_compiler_rt_runtime(clang_rt.xray-profiling
230    STATIC
231    OS ${XRAY_SUPPORTED_OS}
232    ARCHS ${XRAY_SUPPORTED_ARCH}
233    OBJECT_LIBS RTXrayPROFILING
234    CFLAGS ${XRAY_CFLAGS}
235    DEFS ${XRAY_COMMON_DEFINITIONS}
236    LINK_FLAGS ${SANITIZER_COMMON_LINK_FLAGS} ${WEAK_SYMBOL_LINK_FLAGS}
237    LINK_LIBS ${XRAY_LINK_LIBS}
238    PARENT_TARGET xray)
239else() # not Apple
240  foreach(arch ${XRAY_SUPPORTED_ARCH})
241    if(NOT CAN_TARGET_${arch})
242      continue()
243    endif()
244    add_compiler_rt_object_libraries(RTXray
245      ARCHS ${arch}
246      SOURCES ${XRAY_SOURCES} ${${arch}_SOURCES}
247      ADDITIONAL_HEADERS ${XRAY_IMPL_HEADERS}
248      CFLAGS ${XRAY_CFLAGS}
249      DEFS ${XRAY_COMMON_DEFINITIONS}
250      DEPS ${XRAY_DEPS})
251    add_compiler_rt_object_libraries(RTXrayFDR
252      ARCHS ${arch}
253      SOURCES ${XRAY_FDR_MODE_SOURCES}
254      ADDITIONAL_HEADERS ${XRAY_IMPL_HEADERS}
255      CFLAGS ${XRAY_CFLAGS}
256      DEFS ${XRAY_COMMON_DEFINITIONS}
257      DEPS ${XRAY_DEPS})
258    add_compiler_rt_object_libraries(RTXrayBASIC
259      ARCHS ${arch}
260      SOURCES ${XRAY_BASIC_MODE_SOURCES}
261      ADDITIONAL_HEADERS ${XRAY_IMPL_HEADERS}
262      CFLAGS ${XRAY_CFLAGS}
263      DEFS ${XRAY_COMMON_DEFINITIONS}
264      DEPS ${XRAY_DEPS})
265    add_compiler_rt_object_libraries(RTXrayPROFILING
266      ARCHS ${arch}
267      SOURCES ${XRAY_PROFILING_MODE_SOURCES}
268      ADDITIONAL_HEADERS ${XRAY_IMPL_HEADERS}
269      CFLAGS ${XRAY_CFLAGS}
270      DEFS ${XRAY_COMMON_DEFINITIONS}
271      DEPS ${XRAY_DEPS})
272
273    # Common XRay archive for instrumented binaries.
274    add_compiler_rt_runtime(clang_rt.xray
275     STATIC
276     ARCHS ${arch}
277     CFLAGS ${XRAY_CFLAGS}
278     DEFS ${XRAY_COMMON_DEFINITIONS}
279     OBJECT_LIBS ${XRAY_COMMON_RUNTIME_OBJECT_LIBS} RTXray
280     PARENT_TARGET xray)
281    # FDR mode runtime archive (addon for clang_rt.xray)
282    add_compiler_rt_runtime(clang_rt.xray-fdr
283      STATIC
284      ARCHS ${arch}
285      CFLAGS ${XRAY_CFLAGS}
286      DEFS ${XRAY_COMMON_DEFINITIONS}
287      OBJECT_LIBS RTXrayFDR
288      PARENT_TARGET xray)
289    # Basic mode runtime archive (addon for clang_rt.xray)
290    add_compiler_rt_runtime(clang_rt.xray-basic
291      STATIC
292      ARCHS ${arch}
293      CFLAGS ${XRAY_CFLAGS}
294      DEFS ${XRAY_COMMON_DEFINITIONS}
295      OBJECT_LIBS RTXrayBASIC
296      PARENT_TARGET xray)
297   # Profiler Mode runtime
298   add_compiler_rt_runtime(clang_rt.xray-profiling
299     STATIC
300     ARCHS ${arch}
301     CFLAGS ${XRAY_CFLAGS}
302     DEFS ${XRAY_COMMON_DEFINITIONS}
303     OBJECT_LIBS RTXrayPROFILING
304     PARENT_TARGET xray)
305  endforeach()
306endif() # not Apple
307
308if(COMPILER_RT_INCLUDE_TESTS)
309  add_subdirectory(tests)
310endif()
311