include_directories(..)

# Runtime library sources and build flags.
set(HWASAN_RTL_SOURCES
  hwasan.cpp
  hwasan_allocator.cpp
  hwasan_allocation_functions.cpp
  hwasan_dynamic_shadow.cpp
  hwasan_exceptions.cpp
  hwasan_fuchsia.cpp
  hwasan_globals.cpp
  hwasan_interceptors.cpp
  hwasan_interceptors_vfork.S
  hwasan_linux.cpp
  hwasan_memintrinsics.cpp
  hwasan_poisoning.cpp
  hwasan_report.cpp
  hwasan_setjmp_aarch64.S
  hwasan_setjmp_riscv64.S
  hwasan_setjmp_x86_64.S
  hwasan_tag_mismatch_aarch64.S
  hwasan_tag_mismatch_riscv64.S
  hwasan_thread.cpp
  hwasan_thread_list.cpp
  hwasan_type_test.cpp
  )

set(HWASAN_RTL_CXX_SOURCES
  hwasan_new_delete.cpp
  )

set(HWASAN_RTL_PREINIT_SOURCES
  hwasan_preinit.cpp
  )

set(HWASAN_RTL_HEADERS
  hwasan.h
  hwasan_allocator.h
  hwasan_dynamic_shadow.h
  hwasan_flags.h
  hwasan_flags.inc
  hwasan_globals.h
  hwasan_interface_internal.h
  hwasan_malloc_bisect.h
  hwasan_mapping.h
  hwasan_poisoning.h
  hwasan_report.h
  hwasan_thread.h
  hwasan_thread_list.h
  )

set(HWASAN_DEFINITIONS)
append_list_if(COMPILER_RT_HWASAN_WITH_INTERCEPTORS HWASAN_WITH_INTERCEPTORS=1 HWASAN_DEFINITIONS)

if(FUCHSIA)
  # Set this explicitly on Fuchsia, otherwise the default value is set to HWASAN_WITH_INTERCEPTORS.
  list(APPEND HWASAN_DEFINITIONS HWASAN_REPLACE_OPERATORS_NEW_AND_DELETE=1)
endif()

set(HWASAN_RTL_CFLAGS ${SANITIZER_COMMON_CFLAGS})
append_rtti_flag(OFF HWASAN_RTL_CFLAGS)
append_list_if(COMPILER_RT_HAS_FPIC_FLAG -fPIC HWASAN_RTL_CFLAGS)
# Prevent clang from generating libc calls.
append_list_if(COMPILER_RT_HAS_FFREESTANDING_FLAG -ffreestanding HWASAN_RTL_CFLAGS)

# Too many existing bugs, needs cleanup.
append_list_if(COMPILER_RT_HAS_WNO_FORMAT -Wno-format HWASAN_RTL_CFLAGS)

set(HWASAN_DYNAMIC_LINK_FLAGS ${SANITIZER_COMMON_LINK_FLAGS})

if(ANDROID)
# Put most Sanitizer shared libraries in the global group. For more details, see
# android-changes-for-ndk-developers.md#changes-to-library-search-order
  if (COMPILER_RT_HAS_Z_GLOBAL)
    list(APPEND HWASAN_DYNAMIC_LINK_FLAGS -Wl,-z,global)
  endif()
endif()

set(HWASAN_DYNAMIC_CFLAGS ${HWASAN_RTL_CFLAGS})
append_list_if(COMPILER_RT_HAS_FTLS_MODEL_INITIAL_EXEC
  -ftls-model=initial-exec HWASAN_DYNAMIC_CFLAGS)
append_list_if(MSVC /DEBUG HWASAN_DYNAMIC_LINK_FLAGS)

set(HWASAN_DYNAMIC_LIBS
  ${COMPILER_RT_UNWINDER_LINK_LIBS}
  ${SANITIZER_CXX_ABI_LIBRARIES}
  ${SANITIZER_COMMON_LINK_LIBS})

