include_directories(../rtl)

add_custom_target(TsanUnitTests)
set_target_properties(TsanUnitTests PROPERTIES
  FOLDER "TSan unittests")

set(TSAN_UNITTEST_CFLAGS
  ${TSAN_CFLAGS}
  ${COMPILER_RT_TEST_CFLAGS}
  ${COMPILER_RT_GTEST_CFLAGS}
  -I${COMPILER_RT_SOURCE_DIR}/lib
  -I${COMPILER_RT_SOURCE_DIR}/lib/tsan/rtl
  -DGTEST_HAS_RTTI=0)

set(TSAN_RTL_HEADERS)
foreach (header ${TSAN_HEADERS})
  list(APPEND TSAN_RTL_HEADERS ${CMAKE_CURRENT_SOURCE_DIR}/../${header})
endforeach()

# tsan_compile(obj_list, source, arch, {headers})
macro(tsan_compile obj_list source arch)
  get_filename_component(basename ${source} NAME)
  set(output_obj "${basename}.${arch}.o")
  get_target_flags_for_arch(${arch} TARGET_CFLAGS)
  set(COMPILE_DEPS ${TSAN_RTL_HEADERS} ${ARGN})
  if(NOT COMPILER_RT_STANDALONE_BUILD)
    list(APPEND COMPILE_DEPS gtest tsan)
  endif()
  clang_compile(${output_obj} ${source}
          CFLAGS ${TSAN_UNITTEST_CFLAGS} ${TARGET_CFLAGS}
          DEPS ${COMPILE_DEPS})
  list(APPEND ${obj_list} ${output_obj})
endmacro()

macro(add_tsan_unittest testname)
  set(TSAN_TEST_ARCH ${TSAN_SUPPORTED_ARCH})
  if(APPLE)
    darwin_filter_host_archs(TSAN_SUPPORTED_ARCH TSAN_TEST_ARCH)
  endif()
  if(UNIX)
    foreach(arch ${TSAN_TEST_ARCH})
      cmake_parse_arguments(TEST "" "" "SOURCES;HEADERS" ${ARGN})
      set(TEST_OBJECTS)
      foreach(SOURCE ${TEST_SOURCES} ${COMPILER_RT_GTEST_SOURCE})
        tsan_compile(TEST_OBJECTS ${SOURCE} ${arch} ${TEST_HEADERS})
      endforeach()
      get_target_flags_for_arch(${arch} TARGET_LINK_FLAGS)
      set(TEST_DEPS ${TEST_OBJECTS})
      if(NOT COMPILER_RT_STANDALONE_BUILD)
        list(APPEND TEST_DEPS tsan)
      endif()
      if(NOT APPLE)
        # FIXME: Looks like we should link TSan with just-built runtime,
        # and not rely on -fsanitize=thread, as these tests are essentially
        # unit tests.
        add_compiler_rt_test(TsanUnitTests ${testname}
                OBJECTS ${TEST_OBJECTS}
                DEPS ${TEST_DEPS}
                LINK_FLAGS ${TARGET_LINK_FLAGS}
                           -fsanitize=thread
                           -lstdc++ -lm)
      else()
        set(TSAN_TEST_RUNTIME_OBJECTS
          $<TARGET_OBJECTS:RTTsan_dynamic.osx>
          $<TARGET_OBJECTS:RTInterception.osx>
          $<TARGET_OBJECTS:RTSanitizerCommon.osx>
          $<TARGET_OBJECTS:RTSanitizerCommonLibc.osx>
          $<TARGET_OBJECTS:RTUbsan.osx>)
        set(TSAN_TEST_RUNTIME RTTsanTest.${testname}.${arch})
        add_library(${TSAN_TEST_RUNTIME} STATIC ${TSAN_TEST_RUNTIME_OBJECTS})
        set_target_properties(${TSAN_TEST_RUNTIME} PROPERTIES
          ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})
        list(APPEND TEST_OBJECTS lib${TSAN_TEST_RUNTIME}.a)
        list(APPEND TEST_DEPS ${TSAN_TEST_RUNTIME})
        # Intentionally do *not* link with `-fsanitize=thread`. We already link
        # against a static version of the runtime, and we don't want the dynamic
        # one.
        add_compiler_rt_test(TsanUnitTests "${testname}-${arch}-Test"
                OBJECTS ${TEST_OBJECTS}
                DEPS ${TEST_DEPS}
                LINK_FLAGS ${TARGET_LINK_FLAGS}
                           -lc++)
      endif()
    endforeach()
  endif()
endmacro()

if(COMPILER_RT_CAN_EXECUTE_TESTS)
  add_subdirectory(rtl)
  add_subdirectory(unit)
endif()
