include_directories(..)

# Runtime library sources and build flags.
set(MSAN_RTL_SOURCES
  msan.cc
  msan_allocator.cc
  msan_chained_origin_depot.cc
  msan_interceptors.cc
  msan_linux.cc
  msan_report.cc
  msan_thread.cc
  msan_poisoning.cc
  )

set(MSAN_RTL_CXX_SOURCES
  msan_new_delete.cc)

set(MSAN_RTL_HEADERS
  msan.h
  msan_allocator.h
  msan_chained_origin_depot.h
  msan_flags.h
  msan_flags.inc
  msan_interface_internal.h
  msan_origin.h
  msan_poisoning.h
  msan_report.h
  msan_thread.h)

set(MSAN_RTL_CFLAGS ${SANITIZER_COMMON_CFLAGS})
if(CMAKE_SYSTEM_NAME MATCHES "FreeBSD")
  append_list_if(COMPILER_RT_HAS_FTLS_MODEL_INITIAL_EXEC -ftls-model=initial-exec MSAN_RTL_CFLAGS)
endif()
append_rtti_flag(OFF MSAN_RTL_CFLAGS)
if(NOT CMAKE_SYSTEM_NAME MATCHES "FreeBSD")
  append_list_if(COMPILER_RT_HAS_FPIE_FLAG -fPIE MSAN_RTL_CFLAGS)
endif()
# Prevent clang from generating libc calls.
append_list_if(COMPILER_RT_HAS_FFREESTANDING_FLAG -ffreestanding MSAN_RTL_CFLAGS)

set(MSAN_RUNTIME_LIBRARIES)

# Static runtime library.
add_compiler_rt_component(msan)

foreach(arch ${MSAN_SUPPORTED_ARCH})
  add_compiler_rt_runtime(clang_rt.msan
    STATIC
    ARCHS ${arch}
    SOURCES ${MSAN_RTL_SOURCES}
            $<TARGET_OBJECTS:RTInterception.${arch}>
            $<TARGET_OBJECTS:RTSanitizerCommon.${arch}>
            $<TARGET_OBJECTS:RTSanitizerCommonLibc.${arch}>
            $<TARGET_OBJECTS:RTSanitizerCommonCoverage.${arch}>
            $<TARGET_OBJECTS:RTSanitizerCommonSymbolizer.${arch}>
            $<TARGET_OBJECTS:RTUbsan.${arch}>
    ADDITIONAL_HEADERS ${MSAN_RTL_HEADERS}
    CFLAGS ${MSAN_RTL_CFLAGS}
    PARENT_TARGET msan)
  add_compiler_rt_runtime(clang_rt.msan_cxx
    STATIC
    ARCHS ${arch}
    SOURCES ${MSAN_RTL_CXX_SOURCES}
            $<TARGET_OBJECTS:RTUbsan_cxx.${arch}>
    ADDITIONAL_HEADERS ${MSAN_RTL_HEADERS}
    CFLAGS ${MSAN_RTL_CFLAGS}
    PARENT_TARGET msan)
  list(APPEND MSAN_RUNTIME_LIBRARIES clang_rt.msan-${arch}
                                     clang_rt.msan_cxx-${arch})
  if(SANITIZER_USE_SYMBOLS)
    add_sanitizer_rt_symbols(clang_rt.msan
      ARCHS ${arch}
      EXTRA msan.syms.extra)
    add_sanitizer_rt_symbols(clang_rt.msan_cxx
      ARCHS ${arch}
      EXTRA msan.syms.extra)
    add_dependencies(msan clang_rt.msan-${arch}-symbols
                          clang_rt.msan_cxx-${arch}-symbols)
  endif()
endforeach()

add_compiler_rt_resource_file(msan_blacklist msan_blacklist.txt msan)

if(COMPILER_RT_INCLUDE_TESTS)
  add_subdirectory(tests)
endif()