append_list_if(COMPILER_RT_HAS_LIBDL dl HWASAN_DYNAMIC_LIBS)
append_list_if(COMPILER_RT_HAS_LIBRT rt HWASAN_DYNAMIC_LIBS)
append_list_if(COMPILER_RT_HAS_LIBM m HWASAN_DYNAMIC_LIBS)
append_list_if(COMPILER_RT_HAS_LIBPTHREAD pthread HWASAN_DYNAMIC_LIBS)

# Static runtime library.
add_compiler_rt_component(hwasan)

add_compiler_rt_object_libraries(RTHwasan
  ARCHS ${HWASAN_SUPPORTED_ARCH}
  SOURCES ${HWASAN_RTL_SOURCES}
  ADDITIONAL_HEADERS ${HWASAN_RTL_HEADERS}
  CFLAGS ${HWASAN_RTL_CFLAGS}
  DEFS ${HWASAN_DEFINITIONS})
add_compiler_rt_object_libraries(RTHwasan_cxx
  ARCHS ${HWASAN_SUPPORTED_ARCH}
  SOURCES ${HWASAN_RTL_CXX_SOURCES}
  ADDITIONAL_HEADERS ${HWASAN_RTL_HEADERS}
  CFLAGS ${HWASAN_RTL_CFLAGS}
  DEFS ${HWASAN_DEFINITIONS})
add_compiler_rt_object_libraries(RTHwasan_dynamic
  ARCHS ${HWASAN_SUPPORTED_ARCH}
  SOURCES ${HWASAN_RTL_SOURCES} ${HWASAN_RTL_CXX_SOURCES}
  ADDITIONAL_HEADERS ${HWASAN_RTL_HEADERS}
  CFLAGS ${HWASAN_DYNAMIC_CFLAGS}
  DEFS ${HWASAN_DEFINITIONS})
add_compiler_rt_object_libraries(RTHwasan_preinit
  ARCHS ${HWASAN_SUPPORTED_ARCH}
  SOURCES ${HWASAN_RTL_PREINIT_SOURCES}
  ADDITIONAL_HEADERS ${HWASAN_RTL_HEADERS}
  CFLAGS ${HWASAN_RTL_CFLAGS}
  DEFS ${HWASAN_DEFINITIONS})

file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/dummy.cpp "")
add_compiler_rt_object_libraries(RTHwasan_dynamic_version_script_dummy
  ARCHS ${HWASAN_SUPPORTED_ARCH}
  SOURCES ${CMAKE_CURRENT_BINARY_DIR}/dummy.cpp
  CFLAGS ${HWASAN_DYNAMIC_CFLAGS}
  DEFS ${HWASAN_DEFINITIONS})

