xref: /aosp_15_r20/external/compiler-rt/lib/asan/CMakeLists.txt (revision 7c3d14c8b49c529e04be81a3ce6f5cc23712e4c6)
1*7c3d14c8STreehugger Robot# Build for the AddressSanitizer runtime support library.
2*7c3d14c8STreehugger Robot
3*7c3d14c8STreehugger Robotset(ASAN_SOURCES
4*7c3d14c8STreehugger Robot  asan_allocator.cc
5*7c3d14c8STreehugger Robot  asan_activation.cc
6*7c3d14c8STreehugger Robot  asan_debugging.cc
7*7c3d14c8STreehugger Robot  asan_fake_stack.cc
8*7c3d14c8STreehugger Robot  asan_flags.cc
9*7c3d14c8STreehugger Robot  asan_globals.cc
10*7c3d14c8STreehugger Robot  asan_interceptors.cc
11*7c3d14c8STreehugger Robot  asan_linux.cc
12*7c3d14c8STreehugger Robot  asan_mac.cc
13*7c3d14c8STreehugger Robot  asan_malloc_linux.cc
14*7c3d14c8STreehugger Robot  asan_malloc_mac.cc
15*7c3d14c8STreehugger Robot  asan_malloc_win.cc
16*7c3d14c8STreehugger Robot  asan_memory_profile.cc
17*7c3d14c8STreehugger Robot  asan_poisoning.cc
18*7c3d14c8STreehugger Robot  asan_posix.cc
19*7c3d14c8STreehugger Robot  asan_report.cc
20*7c3d14c8STreehugger Robot  asan_rtl.cc
21*7c3d14c8STreehugger Robot  asan_stack.cc
22*7c3d14c8STreehugger Robot  asan_stats.cc
23*7c3d14c8STreehugger Robot  asan_suppressions.cc
24*7c3d14c8STreehugger Robot  asan_thread.cc
25*7c3d14c8STreehugger Robot  asan_win.cc)
26*7c3d14c8STreehugger Robot
27*7c3d14c8STreehugger Robotset(ASAN_CXX_SOURCES
28*7c3d14c8STreehugger Robot  asan_new_delete.cc)
29*7c3d14c8STreehugger Robot
30*7c3d14c8STreehugger Robotset(ASAN_PREINIT_SOURCES
31*7c3d14c8STreehugger Robot  asan_preinit.cc)
32*7c3d14c8STreehugger Robot
33*7c3d14c8STreehugger Robotinclude_directories(..)
34*7c3d14c8STreehugger Robot
35*7c3d14c8STreehugger Robotset(ASAN_CFLAGS ${SANITIZER_COMMON_CFLAGS})
36*7c3d14c8STreehugger Robotappend_rtti_flag(OFF ASAN_CFLAGS)
37*7c3d14c8STreehugger Robot
38*7c3d14c8STreehugger Robotset(ASAN_COMMON_DEFINITIONS
39*7c3d14c8STreehugger Robot  ASAN_HAS_EXCEPTIONS=1)
40*7c3d14c8STreehugger Robot
41*7c3d14c8STreehugger Robotset(ASAN_DYNAMIC_LINK_FLAGS)
42*7c3d14c8STreehugger Robot
43*7c3d14c8STreehugger Robotif(ANDROID)
44*7c3d14c8STreehugger Robot  list(APPEND ASAN_COMMON_DEFINITIONS
45*7c3d14c8STreehugger Robot    ASAN_LOW_MEMORY=1)
46*7c3d14c8STreehugger Robot# On Android, -z global does not do what it is documented to do.
47*7c3d14c8STreehugger Robot# On Android, -z global moves the library ahead in the lookup order,
48*7c3d14c8STreehugger Robot# placing it right after the LD_PRELOADs. This is used to compensate for the fact
49*7c3d14c8STreehugger Robot# that Android linker does not look at the dependencies of the main executable
50*7c3d14c8STreehugger Robot# that aren't dependencies of the current DSO when resolving symbols from said DSO.
51*7c3d14c8STreehugger Robot# As a net result, this allows running ASan executables without LD_PRELOAD-ing the
52*7c3d14c8STreehugger Robot# ASan runtime library.
53*7c3d14c8STreehugger Robot# The above is applicable to L MR1 or newer.
54*7c3d14c8STreehugger Robot  if (COMPILER_RT_HAS_Z_GLOBAL)
55*7c3d14c8STreehugger Robot    list(APPEND ASAN_DYNAMIC_LINK_FLAGS -Wl,-z,global)
56*7c3d14c8STreehugger Robot  endif()
57*7c3d14c8STreehugger Robotendif()
58*7c3d14c8STreehugger Robot
59*7c3d14c8STreehugger Robotset(ASAN_DYNAMIC_DEFINITIONS
60*7c3d14c8STreehugger Robot  ${ASAN_COMMON_DEFINITIONS} ASAN_DYNAMIC=1)
61*7c3d14c8STreehugger Robotappend_list_if(WIN32 INTERCEPTION_DYNAMIC_CRT ASAN_DYNAMIC_DEFINITIONS)
62*7c3d14c8STreehugger Robot
63*7c3d14c8STreehugger Robotset(ASAN_DYNAMIC_CFLAGS ${ASAN_CFLAGS})
64*7c3d14c8STreehugger Robotappend_list_if(COMPILER_RT_HAS_FTLS_MODEL_INITIAL_EXEC
65*7c3d14c8STreehugger Robot  -ftls-model=initial-exec ASAN_DYNAMIC_CFLAGS)
66*7c3d14c8STreehugger Robotappend_list_if(MSVC /DEBUG ASAN_DYNAMIC_LINK_FLAGS)
67*7c3d14c8STreehugger Robot
68*7c3d14c8STreehugger Robotappend_list_if(COMPILER_RT_HAS_LIBC c ASAN_DYNAMIC_LIBS)
69*7c3d14c8STreehugger Robotappend_list_if(COMPILER_RT_HAS_LIBDL dl ASAN_DYNAMIC_LIBS)
70*7c3d14c8STreehugger Robotappend_list_if(COMPILER_RT_HAS_LIBRT rt ASAN_DYNAMIC_LIBS)
71*7c3d14c8STreehugger Robotappend_list_if(COMPILER_RT_HAS_LIBM m ASAN_DYNAMIC_LIBS)
72*7c3d14c8STreehugger Robotappend_list_if(COMPILER_RT_HAS_LIBPTHREAD pthread ASAN_DYNAMIC_LIBS)
73*7c3d14c8STreehugger Robotappend_list_if(COMPILER_RT_HAS_LIBSTDCXX stdc++ ASAN_DYNAMIC_LIBS)
74*7c3d14c8STreehugger Robotappend_list_if(COMPILER_RT_HAS_LIBLOG log ASAN_DYNAMIC_LIBS)
75*7c3d14c8STreehugger Robot
76*7c3d14c8STreehugger Robot# Compile ASan sources into an object library.
77*7c3d14c8STreehugger Robot
78*7c3d14c8STreehugger Robotadd_compiler_rt_object_libraries(RTAsan_dynamic
79*7c3d14c8STreehugger Robot  OS ${SANITIZER_COMMON_SUPPORTED_OS}
80*7c3d14c8STreehugger Robot  ARCHS ${ASAN_SUPPORTED_ARCH}
81*7c3d14c8STreehugger Robot  SOURCES ${ASAN_SOURCES} ${ASAN_CXX_SOURCES}
82*7c3d14c8STreehugger Robot  CFLAGS ${ASAN_DYNAMIC_CFLAGS}
83*7c3d14c8STreehugger Robot  DEFS ${ASAN_DYNAMIC_DEFINITIONS})
84*7c3d14c8STreehugger Robot
85*7c3d14c8STreehugger Robotif(NOT APPLE)
86*7c3d14c8STreehugger Robot  add_compiler_rt_object_libraries(RTAsan
87*7c3d14c8STreehugger Robot    ARCHS ${ASAN_SUPPORTED_ARCH}
88*7c3d14c8STreehugger Robot    SOURCES ${ASAN_SOURCES} CFLAGS ${ASAN_CFLAGS}
89*7c3d14c8STreehugger Robot    DEFS ${ASAN_COMMON_DEFINITIONS})
90*7c3d14c8STreehugger Robot  add_compiler_rt_object_libraries(RTAsan_cxx
91*7c3d14c8STreehugger Robot    ARCHS ${ASAN_SUPPORTED_ARCH}
92*7c3d14c8STreehugger Robot    SOURCES ${ASAN_CXX_SOURCES} CFLAGS ${ASAN_CFLAGS}
93*7c3d14c8STreehugger Robot    DEFS ${ASAN_COMMON_DEFINITIONS})
94*7c3d14c8STreehugger Robot  add_compiler_rt_object_libraries(RTAsan_preinit
95*7c3d14c8STreehugger Robot    ARCHS ${ASAN_SUPPORTED_ARCH}
96*7c3d14c8STreehugger Robot    SOURCES ${ASAN_PREINIT_SOURCES} CFLAGS ${ASAN_CFLAGS}
97*7c3d14c8STreehugger Robot    DEFS ${ASAN_COMMON_DEFINITIONS})
98*7c3d14c8STreehugger Robot
99*7c3d14c8STreehugger Robot  file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/dummy.cc "")
100*7c3d14c8STreehugger Robot  add_compiler_rt_object_libraries(RTAsan_dynamic_version_script_dummy
101*7c3d14c8STreehugger Robot    ARCHS ${ASAN_SUPPORTED_ARCH}
102*7c3d14c8STreehugger Robot    SOURCES ${CMAKE_CURRENT_BINARY_DIR}/dummy.cc
103*7c3d14c8STreehugger Robot    CFLAGS ${ASAN_DYNAMIC_CFLAGS}
104*7c3d14c8STreehugger Robot    DEFS ${ASAN_DYNAMIC_DEFINITIONS})
105*7c3d14c8STreehugger Robotendif()
106*7c3d14c8STreehugger Robot
107*7c3d14c8STreehugger Robot# Build ASan runtimes shipped with Clang.
108*7c3d14c8STreehugger Robotadd_custom_target(asan)
109*7c3d14c8STreehugger Robotset_target_properties(asan PROPERTIES FOLDER "Compiler-RT Misc")
110*7c3d14c8STreehugger Robot
111*7c3d14c8STreehugger Robotif(APPLE)
112*7c3d14c8STreehugger Robot  add_compiler_rt_runtime(clang_rt.asan
113*7c3d14c8STreehugger Robot    SHARED
114*7c3d14c8STreehugger Robot    OS ${SANITIZER_COMMON_SUPPORTED_OS}
115*7c3d14c8STreehugger Robot    ARCHS ${ASAN_SUPPORTED_ARCH}
116*7c3d14c8STreehugger Robot    OBJECT_LIBS RTAsan_dynamic
117*7c3d14c8STreehugger Robot                RTInterception
118*7c3d14c8STreehugger Robot                RTSanitizerCommon
119*7c3d14c8STreehugger Robot                RTSanitizerCommonLibc
120*7c3d14c8STreehugger Robot                RTLSanCommon
121*7c3d14c8STreehugger Robot                RTUbsan
122*7c3d14c8STreehugger Robot    CFLAGS ${ASAN_DYNAMIC_CFLAGS}
123*7c3d14c8STreehugger Robot    DEFS ${ASAN_DYNAMIC_DEFINITIONS}
124*7c3d14c8STreehugger Robot    PARENT_TARGET asan)
125*7c3d14c8STreehugger Robotelse()
126*7c3d14c8STreehugger Robot  # Build separate libraries for each target.
127*7c3d14c8STreehugger Robot
128*7c3d14c8STreehugger Robot  set(ASAN_COMMON_RUNTIME_OBJECT_LIBS
129*7c3d14c8STreehugger Robot    RTInterception
130*7c3d14c8STreehugger Robot    RTSanitizerCommon
131*7c3d14c8STreehugger Robot    RTSanitizerCommonLibc
132*7c3d14c8STreehugger Robot    RTLSanCommon
133*7c3d14c8STreehugger Robot    RTUbsan)
134*7c3d14c8STreehugger Robot
135*7c3d14c8STreehugger Robot  add_compiler_rt_runtime(clang_rt.asan
136*7c3d14c8STreehugger Robot    STATIC
137*7c3d14c8STreehugger Robot    ARCHS ${ASAN_SUPPORTED_ARCH}
138*7c3d14c8STreehugger Robot    OBJECT_LIBS RTAsan_preinit
139*7c3d14c8STreehugger Robot                RTAsan
140*7c3d14c8STreehugger Robot                ${ASAN_COMMON_RUNTIME_OBJECT_LIBS}
141*7c3d14c8STreehugger Robot    CFLAGS ${ASAN_CFLAGS}
142*7c3d14c8STreehugger Robot    DEFS ${ASAN_COMMON_DEFINITIONS}
143*7c3d14c8STreehugger Robot    PARENT_TARGET asan)
144*7c3d14c8STreehugger Robot
145*7c3d14c8STreehugger Robot  add_compiler_rt_runtime(clang_rt.asan_cxx
146*7c3d14c8STreehugger Robot    STATIC
147*7c3d14c8STreehugger Robot    ARCHS ${ASAN_SUPPORTED_ARCH}
148*7c3d14c8STreehugger Robot    OBJECT_LIBS RTAsan_cxx
149*7c3d14c8STreehugger Robot                RTUbsan_cxx
150*7c3d14c8STreehugger Robot    CFLAGS ${ASAN_CFLAGS}
151*7c3d14c8STreehugger Robot    DEFS ${ASAN_COMMON_DEFINITIONS}
152*7c3d14c8STreehugger Robot    PARENT_TARGET asan)
153*7c3d14c8STreehugger Robot
154*7c3d14c8STreehugger Robot  add_compiler_rt_runtime(clang_rt.asan-preinit
155*7c3d14c8STreehugger Robot    STATIC
156*7c3d14c8STreehugger Robot    ARCHS ${ASAN_SUPPORTED_ARCH}
157*7c3d14c8STreehugger Robot    OBJECT_LIBS RTAsan_preinit
158*7c3d14c8STreehugger Robot    CFLAGS ${ASAN_CFLAGS}
159*7c3d14c8STreehugger Robot    DEFS ${ASAN_COMMON_DEFINITIONS}
160*7c3d14c8STreehugger Robot    PARENT_TARGET asan)
161*7c3d14c8STreehugger Robot
162*7c3d14c8STreehugger Robot  foreach(arch ${ASAN_SUPPORTED_ARCH})
163*7c3d14c8STreehugger Robot    if (UNIX AND NOT ${arch} MATCHES "i386|i686")
164*7c3d14c8STreehugger Robot      add_sanitizer_rt_version_list(clang_rt.asan-dynamic-${arch}
165*7c3d14c8STreehugger Robot                                    LIBS clang_rt.asan-${arch} clang_rt.asan_cxx-${arch}
166*7c3d14c8STreehugger Robot                                    EXTRA asan.syms.extra)
167*7c3d14c8STreehugger Robot      set(VERSION_SCRIPT_FLAG
168*7c3d14c8STreehugger Robot           -Wl,--version-script,${CMAKE_CURRENT_BINARY_DIR}/clang_rt.asan-dynamic-${arch}.vers)
169*7c3d14c8STreehugger Robot      set_source_files_properties(
170*7c3d14c8STreehugger Robot        ${CMAKE_CURRENT_BINARY_DIR}/dummy.cc
171*7c3d14c8STreehugger Robot        PROPERTIES
172*7c3d14c8STreehugger Robot        OBJECT_DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/clang_rt.asan-dynamic-${arch}.vers)
173*7c3d14c8STreehugger Robot    else()
174*7c3d14c8STreehugger Robot      set(VERSION_SCRIPT_FLAG)
175*7c3d14c8STreehugger Robot    endif()
176*7c3d14c8STreehugger Robot
177*7c3d14c8STreehugger Robot    add_compiler_rt_runtime(clang_rt.asan
178*7c3d14c8STreehugger Robot      SHARED
179*7c3d14c8STreehugger Robot      ARCHS ${arch}
180*7c3d14c8STreehugger Robot      OBJECT_LIBS ${ASAN_COMMON_RUNTIME_OBJECT_LIBS}
181*7c3d14c8STreehugger Robot              RTAsan_dynamic
182*7c3d14c8STreehugger Robot              # The only purpose of RTAsan_dynamic_version_script_dummy is to carry
183*7c3d14c8STreehugger Robot              # a dependency of the shared runtime on the version script. With CMake
184*7c3d14c8STreehugger Robot              # 3.1 or later it can be replaced with a straightforward
185*7c3d14c8STreehugger Robot              # add_dependencies(clang_rt.asan-dynamic-${arch} clang_rt.asan-dynamic-${arch}-version-list)
186*7c3d14c8STreehugger Robot              RTAsan_dynamic_version_script_dummy
187*7c3d14c8STreehugger Robot              RTUbsan_cxx
188*7c3d14c8STreehugger Robot      CFLAGS ${ASAN_DYNAMIC_CFLAGS}
189*7c3d14c8STreehugger Robot      LINKFLAGS ${ASAN_DYNAMIC_LINK_FLAGS}
190*7c3d14c8STreehugger Robot                ${VERSION_SCRIPT_FLAG}
191*7c3d14c8STreehugger Robot      LINK_LIBS ${ASAN_DYNAMIC_LIBS}
192*7c3d14c8STreehugger Robot      DEFS ${ASAN_DYNAMIC_DEFINITIONS}
193*7c3d14c8STreehugger Robot      PARENT_TARGET asan)
194*7c3d14c8STreehugger Robot
195*7c3d14c8STreehugger Robot    if (UNIX AND NOT ${arch} MATCHES "i386|i686")
196*7c3d14c8STreehugger Robot      add_sanitizer_rt_symbols(clang_rt.asan_cxx
197*7c3d14c8STreehugger Robot        ARCHS ${arch})
198*7c3d14c8STreehugger Robot      add_dependencies(asan clang_rt.asan_cxx-${arch}-symbols)
199*7c3d14c8STreehugger Robot      add_sanitizer_rt_symbols(clang_rt.asan
200*7c3d14c8STreehugger Robot        ARCHS ${arch}
201*7c3d14c8STreehugger Robot        EXTRA asan.syms.extra)
202*7c3d14c8STreehugger Robot      add_dependencies(asan clang_rt.asan-${arch}-symbols)
203*7c3d14c8STreehugger Robot    endif()
204*7c3d14c8STreehugger Robot
205*7c3d14c8STreehugger Robot    if (WIN32)
206*7c3d14c8STreehugger Robot      add_compiler_rt_runtime(clang_rt.asan_dll_thunk
207*7c3d14c8STreehugger Robot        STATIC
208*7c3d14c8STreehugger Robot        ARCHS ${arch}
209*7c3d14c8STreehugger Robot        SOURCES asan_win_dll_thunk.cc
210*7c3d14c8STreehugger Robot                $<TARGET_OBJECTS:RTInterception.${arch}>
211*7c3d14c8STreehugger Robot        CFLAGS ${ASAN_CFLAGS} -DASAN_DLL_THUNK
212*7c3d14c8STreehugger Robot        DEFS ${ASAN_COMMON_DEFINITIONS}
213*7c3d14c8STreehugger Robot        PARENT_TARGET asan)
214*7c3d14c8STreehugger Robot      add_compiler_rt_runtime(clang_rt.asan_dynamic_runtime_thunk
215*7c3d14c8STreehugger Robot        STATIC
216*7c3d14c8STreehugger Robot        ARCHS ${arch}
217*7c3d14c8STreehugger Robot        SOURCES asan_win_dynamic_runtime_thunk.cc
218*7c3d14c8STreehugger Robot        CFLAGS ${ASAN_CFLAGS} -DASAN_DYNAMIC_RUNTIME_THUNK -Zl
219*7c3d14c8STreehugger Robot        DEFS ${ASAN_COMMON_DEFINITIONS}
220*7c3d14c8STreehugger Robot        PARENT_TARGET asan)
221*7c3d14c8STreehugger Robot    endif()
222*7c3d14c8STreehugger Robot  endforeach()
223*7c3d14c8STreehugger Robotendif()
224*7c3d14c8STreehugger Robot
225*7c3d14c8STreehugger Robotadd_compiler_rt_resource_file(asan_blacklist asan_blacklist.txt asan)
226*7c3d14c8STreehugger Robotadd_dependencies(compiler-rt asan)
227*7c3d14c8STreehugger Robot
228*7c3d14c8STreehugger Robotadd_subdirectory(scripts)
229*7c3d14c8STreehugger Robot
230*7c3d14c8STreehugger Robotif(COMPILER_RT_INCLUDE_TESTS)
231*7c3d14c8STreehugger Robot  add_subdirectory(tests)
232*7c3d14c8STreehugger Robotendif()
233