Skip to content

Commit

Permalink
Add dynamic detection of asan paths.
Browse files Browse the repository at this point in the history
  • Loading branch information
viferga committed Feb 26, 2025
1 parent cd13179 commit 53620af
Showing 1 changed file with 37 additions and 3 deletions.
40 changes: 37 additions & 3 deletions cmake/CompileOptions.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -149,17 +149,51 @@ else()
set(SANITIZER_COMPILE_DEFINITIONS)
endif()

function(find_sanitizer NAME LINK_OPTION)
string(TOUPPER "${NAME}" NAME_UPPER)
set(SANITIZER_PROGRAM_CODE "int main() {return 0;}")
message(STATUS "${CMAKE_CURRENT_BINARY_DIR}/sanitizer_locate.cpp")
file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/sanitizer_locate.cpp" "${SANITIZER_PROGRAM_CODE}")

try_compile(
STATUS
${PROJECT_OUTPUT_DIR}
${CMAKE_CURRENT_BINARY_DIR}/sanitizer_locate.cpp
OUTPUT_VARIABLE SANITIZER_COMPILER_OUTPUT
LINK_OPTIONS ${LINK_OPTION}
COPY_FILE ${CMAKE_CURRENT_BINARY_DIR}/sanitizer_locate
)

if(NOT STATUS)
message(FATAL_ERROR "Could not find location for lib${NAME}: ${SANITIZER_COMPILER_OUTPUT}")
return()
endif()

file(GET_RUNTIME_DEPENDENCIES
EXECUTABLES ${CMAKE_CURRENT_BINARY_DIR}/sanitizer_locate
RESOLVED_DEPENDENCIES_VAR SANITIZER_PROGRAM_LIBRARIES
)

foreach(DEPENDENCY IN LISTS SANITIZER_PROGRAM_LIBRARIES)
string(FIND "${DEPENDENCY}" "${NAME}" POSITION)
if(POSITION GREATER -1)
set(LIB${NAME_UPPER}_PATH "${DEPENDENCY}" PARENT_SCOPE)
return()
endif()
endforeach()
endfunction()

if("${CMAKE_C_COMPILER_ID}" STREQUAL "GNU" OR "${CMAKE_C_COMPILER_ID}" STREQUAL "Clang" OR "${CMAKE_C_COMPILER_ID}" STREQUAL "AppleClang")
if(OPTION_BUILD_THREAD_SANITIZER)
execute_process(COMMAND ${CMAKE_C_COMPILER} -print-file-name=libtsan${CMAKE_SHARED_LIBRARY_SUFFIX} OUTPUT_VARIABLE LIBTSAN_PATH OUTPUT_STRIP_TRAILING_WHITESPACE)
find_sanitizer(tsan -fsanitize=thread)
set(SANITIZER_LIBRARIES_PATH
"${LIBTSAN_PATH}"
)
elseif(OPTION_BUILD_MEMORY_SANITIZER)
set(SANITIZER_LIBRARIES_PATH) # TODO
elseif(OPTION_BUILD_ADDRESS_SANITIZER)
execute_process(COMMAND ${CMAKE_C_COMPILER} -print-file-name=libasan${CMAKE_SHARED_LIBRARY_SUFFIX} OUTPUT_VARIABLE LIBASAN_PATH OUTPUT_STRIP_TRAILING_WHITESPACE)
execute_process(COMMAND ${CMAKE_C_COMPILER} -print-file-name=libubsan${CMAKE_SHARED_LIBRARY_SUFFIX} OUTPUT_VARIABLE LIBUBSAN_PATH OUTPUT_STRIP_TRAILING_WHITESPACE)
find_sanitizer(asan -fsanitize=address)
find_sanitizer(ubsan -fsanitize=undefined)
set(SANITIZER_LIBRARIES_PATH
"${LIBASAN_PATH}"
"${LIBUBSAN_PATH}"
Expand Down

0 comments on commit 53620af

Please sign in to comment.