]> git.proxmox.com Git - rustc.git/blob - src/compiler-rt/cmake/Modules/SanitizerUtils.cmake
New upstream version 1.19.0+dfsg1
[rustc.git] / src / compiler-rt / cmake / Modules / SanitizerUtils.cmake
1 set(SANITIZER_GEN_DYNAMIC_LIST
2 ${COMPILER_RT_SOURCE_DIR}/lib/sanitizer_common/scripts/gen_dynamic_list.py)
3
4 set(SANITIZER_LINT_SCRIPT
5 ${COMPILER_RT_SOURCE_DIR}/lib/sanitizer_common/scripts/check_lint.sh)
6
7 # Create a target "<name>-<arch>-symbols" that would generate the list of
8 # symbols that need to be exported from sanitizer runtime "<name>". Function
9 # interceptors are exported automatically, user can also provide files with
10 # symbol names that should be exported as well.
11 # add_sanitizer_rt_symbols(<name>
12 # ARCHS <architectures>
13 # PARENT_TARGET <convenience parent target>
14 # EXTRA <files with extra symbols to export>)
15 macro(add_sanitizer_rt_symbols name)
16 cmake_parse_arguments(ARG
17 ""
18 "PARENT_TARGET"
19 "ARCHS;EXTRA"
20 ${ARGN})
21 foreach(arch ${ARG_ARCHS})
22 set(target_name ${name}-${arch})
23 set(stamp ${CMAKE_CURRENT_BINARY_DIR}/${target_name}.syms-stamp)
24 set(extra_args)
25 foreach(arg ${ARG_EXTRA})
26 list(APPEND extra_args "--extra" ${arg})
27 endforeach()
28 add_custom_command(OUTPUT ${stamp}
29 COMMAND ${PYTHON_EXECUTABLE}
30 ${SANITIZER_GEN_DYNAMIC_LIST} ${extra_args} $<TARGET_FILE:${target_name}>
31 > $<TARGET_FILE:${target_name}>.syms
32 COMMAND ${CMAKE_COMMAND} -E touch ${stamp}
33 DEPENDS ${target_name} ${SANITIZER_GEN_DYNAMIC_LIST} ${ARG_EXTRA}
34 WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
35 COMMENT "Generating exported symbols for ${target_name}"
36 VERBATIM)
37 add_custom_target(${target_name}-symbols ALL
38 DEPENDS ${stamp}
39 SOURCES ${SANITIZER_GEN_DYNAMIC_LIST} ${ARG_EXTRA})
40
41 install(FILES $<TARGET_FILE:${target_name}>.syms
42 DESTINATION ${COMPILER_RT_LIBRARY_INSTALL_DIR})
43 if(ARG_PARENT_TARGET)
44 add_dependencies(${ARG_PARENT_TARGET} ${target_name}-symbols)
45 endif()
46 endforeach()
47 endmacro()
48
49 # This function is only used on Darwin, where undefined symbols must be specified
50 # in the linker invocation.
51 function(add_weak_symbols libname link_flags)
52 file(STRINGS "${COMPILER_RT_SOURCE_DIR}/lib/${libname}/weak_symbols.txt" WEAK_SYMBOLS)
53 set(local_link_flags ${${link_flags}})
54 foreach(SYMBOL ${WEAK_SYMBOLS})
55 set(local_link_flags ${local_link_flags} -Wl,-U,${SYMBOL})
56 endforeach()
57 set(${link_flags} ${local_link_flags} PARENT_SCOPE)
58 endfunction()
59
60 macro(add_sanitizer_rt_version_list name)
61 set(vers ${CMAKE_CURRENT_BINARY_DIR}/${name}.vers)
62 cmake_parse_arguments(ARG "" "" "LIBS;EXTRA" ${ARGN})
63 set(args)
64 foreach(arg ${ARG_EXTRA})
65 list(APPEND args "--extra" ${arg})
66 endforeach()
67 foreach(arg ${ARG_LIBS})
68 list(APPEND args "$<TARGET_FILE:${arg}>")
69 endforeach()
70 add_custom_command(OUTPUT ${vers}
71 COMMAND ${PYTHON_EXECUTABLE}
72 ${SANITIZER_GEN_DYNAMIC_LIST} --version-list ${args}
73 > ${vers}
74 DEPENDS ${SANITIZER_GEN_DYNAMIC_LIST} ${ARG_EXTRA} ${ARG_LIBS}
75 WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
76 COMMENT "Generating version list for ${name}"
77 VERBATIM)
78
79 add_custom_target(${name}-version-list ALL
80 DEPENDS ${vers})
81 endmacro()
82
83 # Add target to check code style for sanitizer runtimes.
84 if(CMAKE_HOST_UNIX)
85 add_custom_target(SanitizerLintCheck
86 COMMAND env LLVM_CHECKOUT=${LLVM_MAIN_SRC_DIR} SILENT=1 TMPDIR=
87 PYTHON_EXECUTABLE=${PYTHON_EXECUTABLE}
88 COMPILER_RT=${COMPILER_RT_SOURCE_DIR}
89 ${SANITIZER_LINT_SCRIPT}
90 DEPENDS ${SANITIZER_LINT_SCRIPT}
91 COMMENT "Running lint check for sanitizer sources..."
92 VERBATIM)
93 endif()
94