add_compiler_rt_component(nsan) include_directories(..) set(NSAN_SOURCES nsan.cpp nsan_allocator.cpp nsan_flags.cpp nsan_interceptors.cpp nsan_malloc_linux.cpp nsan_new_delete.cpp nsan_stats.cpp nsan_suppressions.cpp nsan_thread.cpp ) set(NSAN_PREINIT_SOURCES nsan_preinit.cpp) set(NSAN_HEADERS nsan.h nsan_flags.h nsan_flags.inc nsan_platform.h nsan_stats.h nsan_suppressions.h ) set(NSAN_DYNAMIC_LINK_FLAGS ${SANITIZER_COMMON_LINK_FLAGS}) set(NSAN_CFLAGS ${SANITIZER_COMMON_CFLAGS}) append_rtti_flag(OFF NSAN_CFLAGS) set(NSAN_DYNAMIC_CFLAGS ${NSAN_CFLAGS}) set(NSAN_COMMON_RUNTIME_OBJECT_LIBS RTInterception RTSanitizerCommon RTSanitizerCommonLibc RTSanitizerCommonCoverage RTSanitizerCommonSymbolizer RTSanitizerCommonSymbolizerInternal RTUbsan) set(NSAN_DYNAMIC_LIBS ${COMPILER_RT_UNWINDER_LINK_LIBS} ${SANITIZER_CXX_ABI_LIBRARIES} ${SANITIZER_COMMON_LINK_LIBS}) append_list_if(COMPILER_RT_HAS_LIBDL dl NSAN_DYNAMIC_LIBS) append_list_if(COMPILER_RT_HAS_LIBRT rt NSAN_DYNAMIC_LIBS) append_list_if(COMPILER_RT_HAS_LIBM m NSAN_DYNAMIC_LIBS) append_list_if(COMPILER_RT_HAS_LIBPTHREAD pthread NSAN_DYNAMIC_LIBS) # Compile sources into an object library. add_compiler_rt_object_libraries(RTNsan_dynamic ARCHS ${NSAN_SUPPORTED_ARCH} SOURCES ${NSAN_SOURCES} ADDITIONAL_HEADERS ${NSAN_HEADERS} CFLAGS ${NSAN_CFLAGS}) if(NOT APPLE) add_compiler_rt_object_libraries(RTNsan ARCHS ${NSAN_SUPPORTED_ARCH} SOURCES ${NSAN_SOURCES} ADDITIONAL_HEADERS ${NSAN_HEADERS} CFLAGS ${NSAN_CFLAGS}) add_compiler_rt_object_libraries(RTNsan_preinit ARCHS ${NSAN_SUPPORTED_ARCH} SOURCES ${NSAN_PREINIT_SOURCES} ADDITIONAL_HEADERS ${NSAN_HEADERS} CFLAGS ${NSAN_CFLAGS}) file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/dummy.cpp "") add_compiler_rt_object_libraries(RTNsan_dynamic_version_script_dummy ARCHS ${NSAN_SUPPORTED_ARCH} SOURCES ${CMAKE_CURRENT_BINARY_DIR}/dummy.cpp CFLAGS ${NSAN_DYNAMIC_CFLAGS}) endif() add_compiler_rt_runtime( clang_rt.nsan STATIC ARCHS ${NSAN_SUPPORTED_ARCH} OBJECT_LIBS RTNsan_preinit RTNsan ${NSAN_COMMON_RUNTIME_OBJECT_LIBS} CFLAGS ${NSAN_CFLAGS} PARENT_TARGET nsan) if(NOT APPLE) foreach(arch ${NSAN_SUPPORTED_ARCH}) if (COMPILER_RT_HAS_VERSION_SCRIPT) add_sanitizer_rt_version_list(clang_rt.nsan-dynamic-${arch} LIBS clang_rt.nsan-${arch} EXTRA nsan.syms.extra) set(VERSION_SCRIPT_FLAG -Wl,--version-script,${CMAKE_CURRENT_BINARY_DIR}/clang_rt.nsan-dynamic-${arch}.vers) # The Solaris 11.4 linker supports a subset of GNU ld version scripts, # but requires a special option to enable it. if (COMPILER_RT_HAS_GNU_VERSION_SCRIPT_COMPAT) list(APPEND VERSION_SCRIPT_FLAG -Wl,-z,gnu-version-script-compat) endif() set_property(SOURCE ${CMAKE_CURRENT_BINARY_DIR}/dummy.cpp APPEND PROPERTY OBJECT_DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/clang_rt.nsan-dynamic-${arch}.vers) else() set(VERSION_SCRIPT_FLAG) endif() add_compiler_rt_runtime( clang_rt.nsan SHARED ARCHS ${arch} OBJECT_LIBS ${NSAN_COMMON_RUNTIME_OBJECT_LIBS} RTNsan_dynamic # The only purpose of RTNsan_dynamic_version_script_dummy is to # carry a dependency of the shared runtime on the version script. # Replacing it with a straightforward # add_dependencies(clang_rt.nsan-dynamic-${arch} clang_rt.nsan-dynamic-${arch}-version-list) # generates an order-only dependency in ninja. RTNsan_dynamic_version_script_dummy CFLAGS ${NSAN_DYNAMIC_CFLAGS} LINK_FLAGS ${NSAN_DYNAMIC_LINK_FLAGS} ${VERSION_SCRIPT_FLAG} LINK_LIBS ${NSAN_DYNAMIC_LIBS} PARENT_TARGET nsan) endforeach() endif() if(COMPILER_RT_INCLUDE_TESTS) add_subdirectory(tests) endif()