add_compiler_rt_component(gwp_asan)

include_directories(..)

set(GWP_ASAN_SOURCES
  common.cpp
  crash_handler.cpp
  platform_specific/common_posix.cpp
  platform_specific/guarded_pool_allocator_posix.cpp
  platform_specific/mutex_posix.cpp
  platform_specific/utilities_posix.cpp
  guarded_pool_allocator.cpp
  stack_trace_compressor.cpp
  utilities.cpp
)

set(GWP_ASAN_HEADERS
  common.h
  crash_handler.h
  definitions.h
  guarded_pool_allocator.h
  mutex.h
  options.h
  options.inc
  platform_specific/guarded_pool_allocator_fuchsia.h
  platform_specific/guarded_pool_allocator_posix.h
  platform_specific/guarded_pool_allocator_tls.h
  platform_specific/mutex_fuchsia.h
  platform_specific/mutex_posix.h
  stack_trace_compressor.h
  utilities.h
)

# Ensure that GWP-ASan meets the delegated requirements of some supporting
# allocators. Some supporting allocators (e.g. scudo standalone) cannot use any
# parts of the C++ standard library.
set(GWP_ASAN_CFLAGS ${SANITIZER_COMMON_CFLAGS} -fno-rtti -fno-exceptions
    -nostdinc++ -pthread -fno-omit-frame-pointer)
append_list_if(COMPILER_RT_HAS_FPIC_FLAG -fPIC GWP_ASAN_CFLAGS)

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

# Options parsing support is optional. This is an optional library that can be
# used by an allocator to automatically parse GwpAsan options from the
# environment variable GWP_ASAN_FLAGS, but the allocator can choose to implement
# its own options parsing and populate the Options struct itself.
set(GWP_ASAN_OPTIONS_PARSER_SOURCES
  optional/options_parser.cpp
)
set(GWP_ASAN_OPTIONS_PARSER_HEADERS
  optional/options_parser.h
  options.h
  options.inc
)
set(GWP_ASAN_BACKTRACE_HEADERS
  optional/backtrace.h
  options.h
  options.inc
)
set(GWP_ASAN_SEGV_HANDLER_HEADERS
  optional/segv_handler.h
  options.h)

set(GWP_ASAN_OPTIONS_PARSER_CFLAGS
    ${GWP_ASAN_CFLAGS})

if (COMPILER_RT_HAS_GWP_ASAN)
  foreach(arch ${GWP_ASAN_SUPPORTED_ARCH})
    add_compiler_rt_runtime(
      clang_rt.gwp_asan
      STATIC
      ARCHS ${arch}
      SOURCES ${GWP_ASAN_SOURCES}
      ADDITIONAL_HEADERS ${GWP_ASAN_HEADERS}
      CFLAGS ${GWP_ASAN_CFLAGS}
      PARENT_TARGET gwp_asan
    )
  endforeach()

  add_compiler_rt_object_libraries(RTGwpAsan
      ARCHS ${GWP_ASAN_SUPPORTED_ARCH}
      SOURCES ${GWP_ASAN_SOURCES}
      ADDITIONAL_HEADERS ${GWP_ASAN_HEADERS}
      CFLAGS ${GWP_ASAN_CFLAGS})

  add_compiler_rt_object_libraries(RTGwpAsanOptionsParser
      ARCHS ${GWP_ASAN_SUPPORTED_ARCH}
      SOURCES ${GWP_ASAN_OPTIONS_PARSER_SOURCES}
      ADDITIONAL_HEADERS ${GWP_ASAN_OPTIONS_PARSER_HEADERS}
      CFLAGS ${GWP_ASAN_OPTIONS_PARSER_CFLAGS})

  # As above, build the pre-implemented optional backtrace support libraries.
  add_compiler_rt_object_libraries(RTGwpAsanBacktraceLibc
      ARCHS ${GWP_ASAN_SUPPORTED_ARCH}
      SOURCES optional/backtrace_linux_libc.cpp
      ADDITIONAL_HEADERS ${GWP_ASAN_BACKTRACE_HEADERS}
      CFLAGS ${GWP_ASAN_CFLAGS})
  add_compiler_rt_object_libraries(RTGwpAsanSegvHandler
      ARCHS ${GWP_ASAN_SUPPORTED_ARCH}
      SOURCES optional/segv_handler_posix.cpp
      ADDITIONAL_HEADERS ${GWP_ASAN_SEGV_HANDLER_HEADERS}
      CFLAGS ${GWP_ASAN_CFLAGS})
  add_compiler_rt_object_libraries(RTGwpAsanBacktraceSanitizerCommon
      ARCHS ${GWP_ASAN_SUPPORTED_ARCH}
      SOURCES optional/backtrace_sanitizer_common.cpp
      ADDITIONAL_HEADERS ${GWP_ASAN_BACKTRACE_HEADERS}
      CFLAGS ${GWP_ASAN_CFLAGS} ${SANITIZER_COMMON_CFLAGS})
endif()

if(COMPILER_RT_INCLUDE_TESTS)
  add_subdirectory(tests)
endif()
