Skip to content

Commit e7bba16

Browse files
illuhaddevajithvs
authored andcommitted
Don't enforce LLVM releases for minimal compiler builds against ROCm; enforce that for SSCP AdaptiveCpp LLVM <= ROCm LLVM
1 parent 6c9e36c commit e7bba16

File tree

1 file changed

+51
-1
lines changed

1 file changed

+51
-1
lines changed

CMakeLists.txt

Lines changed: 51 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -361,6 +361,46 @@ if(BUILD_CLANG_PLUGIN)
361361
message(SEND_ERROR "CLANG_INCLUDE_PATH ${CLANG_INCLUDE_PATH} does not exist. Please provide clang's internal include path manually: Find the directory where __clang_cuda_runtime_wrapper.h is. Provide this directory for older ROCm versions and the parent directory for newer ones.")
362362
endif()
363363
if(WITH_ROCM_BACKEND)
364+
# Check if we're building against ROCm LLVM. This code checks if
365+
# CLANG_EXECUTABLE_PATH is located within ROCM_PATH.
366+
# Note: This might fail in ROCm distributions where ROCm is strongly decomposed
367+
# (spack?) but it is more reliable than just parsing the output of clang++ --version.
368+
# This is then later used to decide whether we need to make exemptions
369+
# from LLVM version compatibility checks.
370+
file(GLOB_RECURSE ROCM_FOUND_FILES FOLLOW_SYMLINKS "${ROCM_PATH}/*")
371+
if ("${CLANG_EXECUTABLE_PATH}" IN_LIST ROCM_FOUND_FILES)
372+
message(STATUS "File ${CLANG_EXECUTABLE_PATH} found in ${ROCM_PATH}.")
373+
set(USE_ROCM_LLVM true)
374+
else()
375+
message(STATUS "File ${CLANG_EXECUTABLE_PATH} not found in ${ROCM_PATH}.")
376+
set(USE_ROCM_LLVM false)
377+
endif()
378+
379+
find_program(ROCM_CLANG_PATH NAMES clang++ HINTS ${ROCM_PATH} ${ROCM_PATH}/bin ${ROCM_PATH}/llvm/bin NO_DEFAULT_PATH CACHE STRING)
380+
if(ROCM_CLANG_PATH)
381+
# Figure out ROCm LLVM version - this is used to check whether the AdaptiveCpp LLVM version
382+
# is compatible with ROCm for SSCP.
383+
# Note: We have an extra code path here in addition to the one below to find out
384+
# the ROCm version for robustness, since some ROCm distributions identify differently!
385+
message(STATUS "Found ROCm clang: ${ROCM_CLANG_PATH}")
386+
execute_process(COMMAND ${ROCM_CLANG_PATH} "--version"
387+
OUTPUT_VARIABLE ROCM_CLANG_VERBOSE_OUTPUT)
388+
string(REGEX MATCH "clang version ([0-9]+).([0-9]+).([0-9]+)" ROCM_CLANG_VERSION ${ROCM_CLANG_VERBOSE_OUTPUT})
389+
if(ROCM_CLANG_VERSION)
390+
set(ROCM_LLVM_MAJOR ${CMAKE_MATCH_1})
391+
set(ROCM_LLVM_MINOR ${CMAKE_MATCH_2})
392+
set(ROCM_LLVM_PATCH ${CMAKE_MATCH_3})
393+
message(STATUS "ROCm LLVM version: ${ROCM_LLVM_MAJOR}.${ROCM_LLVM_MINOR}.${ROCM_LLVM_PATCH}")
394+
# If we want to target ROCm with SSCP, then AdaptiveCpp LLVM must be <= ROCm LLVM
395+
if(ROCM_LLVM_MAJOR AND LLVM_VERSION_MAJOR AND WITH_SSCP_COMPILER)
396+
if(${LLVM_VERSION_MAJOR} GREATER ${ROCM_LLVM_MAJOR})
397+
message(SEND_ERROR "AdaptiveCpp LLVM version (${LLVM_VERSION_MAJOR}) must be <= ROCm LLVM version (${ROCM_LLVM_MAJOR}) for the AdaptiveCpp generic JIT compiler.")
398+
endif()
399+
endif()
400+
endif()
401+
endif()
402+
# Find ROCm version - this may not work for ROCm distributions repackaged
403+
# by Linux distributions as they may be missing the roc-* identifier in the output :(
364404
execute_process(COMMAND ${CLANG_EXECUTABLE_PATH} "--version"
365405
OUTPUT_VARIABLE CLANG_VERBOSE_OUTPUT)
366406
string(REGEX MATCH "clang version [0-9]+.[0-9]+.[0-9]+ \\(.+ roc-([0-9]+).([0-9]+).([0-9]+)" AMD_CLANG_VERSION ${CLANG_VERBOSE_OUTPUT})
@@ -402,7 +442,17 @@ if(BUILD_CLANG_PLUGIN)
402442
set(WITH_ACCELERATED_CPU false)
403443
endif()
404444
endif()
405-
if(NOT ACPP_EXPERIMENTAL_LLVM)
445+
446+
set(ENFORCE_COMPATIBLE_LLVM true)
447+
if(USE_ROCM_LLVM)
448+
if(ACPP_COMPILER_FEATURE_PROFILE STREQUAL "minimal")
449+
set(ENFORCE_COMPATIBLE_LLVM false)
450+
endif()
451+
if(NOT ${WITH_SSCP_COMPILER} AND NOT ${WITH_STDPAR_COMPILER} AND NOT ${WITH_ACCELERATED_CPU} AND NOT ${WITH_REFLECTION_BUILTINS})
452+
set(ENFORCE_COMPATIBLE_LLVM false)
453+
endif()
454+
endif()
455+
if(ENFORCE_COMPATIBLE_LLVM AND NOT ACPP_EXPERIMENTAL_LLVM)
406456
if(${LLVM_VERSION_MAJOR} GREATER 20)
407457
message(SEND_ERROR "LLVM versions greater than 20 are not yet tested/supported, use -DACPP_EXPERIMENTAL_LLVM=ON if you still wish to try your luck.")
408458
endif()

0 commit comments

Comments
 (0)