13cab2bb3Spatrickadd_compiler_rt_component(scudo_standalone)
23cab2bb3Spatrick
31f9cb04fSpatrickinclude_directories(../.. include)
43cab2bb3Spatrick
53cab2bb3Spatrickset(SCUDO_CFLAGS)
63cab2bb3Spatrick
73cab2bb3Spatricklist(APPEND SCUDO_CFLAGS
83cab2bb3Spatrick  -Werror=conversion
93cab2bb3Spatrick  -Wall
10*810390e3Srobert  -Wextra
11*810390e3Srobert  -pedantic
12d89ec533Spatrick  -g
133cab2bb3Spatrick  -nostdinc++)
143cab2bb3Spatrick
153cab2bb3Spatrick# Remove -stdlib= which is unused when passing -nostdinc++.
16*810390e3Srobertstring(REGEX REPLACE "-stdlib=[a-zA-Z+]*" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
173cab2bb3Spatrick
183cab2bb3Spatrickappend_list_if(COMPILER_RT_HAS_FVISIBILITY_HIDDEN_FLAG -fvisibility=hidden SCUDO_CFLAGS)
193cab2bb3Spatrick
20d89ec533Spatrickappend_list_if(COMPILER_RT_HAS_FNO_EXCEPTIONS_FLAG -fno-exceptions SCUDO_CFLAGS)
21d89ec533Spatrick
22d89ec533Spatrickappend_list_if(COMPILER_RT_HAS_WNO_PEDANTIC -Wno-pedantic SCUDO_CFLAGS)
23d89ec533Spatrick
24d89ec533Spatrick# FIXME: find cleaner way to agree with GWPAsan flags
25d89ec533Spatrickappend_list_if(COMPILER_RT_HAS_FNO_LTO_FLAG -fno-lto SCUDO_CFLAGS)
261f9cb04fSpatrick
273cab2bb3Spatrickif(COMPILER_RT_DEBUG)
28d89ec533Spatrick  list(APPEND SCUDO_CFLAGS -O0 -DSCUDO_DEBUG=1)
293cab2bb3Spatrickelse()
303cab2bb3Spatrick  list(APPEND SCUDO_CFLAGS -O3)
313cab2bb3Spatrickendif()
323cab2bb3Spatrick
333cab2bb3Spatrickset(SCUDO_LINK_FLAGS)
343cab2bb3Spatrick
353cab2bb3Spatricklist(APPEND SCUDO_LINK_FLAGS -Wl,-z,defs,-z,now,-z,relro)
363cab2bb3Spatrick
37d89ec533Spatricklist(APPEND SCUDO_LINK_FLAGS -ffunction-sections -fdata-sections -Wl,--gc-sections)
38d89ec533Spatrick
39d89ec533Spatrick# We don't use the C++ standard library, so avoid including it by mistake.
40d89ec533Spatrickappend_list_if(COMPILER_RT_HAS_NOSTDLIBXX_FLAG -nostdlib++ SCUDO_LINK_FLAGS)
41*810390e3Srobertappend_list_if(CXX_SUPPORTS_UNWINDLIB_NONE_FLAG --unwindlib=none SCUDO_LINK_FLAGS)
42*810390e3Srobert
43*810390e3Srobertif(COMPILER_RT_SCUDO_STANDALONE_SYSROOT_PATH)
44*810390e3Srobert  list(APPEND SCUDO_CFLAGS "--sysroot=${COMPILER_RT_SCUDO_STANDALONE_SYSROOT_PATH}")
45*810390e3Srobertendif()
463cab2bb3Spatrick
473cab2bb3Spatrickif(ANDROID)
483cab2bb3Spatrick  list(APPEND SCUDO_CFLAGS -fno-emulated-tls)
493cab2bb3Spatrick
503cab2bb3Spatrick# Put the shared library in the global group. For more details, see
513cab2bb3Spatrick# android-changes-for-ndk-developers.md#changes-to-library-search-order
523cab2bb3Spatrick  append_list_if(COMPILER_RT_HAS_Z_GLOBAL -Wl,-z,global SCUDO_LINK_FLAGS)
533cab2bb3Spatrickendif()
543cab2bb3Spatrick
553cab2bb3Spatrickset(SCUDO_HEADERS
563cab2bb3Spatrick  allocator_config.h
573cab2bb3Spatrick  atomic_helpers.h
583cab2bb3Spatrick  bytemap.h
593cab2bb3Spatrick  checksum.h
603cab2bb3Spatrick  chunk.h
613cab2bb3Spatrick  combined.h
62d89ec533Spatrick  common.h
633cab2bb3Spatrick  flags_parser.h
64d89ec533Spatrick  flags.h
653cab2bb3Spatrick  fuchsia.h
663cab2bb3Spatrick  internal_defs.h
673cab2bb3Spatrick  linux.h
683cab2bb3Spatrick  list.h
693cab2bb3Spatrick  local_cache.h
70d89ec533Spatrick  memtag.h
713cab2bb3Spatrick  mutex.h
72d89ec533Spatrick  options.h
733cab2bb3Spatrick  platform.h
743cab2bb3Spatrick  primary32.h
753cab2bb3Spatrick  primary64.h
763cab2bb3Spatrick  quarantine.h
773cab2bb3Spatrick  release.h
783cab2bb3Spatrick  report.h
79*810390e3Srobert  rss_limit_checker.h
803cab2bb3Spatrick  secondary.h
813cab2bb3Spatrick  size_class_map.h
82d89ec533Spatrick  stack_depot.h
833cab2bb3Spatrick  stats.h
843cab2bb3Spatrick  string_utils.h
853cab2bb3Spatrick  tsd_exclusive.h
863cab2bb3Spatrick  tsd_shared.h
87d89ec533Spatrick  tsd.h
883cab2bb3Spatrick  vector.h
893cab2bb3Spatrick  wrappers_c_checks.h
903cab2bb3Spatrick  wrappers_c.h
911f9cb04fSpatrick
921f9cb04fSpatrick  include/scudo/interface.h
933cab2bb3Spatrick  )
943cab2bb3Spatrick
953cab2bb3Spatrickset(SCUDO_SOURCES
963cab2bb3Spatrick  checksum.cpp
973cab2bb3Spatrick  common.cpp
98d89ec533Spatrick  crc32_hw.cpp
993cab2bb3Spatrick  flags_parser.cpp
100d89ec533Spatrick  flags.cpp
1013cab2bb3Spatrick  fuchsia.cpp
1023cab2bb3Spatrick  linux.cpp
1031f9cb04fSpatrick  release.cpp
1043cab2bb3Spatrick  report.cpp
105*810390e3Srobert  rss_limit_checker.cpp
1063cab2bb3Spatrick  string_utils.cpp
1073cab2bb3Spatrick  )
1083cab2bb3Spatrick
109*810390e3Srobert# Enable the necessary instruction set for scudo_crc32.cpp, if available.
110*810390e3Srobert# Newer compiler versions use -mcrc32 rather than -msse4.2.
111*810390e3Srobertif (COMPILER_RT_HAS_MCRC32_FLAG)
112*810390e3Srobert  set_source_files_properties(crc32_hw.cpp PROPERTIES COMPILE_FLAGS -mcrc32)
113*810390e3Srobertelseif (COMPILER_RT_HAS_MSSE4_2_FLAG)
1143cab2bb3Spatrick  set_source_files_properties(crc32_hw.cpp PROPERTIES COMPILE_FLAGS -msse4.2)
1153cab2bb3Spatrickendif()
1163cab2bb3Spatrick
1173cab2bb3Spatrick# Enable the AArch64 CRC32 feature for crc32_hw.cpp, if available.
1183cab2bb3Spatrick# Note that it is enabled by default starting with armv8.1-a.
1193cab2bb3Spatrickif (COMPILER_RT_HAS_MCRC_FLAG)
1203cab2bb3Spatrick  set_source_files_properties(crc32_hw.cpp PROPERTIES COMPILE_FLAGS -mcrc)
1213cab2bb3Spatrickendif()
1223cab2bb3Spatrick
1233cab2bb3Spatrickset(SCUDO_SOURCES_C_WRAPPERS
1243cab2bb3Spatrick  wrappers_c.cpp
1253cab2bb3Spatrick  )
1263cab2bb3Spatrick
1273cab2bb3Spatrickset(SCUDO_SOURCES_CXX_WRAPPERS
1283cab2bb3Spatrick  wrappers_cpp.cpp
1293cab2bb3Spatrick  )
1303cab2bb3Spatrick
1313cab2bb3Spatrickset(SCUDO_OBJECT_LIBS)
132*810390e3Srobertset(SCUDO_LINK_LIBS)
1333cab2bb3Spatrick
1341f9cb04fSpatrickif (COMPILER_RT_HAS_GWP_ASAN)
135*810390e3Srobert  if(COMPILER_RT_USE_LLVM_UNWINDER)
136*810390e3Srobert    list(APPEND SCUDO_LINK_LIBS ${COMPILER_RT_UNWINDER_LINK_LIBS} dl)
137*810390e3Srobert  elseif (COMPILER_RT_HAS_GCC_S_LIB)
138*810390e3Srobert    list(APPEND SCUDO_LINK_LIBS gcc_s)
139*810390e3Srobert  elseif (COMPILER_RT_HAS_GCC_LIB)
140*810390e3Srobert    list(APPEND SCUDO_LINK_LIBS gcc)
141*810390e3Srobert  elseif (NOT COMPILER_RT_USE_BUILTINS_LIBRARY)
142*810390e3Srobert    message(FATAL_ERROR "No suitable unwinder library")
143*810390e3Srobert  endif()
144*810390e3Srobert
145d89ec533Spatrick  add_dependencies(scudo_standalone gwp_asan)
1461f9cb04fSpatrick  list(APPEND SCUDO_OBJECT_LIBS
147d89ec533Spatrick       RTGwpAsan RTGwpAsanBacktraceLibc RTGwpAsanSegvHandler
148d89ec533Spatrick       RTGwpAsanOptionsParser)
149d89ec533Spatrick
150d89ec533Spatrick  append_list_if(COMPILER_RT_HAS_OMIT_FRAME_POINTER_FLAG -fno-omit-frame-pointer
151d89ec533Spatrick                                                         -mno-omit-leaf-frame-pointer
152d89ec533Spatrick                 SCUDO_CFLAGS)
1533cab2bb3Spatrick  list(APPEND SCUDO_CFLAGS -DGWP_ASAN_HOOKS)
154d89ec533Spatrick
1553cab2bb3Spatrickendif()
1563cab2bb3Spatrick
157*810390e3Srobertif(COMPILER_RT_BUILD_SCUDO_STANDALONE_WITH_LLVM_LIBC)
158*810390e3Srobert  include_directories(${COMPILER_RT_BINARY_DIR}/../libc/include/)
159*810390e3Srobert
160*810390e3Srobert  set(SCUDO_DEPS libc-headers)
161*810390e3Srobert
162*810390e3Srobert  list(APPEND SCUDO_CFLAGS "-ffreestanding")
163*810390e3Srobertendif()
164d89ec533Spatrick
165d89ec533Spatrickappend_list_if(COMPILER_RT_HAS_LIBPTHREAD -pthread SCUDO_LINK_FLAGS)
166d89ec533Spatrick
167d89ec533Spatrickappend_list_if(FUCHSIA zircon SCUDO_LINK_LIBS)
168d89ec533Spatrick
169*810390e3Srobertif(COMPILER_RT_DEFAULT_TARGET_ARCH MATCHES "mips|mips64|mipsel|mips64el")
170*810390e3Srobert  list(APPEND SCUDO_LINK_LIBS atomic)
171*810390e3Srobertendif()
172*810390e3Srobert
1733cab2bb3Spatrickif(COMPILER_RT_HAS_SCUDO_STANDALONE)
1743cab2bb3Spatrick  add_compiler_rt_object_libraries(RTScudoStandalone
1753cab2bb3Spatrick    ARCHS ${SCUDO_STANDALONE_SUPPORTED_ARCH}
1763cab2bb3Spatrick    SOURCES ${SCUDO_SOURCES}
1773cab2bb3Spatrick    ADDITIONAL_HEADERS ${SCUDO_HEADERS}
178*810390e3Srobert    CFLAGS ${SCUDO_CFLAGS}
179*810390e3Srobert    DEPS ${SCUDO_DEPS})
1803cab2bb3Spatrick  add_compiler_rt_object_libraries(RTScudoStandaloneCWrappers
1813cab2bb3Spatrick    ARCHS ${SCUDO_STANDALONE_SUPPORTED_ARCH}
1823cab2bb3Spatrick    SOURCES ${SCUDO_SOURCES_C_WRAPPERS}
1833cab2bb3Spatrick    ADDITIONAL_HEADERS ${SCUDO_HEADERS}
184*810390e3Srobert    CFLAGS ${SCUDO_CFLAGS}
185*810390e3Srobert    DEPS ${SCUDO_DEPS})
1863cab2bb3Spatrick  add_compiler_rt_object_libraries(RTScudoStandaloneCxxWrappers
1873cab2bb3Spatrick    ARCHS ${SCUDO_STANDALONE_SUPPORTED_ARCH}
1883cab2bb3Spatrick    SOURCES ${SCUDO_SOURCES_CXX_WRAPPERS}
1893cab2bb3Spatrick    ADDITIONAL_HEADERS ${SCUDO_HEADERS}
190*810390e3Srobert    CFLAGS ${SCUDO_CFLAGS}
191*810390e3Srobert    DEPS ${SCUDO_DEPS})
1923cab2bb3Spatrick
1933cab2bb3Spatrick  add_compiler_rt_runtime(clang_rt.scudo_standalone
1943cab2bb3Spatrick    STATIC
1953cab2bb3Spatrick    ARCHS ${SCUDO_STANDALONE_SUPPORTED_ARCH}
1963cab2bb3Spatrick    SOURCES ${SCUDO_SOURCES} ${SCUDO_SOURCES_C_WRAPPERS}
1973cab2bb3Spatrick    ADDITIONAL_HEADERS ${SCUDO_HEADERS}
1983cab2bb3Spatrick    CFLAGS ${SCUDO_CFLAGS}
199*810390e3Srobert    DEPS ${SCUDO_DEPS}
2003cab2bb3Spatrick    OBJECT_LIBS ${SCUDO_OBJECT_LIBS}
2013cab2bb3Spatrick    PARENT_TARGET scudo_standalone)
2023cab2bb3Spatrick  add_compiler_rt_runtime(clang_rt.scudo_standalone_cxx
2033cab2bb3Spatrick    STATIC
2043cab2bb3Spatrick    ARCHS ${SCUDO_STANDALONE_SUPPORTED_ARCH}
2053cab2bb3Spatrick    SOURCES ${SCUDO_SOURCES_CXX_WRAPPERS}
2063cab2bb3Spatrick    ADDITIONAL_HEADERS ${SCUDO_HEADERS}
2073cab2bb3Spatrick    CFLAGS ${SCUDO_CFLAGS}
208*810390e3Srobert    DEPS ${SCUDO_DEPS}
209d89ec533Spatrick    PARENT_TARGET scudo_standalone)
210d89ec533Spatrick
211*810390e3Srobert  if(COMPILER_RT_SCUDO_STANDALONE_BUILD_SHARED)
212d89ec533Spatrick    add_compiler_rt_runtime(clang_rt.scudo_standalone
213d89ec533Spatrick      SHARED
214d89ec533Spatrick      ARCHS ${SCUDO_STANDALONE_SUPPORTED_ARCH}
215d89ec533Spatrick      SOURCES ${SCUDO_SOURCES} ${SCUDO_SOURCES_C_WRAPPERS} ${SCUDO_SOURCES_CXX_WRAPPERS}
216d89ec533Spatrick      ADDITIONAL_HEADERS ${SCUDO_HEADERS}
217d89ec533Spatrick      CFLAGS ${SCUDO_CFLAGS}
218*810390e3Srobert      DEPS ${SCUDO_DEPS}
2193cab2bb3Spatrick      OBJECT_LIBS ${SCUDO_OBJECT_LIBS}
220d89ec533Spatrick      LINK_FLAGS ${SCUDO_LINK_FLAGS}
221d89ec533Spatrick      LINK_LIBS ${SCUDO_LINK_LIBS}
2223cab2bb3Spatrick      PARENT_TARGET scudo_standalone)
223*810390e3Srobert  endif()
2243cab2bb3Spatrick
2253cab2bb3Spatrick  add_subdirectory(benchmarks)
2263cab2bb3Spatrick  if(COMPILER_RT_INCLUDE_TESTS)
2273cab2bb3Spatrick    add_subdirectory(tests)
2283cab2bb3Spatrick  endif()
2293cab2bb3Spatrickendif()
230