[clang] [HIP] Fix OffloadBundler triple when using extra 'llvm' environment (PR #214841)
via cfe-commits
cfe-commits at lists.llvm.org
Fri Aug 7 13:00:07 PDT 2026
llvmorg-github-actions[bot] wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-clang-driver
Author: Joseph Huber (jhuber6)
<details>
<summary>Changes</summary>
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.
---
Full diff: https://github.com/llvm/llvm-project/pull/214841.diff
4 Files Affected:
- (modified) clang/lib/Driver/ToolChains/HIPUtility.cpp (+10-4)
- (modified) clang/test/Driver/hip-device-libs-llvm-env.hip (+8)
- (modified) clang/test/OffloadTools/clang-linker-wrapper/linker-wrapper.c (+9)
- (modified) clang/tools/clang-linker-wrapper/ClangLinkerWrapper.cpp (+10-4)
``````````diff
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>
``````````
</details>
https://github.com/llvm/llvm-project/pull/214841
More information about the cfe-commits
mailing list