[clang] [llvm] [Clang] Support `--offload-compress` for offload binaries (PR #227765)
Joseph Huber via llvm-commits
llvm-commits at lists.llvm.org
Thu Oct 1 06:56:46 PDT 2026
https://github.com/jhuber6 updated https://github.com/llvm/llvm-project/pull/227765
>From df7d0a4eafb51de51a4dd4dd6cec8aa7e08587a2 Mon Sep 17 00:00:00 2001
From: Joseph Huber <huberjn at outlook.com>
Date: Wed, 30 Sep 2026 10:57:03 -0500
Subject: [PATCH 1/2] [Clang] Support `--offload-compress` for offload binaries
Summary:
https://github.com/llvm/llvm-project/pull/222774 added support for
compressing binaries. This PR does the minimal work required to hook
this up to the existing handling. The end goal is to be able to replace
the bundler in HIP.
The one change is moving the `--verbose` handling from the shared helper
so this can be unified.
---
clang/lib/Driver/ToolChains/Clang.cpp | 4 ++++
clang/lib/Driver/ToolChains/CommonArgs.cpp | 2 --
clang/lib/Driver/ToolChains/HIPUtility.cpp | 2 ++
.../test/Driver/hip-offload-compress-zstd.hip | 21 +++++++++++++++-
.../linker-wrapper-compressed.c | 24 +++++++++++++++++++
llvm/docs/CommandGuide/llvm-offload-binary.md | 3 ++-
.../llvm-offload-binary.cpp | 9 ++++---
7 files changed, 58 insertions(+), 7 deletions(-)
create mode 100644 clang/test/OffloadTools/clang-linker-wrapper/linker-wrapper-compressed.c
diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp
index f0d04bf4b6a83..e4cb82617d609 100644
--- a/clang/lib/Driver/ToolChains/Clang.cpp
+++ b/clang/lib/Driver/ToolChains/Clang.cpp
@@ -9640,6 +9640,8 @@ void OffloadBundler::ConstructJob(Compilation &C, const JobAction &JA,
CmdArgs.push_back(TCArgs.MakeArgString(UB));
}
addOffloadCompressArgs(TCArgs, CmdArgs);
+ if (TCArgs.hasArg(options::OPT_v))
+ CmdArgs.push_back("--verbose");
// All the inputs are encoded as commands.
C.addCommand(std::make_unique<Command>(
JA, *this, ResponseFileSupport::None(),
@@ -9697,6 +9699,8 @@ void OffloadPackager::ConstructJob(Compilation &C, const JobAction &JA,
CmdArgs.push_back(Args.MakeArgString("--image=" + llvm::join(Parts, ",")));
}
+ addOffloadCompressArgs(Args, CmdArgs);
+
C.addCommand(std::make_unique<Command>(
JA, *this, ResponseFileSupport::AtFileUTF8(),
Args.MakeArgString(getToolChain().GetProgramPath(getShortName())),
diff --git a/clang/lib/Driver/ToolChains/CommonArgs.cpp b/clang/lib/Driver/ToolChains/CommonArgs.cpp
index c54a0b1068f43..1275d8621f278 100644
--- a/clang/lib/Driver/ToolChains/CommonArgs.cpp
+++ b/clang/lib/Driver/ToolChains/CommonArgs.cpp
@@ -3038,8 +3038,6 @@ void tools::addOffloadCompressArgs(const llvm::opt::ArgList &TCArgs,
if (TCArgs.hasFlag(options::OPT_offload_compress,
options::OPT_no_offload_compress, false))
CmdArgs.push_back("--compress");
- if (TCArgs.hasArg(options::OPT_v))
- CmdArgs.push_back("--verbose");
if (auto *Arg = TCArgs.getLastArg(options::OPT_offload_compression_level_EQ))
CmdArgs.push_back(
TCArgs.MakeArgString(Twine("--compression-level=") + Arg->getValue()));
diff --git a/clang/lib/Driver/ToolChains/HIPUtility.cpp b/clang/lib/Driver/ToolChains/HIPUtility.cpp
index 9c4a67b2f182c..e19cfa0349bfe 100644
--- a/clang/lib/Driver/ToolChains/HIPUtility.cpp
+++ b/clang/lib/Driver/ToolChains/HIPUtility.cpp
@@ -82,6 +82,8 @@ void HIP::constructHIPFatbinCommand(Compilation &C, const JobAction &JA,
BundlerArgs.push_back(BundlerOutputArg);
addOffloadCompressArgs(Args, BundlerArgs);
+ if (Args.hasArg(options::OPT_v))
+ BundlerArgs.push_back("--verbose");
const char *Bundler = Args.MakeArgString(
T.getToolChain().GetProgramPath("clang-offload-bundler"));
diff --git a/clang/test/Driver/hip-offload-compress-zstd.hip b/clang/test/Driver/hip-offload-compress-zstd.hip
index a231197af44f8..fbf03cf8e1cdc 100644
--- a/clang/test/Driver/hip-offload-compress-zstd.hip
+++ b/clang/test/Driver/hip-offload-compress-zstd.hip
@@ -12,4 +12,23 @@
// RUN: -o %t.bc \
// RUN: 2>&1 | FileCheck %s --check-prefix=NEWDRIVER
-// NEWDRIVER: clang-linker-wrapper{{.*}}"--compress" "--verbose" "--compression-level=9"
+// NEWDRIVER: llvm-offload-binary{{.*}}"--image={{[^"]*}}arch=gfx1101{{[^"]*}}" "--compress" "--compression-level=9"{{$}}
+// NEWDRIVER: clang-linker-wrapper{{.*}}"--compress" "--compression-level=9"
+// NEWDRIVER-NOT: "--verbose"
+
+// RUN: %clang -### --target=x86_64-linux-gnu \
+// RUN: -x hip --offload-arch=gfx1100 --offload-arch=gfx1101 \
+// RUN: -nogpuinc -nogpulib -c %S/Inputs/hip_multiple_inputs/a.cu \
+// RUN: --offload-compress \
+// RUN: 2>&1 | FileCheck %s --check-prefix=NORDC
+
+// NORDC: llvm-offload-binary{{.*}}"--image={{[^"]*}}arch=gfx1101{{[^"]*}}" "--compress"{{$}}
+// NORDC: clang-linker-wrapper{{.*}}"--emit-fatbin-only"{{.*}}"--compress"
+
+// RUN: %clang -### --target=x86_64-linux-gnu \
+// RUN: -x hip --offload-arch=gfx1100 \
+// RUN: -fgpu-rdc -nogpuinc -nogpulib -c %S/Inputs/hip_multiple_inputs/a.cu \
+// RUN: --offload-compress --no-offload-compress \
+// RUN: 2>&1 | FileCheck %s --check-prefix=NOCOMPRESS
+
+// NOCOMPRESS: llvm-offload-binary{{.*}}"--image={{[^"]*}}arch=gfx1100{{[^"]*}}"{{$}}
diff --git a/clang/test/OffloadTools/clang-linker-wrapper/linker-wrapper-compressed.c b/clang/test/OffloadTools/clang-linker-wrapper/linker-wrapper-compressed.c
new file mode 100644
index 0000000000000..088955ff76207
--- /dev/null
+++ b/clang/test/OffloadTools/clang-linker-wrapper/linker-wrapper-compressed.c
@@ -0,0 +1,24 @@
+// REQUIRES: x86-registered-target
+
+// RUN: %clang -cc1 %s -triple x86_64-unknown-linux-gnu -emit-obj -o %t.elf.o
+
+// RUN: llvm-offload-binary -o %t.out --compress \
+// RUN: --image=file=%t.elf.o,kind=hip,triple=amdgpu9.0a-amd-amdhsa,arch=gfx90a \
+// RUN: --image=file=%t.elf.o,kind=hip,triple=amdgpu9.08-amd-amdhsa,arch=gfx908
+// 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 \
+// RUN: | FileCheck %s --check-prefixes=CHECK,HIP
+
+// RUN: llvm-offload-binary -o %t-lib.out --compress \
+// RUN: --image=file=%t.elf.o,kind=openmp,triple=amdgpu9.0a-amd-amdhsa,arch=gfx90a
+// RUN: %clang -cc1 %s -triple x86_64-unknown-linux-gnu -emit-obj -o %t-lib.o \
+// RUN: -fembed-offload-object=%t-lib.out
+// RUN: rm -f %t.a && llvm-ar rcs %t.a %t-lib.o
+// RUN: clang-linker-wrapper --dry-run --host-triple=x86_64-unknown-linux-gnu \
+// RUN: --linker-path=/usr/bin/ld --whole-archive %t.a --no-whole-archive \
+// RUN: -o a.out 2>&1 | FileCheck %s
+
+// CHECK: clang{{.*}} --target=amdgpu9.0a-amd-amdhsa -mcpu=gfx90a
+// HIP: clang{{.*}} --target=amdgpu9.08-amd-amdhsa -mcpu=gfx908
diff --git a/llvm/docs/CommandGuide/llvm-offload-binary.md b/llvm/docs/CommandGuide/llvm-offload-binary.md
index 6af4bbe7d4ffa..9c53b12de99b4 100644
--- a/llvm/docs/CommandGuide/llvm-offload-binary.md
+++ b/llvm/docs/CommandGuide/llvm-offload-binary.md
@@ -69,7 +69,8 @@ Compress the packaged offload binary.
:::
:::{option} --compression-format=<zstd|zlib>
-Select the compression format. The default is `zstd`.
+Select the compression format. The default is `zstd`, or `zlib` if LLVM was
+built without zstd support.
:::
:::{option} --compression-level=<level>
diff --git a/llvm/tools/llvm-offload-binary/llvm-offload-binary.cpp b/llvm/tools/llvm-offload-binary/llvm-offload-binary.cpp
index 35946b2b509c7..b171080705cea 100644
--- a/llvm/tools/llvm-offload-binary/llvm-offload-binary.cpp
+++ b/llvm/tools/llvm-offload-binary/llvm-offload-binary.cpp
@@ -143,10 +143,13 @@ static Error bundleImages() {
SmallString<0> Buffer;
if (Compress) {
- if (const char *Reason =
- compression::getReasonIfUnsupported(CompressionFormat))
+ compression::Format Format = CompressionFormat;
+ if (!CompressionFormat.getNumOccurrences() &&
+ !compression::zstd::isAvailable())
+ Format = compression::Format::Zlib;
+ if (const char *Reason = compression::getReasonIfUnsupported(Format))
return createStringError(inconvertibleErrorCode(), Reason);
- compression::Params Params(CompressionFormat);
+ compression::Params Params(Format);
if (CompressionLevel.getNumOccurrences())
Params.level = CompressionLevel;
Expected<SmallString<0>> CompressedOrErr =
>From 43a6db7d20b0a65e237a8128f96e30af7db7775d Mon Sep 17 00:00:00 2001
From: Joseph Huber <huberjn at outlook.com>
Date: Thu, 1 Oct 2026 08:56:26 -0500
Subject: [PATCH 2/2] test update
---
.../clang-linker-wrapper/linker-wrapper-compressed.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/clang/test/OffloadTools/clang-linker-wrapper/linker-wrapper-compressed.c b/clang/test/OffloadTools/clang-linker-wrapper/linker-wrapper-compressed.c
index 088955ff76207..65b09ec2fbbbb 100644
--- a/clang/test/OffloadTools/clang-linker-wrapper/linker-wrapper-compressed.c
+++ b/clang/test/OffloadTools/clang-linker-wrapper/linker-wrapper-compressed.c
@@ -1,4 +1,5 @@
// REQUIRES: x86-registered-target
+// REQUIRES: zlib || zstd
// RUN: %clang -cc1 %s -triple x86_64-unknown-linux-gnu -emit-obj -o %t.elf.o
More information about the llvm-commits
mailing list