1# Build for the undefined behavior sanitizer runtime support library.
2
3set(UBSAN_SOURCES
4  ubsan_diag.cc
5  ubsan_handlers.cc
6  ubsan_value.cc
7  )
8
9set(UBSAN_CXX_SOURCES
10  ubsan_handlers_cxx.cc
11  ubsan_type_hash.cc
12  )
13
14include_directories(..)
15
16set(UBSAN_CFLAGS ${SANITIZER_COMMON_CFLAGS})
17
18add_custom_target(ubsan)
19
20if(APPLE)
21  # Build universal binary on APPLE.
22  add_compiler_rt_osx_static_runtime(clang_rt.ubsan_osx
23    ARCH ${UBSAN_SUPPORTED_ARCH}
24    SOURCES ${UBSAN_SOURCES} ${UBSAN_CXX_SOURCES}
25            $<TARGET_OBJECTS:RTSanitizerCommon.osx>
26    CFLAGS ${UBSAN_CFLAGS})
27  add_dependencies(ubsan clang_rt.ubsan_osx)
28else()
29  # Build separate libraries for each target.
30  foreach(arch ${UBSAN_SUPPORTED_ARCH})
31    # Main UBSan runtime.
32    add_compiler_rt_runtime(clang_rt.ubsan-${arch} ${arch} STATIC
33      SOURCES ${UBSAN_SOURCES}
34      CFLAGS ${UBSAN_CFLAGS})
35    # C++-specific parts of UBSan runtime. Requires a C++ ABI library.
36    add_compiler_rt_runtime(clang_rt.ubsan_cxx-${arch} ${arch} STATIC
37      SOURCES ${UBSAN_CXX_SOURCES}
38      CFLAGS ${UBSAN_CFLAGS})
39    add_dependencies(ubsan
40      clang_rt.san-${arch}
41      clang_rt.ubsan-${arch}
42      clang_rt.ubsan_cxx-${arch})
43    if (UNIX AND NOT ${arch} STREQUAL "i386")
44      add_sanitizer_rt_symbols(clang_rt.ubsan-${arch} ubsan.syms.extra)
45      add_sanitizer_rt_symbols(clang_rt.ubsan_cxx-${arch} ubsan.syms.extra)
46      add_dependencies(ubsan
47        clang_rt.ubsan-${arch}-symbols
48        clang_rt.ubsan_cxx-${arch}-symbols)
49    endif()
50  endforeach()
51endif()
52
53add_dependencies(compiler-rt ubsan)
54