[clang] [llvm] [Clang] Support `--offload-compress` for offload binaries (PR #227765)

via llvm-commits llvm-commits at lists.llvm.org
Wed Sep 30 09:00:36 PDT 2026


llvmorg-github-actions[bot] wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-clang-driver

Author: Joseph Huber (jhuber6)

<details>
<summary>Changes</summary>

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.


---
Full diff: https://github.com/llvm/llvm-project/pull/227765.diff


7 Files Affected:

- (modified) clang/lib/Driver/ToolChains/Clang.cpp (+4) 
- (modified) clang/lib/Driver/ToolChains/CommonArgs.cpp (-2) 
- (modified) clang/lib/Driver/ToolChains/HIPUtility.cpp (+2) 
- (modified) clang/test/Driver/hip-offload-compress-zstd.hip (+20-1) 
- (added) clang/test/OffloadTools/clang-linker-wrapper/linker-wrapper-compressed.c (+24) 
- (modified) llvm/docs/CommandGuide/llvm-offload-binary.md (+2-1) 
- (modified) llvm/tools/llvm-offload-binary/llvm-offload-binary.cpp (+6-3) 


``````````diff
diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp
index f0d04bf4b6a838..e4cb82617d6098 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 c54a0b1068f437..1275d8621f2782 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 9c4a67b2f182c6..e19cfa0349bfe6 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 a231197af44f83..fbf03cf8e1cdc4 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 00000000000000..088955ff76207d
--- /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 6af4bbe7d4ffa3..9c53b12de99b42 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 35946b2b509c7d..b171080705cea1 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 =

``````````

</details>


https://github.com/llvm/llvm-project/pull/227765


More information about the llvm-commits mailing list