xref: /aosp_15_r20/external/compiler-rt/cmake/Modules/SanitizerUtils.cmake (revision 7c3d14c8b49c529e04be81a3ce6f5cc23712e4c6)
1*7c3d14c8STreehugger Robotset(SANITIZER_GEN_DYNAMIC_LIST
2*7c3d14c8STreehugger Robot  ${COMPILER_RT_SOURCE_DIR}/lib/sanitizer_common/scripts/gen_dynamic_list.py)
3*7c3d14c8STreehugger Robot
4*7c3d14c8STreehugger Robotset(SANITIZER_LINT_SCRIPT
5*7c3d14c8STreehugger Robot  ${COMPILER_RT_SOURCE_DIR}/lib/sanitizer_common/scripts/check_lint.sh)
6*7c3d14c8STreehugger Robot
7*7c3d14c8STreehugger Robot# Create a target "<name>-<arch>-symbols" that would generate the list of
8*7c3d14c8STreehugger Robot# symbols that need to be exported from sanitizer runtime "<name>". Function
9*7c3d14c8STreehugger Robot# interceptors are exported automatically, user can also provide files with
10*7c3d14c8STreehugger Robot# symbol names that should be exported as well.
11*7c3d14c8STreehugger Robot#   add_sanitizer_rt_symbols(<name>
12*7c3d14c8STreehugger Robot#                            ARCHS <architectures>
13*7c3d14c8STreehugger Robot#                            PARENT_TARGET <convenience parent target>
14*7c3d14c8STreehugger Robot#                            EXTRA <files with extra symbols to export>)
15*7c3d14c8STreehugger Robotmacro(add_sanitizer_rt_symbols name)
16*7c3d14c8STreehugger Robot  cmake_parse_arguments(ARG
17*7c3d14c8STreehugger Robot    ""
18*7c3d14c8STreehugger Robot    "PARENT_TARGET"
19*7c3d14c8STreehugger Robot    "ARCHS;EXTRA"
20*7c3d14c8STreehugger Robot    ${ARGN})
21*7c3d14c8STreehugger Robot  foreach(arch ${ARG_ARCHS})
22*7c3d14c8STreehugger Robot    set(target_name ${name}-${arch})
23*7c3d14c8STreehugger Robot    set(stamp ${CMAKE_CURRENT_BINARY_DIR}/${target_name}.syms-stamp)
24*7c3d14c8STreehugger Robot    set(extra_args)
25*7c3d14c8STreehugger Robot    foreach(arg ${ARG_EXTRA})
26*7c3d14c8STreehugger Robot      list(APPEND extra_args "--extra" ${arg})
27*7c3d14c8STreehugger Robot    endforeach()
28*7c3d14c8STreehugger Robot    add_custom_command(OUTPUT ${stamp}
29*7c3d14c8STreehugger Robot      COMMAND ${PYTHON_EXECUTABLE}
30*7c3d14c8STreehugger Robot        ${SANITIZER_GEN_DYNAMIC_LIST} ${extra_args} $<TARGET_FILE:${target_name}>
31*7c3d14c8STreehugger Robot        > $<TARGET_FILE:${target_name}>.syms
32*7c3d14c8STreehugger Robot      COMMAND ${CMAKE_COMMAND} -E touch ${stamp}
33*7c3d14c8STreehugger Robot      DEPENDS ${target_name} ${SANITIZER_GEN_DYNAMIC_LIST} ${ARG_EXTRA}
34*7c3d14c8STreehugger Robot      WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
35*7c3d14c8STreehugger Robot      COMMENT "Generating exported symbols for ${target_name}"
36*7c3d14c8STreehugger Robot      VERBATIM)
37*7c3d14c8STreehugger Robot    add_custom_target(${target_name}-symbols ALL
38*7c3d14c8STreehugger Robot      DEPENDS ${stamp}
39*7c3d14c8STreehugger Robot      SOURCES ${SANITIZER_GEN_DYNAMIC_LIST} ${ARG_EXTRA})
40*7c3d14c8STreehugger Robot
41*7c3d14c8STreehugger Robot    install(FILES $<TARGET_FILE:${target_name}>.syms
42*7c3d14c8STreehugger Robot            DESTINATION ${COMPILER_RT_LIBRARY_INSTALL_DIR})
43*7c3d14c8STreehugger Robot    if(ARG_PARENT_TARGET)
44*7c3d14c8STreehugger Robot      add_dependencies(${ARG_PARENT_TARGET} ${target_name}-symbols)
45*7c3d14c8STreehugger Robot    endif()
46*7c3d14c8STreehugger Robot  endforeach()
47*7c3d14c8STreehugger Robotendmacro()
48*7c3d14c8STreehugger Robot
49*7c3d14c8STreehugger Robotmacro(add_sanitizer_rt_version_list name)
50*7c3d14c8STreehugger Robot  set(vers ${CMAKE_CURRENT_BINARY_DIR}/${name}.vers)
51*7c3d14c8STreehugger Robot  cmake_parse_arguments(ARG "" "" "LIBS;EXTRA" ${ARGN})
52*7c3d14c8STreehugger Robot  set(args)
53*7c3d14c8STreehugger Robot  foreach(arg ${ARG_EXTRA})
54*7c3d14c8STreehugger Robot    list(APPEND args "--extra" ${arg})
55*7c3d14c8STreehugger Robot  endforeach()
56*7c3d14c8STreehugger Robot  foreach(arg ${ARG_LIBS})
57*7c3d14c8STreehugger Robot    list(APPEND args "$<TARGET_FILE:${arg}>")
58*7c3d14c8STreehugger Robot  endforeach()
59*7c3d14c8STreehugger Robot  add_custom_command(OUTPUT ${vers}
60*7c3d14c8STreehugger Robot    COMMAND ${PYTHON_EXECUTABLE}
61*7c3d14c8STreehugger Robot      ${SANITIZER_GEN_DYNAMIC_LIST} --version-list ${args}
62*7c3d14c8STreehugger Robot      > ${vers}
63*7c3d14c8STreehugger Robot    DEPENDS ${SANITIZER_GEN_DYNAMIC_LIST} ${ARG_EXTRA} ${ARG_LIBS}
64*7c3d14c8STreehugger Robot    WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
65*7c3d14c8STreehugger Robot    COMMENT "Generating version list for ${name}"
66*7c3d14c8STreehugger Robot    VERBATIM)
67*7c3d14c8STreehugger Robot
68*7c3d14c8STreehugger Robot  add_custom_target(${name}-version-list ALL
69*7c3d14c8STreehugger Robot    DEPENDS ${vers})
70*7c3d14c8STreehugger Robotendmacro()
71*7c3d14c8STreehugger Robot
72*7c3d14c8STreehugger Robot# Add target to check code style for sanitizer runtimes.
73*7c3d14c8STreehugger Robotif(CMAKE_HOST_UNIX)
74*7c3d14c8STreehugger Robot  add_custom_target(SanitizerLintCheck
75*7c3d14c8STreehugger Robot    COMMAND env LLVM_CHECKOUT=${LLVM_MAIN_SRC_DIR} SILENT=1 TMPDIR=
76*7c3d14c8STreehugger Robot      PYTHON_EXECUTABLE=${PYTHON_EXECUTABLE}
77*7c3d14c8STreehugger Robot      COMPILER_RT=${COMPILER_RT_SOURCE_DIR}
78*7c3d14c8STreehugger Robot      ${SANITIZER_LINT_SCRIPT}
79*7c3d14c8STreehugger Robot    DEPENDS ${SANITIZER_LINT_SCRIPT}
80*7c3d14c8STreehugger Robot    COMMENT "Running lint check for sanitizer sources..."
81*7c3d14c8STreehugger Robot    VERBATIM)
82*7c3d14c8STreehugger Robotendif()
83*7c3d14c8STreehugger Robot
84