13cab2bb3Spatrickinclude(CompilerRTUtils) 23cab2bb3Spatrick 33cab2bb3Spatrickset(SANITIZER_GEN_DYNAMIC_LIST 43cab2bb3Spatrick ${COMPILER_RT_SOURCE_DIR}/lib/sanitizer_common/scripts/gen_dynamic_list.py) 53cab2bb3Spatrick 63cab2bb3Spatrickif(CMAKE_NM) 73cab2bb3Spatrick set(SANITIZER_NM "${CMAKE_NM}") 83cab2bb3Spatrickelse() 93cab2bb3Spatrick set(SANITIZER_NM nm) 103cab2bb3Spatrickendif() 113cab2bb3Spatrick 123cab2bb3Spatrick# Create a target "<name>-<arch>-symbols" that would generate the list of 133cab2bb3Spatrick# symbols that need to be exported from sanitizer runtime "<name>". Function 143cab2bb3Spatrick# interceptors are exported automatically, user can also provide files with 153cab2bb3Spatrick# symbol names that should be exported as well. 163cab2bb3Spatrick# add_sanitizer_rt_symbols(<name> 173cab2bb3Spatrick# ARCHS <architectures> 183cab2bb3Spatrick# PARENT_TARGET <convenience parent target> 193cab2bb3Spatrick# EXTRA <files with extra symbols to export>) 203cab2bb3Spatrickmacro(add_sanitizer_rt_symbols name) 213cab2bb3Spatrick cmake_parse_arguments(ARG 223cab2bb3Spatrick "" 233cab2bb3Spatrick "PARENT_TARGET" 243cab2bb3Spatrick "ARCHS;EXTRA" 253cab2bb3Spatrick ${ARGN}) 263cab2bb3Spatrick foreach(arch ${ARG_ARCHS}) 273cab2bb3Spatrick set(target_name ${name}-${arch}) 283cab2bb3Spatrick set(stamp ${CMAKE_CURRENT_BINARY_DIR}/${target_name}.syms-stamp) 293cab2bb3Spatrick set(extra_args) 303cab2bb3Spatrick foreach(arg ${ARG_EXTRA}) 313cab2bb3Spatrick list(APPEND extra_args "--extra" ${arg}) 323cab2bb3Spatrick endforeach() 333cab2bb3Spatrick add_custom_command(OUTPUT ${stamp} 34*1f9cb04fSpatrick COMMAND ${Python3_EXECUTABLE} 353cab2bb3Spatrick ${SANITIZER_GEN_DYNAMIC_LIST} ${extra_args} $<TARGET_FILE:${target_name}> 363cab2bb3Spatrick --nm-executable "${SANITIZER_NM}" -o $<TARGET_FILE:${target_name}>.syms 373cab2bb3Spatrick COMMAND ${CMAKE_COMMAND} -E touch ${stamp} 383cab2bb3Spatrick DEPENDS ${target_name} ${SANITIZER_GEN_DYNAMIC_LIST} ${ARG_EXTRA} 393cab2bb3Spatrick WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} 403cab2bb3Spatrick COMMENT "Generating exported symbols for ${target_name}" 413cab2bb3Spatrick VERBATIM) 423cab2bb3Spatrick add_custom_target(${target_name}-symbols ALL 433cab2bb3Spatrick DEPENDS ${stamp} 443cab2bb3Spatrick SOURCES ${SANITIZER_GEN_DYNAMIC_LIST} ${ARG_EXTRA}) 453cab2bb3Spatrick get_compiler_rt_install_dir(${arch} install_dir) 463cab2bb3Spatrick install(FILES $<TARGET_FILE:${target_name}>.syms 473cab2bb3Spatrick DESTINATION ${install_dir}) 483cab2bb3Spatrick if(ARG_PARENT_TARGET) 493cab2bb3Spatrick add_dependencies(${ARG_PARENT_TARGET} ${target_name}-symbols) 503cab2bb3Spatrick endif() 513cab2bb3Spatrick endforeach() 523cab2bb3Spatrickendmacro() 533cab2bb3Spatrick 543cab2bb3Spatrick# This function is only used on Darwin, where undefined symbols must be specified 553cab2bb3Spatrick# in the linker invocation. 563cab2bb3Spatrickfunction(add_weak_symbols libname link_flags) 573cab2bb3Spatrick set(weak_symbols_file "${COMPILER_RT_SOURCE_DIR}/lib/${libname}/weak_symbols.txt") 583cab2bb3Spatrick file(STRINGS "${weak_symbols_file}" WEAK_SYMBOLS) 593cab2bb3Spatrick # Add this file as a configure-time dependency so that changes to this 603cab2bb3Spatrick # file trigger a re-configure. This is necessary so that `${link_flags}` 613cab2bb3Spatrick # is changed when appropriate. 623cab2bb3Spatrick set_property( 633cab2bb3Spatrick DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" 643cab2bb3Spatrick APPEND 653cab2bb3Spatrick PROPERTY CMAKE_CONFIGURE_DEPENDS "${weak_symbols_file}") 663cab2bb3Spatrick set(local_link_flags ${${link_flags}}) 673cab2bb3Spatrick foreach(SYMBOL ${WEAK_SYMBOLS}) 683cab2bb3Spatrick set(local_link_flags ${local_link_flags} -Wl,-U,${SYMBOL}) 693cab2bb3Spatrick endforeach() 703cab2bb3Spatrick set(${link_flags} ${local_link_flags} PARENT_SCOPE) 713cab2bb3Spatrickendfunction() 723cab2bb3Spatrick 733cab2bb3Spatrickmacro(add_sanitizer_rt_version_list name) 743cab2bb3Spatrick set(vers ${CMAKE_CURRENT_BINARY_DIR}/${name}.vers) 753cab2bb3Spatrick cmake_parse_arguments(ARG "" "" "LIBS;EXTRA" ${ARGN}) 763cab2bb3Spatrick set(args) 773cab2bb3Spatrick foreach(arg ${ARG_EXTRA}) 783cab2bb3Spatrick list(APPEND args "--extra" ${arg}) 793cab2bb3Spatrick endforeach() 803cab2bb3Spatrick foreach(arg ${ARG_LIBS}) 813cab2bb3Spatrick list(APPEND args "$<TARGET_FILE:${arg}>") 823cab2bb3Spatrick endforeach() 833cab2bb3Spatrick add_custom_command(OUTPUT ${vers} 84*1f9cb04fSpatrick COMMAND ${Python3_EXECUTABLE} 853cab2bb3Spatrick ${SANITIZER_GEN_DYNAMIC_LIST} --version-list ${args} 863cab2bb3Spatrick --nm-executable "${SANITIZER_NM}" -o ${vers} 873cab2bb3Spatrick DEPENDS ${SANITIZER_GEN_DYNAMIC_LIST} ${ARG_EXTRA} ${ARG_LIBS} 883cab2bb3Spatrick WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} 893cab2bb3Spatrick COMMENT "Generating version list for ${name}" 903cab2bb3Spatrick VERBATIM) 913cab2bb3Spatrick 923cab2bb3Spatrick add_custom_target(${name}-version-list ALL 933cab2bb3Spatrick DEPENDS ${vers}) 943cab2bb3Spatrickendmacro() 95