[clang] [NFC][clang][Driver] Move normalizeForBundler to OffloadBundler for reuse (PR #225049)
Aditya Sinha via cfe-commits
cfe-commits at lists.llvm.org
Tue Sep 22 00:32:57 PDT 2026
https://github.com/AdityaSinha149 updated https://github.com/llvm/llvm-project/pull/225049
>From 1a0d5d8e595b1734bc4bf676264956643de6077e Mon Sep 17 00:00:00 2001
From: AdityaSinha149 <adsinha at amd.com>
Date: Mon, 21 Sep 2026 14:33:02 +0530
Subject: [PATCH 1/2] [NFC][clang][Driver] Move normalizeForBundler to
OffloadBundler for reuse
---
clang/include/clang/Driver/OffloadBundler.h | 3 +++
clang/lib/Driver/OffloadBundler.cpp | 20 +++++++++++++++
clang/lib/Driver/ToolChains/HIPUtility.cpp | 22 +---------------
.../tools/clang-linker-wrapper/CMakeLists.txt | 1 +
.../ClangLinkerWrapper.cpp | 25 ++-----------------
5 files changed, 27 insertions(+), 44 deletions(-)
diff --git a/clang/include/clang/Driver/OffloadBundler.h b/clang/include/clang/Driver/OffloadBundler.h
index 96839240543af..193584869209d 100644
--- a/clang/include/clang/Driver/OffloadBundler.h
+++ b/clang/include/clang/Driver/OffloadBundler.h
@@ -96,6 +96,9 @@ struct OffloadTargetInfo {
/// <kind>-<triple>[-<target id>[:target features]]
/// <triple> := <arch>-<vendor>-<os>-<env>
bool checkOffloadBundleID(const llvm::StringRef Str);
+/// Constructs the normalized triple string used in an offload bundle entry ID.
+std::string normalizeForBundler(const llvm::Triple &OrigT,
+ llvm::StringRef BoundArch);
} // namespace clang
#endif // LLVM_CLANG_DRIVER_OFFLOADBUNDLER_H
diff --git a/clang/lib/Driver/OffloadBundler.cpp b/clang/lib/Driver/OffloadBundler.cpp
index 2d0c326ab6f40..a4ad17905a887 100644
--- a/clang/lib/Driver/OffloadBundler.cpp
+++ b/clang/lib/Driver/OffloadBundler.cpp
@@ -1752,3 +1752,23 @@ bool clang::checkOffloadBundleID(const llvm::StringRef Str) {
Str.split(Components, '-', /*MaxSplit=*/5);
return Components.size() == 5 || Components.size() == 6;
}
+
+std::string clang::normalizeForBundler(const llvm::Triple &OrigT,
+ StringRef BoundArch) {
+ llvm::Triple T(OrigT);
+ bool HasTargetID = !BoundArch.empty();
+
+ // FIXME: Short-term hack. The HIP runtime hardcodes the legacy
+ // "amdgcn-amd-amdhsa--" prefix when parsing the target IDs embedded in the
+ // fatbin bundle, so force it.
+ if (HasTargetID && T.isAMDGCN()) {
+ return ("amdgcn-" + T.getVendorName() + "-" + T.getOSName() + "-" +
+ T.getEnvironmentName())
+ .str();
+ }
+
+ return HasTargetID ? (T.getArchName() + "-" + T.getVendorName() + "-" +
+ T.getOSName() + "-" + T.getEnvironmentName())
+ .str()
+ : T.normalize(llvm::Triple::CanonicalForm::FOUR_IDENT);
+}
diff --git a/clang/lib/Driver/ToolChains/HIPUtility.cpp b/clang/lib/Driver/ToolChains/HIPUtility.cpp
index 34a35e18c2e12..4fad72bab15bf 100644
--- a/clang/lib/Driver/ToolChains/HIPUtility.cpp
+++ b/clang/lib/Driver/ToolChains/HIPUtility.cpp
@@ -9,6 +9,7 @@
#include "HIPUtility.h"
#include "clang/Driver/CommonArgs.h"
#include "clang/Driver/Compilation.h"
+#include "clang/Driver/OffloadBundler.h"
#include "clang/Options/Options.h"
#include "llvm/Support/Path.h"
@@ -27,27 +28,6 @@ namespace {
const unsigned HIPCodeObjectAlign = 4096;
} // namespace
-// Constructs a triple string for clang offload bundler.
-static std::string normalizeForBundler(const llvm::Triple &OrigT,
- StringRef BoundArch) {
- llvm::Triple T(OrigT);
- bool HasTargetID = !BoundArch.empty();
-
- // FIXME: Short-term hack. The HIP runtime hardcodes the legacy
- // "amdgcn-amd-amdhsa--" prefix when parsing the target IDs embedded in the
- // fatbin bundle, so force it.
- if (HasTargetID && T.isAMDGCN()) {
- return ("amdgcn-" + T.getVendorName() + "-" + T.getOSName() + "-" +
- T.getEnvironmentName())
- .str();
- }
-
- return HasTargetID ? (T.getArchName() + "-" + T.getVendorName() + "-" +
- T.getOSName() + "-" + T.getEnvironmentName())
- .str()
- : T.normalize(llvm::Triple::CanonicalForm::FOUR_IDENT);
-}
-
// Construct a clang-offload-bundler command to bundle code objects for
// different devices into a HIP fat binary.
void HIP::constructHIPFatbinCommand(Compilation &C, const JobAction &JA,
diff --git a/clang/tools/clang-linker-wrapper/CMakeLists.txt b/clang/tools/clang-linker-wrapper/CMakeLists.txt
index 0c2dea328f856..a7d81d045d74b 100644
--- a/clang/tools/clang-linker-wrapper/CMakeLists.txt
+++ b/clang/tools/clang-linker-wrapper/CMakeLists.txt
@@ -36,6 +36,7 @@ add_clang_tool(clang-linker-wrapper
set(CLANG_LINKER_WRAPPER_LIB_DEPS
clangBasic
+ clangDriver
)
target_link_libraries(clang-linker-wrapper
diff --git a/clang/tools/clang-linker-wrapper/ClangLinkerWrapper.cpp b/clang/tools/clang-linker-wrapper/ClangLinkerWrapper.cpp
index 0e71d0020c071..ff75266d0b13a 100644
--- a/clang/tools/clang-linker-wrapper/ClangLinkerWrapper.cpp
+++ b/clang/tools/clang-linker-wrapper/ClangLinkerWrapper.cpp
@@ -16,6 +16,7 @@
#include "clang/Basic/TargetID.h"
#include "clang/Basic/Version.h"
+#include "clang/Driver/OffloadBundler.h"
#include "llvm/ADT/MapVector.h"
#include "llvm/BinaryFormat/Magic.h"
#include "llvm/Bitcode/BitcodeWriter.h"
@@ -423,28 +424,6 @@ fatbinary(ArrayRef<std::pair<StringRef, StringRef>> InputFiles,
namespace amdgcn {
-// Constructs a triple string for clang offload bundler.
-// NOTE: copied from HIPUtility.cpp.
-static std::string normalizeForBundler(const llvm::Triple &T,
- bool HasTargetID) {
- // FIXME: Short-term hack, mirrors HIPUtility.cpp. The HIP runtime (CLR)
- // hardcodes the legacy "amdgcn-amd-amdhsa" spelling when parsing the target
- // IDs embedded in the fatbin bundle. The new amdgpu subarch triples (e.g.
- // "amdgpu9.00-amd-amdhsa"), and the plain canonical "amdgpu" arch name, do
- // not match, producing hipErrorInvalidImage at load time. Force the legacy
- // "amdgcn-amd-amdhsa" spelling in the bundle entry until CLR stops
- // hardcoding this.
- if (HasTargetID && T.isAMDGCN())
- return ("amdgcn-" + T.getVendorName() + "-" + T.getOSName() + "-" +
- T.getEnvironmentName())
- .str();
-
- return HasTargetID ? (T.getArchName() + "-" + T.getVendorName() + "-" +
- T.getOSName() + "-" + T.getEnvironmentName())
- .str()
- : T.normalize(llvm::Triple::CanonicalForm::FOUR_IDENT);
-}
-
Expected<StringRef>
fatbinary(ArrayRef<std::tuple<StringRef, StringRef, StringRef>> InputFiles,
const ArgList &Args) {
@@ -481,7 +460,7 @@ fatbinary(ArrayRef<std::tuple<StringRef, StringRef, StringRef>> InputFiles,
Saver.save("-targets=host-" + HostTriple.normalize())};
for (const auto &[File, TripleRef, Arch] : InputFiles) {
std::string NormalizedTriple =
- normalizeForBundler(Triple(TripleRef), !Arch.empty());
+ clang::normalizeForBundler(Triple(TripleRef), Arch);
Targets.push_back(Saver.save("hip-" + NormalizedTriple + "-" + Arch));
}
CmdArgs.push_back(Saver.save(llvm::join(Targets, ",")));
>From 9f3edf791215f5b48bd57b7451e32f13a7eba71a Mon Sep 17 00:00:00 2001
From: AdityaSinha149 <adsinha at amd.com>
Date: Tue, 22 Sep 2026 13:02:41 +0530
Subject: [PATCH 2/2] remove clang driver dependency
---
clang/include/clang/Basic/TargetID.h | 10 ++++++++++
clang/include/clang/Driver/OffloadBundler.h | 3 ---
clang/lib/Basic/TargetID.cpp | 20 +++++++++++++++++++
clang/lib/Driver/OffloadBundler.cpp | 20 -------------------
clang/lib/Driver/ToolChains/HIPUtility.cpp | 2 +-
.../tools/clang-linker-wrapper/CMakeLists.txt | 1 -
.../ClangLinkerWrapper.cpp | 1 -
7 files changed, 31 insertions(+), 26 deletions(-)
diff --git a/clang/include/clang/Basic/TargetID.h b/clang/include/clang/Basic/TargetID.h
index 902151d76556d..7e791424df4b8 100644
--- a/clang/include/clang/Basic/TargetID.h
+++ b/clang/include/clang/Basic/TargetID.h
@@ -61,6 +61,16 @@ bool isCompatibleTargetID(llvm::StringRef Provided, llvm::StringRef Requested);
/// Replaces invalid characters (like ':') with safe characters (like '@').
/// Currently only replaces ':' with '@' on Windows.
std::string sanitizeTargetIDInFileName(llvm::StringRef TargetID);
+
+/// Constructs the normalized triple string used inside an offload bundle entry
+/// ID for device triple \p T. When \p BoundArch is non-empty (a target ID is
+/// present) the four triple components are kept (and, for AMDGCN, the legacy
+/// "amdgcn-<vendor>-<os>-<env>" spelling the HIP runtime expects is forced);
+/// otherwise the triple is normalized to its canonical four-identifier form.
+/// Shared by the HIP toolchain, the offload linker wrapper, and clang-repl
+/// device offloading so they all agree on the bundle target-name policy.
+std::string normalizeForBundler(const llvm::Triple &T,
+ llvm::StringRef BoundArch);
} // namespace clang
#endif
diff --git a/clang/include/clang/Driver/OffloadBundler.h b/clang/include/clang/Driver/OffloadBundler.h
index 193584869209d..96839240543af 100644
--- a/clang/include/clang/Driver/OffloadBundler.h
+++ b/clang/include/clang/Driver/OffloadBundler.h
@@ -96,9 +96,6 @@ struct OffloadTargetInfo {
/// <kind>-<triple>[-<target id>[:target features]]
/// <triple> := <arch>-<vendor>-<os>-<env>
bool checkOffloadBundleID(const llvm::StringRef Str);
-/// Constructs the normalized triple string used in an offload bundle entry ID.
-std::string normalizeForBundler(const llvm::Triple &OrigT,
- llvm::StringRef BoundArch);
} // namespace clang
#endif // LLVM_CLANG_DRIVER_OFFLOADBUNDLER_H
diff --git a/clang/lib/Basic/TargetID.cpp b/clang/lib/Basic/TargetID.cpp
index cc3c302bd9e76..efe5b0e0610e1 100644
--- a/clang/lib/Basic/TargetID.cpp
+++ b/clang/lib/Basic/TargetID.cpp
@@ -209,4 +209,24 @@ std::string sanitizeTargetIDInFileName(llvm::StringRef TargetID) {
return FileName;
}
+std::string normalizeForBundler(const llvm::Triple &OrigT,
+ llvm::StringRef BoundArch) {
+ llvm::Triple T(OrigT);
+ bool HasTargetID = !BoundArch.empty();
+
+ // FIXME: Short-term hack. The HIP runtime hardcodes the legacy
+ // "amdgcn-amd-amdhsa--" prefix when parsing the target IDs embedded in the
+ // fatbin bundle, so force it.
+ if (HasTargetID && T.isAMDGCN()) {
+ return ("amdgcn-" + T.getVendorName() + "-" + T.getOSName() + "-" +
+ T.getEnvironmentName())
+ .str();
+ }
+
+ return HasTargetID ? (T.getArchName() + "-" + T.getVendorName() + "-" +
+ T.getOSName() + "-" + T.getEnvironmentName())
+ .str()
+ : T.normalize(llvm::Triple::CanonicalForm::FOUR_IDENT);
+}
+
} // namespace clang
diff --git a/clang/lib/Driver/OffloadBundler.cpp b/clang/lib/Driver/OffloadBundler.cpp
index a4ad17905a887..2d0c326ab6f40 100644
--- a/clang/lib/Driver/OffloadBundler.cpp
+++ b/clang/lib/Driver/OffloadBundler.cpp
@@ -1752,23 +1752,3 @@ bool clang::checkOffloadBundleID(const llvm::StringRef Str) {
Str.split(Components, '-', /*MaxSplit=*/5);
return Components.size() == 5 || Components.size() == 6;
}
-
-std::string clang::normalizeForBundler(const llvm::Triple &OrigT,
- StringRef BoundArch) {
- llvm::Triple T(OrigT);
- bool HasTargetID = !BoundArch.empty();
-
- // FIXME: Short-term hack. The HIP runtime hardcodes the legacy
- // "amdgcn-amd-amdhsa--" prefix when parsing the target IDs embedded in the
- // fatbin bundle, so force it.
- if (HasTargetID && T.isAMDGCN()) {
- return ("amdgcn-" + T.getVendorName() + "-" + T.getOSName() + "-" +
- T.getEnvironmentName())
- .str();
- }
-
- return HasTargetID ? (T.getArchName() + "-" + T.getVendorName() + "-" +
- T.getOSName() + "-" + T.getEnvironmentName())
- .str()
- : T.normalize(llvm::Triple::CanonicalForm::FOUR_IDENT);
-}
diff --git a/clang/lib/Driver/ToolChains/HIPUtility.cpp b/clang/lib/Driver/ToolChains/HIPUtility.cpp
index 4fad72bab15bf..9c4a67b2f182c 100644
--- a/clang/lib/Driver/ToolChains/HIPUtility.cpp
+++ b/clang/lib/Driver/ToolChains/HIPUtility.cpp
@@ -7,9 +7,9 @@
//===----------------------------------------------------------------------===//
#include "HIPUtility.h"
+#include "clang/Basic/TargetID.h"
#include "clang/Driver/CommonArgs.h"
#include "clang/Driver/Compilation.h"
-#include "clang/Driver/OffloadBundler.h"
#include "clang/Options/Options.h"
#include "llvm/Support/Path.h"
diff --git a/clang/tools/clang-linker-wrapper/CMakeLists.txt b/clang/tools/clang-linker-wrapper/CMakeLists.txt
index a7d81d045d74b..0c2dea328f856 100644
--- a/clang/tools/clang-linker-wrapper/CMakeLists.txt
+++ b/clang/tools/clang-linker-wrapper/CMakeLists.txt
@@ -36,7 +36,6 @@ add_clang_tool(clang-linker-wrapper
set(CLANG_LINKER_WRAPPER_LIB_DEPS
clangBasic
- clangDriver
)
target_link_libraries(clang-linker-wrapper
diff --git a/clang/tools/clang-linker-wrapper/ClangLinkerWrapper.cpp b/clang/tools/clang-linker-wrapper/ClangLinkerWrapper.cpp
index ff75266d0b13a..a5ebd7d2ad06b 100644
--- a/clang/tools/clang-linker-wrapper/ClangLinkerWrapper.cpp
+++ b/clang/tools/clang-linker-wrapper/ClangLinkerWrapper.cpp
@@ -16,7 +16,6 @@
#include "clang/Basic/TargetID.h"
#include "clang/Basic/Version.h"
-#include "clang/Driver/OffloadBundler.h"
#include "llvm/ADT/MapVector.h"
#include "llvm/BinaryFormat/Magic.h"
#include "llvm/Bitcode/BitcodeWriter.h"
More information about the cfe-commits
mailing list