diff --git a/0006-Offload-Add-support-for-loongarch64-to-host-plugin.patch b/0006-Offload-Add-support-for-loongarch64-to-host-plugin.patch new file mode 100644 index 0000000000000000000000000000000000000000..c8a47b77b387fa19d0f26adb448c189a10799ca6 --- /dev/null +++ b/0006-Offload-Add-support-for-loongarch64-to-host-plugin.patch @@ -0,0 +1,133 @@ +From bdf727065b581c45b68a81090272f497f1ce5485 Mon Sep 17 00:00:00 2001 +From: wanglei +Date: Tue, 17 Dec 2024 19:06:10 +0800 +Subject: [PATCH] [Offload] Add support for loongarch64 to host plugin +This adds support for the loongarch64 architecture to the offload host +plugin. +Similar to #115773 +To fix some test issues, I've had to add the LoongArch64 target to: +- CompilerInvocation::ParseLangArgs +- linkDevice in ClangLinuxWrapper.cpp +- OMPContext::OMPContext (to set the device_kind_cpu trait) +Reviewed By: jhuber6 +Pull Request: https://github.com/llvm/llvm-project/pull/120173 +--- + clang/lib/Frontend/CompilerInvocation.cpp | 1 + + clang/tools/clang-linker-wrapper/ClangLinkerWrapper.cpp | 1 + + llvm/lib/Frontend/OpenMP/OMPContext.cpp | 1 + + 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 | 2 +- + offload/plugins-nextgen/host/src/rtl.cpp | 2 ++ + 8 files changed, 15 insertions(+), 2 deletions(-) +diff --git a/clang/lib/Frontend/CompilerInvocation.cpp b/clang/lib/Frontend/CompilerInvocation.cpp +index 23906d5c06d3..298fafc21588 100644 +--- a/clang/lib/Frontend/CompilerInvocation.cpp ++++ b/clang/lib/Frontend/CompilerInvocation.cpp +@@ -4257,6 +4257,7 @@ bool CompilerInvocation::ParseLangArgs(LangOptions &Opts, ArgList &Args, + if (TT.getArch() == llvm::Triple::UnknownArch || + !(TT.getArch() == llvm::Triple::aarch64 || TT.isPPC() || + TT.getArch() == llvm::Triple::systemz || ++ TT.getArch() == llvm::Triple::loongarch64 || + TT.getArch() == llvm::Triple::nvptx || + TT.getArch() == llvm::Triple::nvptx64 || + TT.getArch() == llvm::Triple::amdgcn || +diff --git a/clang/tools/clang-linker-wrapper/ClangLinkerWrapper.cpp b/clang/tools/clang-linker-wrapper/ClangLinkerWrapper.cpp +index fae32a3503c1..4201f043944e 100644 +--- a/clang/tools/clang-linker-wrapper/ClangLinkerWrapper.cpp ++++ b/clang/tools/clang-linker-wrapper/ClangLinkerWrapper.cpp +@@ -596,6 +596,7 @@ Expected linkDevice(ArrayRef InputFiles, + case Triple::ppc64: + case Triple::ppc64le: + case Triple::systemz: ++ case Triple::loongarch64: + return generic::clang(InputFiles, Args); + default: + return createStringError(Triple.getArchName() + +diff --git a/llvm/lib/Frontend/OpenMP/OMPContext.cpp b/llvm/lib/Frontend/OpenMP/OMPContext.cpp +index ad794d8345cf..c26f5b49b600 100644 +--- a/llvm/lib/Frontend/OpenMP/OMPContext.cpp ++++ b/llvm/lib/Frontend/OpenMP/OMPContext.cpp +@@ -36,6 +36,7 @@ OMPContext::OMPContext(bool IsDeviceCompilation, Triple TargetTriple) { + case Triple::aarch64: + case Triple::aarch64_be: + case Triple::aarch64_32: ++ case Triple::loongarch64: + case Triple::mips: + case Triple::mipsel: + case Triple::mips64: +diff --git a/offload/CMakeLists.txt b/offload/CMakeLists.txt +index 8da95c5c74e4..f6e894d39968 100644 +--- a/offload/CMakeLists.txt ++++ b/offload/CMakeLists.txt +@@ -207,6 +207,8 @@ 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") ++set (LIBOMPTARGET_ALL_TARGETS "${LIBOMPTARGET_ALL_TARGETS} loongarch64-unknown-linux-gnu") ++set (LIBOMPTARGET_ALL_TARGETS "${LIBOMPTARGET_ALL_TARGETS} loongarch64-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 10b32440dc87..44d1c737e2ef 100644 +--- a/offload/plugins-nextgen/common/src/Utils/ELF.cpp ++++ b/offload/plugins-nextgen/common/src/Utils/ELF.cpp +@@ -47,6 +47,8 @@ uint16_t utils::elf::getTargetMachine() { + return EM_PPC64; + #elif defined(__riscv) + return EM_RISCV; ++#elif defined(__loongarch__) ++ return EM_LOONGARCH; + #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 cbfe4b951af4..e6b3bdf83d74 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 riscv64 s390x) ++set(supported_targets x86_64 aarch64 ppc64 ppc64le riscv64 s390x loongarch64) + if(NOT ${CMAKE_SYSTEM_PROCESSOR} IN_LIST supported_targets) + message(STATUS "Not building ${machine} NextGen offloading plugin") + return() +@@ -63,4 +63,8 @@ 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) ++elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "loongarch64$") ++ list(APPEND LIBOMPTARGET_SYSTEM_TARGETS ++ "loongarch64-unknown-linux-gnu" "loongarch64-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 8b4e0286d65e..4a9e88cc4dc9 100644 +--- a/offload/plugins-nextgen/host/dynamic_ffi/ffi.h ++++ b/offload/plugins-nextgen/host/dynamic_ffi/ffi.h +@@ -44,7 +44,7 @@ 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) || \ +- defined(__riscv) ++ defined(__riscv) || defined(__loongarch__) + 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 915c41e88c58..171c202e3e39 100644 +--- a/offload/plugins-nextgen/host/src/rtl.cpp ++++ b/offload/plugins-nextgen/host/src/rtl.cpp +@@ -442,6 +442,8 @@ struct GenELF64PluginTy final : public GenericPluginTy { + #endif + #elif defined(__riscv) && (__riscv_xlen == 64) + return llvm::Triple::riscv64; ++#elif defined(__loongarch__) && (__loongarch_grlen == 64) ++ return llvm::Triple::loongarch64; + #else + return llvm::Triple::UnknownArch; + #endif +-- +2.20.1 + diff --git a/llvm-toolset-19.spec b/llvm-toolset-19.spec index bbd53dd562d56b2cdea9b9e94bd01e39a178565b..641a4bcb6ef805f8c3fd0e93bd330092d840ef41 100644 --- a/llvm-toolset-19.spec +++ b/llvm-toolset-19.spec @@ -160,7 +160,7 @@ #region main package Name: llvm-toolset-%{maj_ver} Version: %{maj_ver}.%{min_ver}.%{patch_ver} -Release: 14 +Release: 15 Summary: The Low Level Virtual Machine License: NCSA @@ -179,6 +179,7 @@ Patch0002: 0002-Always-build-shared-libs-for-LLD.patch Patch0003: 0003-PATCH-Bolt-CMake-Don-t-export-bolt-libraries-in-LLVM.patch Patch0004: 0004-BOLT-Do-not-use-HLT-as-split-point-when-build-the-CFG.patch Patch0005: 0005-BOLT-Keep-X86-HLT-instruction-as-a-terminator-in-user-mode.patch +Patch0006: 0006-Offload-Add-support-for-loongarch64-to-host-plugin.patch BuildRequires: gcc BuildRequires: gcc-c++ @@ -2632,7 +2633,7 @@ fi %{install_libdir}/clang/%{maj_ver}/lib/%{compiler_rt_triple}/clang_rt.crtend.o %endif -%ifnarch %{ix86} s390x riscv64 +%ifnarch %{ix86} s390x riscv64 loongarch64 # currently unsupported on above arches %{install_libdir}/clang/%{maj_ver}/lib/%{compiler_rt_triple}/liborc_rt.a %endif @@ -2960,6 +2961,10 @@ fi #endregion files %changelog +* Fri Oct 31 2025 mahailiang - 19.1.7-15 +- LoongArch: Backport offload support +- LoongArch: Fix liborc_rt.a file not found + * Tue Oct 14 2025 wangqiang - 19.1.7-14 - Replaced the hardcoded /opt/openEuler path with /opt/\%{_vendor}