From dfc88f9bcb2b51a6eaedcb8f08a0e6944d0d91ec Mon Sep 17 00:00:00 2001 From: Aurelien Jarno Date: Mon, 11 Nov 2024 11:12:54 +0100 Subject: [PATCH] [Offload] Add support for riscv64 to host plugin This adds support for the riscv64 architecture to the offload host plugin. The check to define FFI_DEFAULT_ABI is intentionally not guarded by __riscv_xlen as the value is the same for riscv32 and riscv64 (support for OpenMP on riscv32 is still under review). Tested-by: jchzhou --- offload/CMakeLists.txt | 2 ++ offload/plugins-nextgen/common/src/Utils/ELF.cpp | 2 ++ offload/plugins-nextgen/host/CMakeLists.txt | 6 +++++- offload/plugins-nextgen/host/dynamic_ffi/ffi.h | 3 ++- offload/plugins-nextgen/host/src/rtl.cpp | 2 ++ 5 files changed, 13 insertions(+), 2 deletions(-) diff --git a/offload/CMakeLists.txt b/offload/CMakeLists.txt index 959d6260bc74..ccb61a698f89 100644 --- a/offload/CMakeLists.txt +++ b/offload/CMakeLists.txt @@ -200,6 +200,8 @@ set (LIBOMPTARGET_ALL_TARGETS "${LIBOMPTARGET_ALL_TARGETS} nvptx64-nvidia-cuda-L set (LIBOMPTARGET_ALL_TARGETS "${LIBOMPTARGET_ALL_TARGETS} nvptx64-nvidia-cuda-JIT-LTO") set (LIBOMPTARGET_ALL_TARGETS "${LIBOMPTARGET_ALL_TARGETS} s390x-ibm-linux-gnu") set (LIBOMPTARGET_ALL_TARGETS "${LIBOMPTARGET_ALL_TARGETS} s390x-ibm-linux-gnu-LTO") +set (LIBOMPTARGET_ALL_TARGETS "${LIBOMPTARGET_ALL_TARGETS} riscv64-unknown-linux-gnu") +set (LIBOMPTARGET_ALL_TARGETS "${LIBOMPTARGET_ALL_TARGETS} riscv64-unknown-linux-gnu-LTO") # Once the plugins for the different targets are validated, they will be added to # the list of supported targets in the current system. diff --git a/offload/plugins-nextgen/common/src/Utils/ELF.cpp b/offload/plugins-nextgen/common/src/Utils/ELF.cpp index 90d6950b83e5..88642fd5b564 100644 --- a/offload/plugins-nextgen/common/src/Utils/ELF.cpp +++ b/offload/plugins-nextgen/common/src/Utils/ELF.cpp @@ -45,6 +45,8 @@ uint16_t utils::elf::getTargetMachine() { return EM_AARCH64; #elif defined(__powerpc64__) return EM_PPC64; +#elif defined(__riscv) + return EM_RISCV; #else #warning "Unknown ELF compilation target architecture" return EM_NONE; diff --git a/offload/plugins-nextgen/host/CMakeLists.txt b/offload/plugins-nextgen/host/CMakeLists.txt index 817d128f9241..286bc51cc2a4 100644 --- a/offload/plugins-nextgen/host/CMakeLists.txt +++ b/offload/plugins-nextgen/host/CMakeLists.txt @@ -1,4 +1,4 @@ -set(supported_targets x86_64 aarch64 ppc64 ppc64le s390x) +set(supported_targets x86_64 aarch64 ppc64 ppc64le riscv64 s390x) if(NOT ${CMAKE_SYSTEM_PROCESSOR} IN_LIST supported_targets) message(STATUS "Not building ${machine} NextGen offloading plugin") return() @@ -59,4 +59,8 @@ elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "s390x$") list(APPEND LIBOMPTARGET_SYSTEM_TARGETS "s390x-ibm-linux-gnu" "s390x-ibm-linux-gnu-LTO") set(LIBOMPTARGET_SYSTEM_TARGETS "${LIBOMPTARGET_SYSTEM_TARGETS}" PARENT_SCOPE) +elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "riscv64$") + list(APPEND LIBOMPTARGET_SYSTEM_TARGETS + "riscv64-unknown-linux-gnu" "riscv64-unknown-linux-gnu-LTO") + set(LIBOMPTARGET_SYSTEM_TARGETS "${LIBOMPTARGET_SYSTEM_TARGETS}" PARENT_SCOPE) endif() diff --git a/offload/plugins-nextgen/host/dynamic_ffi/ffi.h b/offload/plugins-nextgen/host/dynamic_ffi/ffi.h index 0ae025805e1d..8b4e0286d65e 100644 --- a/offload/plugins-nextgen/host/dynamic_ffi/ffi.h +++ b/offload/plugins-nextgen/host/dynamic_ffi/ffi.h @@ -43,7 +43,8 @@ typedef enum { typedef enum ffi_abi { #if (defined(_M_X64) || defined(__x86_64__)) FFI_DEFAULT_ABI = 2, // FFI_UNIX64. -#elif defined(__aarch64__) || defined(__arm64__) || defined(_M_ARM64) +#elif defined(__aarch64__) || defined(__arm64__) || defined(_M_ARM64) || \ + defined(__riscv) FFI_DEFAULT_ABI = 1, // FFI_SYSV. #elif defined(__powerpc64__) FFI_DEFAULT_ABI = 8, // FFI_LINUX. diff --git a/offload/plugins-nextgen/host/src/rtl.cpp b/offload/plugins-nextgen/host/src/rtl.cpp index fe296b77c7d5..6f2e3d8604ec 100644 --- a/offload/plugins-nextgen/host/src/rtl.cpp +++ b/offload/plugins-nextgen/host/src/rtl.cpp @@ -440,6 +440,8 @@ struct GenELF64PluginTy final : public GenericPluginTy { #else return llvm::Triple::ppc64; #endif +#elif defined(__riscv) && (__riscv_xlen == 64) + return llvm::Triple::riscv64; #else return llvm::Triple::UnknownArch; #endif -- Gitee