blob: c80fc3b1eefc226b202af7d0ec42c41342554629 [file] [log] [blame]
Alexey Samsonove5fa2432013-08-27 15:08:02 +00001set(SANITIZER_GEN_DYNAMIC_LIST
2 ${COMPILER_RT_SOURCE_DIR}/lib/sanitizer_common/scripts/gen_dynamic_list.py)
3
Alexey Samsonov38a61aa2013-08-29 10:49:04 +00004set(SANITIZER_LINT_SCRIPT
5 ${COMPILER_RT_SOURCE_DIR}/lib/sanitizer_common/scripts/check_lint.sh)
6
Chris Bieneman0d4ac152015-08-27 20:07:54 +00007# Create a target "<name>-<arch>-symbols" that would generate the list of
8# symbols that need to be exported from sanitizer runtime "<name>". Function
Alexey Samsonove5fa2432013-08-27 15:08:02 +00009# interceptors are exported automatically, user can also provide files with
10# symbol names that should be exported as well.
Chris Bieneman15b57502015-08-26 23:12:25 +000011# add_sanitizer_rt_symbols(<name>
Chris Bieneman0d4ac152015-08-27 20:07:54 +000012# ARCHS <architectures>
Chris Bieneman69c3a3e2015-08-27 18:27:33 +000013# PARENT_TARGET <convenience parent target>
Chris Bieneman15b57502015-08-26 23:12:25 +000014# EXTRA <files with extra symbols to export>)
Alexey Samsonove5fa2432013-08-27 15:08:02 +000015macro(add_sanitizer_rt_symbols name)
Chris Bieneman15b57502015-08-26 23:12:25 +000016 cmake_parse_arguments(ARG
17 ""
Chris Bieneman69c3a3e2015-08-27 18:27:33 +000018 "PARENT_TARGET"
Chris Bieneman0d4ac152015-08-27 20:07:54 +000019 "ARCHS;EXTRA"
Chris Bieneman15b57502015-08-26 23:12:25 +000020 ${ARGN})
Chris Bieneman0d4ac152015-08-27 20:07:54 +000021 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})
Alexey Samsonovcbac3e42014-03-04 08:28:43 +000040
Chris Bienemanc2cae062016-06-09 21:35:37 +000041 install(FILES $<TARGET_FILE:${target_name}>.syms
Chris Bieneman0d4ac152015-08-27 20:07:54 +000042 DESTINATION ${COMPILER_RT_LIBRARY_INSTALL_DIR})
Chris Bieneman0d4ac152015-08-27 20:07:54 +000043 if(ARG_PARENT_TARGET)
44 add_dependencies(${ARG_PARENT_TARGET} ${target_name}-symbols)
45 endif()
46 endforeach()
Alexey Samsonove5fa2432013-08-27 15:08:02 +000047endmacro()
Alexey Samsonov38a61aa2013-08-29 10:49:04 +000048
Francis Ricciae4b8802017-01-09 03:51:42 +000049# This function is only used on Darwin, where undefined symbols must be specified
50# in the linker invocation.
Francis Ricci9f931132017-01-10 04:33:04 +000051function(add_weak_symbols libname link_flags)
Francis Ricciae4b8802017-01-09 03:51:42 +000052 file(STRINGS "${COMPILER_RT_SOURCE_DIR}/lib/${libname}/weak_symbols.txt" WEAK_SYMBOLS)
Francis Ricci9f931132017-01-10 04:33:04 +000053 set(local_link_flags ${${link_flags}})
Francis Ricciae4b8802017-01-09 03:51:42 +000054 foreach(SYMBOL ${WEAK_SYMBOLS})
Francis Ricci9f931132017-01-10 04:33:04 +000055 set(local_link_flags ${local_link_flags} -Wl,-U,${SYMBOL})
Francis Ricciae4b8802017-01-09 03:51:42 +000056 endforeach()
Francis Ricci9f931132017-01-10 04:33:04 +000057 set(${link_flags} ${local_link_flags} PARENT_SCOPE)
Francis Ricciae4b8802017-01-09 03:51:42 +000058endfunction()
59
Evgeniy Stepanov06832412015-05-05 22:51:35 +000060macro(add_sanitizer_rt_version_list name)
61 set(vers ${CMAKE_CURRENT_BINARY_DIR}/${name}.vers)
Filipe Cabecinhasc309de72015-06-19 03:39:24 +000062 cmake_parse_arguments(ARG "" "" "LIBS;EXTRA" ${ARGN})
Evgeniy Stepanov06832412015-05-05 22:51:35 +000063 set(args)
64 foreach(arg ${ARG_EXTRA})
65 list(APPEND args "--extra" ${arg})
66 endforeach()
Filipe Cabecinhasc309de72015-06-19 03:39:24 +000067 foreach(arg ${ARG_LIBS})
Evgeniy Stepanov06832412015-05-05 22:51:35 +000068 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}
Filipe Cabecinhasc309de72015-06-19 03:39:24 +000074 DEPENDS ${SANITIZER_GEN_DYNAMIC_LIST} ${ARG_EXTRA} ${ARG_LIBS}
Evgeniy Stepanov06832412015-05-05 22:51:35 +000075 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})
81endmacro()
82
Alexey Samsonov38a61aa2013-08-29 10:49:04 +000083# Add target to check code style for sanitizer runtimes.
Sean Silva621dec42016-04-06 20:19:31 +000084if(CMAKE_HOST_UNIX)
Alexey Samsonov38a61aa2013-08-29 10:49:04 +000085 add_custom_target(SanitizerLintCheck
Alexey Samsonov61d47982016-03-17 21:41:08 +000086 COMMAND env LLVM_CHECKOUT=${LLVM_MAIN_SRC_DIR} SILENT=1 TMPDIR=
Alexey Samsonov38a61aa2013-08-29 10:49:04 +000087 PYTHON_EXECUTABLE=${PYTHON_EXECUTABLE}
Greg Fitzgeralda6bfd8d2014-03-21 00:45:21 +000088 COMPILER_RT=${COMPILER_RT_SOURCE_DIR}
Alexey Samsonov38a61aa2013-08-29 10:49:04 +000089 ${SANITIZER_LINT_SCRIPT}
90 DEPENDS ${SANITIZER_LINT_SCRIPT}
91 COMMENT "Running lint check for sanitizer sources..."
92 VERBATIM)
93endif()
94