# If use_aliases is TRUE, adds the HWASan runtime built with alias support.
# Otherwise adds the runtime without alias support.
function(add_hwasan_runtimes arch use_aliases)
  set(hwasan_object_lib RTHwasan)
  set(hwasan_object_dyn_lib RTHwasan_dynamic)
  set(hwasan_runtime clang_rt.hwasan)
  set(hwasan_rtl_flags ${HWASAN_RTL_CFLAGS})
  set(hwasan_dyn_flags ${HWASAN_DYNAMIC_CFLAGS})
  if(use_aliases)
    list(APPEND hwasan_rtl_flags -DHWASAN_ALIASING_MODE)
    list(APPEND hwasan_dyn_flags -DHWASAN_ALIASING_MODE)
    add_compiler_rt_object_libraries(RTHwasanAliases
      ARCHS ${arch}
      SOURCES ${HWASAN_RTL_SOURCES}
      ADDITIONAL_HEADERS ${HWASAN_RTL_HEADERS}
      CFLAGS ${hwasan_rtl_flags}
      DEFS ${HWASAN_DEFINITIONS})
    add_compiler_rt_object_libraries(RTHwasanAliases_dynamic
      ARCHS ${arch}
      SOURCES ${HWASAN_RTL_SOURCES} ${HWASAN_RTL_CXX_SOURCES}
      ADDITIONAL_HEADERS ${HWASAN_RTL_HEADERS}
      CFLAGS ${hwasan_dyn_flags}
      DEFS ${HWASAN_DEFINITIONS})

    set(hwasan_object_lib RTHwasanAliases)
    set(hwasan_object_dyn_lib RTHwasanAliases_dynamic)
    set(hwasan_runtime clang_rt.hwasan_aliases)
  endif()
  add_compiler_rt_runtime(${hwasan_runtime}
    STATIC
    ARCHS ${arch}
    OBJECT_LIBS ${hwasan_object_lib}
                RTHwasan_preinit
                RTInterception
                RTSanitizerCommon
                RTSanitizerCommonLibc
                RTSanitizerCommonCoverage
                RTSanitizerCommonSymbolizer
                RTUbsan
    CFLAGS ${hwasan_rtl_flags}
    PARENT_TARGET hwasan)
  add_compiler_rt_runtime(${hwasan_runtime}_cxx
    STATIC
    ARCHS ${arch}
    OBJECT_LIBS RTHwasan_cxx
                RTUbsan_cxx
    CFLAGS ${hwasan_rtl_flags}
    PARENT_TARGET hwasan)

  if (UNIX)
    add_sanitizer_rt_version_list(${hwasan_runtime}-dynamic-${arch}
                                  LIBS ${hwasan_runtime}-${arch} ${hwasan_runtime}_cxx-${arch}
                                  EXTRA hwasan.syms.extra)
    set(VERSION_SCRIPT_FLAG
         -Wl,--version-script,${CMAKE_CURRENT_BINARY_DIR}/${hwasan_runtime}-dynamic-${arch}.vers)
    set_property(SOURCE
      ${CMAKE_CURRENT_BINARY_DIR}/dummy.cpp
      APPEND PROPERTY
      OBJECT_DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/${hwasan_runtime}-dynamic-${arch}.vers)
  else()
    set(VERSION_SCRIPT_FLAG)
  endif()


  add_compiler_rt_runtime(${hwasan_runtime}
    SHARED
    ARCHS ${arch}
    OBJECT_LIBS
            ${hwasan_object_dyn_lib}
            RTInterception
            RTSanitizerCommon
            RTSanitizerCommonLibc
            RTSanitizerCommonCoverage
            RTSanitizerCommonSymbolizer
            RTUbsan
            RTUbsan_cxx
            # The only purpose of RTHWAsan_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.asan-dynamic-${arch} clang_rt.asan-dynamic-${arch}-version-list)
            # generates an order-only dependency in ninja.
            RTHwasan_dynamic_version_script_dummy
    CFLAGS ${hwasan_dyn_flags}
    LINK_FLAGS ${HWASAN_DYNAMIC_LINK_FLAGS}
              ${VERSION_SCRIPT_FLAG}
    LINK_LIBS ${HWASAN_DYNAMIC_LIBS}
    DEFS ${ASAN_DYNAMIC_DEFINITIONS}
    PARENT_TARGET hwasan)

  if(SANITIZER_USE_SYMBOLS)
    add_sanitizer_rt_symbols(${hwasan_runtime}
      ARCHS ${arch}
      EXTRA hwasan.syms.extra)
    add_sanitizer_rt_symbols(${hwasan_runtime}_cxx
      ARCHS ${arch}
      EXTRA hwasan.syms.extra)
    add_dependencies(hwasan ${hwasan_runtime}-${arch}-symbols
                          ${hwasan_runtime}_cxx-${arch}-symbols)
  endif()
endfunction()

foreach(arch ${HWASAN_SUPPORTED_ARCH})
  add_hwasan_runtimes(${arch} FALSE)
  if(${arch} MATCHES "x86_64")
    add_hwasan_runtimes(${arch} TRUE)
  endif()
endforeach()

add_compiler_rt_runtime(clang_rt.hwasan-preinit
  STATIC
  ARCHS ${HWASAN_SUPPORTED_ARCH}
  OBJECT_LIBS RTHwasan_preinit
  CFLAGS ${HWASAN_RTL_CFLAGS}
  PARENT_TARGET hwasan)

add_compiler_rt_resource_file(hwasan_ignorelist hwasan_ignorelist.txt hwasan)

add_subdirectory("scripts")

# if(COMPILER_RT_INCLUDE_TESTS)
#   add_subdirectory(tests)
# endif()
