https://github.com/AdityaSinha149 updated https://github.com/llvm/llvm-project/pull/225049
>From 1a0d5d8e595b1734bc4bf676264956643de6077e Mon Sep 17 00:00:00 2001 From: AdityaSinha149 <[email protected]> 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 <[email protected]> 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" _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
