# # # set(ROCPROFILER_MEMCHECK_TYPES "ThreadSanitizer" "AddressSanitizer" "LeakSanitizer" "MemorySanitizer" "UndefinedBehaviorSanitizer") if(ROCPROFILER_MEMCHECK AND NOT ROCPROFILER_MEMCHECK IN_LIST ROCPROFILER_MEMCHECK_TYPES) message( FATAL_ERROR "Unsupported memcheck type '${ROCPROFILER_MEMCHECK}'. Options: ${ROCPROFILER_MEMCHECK_TYPES}" ) endif() set_property(CACHE ROCPROFILER_MEMCHECK PROPERTY STRINGS "${ROCPROFILER_MEMCHECK_TYPES}") function(rocprofiler_add_memcheck_flags _TYPE) target_compile_options( rocprofiler-memcheck INTERFACE $) target_link_options(rocprofiler-memcheck INTERFACE $) endfunction() function(rocprofiler_set_memcheck_env _TYPE _LIB_BASE) set(_LIBS ${_LIB_BASE}) foreach(_N 6 5 4 3 2 1 0) list( APPEND _LIBS ${CMAKE_SHARED_LIBRARY_PREFIX}${_LIB_BASE}${CMAKE_SHARED_LIBRARY_SUFFIX}.${_N} ) endforeach() foreach(_LIB ${_LIBS}) if(NOT ${_TYPE}_LIBRARY) find_library(${_TYPE}_LIBRARY NAMES ${_LIB} ${ARGN}) endif() endforeach() target_link_libraries(rocprofiler-memcheck INTERFACE ${_LIB_BASE}) if(${_TYPE}_LIBRARY) set(ROCPROFILER_MEMCHECK_PRELOAD_ENV "LD_PRELOAD=${${_TYPE}_LIBRARY}" CACHE INTERNAL "LD_PRELOAD env variable for tests " FORCE) endif() endfunction() # always unset so that it doesn't preload if memcheck disabled unset(ROCPROFILER_MEMCHECK_PRELOAD_ENV CACHE) if(ROCPROFILER_MEMCHECK STREQUAL "AddressSanitizer") rocprofiler_add_memcheck_flags("address") rocprofiler_set_memcheck_env("${ROCPROFILER_MEMCHECK}" "asan") elseif(ROCPROFILER_MEMCHECK STREQUAL "LeakSanitizer") rocprofiler_add_memcheck_flags("leak") rocprofiler_set_memcheck_env("${ROCPROFILER_MEMCHECK}" "lsan") elseif(ROCPROFILER_MEMCHECK STREQUAL "MemorySanitizer") rocprofiler_add_memcheck_flags("memory") elseif(ROCPROFILER_MEMCHECK STREQUAL "ThreadSanitizer") rocprofiler_add_memcheck_flags("thread") rocprofiler_set_memcheck_env("${ROCPROFILER_MEMCHECK}" "tsan") elseif(ROCPROFILER_MEMCHECK STREQUAL "UndefinedBehaviorSanitizer") rocprofiler_add_memcheck_flags("undefined") rocprofiler_set_memcheck_env("${ROCPROFILER_MEMCHECK}" "ubsan") elseif(NOT ROCPROFILER_MEMCHECK STREQUAL "") message(FATAL_ERROR "Unsupported ROCPROFILER_MEMCHECK type: ${ROCPROFILER_MEMCHECK}") endif()