add_compiler_rt_component(scudo_standalone)

include_directories(../.. include)

set(SCUDO_CFLAGS)

list(APPEND SCUDO_CFLAGS
  -Werror=conversion
  -Wall
  -Wextra
  -pedantic
  -g
  -nostdinc++)

# Remove -stdlib= which is unused when passing -nostdinc++.
string(REGEX REPLACE "-stdlib=[a-zA-Z+]*" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")

append_list_if(COMPILER_RT_HAS_FVISIBILITY_HIDDEN_FLAG -fvisibility=hidden SCUDO_CFLAGS)

append_list_if(COMPILER_RT_HAS_FNO_EXCEPTIONS_FLAG -fno-exceptions SCUDO_CFLAGS)

append_list_if(COMPILER_RT_HAS_WNO_PEDANTIC -Wno-pedantic SCUDO_CFLAGS)

# FIXME: find cleaner way to agree with GWPAsan flags
append_list_if(COMPILER_RT_HAS_FNO_LTO_FLAG -fno-lto SCUDO_CFLAGS)

if(COMPILER_RT_DEBUG)
  list(APPEND SCUDO_CFLAGS -O0 -DSCUDO_DEBUG=1)
else()
  list(APPEND SCUDO_CFLAGS -O3)
endif()

append_list_if(COMPILER_RT_HAS_WTHREAD_SAFETY_FLAG -Werror=thread-safety
  SCUDO_CFLAGS)

set(SCUDO_LINK_FLAGS)

list(APPEND SCUDO_LINK_FLAGS -Wl,-z,defs,-z,now,-z,relro)

list(APPEND SCUDO_LINK_FLAGS -ffunction-sections -fdata-sections -Wl,--gc-sections)

# We don't use the C++ standard library, so avoid including it by mistake.
append_list_if(COMPILER_RT_HAS_NOSTDLIBXX_FLAG -nostdlib++ SCUDO_LINK_FLAGS)
append_list_if(CXX_SUPPORTS_UNWINDLIB_NONE_FLAG --unwindlib=none SCUDO_LINK_FLAGS)

if(COMPILER_RT_SCUDO_STANDALONE_SYSROOT_PATH)
  list(APPEND SCUDO_CFLAGS "--sysroot=${COMPILER_RT_SCUDO_STANDALONE_SYSROOT_PATH}")
endif()

if(ANDROID)
  list(APPEND SCUDO_CFLAGS -fno-emulated-tls)

# Put the shared library in the global group. For more details, see
# android-changes-for-ndk-developers.md#changes-to-library-search-order
  append_list_if(COMPILER_RT_HAS_Z_GLOBAL -Wl,-z,global SCUDO_LINK_FLAGS)
endif()

set(SCUDO_HEADERS
  allocator_config.h
  atomic_helpers.h
  bytemap.h
  checksum.h
  chunk.h
  combined.h
  common.h
  flags_parser.h
  flags.h
  fuchsia.h
  internal_defs.h
  linux.h
  list.h
  local_cache.h
  memtag.h
  mem_map.h
  mem_map_base.h
  mutex.h
  options.h
  platform.h
  primary32.h
  primary64.h
  quarantine.h
  release.h
  report.h
  rss_limit_checker.h
  secondary.h
  size_class_map.h
  stack_depot.h
  stats.h
  string_utils.h
  timing.h
  tsd_exclusive.h
  tsd_shared.h
  tsd.h
  vector.h
  wrappers_c_checks.h
  wrappers_c.h

  include/scudo/interface.h
  )

set(SCUDO_SOURCES
  checksum.cpp
  common.cpp
  crc32_hw.cpp
  flags_parser.cpp
  flags.cpp
  fuchsia.cpp
  linux.cpp
  mem_map.cpp
  release.cpp
  report.cpp
  rss_limit_checker.cpp
  string_utils.cpp
  timing.cpp
  )

# Enable the necessary instruction set for scudo_crc32.cpp, if available.
# Newer compiler versions use -mcrc32 rather than -msse4.2.
if (COMPILER_RT_HAS_MCRC32_FLAG)
  set_source_files_properties(crc32_hw.cpp PROPERTIES COMPILE_FLAGS -mcrc32)
elseif (COMPILER_RT_HAS_MSSE4_2_FLAG)
  set_source_files_properties(crc32_hw.cpp PROPERTIES COMPILE_FLAGS -msse4.2)
endif()

# Enable the AArch64 CRC32 feature for crc32_hw.cpp, if available.
# Note that it is enabled by default starting with armv8.1-a.
if (COMPILER_RT_HAS_MCRC_FLAG)
  set_source_files_properties(crc32_hw.cpp PROPERTIES COMPILE_FLAGS -mcrc)
endif()

set(SCUDO_SOURCES_C_WRAPPERS
  wrappers_c.cpp
  )

set(SCUDO_SOURCES_CXX_WRAPPERS
  wrappers_cpp.cpp
  )

set(SCUDO_OBJECT_LIBS)
set(SCUDO_LINK_LIBS)

if (COMPILER_RT_HAS_GWP_ASAN)
  if(COMPILER_RT_USE_LLVM_UNWINDER)
    list(APPEND SCUDO_LINK_LIBS ${COMPILER_RT_UNWINDER_LINK_LIBS} dl)
  elseif (COMPILER_RT_HAS_GCC_S_LIB)
    list(APPEND SCUDO_LINK_LIBS gcc_s)
  elseif (COMPILER_RT_HAS_GCC_LIB)
    list(APPEND SCUDO_LINK_LIBS gcc)
  elseif (NOT COMPILER_RT_USE_BUILTINS_LIBRARY)
    message(FATAL_ERROR "No suitable unwinder library")
  endif()

  add_dependencies(scudo_standalone gwp_asan)
  list(APPEND SCUDO_OBJECT_LIBS
       RTGwpAsan RTGwpAsanBacktraceLibc RTGwpAsanSegvHandler
       RTGwpAsanOptionsParser)

  append_list_if(COMPILER_RT_HAS_OMIT_FRAME_POINTER_FLAG -fno-omit-frame-pointer
                                                         -mno-omit-leaf-frame-pointer
                 SCUDO_CFLAGS)
  list(APPEND SCUDO_CFLAGS -DGWP_ASAN_HOOKS)

endif()

if(COMPILER_RT_BUILD_SCUDO_STANDALONE_WITH_LLVM_LIBC)
  include_directories(${COMPILER_RT_BINARY_DIR}/../libc/include/)

  set(SCUDO_DEPS libc-headers)

  list(APPEND SCUDO_CFLAGS "-ffreestanding")
endif()

append_list_if(COMPILER_RT_HAS_LIBPTHREAD -pthread SCUDO_LINK_FLAGS)

append_list_if(FUCHSIA zircon SCUDO_LINK_LIBS)

if(COMPILER_RT_DEFAULT_TARGET_ARCH MATCHES "mips|mips64|mipsel|mips64el")
  list(APPEND SCUDO_LINK_LIBS atomic)
endif()

if(COMPILER_RT_HAS_SCUDO_STANDALONE)
  add_compiler_rt_object_libraries(RTScudoStandalone
    ARCHS ${SCUDO_STANDALONE_SUPPORTED_ARCH}
    SOURCES ${SCUDO_SOURCES}
    ADDITIONAL_HEADERS ${SCUDO_HEADERS}
    CFLAGS ${SCUDO_CFLAGS}
    DEPS ${SCUDO_DEPS})
  add_compiler_rt_object_libraries(RTScudoStandaloneCWrappers
    ARCHS ${SCUDO_STANDALONE_SUPPORTED_ARCH}
    SOURCES ${SCUDO_SOURCES_C_WRAPPERS}
    ADDITIONAL_HEADERS ${SCUDO_HEADERS}
    CFLAGS ${SCUDO_CFLAGS}
    DEPS ${SCUDO_DEPS})
  add_compiler_rt_object_libraries(RTScudoStandaloneCxxWrappers
    ARCHS ${SCUDO_STANDALONE_SUPPORTED_ARCH}
    SOURCES ${SCUDO_SOURCES_CXX_WRAPPERS}
    ADDITIONAL_HEADERS ${SCUDO_HEADERS}
    CFLAGS ${SCUDO_CFLAGS}
    DEPS ${SCUDO_DEPS})

  add_compiler_rt_runtime(clang_rt.scudo_standalone
    STATIC
    ARCHS ${SCUDO_STANDALONE_SUPPORTED_ARCH}
    SOURCES ${SCUDO_SOURCES} ${SCUDO_SOURCES_C_WRAPPERS}
    ADDITIONAL_HEADERS ${SCUDO_HEADERS}
    CFLAGS ${SCUDO_CFLAGS}
    DEPS ${SCUDO_DEPS}
    OBJECT_LIBS ${SCUDO_OBJECT_LIBS}
    PARENT_TARGET scudo_standalone)
  add_compiler_rt_runtime(clang_rt.scudo_standalone_cxx
    STATIC
    ARCHS ${SCUDO_STANDALONE_SUPPORTED_ARCH}
    SOURCES ${SCUDO_SOURCES_CXX_WRAPPERS}
    ADDITIONAL_HEADERS ${SCUDO_HEADERS}
    CFLAGS ${SCUDO_CFLAGS}
    DEPS ${SCUDO_DEPS}
    PARENT_TARGET scudo_standalone)

  if(COMPILER_RT_SCUDO_STANDALONE_BUILD_SHARED)
    add_compiler_rt_runtime(clang_rt.scudo_standalone
      SHARED
      ARCHS ${SCUDO_STANDALONE_SUPPORTED_ARCH}
      SOURCES ${SCUDO_SOURCES} ${SCUDO_SOURCES_C_WRAPPERS} ${SCUDO_SOURCES_CXX_WRAPPERS}
      ADDITIONAL_HEADERS ${SCUDO_HEADERS}
      CFLAGS ${SCUDO_CFLAGS}
      DEPS ${SCUDO_DEPS}
      OBJECT_LIBS ${SCUDO_OBJECT_LIBS}
      LINK_FLAGS ${SCUDO_LINK_FLAGS}
      LINK_LIBS ${SCUDO_LINK_LIBS}
      PARENT_TARGET scudo_standalone)
  endif()

  add_subdirectory(benchmarks)
  if(COMPILER_RT_INCLUDE_TESTS)
    add_subdirectory(tests)
  endif()
endif()
