[clang] HIPSPV: Unbundle SDL (PR #136412)
Paulius Velesko via cfe-commits
cfe-commits at lists.llvm.org
Tue Jun 17 22:54:50 PDT 2025
https://github.com/pvelesko updated https://github.com/llvm/llvm-project/pull/136412
>From fe6a426fc135c7232650b5ebac465ceaa66d7a20 Mon Sep 17 00:00:00 2001
From: Paulius Velesko <pvelesko at pglc.io>
Date: Sat, 19 Apr 2025 10:02:59 +0300
Subject: [PATCH 1/3] HIPSPV: Unbundle SDL
This fixes the issue of rdc linking static libraries with device code
---
clang/lib/Driver/ToolChains/HIPSPV.cpp | 9 +++++++++
1 file changed, 9 insertions(+)
diff --git a/clang/lib/Driver/ToolChains/HIPSPV.cpp b/clang/lib/Driver/ToolChains/HIPSPV.cpp
index bbde5c047c3f9..eaf20f34edb72 100644
--- a/clang/lib/Driver/ToolChains/HIPSPV.cpp
+++ b/clang/lib/Driver/ToolChains/HIPSPV.cpp
@@ -70,6 +70,15 @@ void HIPSPV::Linker::constructLinkAndEmitSpirvCommand(
// Link LLVM bitcode.
ArgStringList LinkArgs{};
+
+ // Add static device libraries using the common helper function.
+ // This handles unbundling archives (.a) containing bitcode bundles.
+ const HIPSPVToolChain &TC = static_cast<const HIPSPVToolChain &>(getToolChain());
+ StringRef Arch = TC.getTriple().getArchName();
+ StringRef Target = "generic"; // SPIR-V is generic, no specific target ID like -mcpu
+ tools::AddStaticDeviceLibsLinking(C, *this, JA, Inputs, Args, LinkArgs, Arch,
+ Target, /*IsBitCodeSDL=*/true);
+
for (auto Input : Inputs)
LinkArgs.push_back(Input.getFilename());
LinkArgs.append({"-o", TempFile});
>From 116d6894516cff02c11b69380f4f86c3208d0b06 Mon Sep 17 00:00:00 2001
From: Paulius Velesko <pvelesko at pglc.io>
Date: Tue, 17 Jun 2025 15:23:54 +0300
Subject: [PATCH 2/3] Update clang/lib/Driver/ToolChains/HIPSPV.cpp
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Co-authored-by: Henry Linjamäki <henry.linjamaki at gmail.com>
---
clang/lib/Driver/ToolChains/HIPSPV.cpp | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/clang/lib/Driver/ToolChains/HIPSPV.cpp b/clang/lib/Driver/ToolChains/HIPSPV.cpp
index eaf20f34edb72..ae485a2688b9a 100644
--- a/clang/lib/Driver/ToolChains/HIPSPV.cpp
+++ b/clang/lib/Driver/ToolChains/HIPSPV.cpp
@@ -73,8 +73,7 @@ void HIPSPV::Linker::constructLinkAndEmitSpirvCommand(
// Add static device libraries using the common helper function.
// This handles unbundling archives (.a) containing bitcode bundles.
- const HIPSPVToolChain &TC = static_cast<const HIPSPVToolChain &>(getToolChain());
- StringRef Arch = TC.getTriple().getArchName();
+ StringRef Arch = getToolChain().getTriple().getArchName();
StringRef Target = "generic"; // SPIR-V is generic, no specific target ID like -mcpu
tools::AddStaticDeviceLibsLinking(C, *this, JA, Inputs, Args, LinkArgs, Arch,
Target, /*IsBitCodeSDL=*/true);
>From 9e4e9f3b04c748e30039ff384a456a140db74198 Mon Sep 17 00:00:00 2001
From: Paulius Velesko <pvelesko at pglc.io>
Date: Tue, 17 Jun 2025 16:27:22 +0300
Subject: [PATCH 3/3] Address PR comments: Fix HIPSPV SDL linking
* Also ordering and add --no-offloadlib support
---
clang/lib/Driver/ToolChains/CommonArgs.cpp | 5 +++
clang/lib/Driver/ToolChains/HIPSPV.cpp | 6 +--
.../Driver/hipspv-link-static-library.hip | 38 +++++++++++++++++++
3 files changed, 46 insertions(+), 3 deletions(-)
create mode 100644 clang/test/Driver/hipspv-link-static-library.hip
diff --git a/clang/lib/Driver/ToolChains/CommonArgs.cpp b/clang/lib/Driver/ToolChains/CommonArgs.cpp
index 109316d0a27e7..2f0235cec4c31 100644
--- a/clang/lib/Driver/ToolChains/CommonArgs.cpp
+++ b/clang/lib/Driver/ToolChains/CommonArgs.cpp
@@ -2622,6 +2622,11 @@ void tools::AddStaticDeviceLibs(Compilation *C, const Tool *T,
llvm::opt::ArgStringList &CC1Args,
StringRef Arch, StringRef Target,
bool isBitCodeSDL) {
+
+ // Check if offload libraries are disabled
+ if (!DriverArgs.hasFlag(options::OPT_offloadlib, options::OPT_no_offloadlib,
+ true))
+ return;
SmallVector<std::string, 8> LibraryPaths;
// Add search directories from LIBRARY_PATH env variable
diff --git a/clang/lib/Driver/ToolChains/HIPSPV.cpp b/clang/lib/Driver/ToolChains/HIPSPV.cpp
index ae485a2688b9a..15e7c2c9e9418 100644
--- a/clang/lib/Driver/ToolChains/HIPSPV.cpp
+++ b/clang/lib/Driver/ToolChains/HIPSPV.cpp
@@ -71,15 +71,15 @@ void HIPSPV::Linker::constructLinkAndEmitSpirvCommand(
// Link LLVM bitcode.
ArgStringList LinkArgs{};
+ for (auto Input : Inputs)
+ LinkArgs.push_back(Input.getFilename());
+
// Add static device libraries using the common helper function.
// This handles unbundling archives (.a) containing bitcode bundles.
StringRef Arch = getToolChain().getTriple().getArchName();
StringRef Target = "generic"; // SPIR-V is generic, no specific target ID like -mcpu
tools::AddStaticDeviceLibsLinking(C, *this, JA, Inputs, Args, LinkArgs, Arch,
Target, /*IsBitCodeSDL=*/true);
-
- for (auto Input : Inputs)
- LinkArgs.push_back(Input.getFilename());
LinkArgs.append({"-o", TempFile});
const char *LlvmLink =
Args.MakeArgString(getToolChain().GetProgramPath("llvm-link"));
diff --git a/clang/test/Driver/hipspv-link-static-library.hip b/clang/test/Driver/hipspv-link-static-library.hip
new file mode 100644
index 0000000000000..5447d35014bbf
--- /dev/null
+++ b/clang/test/Driver/hipspv-link-static-library.hip
@@ -0,0 +1,38 @@
+// Test HIPSPV static device library linking
+// REQUIRES: system-linux
+// UNSUPPORTED: system-windows
+
+// Create a dummy archive to test SDL linking
+// RUN: rm -rf %t && mkdir %t
+// RUN: touch %t/dummy.bc
+// RUN: llvm-ar cr %t/libSDL.a %t/dummy.bc
+
+// Test that -l options are passed to llvm-link for --offload=spirv64
+// RUN: %clang -### --target=x86_64-linux-gnu --offload=spirv64 \
+// RUN: --hip-path=%S/Inputs/hipspv -nohipwrapperinc %s \
+// RUN: -L%t -lSDL \
+// RUN: 2>&1 | FileCheck -check-prefix=SDL-LINK %s
+
+// Test that .a files are properly unbundled and passed to llvm-link
+// RUN: %clang -### --target=x86_64-linux-gnu --offload=spirv64 \
+// RUN: --hip-path=%S/Inputs/hipspv -nohipwrapperinc %s \
+// RUN: %t/libSDL.a \
+// RUN: 2>&1 | FileCheck -check-prefix=SDL-ARCHIVE %s
+
+// Verify that the input files are added before the SDL files in llvm-link command
+// This tests the ordering fix to match HIPAMD behavior
+// SDL-LINK: "{{.*}}clang-offload-bundler" "-unbundle" "-type=a" "-input={{.*}}libSDL.a" "-targets=hip-spirv64-unknown-unknown-unknown-generic" "-output=[[SDL_A:.*\.a]]" "-allow-missing-bundles"
+// SDL-LINK: "{{.*}}llvm-link" "{{.*}}.bc" "[[SDL_A]]" "-o"
+
+// SDL-ARCHIVE: "{{.*}}clang-offload-bundler" "-unbundle" "-type=a" "-input={{.*}}libSDL.a" "-targets=hip-spirv64-unknown-unknown-unknown-generic" "-output=[[SDL_A:.*\.a]]" "-allow-missing-bundles"
+// SDL-ARCHIVE: "{{.*}}llvm-link" "{{.*}}.bc" "[[SDL_A]]" "-o"
+
+// Test that no SDL linking occurs when --no-offloadlib is used
+// RUN: %clang -### --target=x86_64-linux-gnu --offload=spirv64 \
+// RUN: --hip-path=%S/Inputs/hipspv -nohipwrapperinc --no-offloadlib %s \
+// RUN: -L%t -lSDL \
+// RUN: 2>&1 | FileCheck -check-prefix=NO-SDL %s
+
+// NO-SDL-NOT: "{{.*}}clang-offload-bundler" "-unbundle" "-type=a" "-input={{.*}}libSDL.a"
+
+__global__ void kernel() {}
\ No newline at end of file
More information about the cfe-commits
mailing list