https://github.com/jhuber6 created https://github.com/llvm/llvm-project/pull/214841
Summary: The runtime hard codes this value. Rather than fight with the version of the library we should just normalize this like we already do for this reason. >From 5111abbfde8b48dd7a740f45768af666db55a0ba Mon Sep 17 00:00:00 2001 From: Joseph Huber <[email protected]> Date: Fri, 7 Aug 2026 14:50:40 -0500 Subject: [PATCH] [HIP] Fix OffloadBundler triple when using extra 'llvm' environment Summary: The runtime hard codes this value. Rather than fight with the version of the library we should just normalize this like we already do for this reason. --- clang/lib/Driver/ToolChains/HIPUtility.cpp | 14 ++++++++++---- clang/test/Driver/hip-device-libs-llvm-env.hip | 8 ++++++++ .../clang-linker-wrapper/linker-wrapper.c | 9 +++++++++ .../clang-linker-wrapper/ClangLinkerWrapper.cpp | 14 ++++++++++---- 4 files changed, 37 insertions(+), 8 deletions(-) diff --git a/clang/lib/Driver/ToolChains/HIPUtility.cpp b/clang/lib/Driver/ToolChains/HIPUtility.cpp index 001f9f3400a06..dafa61c485dd3 100644 --- a/clang/lib/Driver/ToolChains/HIPUtility.cpp +++ b/clang/lib/Driver/ToolChains/HIPUtility.cpp @@ -41,10 +41,16 @@ const unsigned HIPCodeObjectAlign = 4096; // Constructs a triple string for clang offload bundler. static std::string normalizeForBundler(const llvm::Triple &T, bool HasTargetID) { - return HasTargetID ? (T.getArchName() + "-" + T.getVendorName() + "-" + - T.getOSName() + "-" + T.getEnvironmentName()) - .str() - : T.normalize(llvm::Triple::CanonicalForm::FOUR_IDENT); + // The 'llvm' environment is not recognized by the HIP runtime. + llvm::Triple Normalized = T; + if (T.getEnvironment() == llvm::Triple::LLVM) + Normalized.setEnvironmentName(""); + return HasTargetID + ? (Normalized.getArchName() + "-" + Normalized.getVendorName() + + "-" + Normalized.getOSName() + "-" + + Normalized.getEnvironmentName()) + .str() + : Normalized.normalize(llvm::Triple::CanonicalForm::FOUR_IDENT); } // Collect undefined __hip_fatbin* and __hip_gpubin_handle* symbols from all diff --git a/clang/test/Driver/hip-device-libs-llvm-env.hip b/clang/test/Driver/hip-device-libs-llvm-env.hip index 7232285237550..b1116cfcd7fbe 100644 --- a/clang/test/Driver/hip-device-libs-llvm-env.hip +++ b/clang/test/Driver/hip-device-libs-llvm-env.hip @@ -39,3 +39,11 @@ // RUN: 2>&1 | FileCheck --check-prefix=NOINC %s // NOINC-NOT: __clang_gpu_device_functions.h + +// RUN: %clang -### --target=x86_64-linux-gnu -nogpuinc -nogpulib \ +// RUN: --offload-targets=amdgcn-amd-amdhsa-llvm --offload-arch=gfx90a \ +// RUN: --no-offload-new-driver -c \ +// RUN: %S/Inputs/hip_multiple_inputs/b.hip \ +// RUN: 2>&1 | FileCheck --check-prefix=BUNDLE %s + +// BUNDLE: "-targets=host-x86_64-unknown-linux-gnu,hipv4-amdgcn-amd-amdhsa--gfx90a" diff --git a/clang/test/OffloadTools/clang-linker-wrapper/linker-wrapper.c b/clang/test/OffloadTools/clang-linker-wrapper/linker-wrapper.c index eebae1a0cc153..02486df1998d9 100644 --- a/clang/test/OffloadTools/clang-linker-wrapper/linker-wrapper.c +++ b/clang/test/OffloadTools/clang-linker-wrapper/linker-wrapper.c @@ -133,6 +133,15 @@ __attribute__((visibility("protected"), used)) int x; // HIP: clang{{.*}} -o [[IMG_GFX908:.+]] -dumpdir a.out.amdgpu9.08.gfx908.img. --target=amdgpu9.08-amd-amdhsa -mcpu=gfx908 // HIP: clang-offload-bundler{{.*}}-type=o -bundle-align=4096 -compress -compression-level=6 -targets=host-x86_64-unknown-linux-gnu,hip-amdgpu9.0a-amd-amdhsa--gfx90a,hip-amdgpu9.08-amd-amdhsa--gfx908 -input={{/dev/null|NUL}} -input=[[IMG_GFX90A]] -input=[[IMG_GFX908]] -output={{.*}}.hipfb +// RUN: llvm-offload-binary -o %t.out \ +// RUN: --image=file=%t.elf.o,kind=hip,triple=amdgpu9.0a-amd-amdhsa-llvm,arch=gfx90a +// RUN: %clang -cc1 %s -triple x86_64-unknown-linux-gnu -emit-obj -o %t.o \ +// RUN: -fembed-offload-object=%t.out +// RUN: clang-linker-wrapper --dry-run --host-triple=x86_64-unknown-linux-gnu \ +// RUN: --linker-path=/usr/bin/ld %t.o -o a.out 2>&1 | FileCheck %s --check-prefix=HIP-LLVM-ENV + +// HIP-LLVM-ENV: clang-offload-bundler{{.*}}-targets=host-x86_64-unknown-linux-gnu,hip-amdgpu9.0a-amd-amdhsa--gfx90a + // RUN: llvm-offload-binary -o %t.out \ // RUN: --image=file=%t.elf.o,kind=openmp,triple=amdgpu9.08-amd-amdhsa,arch=gfx908 \ // RUN: --image=file=%t.elf.o,kind=openmp,triple=nvptx64-nvidia-cuda,arch=sm_70 diff --git a/clang/tools/clang-linker-wrapper/ClangLinkerWrapper.cpp b/clang/tools/clang-linker-wrapper/ClangLinkerWrapper.cpp index f2a58774e99af..076699e6f5f22 100644 --- a/clang/tools/clang-linker-wrapper/ClangLinkerWrapper.cpp +++ b/clang/tools/clang-linker-wrapper/ClangLinkerWrapper.cpp @@ -432,10 +432,16 @@ namespace amdgcn { // NOTE: copied from HIPUtility.cpp. static std::string normalizeForBundler(const llvm::Triple &T, bool HasTargetID) { - return HasTargetID ? (T.getArchName() + "-" + T.getVendorName() + "-" + - T.getOSName() + "-" + T.getEnvironmentName()) - .str() - : T.normalize(llvm::Triple::CanonicalForm::FOUR_IDENT); + // The 'llvm' environment is not recognized by the HIP runtime. + llvm::Triple Normalized = T; + if (T.getEnvironment() == llvm::Triple::LLVM) + Normalized.setEnvironmentName(""); + return HasTargetID + ? (Normalized.getArchName() + "-" + Normalized.getVendorName() + + "-" + Normalized.getOSName() + "-" + + Normalized.getEnvironmentName()) + .str() + : Normalized.normalize(llvm::Triple::CanonicalForm::FOUR_IDENT); } Expected<StringRef> _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
