From 58f125493d3cdcf91e92c888551503aca77d4bb8 Mon Sep 17 00:00:00 2001 From: Jon Chesterfield Date: Sat, 24 Apr 2021 02:24:44 +0100 Subject: [PATCH] [libomptarget] Enable AMDGPU devicertl [libomptarget] Enable AMDGPU devicertl The amdgpu devicertl is written in freestanding openmp and compiles to a bitcode library (per listed gfx arch) with no unresolved symbols. It requires a recent clang, preferably the one from the same monorepo checkout. This is D98658, with printf explicitly stubbed out, after patching clang to no longer require an llvm with the amdgpu target enabled. Reviewed By: tianshilei1992 Differential Revision: https://reviews.llvm.org/D101213 --- openmp/libomptarget/deviceRTLs/CMakeLists.txt | 1 + .../deviceRTLs/amdgcn/CMakeLists.txt | 16 ++++++++++++++-- .../deviceRTLs/amdgcn/src/target_impl.h | 6 +++++- 3 files changed, 20 insertions(+), 3 deletions(-) diff --git a/openmp/libomptarget/deviceRTLs/CMakeLists.txt b/openmp/libomptarget/deviceRTLs/CMakeLists.txt index 3df94eac0727..8bbf987aaf20 100644 --- a/openmp/libomptarget/deviceRTLs/CMakeLists.txt +++ b/openmp/libomptarget/deviceRTLs/CMakeLists.txt @@ -10,4 +10,5 @@ # ##===----------------------------------------------------------------------===## +add_subdirectory(amdgcn) add_subdirectory(nvptx) diff --git a/openmp/libomptarget/deviceRTLs/amdgcn/CMakeLists.txt b/openmp/libomptarget/deviceRTLs/amdgcn/CMakeLists.txt index 8ba057206b82..ce5e5b820d0f 100644 --- a/openmp/libomptarget/deviceRTLs/amdgcn/CMakeLists.txt +++ b/openmp/libomptarget/deviceRTLs/amdgcn/CMakeLists.txt @@ -36,6 +36,18 @@ else() set(AOMP_BINDIR ${LLVM_BUILD_BINARY_DIR}/bin) endif() +# Copied from nvptx CMakeLists +if(CMAKE_HOST_SYSTEM_PROCESSOR MATCHES "x86_64") + set(aux_triple x86_64-unknown-linux-gnu) +elseif(CMAKE_HOST_SYSTEM_PROCESSOR MATCHES "ppc64le") + set(aux_triple powerpc64le-unknown-linux-gnu) +elseif(CMAKE_HOST_SYSTEM_PROCESSOR MATCHES "aarch64") + set(aux_triple aarch64-unknown-linux-gnu) +else() + libomptarget_say("Not building AMDGCN device RTL: unknown host arch: ${CMAKE_HOST_SYSTEM_PROCESSOR}") + return() +endif() + libomptarget_say("Building AMDGCN device RTL. LLVM_COMPILER_PATH=${AOMP_BINDIR}") project(omptarget-amdgcn) @@ -104,7 +116,7 @@ macro(add_cuda_bc_library) -ffreestanding -target amdgcn-amd-amdhsa -emit-llvm - -Xclang -aux-triple -Xclang x86_64-unknown-linux-gnu # see nvptx + -Xclang -aux-triple -Xclang ${aux_triple} -fopenmp -fopenmp-cuda-mode -Xclang -fopenmp-is-device -D__AMDGCN__ -Xclang -target-cpu -Xclang ${mcpu} @@ -154,6 +166,6 @@ foreach(mcpu ${mcpus}) add_custom_target(lib${libname}-${mcpu} ALL DEPENDS ${bc_libname}) install(FILES ${OUTPUTDIR}/${bc_libname} - DESTINATION "${OPENMP_INSTALL_LIBDIR}/libdevice" + DESTINATION "${OPENMP_INSTALL_LIBDIR}" ) endforeach() diff --git a/openmp/libomptarget/deviceRTLs/amdgcn/src/target_impl.h b/openmp/libomptarget/deviceRTLs/amdgcn/src/target_impl.h index 197b7d7be250..6af40a7d507c 100644 --- a/openmp/libomptarget/deviceRTLs/amdgcn/src/target_impl.h +++ b/openmp/libomptarget/deviceRTLs/amdgcn/src/target_impl.h @@ -67,6 +67,10 @@ enum : __kmpc_impl_lanemask_t { __kmpc_impl_all_lanes = ~(__kmpc_impl_lanemask_t)0 }; -EXTERN int printf(const char *, ...); +// The return code of printf is not checked in the call sites in this library. +// A call to a function named printf currently hits some special case handling +// for opencl, which translates to calls that do not presently exist for openmp +// Therefore, for now, stub out printf while building this library. +#define printf(...) #endif