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

Reply via email to