[clang] [llvm] [llvm][tools] Extend llvm-objdump to support nested OffloadBinaries (PR #185425)
Alex Duran via cfe-commits
cfe-commits at lists.llvm.org
Mon Apr 13 02:53:30 PDT 2026
https://github.com/adurang updated https://github.com/llvm/llvm-project/pull/185425
>From 0cbafd367321c547ad673c66fabcacbca629e039 Mon Sep 17 00:00:00 2001
From: "Duran, Alex" <alejandro.duran at intel.com>
Date: Mon, 9 Mar 2026 06:05:50 -0700
Subject: [PATCH 01/33] [llvm][offload] Change Intel's SPIRV containerizetion
from ELF to OffloadBinary
---
.../clang-linker-wrapper-spirv-elf.cpp | 22 ----
.../llvm/Frontend/Offloading/Utility.h | 27 ++++-
llvm/lib/Frontend/Offloading/Utility.cpp | 114 ++++++------------
3 files changed, 59 insertions(+), 104 deletions(-)
delete mode 100644 clang/test/Tooling/clang-linker-wrapper-spirv-elf.cpp
diff --git a/clang/test/Tooling/clang-linker-wrapper-spirv-elf.cpp b/clang/test/Tooling/clang-linker-wrapper-spirv-elf.cpp
deleted file mode 100644
index 8a7d36d36b025..0000000000000
--- a/clang/test/Tooling/clang-linker-wrapper-spirv-elf.cpp
+++ /dev/null
@@ -1,22 +0,0 @@
-// Verify the ELF packaging of OpenMP SPIR-V device images.
-// REQUIRES: system-linux
-// REQUIRES: spirv-tools
-// REQUIRES: spirv-registered-target
-// RUN: mkdir -p %t_tmp
-// RUN: cd %t_tmp
-// RUN: %clangxx -fopenmp -fopenmp-targets=spirv64-intel -nogpulib -c -o %t_clang-linker-wrapper-spirv-elf.o %s
-// RUN: not clang-linker-wrapper -o a.out %t_clang-linker-wrapper-spirv-elf.o --save-temps --linker-path=ld
-// RUN: llvm-offload-binary --image=triple=spirv64-intel,kind=openmp,file=%t.elf %t_tmp/a.out.openmp.image.wrapper.o
-// RUN: llvm-readelf -h %t.elf | FileCheck -check-prefix=CHECK-MACHINE %s
-// RUN: llvm-readelf -t %t.elf | FileCheck -check-prefix=CHECK-SECTION %s
-// RUN: llvm-readelf -n %t.elf | FileCheck -check-prefix=CHECK-NOTES %s
-
-// CHECK-MACHINE: Machine: Intel Graphics Technology
-
-// CHECK-SECTION: .note.inteloneompoffload
-// CHECK-SECTION: __openmp_offload_spirv_0
-
-// CHECK-NOTES-COUNT-3: INTELONEOMPOFFLOAD
-int main(int argc, char** argv) {
- return 0;
-}
diff --git a/llvm/include/llvm/Frontend/Offloading/Utility.h b/llvm/include/llvm/Frontend/Offloading/Utility.h
index 23e6702beb476..0c2e5e7c860e3 100644
--- a/llvm/include/llvm/Frontend/Offloading/Utility.h
+++ b/llvm/include/llvm/Frontend/Offloading/Utility.h
@@ -158,10 +158,29 @@ LLVM_ABI Error getAMDGPUMetaDataFromImage(
} // namespace amdgpu
namespace intel {
-/// Containerizes an offloading binary into the ELF binary format expected by
-/// the Intel runtime offload plugin.
-LLVM_ABI Error
-containerizeOpenMPSPIRVImage(std::unique_ptr<MemoryBuffer> &Binary);
+/// Containerizes an SPIR-V image into inner OffloadBinary format.
+/// Creates a nested OffloadBinary structure where the inner binary contains
+/// the raw SPIR-V and associated metadata (version, format, triple, etc.).
+/// This inner OffloadBinary is then embedded in an outer OffloadBinary.
+///
+/// \param Binary The SPIR-V binary to containerize
+/// \param CompileOpts Optional compilation options
+/// \param LinkOpts Optional linking options
+LLVM_ABI Error containerizeSPIRVImage(std::unique_ptr<MemoryBuffer> &Binary,
+ object::OffloadKind Kind,
+ StringRef CompileOpts = "",
+ StringRef LinkOpts = "");
+
+/// Containerizes OpenMP SPIR-V image into inner OffloadBinary format.
+/// \param Binary The SPIR-V binary to containerize
+/// \param CompileOpts Optional compilation options
+/// \param LinkOpts Optional linking options
+inline LLVM_ABI Error containerizeOpenMPSPIRVImage(
+ std::unique_ptr<MemoryBuffer> &Binary, StringRef CompileOpts = "",
+ StringRef LinkOpts = "") {
+ return containerizeSPIRVImage(Binary, object::OffloadKind::OFK_OpenMP,
+ CompileOpts, LinkOpts);
+}
} // namespace intel
} // namespace offloading
} // namespace llvm
diff --git a/llvm/lib/Frontend/Offloading/Utility.cpp b/llvm/lib/Frontend/Offloading/Utility.cpp
index 5000488a52f37..d5571a15baf1c 100644
--- a/llvm/lib/Frontend/Offloading/Utility.cpp
+++ b/llvm/lib/Frontend/Offloading/Utility.cpp
@@ -15,6 +15,7 @@
#include "llvm/IR/GlobalVariable.h"
#include "llvm/IR/Value.h"
#include "llvm/Object/ELFObjectFile.h"
+#include "llvm/Object/OffloadBinary.h"
#include "llvm/ObjectYAML/ELFYAML.h"
#include "llvm/ObjectYAML/yaml2obj.h"
#include "llvm/Support/MemoryBufferRef.h"
@@ -377,84 +378,41 @@ Error llvm::offloading::amdgpu::getAMDGPUMetaDataFromImage(
}
return Error::success();
}
-Error offloading::intel::containerizeOpenMPSPIRVImage(
- std::unique_ptr<MemoryBuffer> &Img) {
- constexpr char INTEL_ONEOMP_OFFLOAD_VERSION[] = "1.0";
- constexpr int NT_INTEL_ONEOMP_OFFLOAD_VERSION = 1;
- constexpr int NT_INTEL_ONEOMP_OFFLOAD_IMAGE_COUNT = 2;
- constexpr int NT_INTEL_ONEOMP_OFFLOAD_IMAGE_AUX = 3;
-
- // Start creating notes for the ELF container.
- std::vector<ELFYAML::NoteEntry> Notes;
- std::string Version = toHex(INTEL_ONEOMP_OFFLOAD_VERSION);
- Notes.emplace_back(ELFYAML::NoteEntry{"INTELONEOMPOFFLOAD",
- yaml::BinaryRef(Version),
- NT_INTEL_ONEOMP_OFFLOAD_VERSION});
-
- // The AuxInfo string will hold auxiliary information for the image.
- // ELFYAML::NoteEntry structures will hold references to the
- // string, so we have to make sure the string is valid.
- std::string AuxInfo;
-
- // TODO: Pass compile/link opts
- StringRef CompileOpts = "";
- StringRef LinkOpts = "";
-
- unsigned ImageFmt = 1; // SPIR-V format
-
- AuxInfo = toHex((Twine(0) + Twine('\0') + Twine(ImageFmt) + Twine('\0') +
- CompileOpts + Twine('\0') + LinkOpts)
- .str());
- Notes.emplace_back(ELFYAML::NoteEntry{"INTELONEOMPOFFLOAD",
- yaml::BinaryRef(AuxInfo),
- NT_INTEL_ONEOMP_OFFLOAD_IMAGE_AUX});
-
- std::string ImgCount = toHex(Twine(1).str()); // always one image per ELF
- Notes.emplace_back(ELFYAML::NoteEntry{"INTELONEOMPOFFLOAD",
- yaml::BinaryRef(ImgCount),
- NT_INTEL_ONEOMP_OFFLOAD_IMAGE_COUNT});
-
- std::string YamlFile;
- llvm::raw_string_ostream YamlFileStream(YamlFile);
-
- // Write the YAML template file.
-
- // We use 64-bit little-endian ELF currently.
- ELFYAML::FileHeader Header{};
- Header.Class = ELF::ELFCLASS64;
- Header.Data = ELF::ELFDATA2LSB;
- Header.Type = ELF::ET_DYN;
- Header.Machine = ELF::EM_INTELGT;
-
- // Create a section with notes.
- ELFYAML::NoteSection Section{};
- Section.Type = ELF::SHT_NOTE;
- Section.AddressAlign = 0;
- Section.Name = ".note.inteloneompoffload";
- Section.Notes.emplace(std::move(Notes));
-
- ELFYAML::Object Object{};
- Object.Header = Header;
- Object.Chunks.push_back(
- std::make_unique<ELFYAML::NoteSection>(std::move(Section)));
-
- // Create the section that will hold the image
- ELFYAML::RawContentSection ImageSection{};
- ImageSection.Type = ELF::SHT_PROGBITS;
- ImageSection.AddressAlign = 0;
- std::string Name = "__openmp_offload_spirv_0";
- ImageSection.Name = Name;
- ImageSection.Content =
- llvm::yaml::BinaryRef(arrayRefFromStringRef(Img->getBuffer()));
- Object.Chunks.push_back(
- std::make_unique<ELFYAML::RawContentSection>(std::move(ImageSection)));
- Error Err = Error::success();
- llvm::yaml::yaml2elf(
- Object, YamlFileStream,
- [&Err](const Twine &Msg) { Err = createStringError(Msg); }, UINT64_MAX);
- if (Err)
- return Err;
+Error offloading::intel::containerizeSPIRVImage(
+ std::unique_ptr<MemoryBuffer> &Img, object::OffloadKind Kind,
+ StringRef CompileOpts, StringRef LinkOpts) {
+ using namespace object;
+
+ // Create inner OffloadBinary containing the raw SPIR-V
+ OffloadBinary::OffloadingImage InnerImage;
+ InnerImage.TheImageKind = ImageKind::IMG_SPIRV;
+ InnerImage.TheOffloadKind = Kind;
+ InnerImage.Flags = 0;
+
+ // Add metadata about the SPIR-V image as string key-value pairs.
+ MapVector<StringRef, StringRef> StringData;
+ StringData["version"] = "1.0";
+ StringData["format"] = "spirv";
+ StringData["triple"] = "spirv64-intel";
+
+ // Store compile/link options if provided
+ if (!CompileOpts.empty())
+ StringData["compile-opts"] = CompileOpts;
+ if (!LinkOpts.empty())
+ StringData["link-opts"] = LinkOpts;
+
+ InnerImage.StringData = StringData;
+
+ // Wrap the raw SPIR-V binary
+ InnerImage.Image = std::move(Img);
+
+ // Serialize inner OffloadBinary
+ SmallVector<OffloadBinary::OffloadingImage> Images;
+ Images.push_back(std::move(InnerImage));
+ SmallString<0> InnerBinaryData = OffloadBinary::write(Images);
+
+ // Replace the buffer with the inner OffloadBinary
+ Img = MemoryBuffer::getMemBufferCopy(InnerBinaryData);
- Img = MemoryBuffer::getMemBufferCopy(YamlFile);
return Error::success();
}
>From 30ed5e4f34339bbb7fd7e3c454f4fa109e1d893b Mon Sep 17 00:00:00 2001
From: "Duran, Alex" <alejandro.duran at intel.com>
Date: Mon, 9 Mar 2026 07:09:28 -0700
Subject: [PATCH 02/33] [llvm][tools] Exted llvm-objdump to support nested
OffloadBinaries
---
llvm/tools/llvm-objdump/OffloadDump.cpp | 61 +++++++++++++++++++++++--
1 file changed, 56 insertions(+), 5 deletions(-)
diff --git a/llvm/tools/llvm-objdump/OffloadDump.cpp b/llvm/tools/llvm-objdump/OffloadDump.cpp
index cd2727069c2e9..1d48d44dcafc9 100644
--- a/llvm/tools/llvm-objdump/OffloadDump.cpp
+++ b/llvm/tools/llvm-objdump/OffloadDump.cpp
@@ -13,6 +13,7 @@
#include "OffloadDump.h"
#include "llvm-objdump.h"
+#include "llvm/BinaryFormat/Magic.h"
#include "llvm/Object/ELFObjectFile.h"
#include "llvm/Object/OffloadBinary.h"
#include "llvm/Object/OffloadBundle.h"
@@ -43,13 +44,63 @@ static StringRef getImageName(const OffloadBinary &OB) {
}
}
+static void printOffloadBinaryMetadata(const OffloadBinary &OB,
+ uint64_t justifaction) {
+ outs() << left_justify("kind", justifaction) << getImageName(OB) << "\n";
+ outs() << left_justify("arch", justifaction) << OB.getArch() << "\n";
+ outs() << left_justify("triple", justifaction) << OB.getTriple() << "\n";
+ outs() << left_justify("producer", justifaction)
+ << getOffloadKindName(OB.getOffloadKind()) << "\n";
+
+ StringRef InnerImage = OB.getImage();
+ outs() << left_justify(" image size", justifaction) << InnerImage.size()
+ << " bytes\n";
+}
+
+/// Print information about nested OffloadBinary (inner layer)
+static void printNestedOffloadBinary(const OffloadBinary &OuterOB,
+ uint64_t Index) {
+ StringRef ImageData = OuterOB.getImage();
+
+ // Parse inner OffloadBinary
+ MemoryBufferRef InnerBuffer(ImageData, "inner-offload-binary");
+ auto InnerBinariesOrErr = OffloadBinary::create(InnerBuffer);
+ if (!InnerBinariesOrErr) {
+ reportWarning("Failed to parse nested OffloadBinary: " +
+ toString(InnerBinariesOrErr.takeError()),
+ OuterOB.getFileName());
+ return;
+ }
+
+ auto &InnerBinaries = *InnerBinariesOrErr;
+ if (InnerBinaries.empty()) {
+ reportWarning("Nested OffloadBinary contains no entries",
+ OuterOB.getFileName());
+ return;
+ }
+
+ outs() << " [Nested OffloadBinary format detected]\n";
+ outs() << " Number of inner images: " << InnerBinaries.size() << "\n";
+
+ // Display information for each inner image
+ for (uint64_t I = 0, E = InnerBinaries.size(); I != E; ++I) {
+ const OffloadBinary *InnerOB = InnerBinaries[I].get();
+
+ if (InnerBinaries.size() > 1)
+ outs() << " Inner image [" << I << "]:\n";
+
+ printOffloadBinaryMetadata(*InnerOB, 20);
+ }
+}
+
static void printBinary(const OffloadBinary &OB, uint64_t Index) {
outs() << "\nOFFLOADING IMAGE [" << Index << "]:\n";
- outs() << left_justify("kind", 16) << getImageName(OB) << "\n";
- outs() << left_justify("arch", 16) << OB.getArch() << "\n";
- outs() << left_justify("triple", 16) << OB.getTriple() << "\n";
- outs() << left_justify("producer", 16)
- << getOffloadKindName(OB.getOffloadKind()) << "\n";
+ printOffloadBinaryMetadata(OB, 16);
+
+ StringRef ImageData = OB.getImage();
+ // Check for nested OffloadBinary format
+ if (identify_magic(ImageData) == file_magic::offload_binary)
+ printNestedOffloadBinary(OB, Index);
}
/// Print the embedded offloading contents of an ObjectFile \p O.
>From c16e95113ef5c183939e7cc89bcc438539487dfc Mon Sep 17 00:00:00 2001
From: "Duran, Alex" <alejandro.duran at intel.com>
Date: Mon, 9 Mar 2026 07:29:09 -0700
Subject: [PATCH 03/33] Add test
---
clang/test/Tooling/clang-linker-wrapper-spirv.cpp | 14 ++++++++++++++
1 file changed, 14 insertions(+)
create mode 100644 clang/test/Tooling/clang-linker-wrapper-spirv.cpp
diff --git a/clang/test/Tooling/clang-linker-wrapper-spirv.cpp b/clang/test/Tooling/clang-linker-wrapper-spirv.cpp
new file mode 100644
index 0000000000000..74d1fb2c212c1
--- /dev/null
+++ b/clang/test/Tooling/clang-linker-wrapper-spirv.cpp
@@ -0,0 +1,14 @@
+// Verify the ELF packaging of OpenMP SPIR-V device images.
+// REQUIRES: system-linux
+// REQUIRES: spirv-tools
+// REQUIRES: spirv-registered-target
+// RUN: %clangxx -fopenmp -fopenmp-targets=spirv64-intel -nogpulib -o %t %s
+// RUN: llvm-objdump --offloading %t | FileCheck -check-prefix=CHECK %s
+
+// CHECK: [Nested OffloadBinary
+// CHECK: Number of inner images: 1
+// CHECK: spirv64-intel
+
+int main(int argc, char** argv) {
+ return 0;
+}
>From 7b5920b79b5fdd9ef152e245b03a13e78dda3c03 Mon Sep 17 00:00:00 2001
From: "Duran, Alex" <alejandro.duran at intel.com>
Date: Mon, 9 Mar 2026 07:40:58 -0700
Subject: [PATCH 04/33] fix tool output
---
llvm/tools/llvm-objdump/OffloadDump.cpp | 18 ++++++++++--------
1 file changed, 10 insertions(+), 8 deletions(-)
diff --git a/llvm/tools/llvm-objdump/OffloadDump.cpp b/llvm/tools/llvm-objdump/OffloadDump.cpp
index 1d48d44dcafc9..50b4178495b68 100644
--- a/llvm/tools/llvm-objdump/OffloadDump.cpp
+++ b/llvm/tools/llvm-objdump/OffloadDump.cpp
@@ -45,15 +45,17 @@ static StringRef getImageName(const OffloadBinary &OB) {
}
static void printOffloadBinaryMetadata(const OffloadBinary &OB,
- uint64_t justifaction) {
- outs() << left_justify("kind", justifaction) << getImageName(OB) << "\n";
- outs() << left_justify("arch", justifaction) << OB.getArch() << "\n";
- outs() << left_justify("triple", justifaction) << OB.getTriple() << "\n";
- outs() << left_justify("producer", justifaction)
+ uint64_t level) {
+ const std::string Indent(level * 2, ' ');
+
+ outs() << Indent << left_justify("kind", 16) << getImageName(OB) << "\n";
+ outs() << Indent << left_justify("arch", 16) << OB.getArch() << "\n";
+ outs() << Indent << left_justify("triple", 16) << OB.getTriple() << "\n";
+ outs() << Indent << left_justify("producer", 16)
<< getOffloadKindName(OB.getOffloadKind()) << "\n";
StringRef InnerImage = OB.getImage();
- outs() << left_justify(" image size", justifaction) << InnerImage.size()
+ outs() << Indent << left_justify("image size", 16) << InnerImage.size()
<< " bytes\n";
}
@@ -89,13 +91,13 @@ static void printNestedOffloadBinary(const OffloadBinary &OuterOB,
if (InnerBinaries.size() > 1)
outs() << " Inner image [" << I << "]:\n";
- printOffloadBinaryMetadata(*InnerOB, 20);
+ printOffloadBinaryMetadata(*InnerOB, 1);
}
}
static void printBinary(const OffloadBinary &OB, uint64_t Index) {
outs() << "\nOFFLOADING IMAGE [" << Index << "]:\n";
- printOffloadBinaryMetadata(OB, 16);
+ printOffloadBinaryMetadata(OB, 0);
StringRef ImageData = OB.getImage();
// Check for nested OffloadBinary format
>From 69ce34569bda1a251eedf75d5ca62f896a72145c Mon Sep 17 00:00:00 2001
From: "Duran, Alex" <alejandro.duran at intel.com>
Date: Mon, 9 Mar 2026 07:42:00 -0700
Subject: [PATCH 05/33] fix messages
---
llvm/tools/llvm-objdump/OffloadDump.cpp | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/llvm/tools/llvm-objdump/OffloadDump.cpp b/llvm/tools/llvm-objdump/OffloadDump.cpp
index 50b4178495b68..ffe4d52d30446 100644
--- a/llvm/tools/llvm-objdump/OffloadDump.cpp
+++ b/llvm/tools/llvm-objdump/OffloadDump.cpp
@@ -68,7 +68,7 @@ static void printNestedOffloadBinary(const OffloadBinary &OuterOB,
MemoryBufferRef InnerBuffer(ImageData, "inner-offload-binary");
auto InnerBinariesOrErr = OffloadBinary::create(InnerBuffer);
if (!InnerBinariesOrErr) {
- reportWarning("Failed to parse nested OffloadBinary: " +
+ reportWarning("failed to parse nested OffloadBinary: " +
toString(InnerBinariesOrErr.takeError()),
OuterOB.getFileName());
return;
@@ -76,7 +76,7 @@ static void printNestedOffloadBinary(const OffloadBinary &OuterOB,
auto &InnerBinaries = *InnerBinariesOrErr;
if (InnerBinaries.empty()) {
- reportWarning("Nested OffloadBinary contains no entries",
+ reportWarning("nested OffloadBinary contains no entries",
OuterOB.getFileName());
return;
}
>From 2b43d73bc6e492dc1b189e2f0ff251ac39c7ecc5 Mon Sep 17 00:00:00 2001
From: "Duran, Alex" <alejandro.duran at intel.com>
Date: Mon, 9 Mar 2026 14:35:10 -0700
Subject: [PATCH 06/33] generalize containerizeImage
---
.../llvm/Frontend/Offloading/Utility.h | 32 ++++++------
llvm/lib/Frontend/Offloading/Utility.cpp | 49 +++++++++++--------
2 files changed, 44 insertions(+), 37 deletions(-)
diff --git a/llvm/include/llvm/Frontend/Offloading/Utility.h b/llvm/include/llvm/Frontend/Offloading/Utility.h
index 0c2e5e7c860e3..58676ebbd14fc 100644
--- a/llvm/include/llvm/Frontend/Offloading/Utility.h
+++ b/llvm/include/llvm/Frontend/Offloading/Utility.h
@@ -157,30 +157,28 @@ LLVM_ABI Error getAMDGPUMetaDataFromImage(
uint16_t &ELFABIVersion);
} // namespace amdgpu
-namespace intel {
-/// Containerizes an SPIR-V image into inner OffloadBinary format.
+/// Containerizes an image into inner OffloadBinary format.
/// Creates a nested OffloadBinary structure where the inner binary contains
-/// the raw SPIR-V and associated metadata (version, format, triple, etc.).
-/// This inner OffloadBinary is then embedded in an outer OffloadBinary.
-///
-/// \param Binary The SPIR-V binary to containerize
-/// \param CompileOpts Optional compilation options
-/// \param LinkOpts Optional linking options
-LLVM_ABI Error containerizeSPIRVImage(std::unique_ptr<MemoryBuffer> &Binary,
- object::OffloadKind Kind,
- StringRef CompileOpts = "",
- StringRef LinkOpts = "");
+/// the raw image and associated metadata (version, format, triple, etc.).
+/// \param Binary The image to containerize
+/// \param ImageKind The format of the image, e.g. SPIR-V or CUBIN.
+/// \param OffloadKind The expected consumer of the image, e.g. CUDA or OpenMP.
+/// \param ImageFlags Flags associated with the image, e.g. for AMDGPU the features
+/// \param MetaData The key-value map of metadata to be associated with the image.
+LLVM_ABI Error containerizeImage(std::unique_ptr<MemoryBuffer> &Binary,
+ object::ImageKind ImageKind,
+ object::OffloadKind OffloadKind,
+ int32_t ImageFlags,
+ MapVector<StringRef, StringRef> &MetaData);
+namespace intel {
/// Containerizes OpenMP SPIR-V image into inner OffloadBinary format.
/// \param Binary The SPIR-V binary to containerize
/// \param CompileOpts Optional compilation options
/// \param LinkOpts Optional linking options
-inline LLVM_ABI Error containerizeOpenMPSPIRVImage(
+LLVM_ABI Error containerizeOpenMPSPIRVImage(
std::unique_ptr<MemoryBuffer> &Binary, StringRef CompileOpts = "",
- StringRef LinkOpts = "") {
- return containerizeSPIRVImage(Binary, object::OffloadKind::OFK_OpenMP,
- CompileOpts, LinkOpts);
-}
+ StringRef LinkOpts = "");
} // namespace intel
} // namespace offloading
} // namespace llvm
diff --git a/llvm/lib/Frontend/Offloading/Utility.cpp b/llvm/lib/Frontend/Offloading/Utility.cpp
index d5571a15baf1c..a22b4d894696b 100644
--- a/llvm/lib/Frontend/Offloading/Utility.cpp
+++ b/llvm/lib/Frontend/Offloading/Utility.cpp
@@ -378,30 +378,22 @@ Error llvm::offloading::amdgpu::getAMDGPUMetaDataFromImage(
}
return Error::success();
}
-Error offloading::intel::containerizeSPIRVImage(
- std::unique_ptr<MemoryBuffer> &Img, object::OffloadKind Kind,
- StringRef CompileOpts, StringRef LinkOpts) {
+
+Error offloading::containerizeImage(std::unique_ptr<MemoryBuffer> &Img,
+ object::ImageKind ImageKind,
+ object::OffloadKind OffloadKind,
+ int32_t ImageFlags,
+ MapVector<StringRef, StringRef> &MetaData) {
using namespace object;
- // Create inner OffloadBinary containing the raw SPIR-V
+ // Create inner OffloadBinary containing the raw image
OffloadBinary::OffloadingImage InnerImage;
- InnerImage.TheImageKind = ImageKind::IMG_SPIRV;
- InnerImage.TheOffloadKind = Kind;
- InnerImage.Flags = 0;
-
- // Add metadata about the SPIR-V image as string key-value pairs.
- MapVector<StringRef, StringRef> StringData;
- StringData["version"] = "1.0";
- StringData["format"] = "spirv";
- StringData["triple"] = "spirv64-intel";
-
- // Store compile/link options if provided
- if (!CompileOpts.empty())
- StringData["compile-opts"] = CompileOpts;
- if (!LinkOpts.empty())
- StringData["link-opts"] = LinkOpts;
+ InnerImage.TheImageKind = ImageKind;
+ InnerImage.TheOffloadKind = OffloadKind;
+ InnerImage.Flags = ImageFlags;
- InnerImage.StringData = StringData;
+ for (const auto &KV : MetaData)
+ InnerImage.StringData[KV.first] = KV.second;
// Wrap the raw SPIR-V binary
InnerImage.Image = std::move(Img);
@@ -416,3 +408,20 @@ Error offloading::intel::containerizeSPIRVImage(
return Error::success();
}
+
+Error offloading::intel::containerizeOpenMPSPIRVImage(
+ std::unique_ptr<MemoryBuffer> &Binary, StringRef CompileOpts,
+ StringRef LinkOpts) {
+ MapVector<StringRef, StringRef> MetaData;
+ MetaData["version"] = "1.0";
+ MetaData["format"] = "spirv";
+ MetaData["triple"] = "spirv64-openmp";
+ if (!CompileOpts.empty())
+ MetaData["compile-opts"] = CompileOpts;
+ if (!LinkOpts.empty())
+ MetaData["link-opts"] = LinkOpts;
+
+ return containerizeImage(Binary, object::ImageKind::IMG_SPIRV,
+ object::OffloadKind::OFK_OpenMP, /*ImageFlags=*/0,
+ MetaData);
+}
>From c9646a4e5436d23e439f142ee16896ea6db54f59 Mon Sep 17 00:00:00 2001
From: "Duran, Alex" <alejandro.duran at intel.com>
Date: Mon, 9 Mar 2026 14:50:31 -0700
Subject: [PATCH 07/33] format
---
llvm/include/llvm/Frontend/Offloading/Utility.h | 14 ++++++++------
1 file changed, 8 insertions(+), 6 deletions(-)
diff --git a/llvm/include/llvm/Frontend/Offloading/Utility.h b/llvm/include/llvm/Frontend/Offloading/Utility.h
index 58676ebbd14fc..d8b1256874f7e 100644
--- a/llvm/include/llvm/Frontend/Offloading/Utility.h
+++ b/llvm/include/llvm/Frontend/Offloading/Utility.h
@@ -163,13 +163,15 @@ LLVM_ABI Error getAMDGPUMetaDataFromImage(
/// \param Binary The image to containerize
/// \param ImageKind The format of the image, e.g. SPIR-V or CUBIN.
/// \param OffloadKind The expected consumer of the image, e.g. CUDA or OpenMP.
-/// \param ImageFlags Flags associated with the image, e.g. for AMDGPU the features
-/// \param MetaData The key-value map of metadata to be associated with the image.
+/// \param ImageFlags Flags associated with the image, e.g. for AMDGPU the
+/// features
+/// \param MetaData The key-value map of metadata to be associated with the
+/// image.
LLVM_ABI Error containerizeImage(std::unique_ptr<MemoryBuffer> &Binary,
- object::ImageKind ImageKind,
- object::OffloadKind OffloadKind,
- int32_t ImageFlags,
- MapVector<StringRef, StringRef> &MetaData);
+ object::ImageKind ImageKind,
+ object::OffloadKind OffloadKind,
+ int32_t ImageFlags,
+ MapVector<StringRef, StringRef> &MetaData);
namespace intel {
/// Containerizes OpenMP SPIR-V image into inner OffloadBinary format.
>From 2c6e20f0e391a701efe24604d5dad80348ec697b Mon Sep 17 00:00:00 2001
From: "Duran, Alex" <alejandro.duran at intel.com>
Date: Mon, 9 Mar 2026 14:52:10 -0700
Subject: [PATCH 08/33] adjust comments
---
llvm/include/llvm/Frontend/Offloading/Utility.h | 10 +++++-----
llvm/lib/Frontend/Offloading/Utility.cpp | 6 +-----
2 files changed, 6 insertions(+), 10 deletions(-)
diff --git a/llvm/include/llvm/Frontend/Offloading/Utility.h b/llvm/include/llvm/Frontend/Offloading/Utility.h
index d8b1256874f7e..101a3ea73baf7 100644
--- a/llvm/include/llvm/Frontend/Offloading/Utility.h
+++ b/llvm/include/llvm/Frontend/Offloading/Utility.h
@@ -160,11 +160,11 @@ LLVM_ABI Error getAMDGPUMetaDataFromImage(
/// Containerizes an image into inner OffloadBinary format.
/// Creates a nested OffloadBinary structure where the inner binary contains
/// the raw image and associated metadata (version, format, triple, etc.).
-/// \param Binary The image to containerize
+/// \param Binary The image to containerize.
/// \param ImageKind The format of the image, e.g. SPIR-V or CUBIN.
/// \param OffloadKind The expected consumer of the image, e.g. CUDA or OpenMP.
/// \param ImageFlags Flags associated with the image, e.g. for AMDGPU the
-/// features
+/// features.
/// \param MetaData The key-value map of metadata to be associated with the
/// image.
LLVM_ABI Error containerizeImage(std::unique_ptr<MemoryBuffer> &Binary,
@@ -175,9 +175,9 @@ LLVM_ABI Error containerizeImage(std::unique_ptr<MemoryBuffer> &Binary,
namespace intel {
/// Containerizes OpenMP SPIR-V image into inner OffloadBinary format.
-/// \param Binary The SPIR-V binary to containerize
-/// \param CompileOpts Optional compilation options
-/// \param LinkOpts Optional linking options
+/// \param Binary The SPIR-V binary to containerize.
+/// \param CompileOpts Optional compilation options.
+/// \param LinkOpts Optional linking options.
LLVM_ABI Error containerizeOpenMPSPIRVImage(
std::unique_ptr<MemoryBuffer> &Binary, StringRef CompileOpts = "",
StringRef LinkOpts = "");
diff --git a/llvm/lib/Frontend/Offloading/Utility.cpp b/llvm/lib/Frontend/Offloading/Utility.cpp
index a22b4d894696b..de1d69ad0b1fc 100644
--- a/llvm/lib/Frontend/Offloading/Utility.cpp
+++ b/llvm/lib/Frontend/Offloading/Utility.cpp
@@ -386,7 +386,7 @@ Error offloading::containerizeImage(std::unique_ptr<MemoryBuffer> &Img,
MapVector<StringRef, StringRef> &MetaData) {
using namespace object;
- // Create inner OffloadBinary containing the raw image
+ // Create inner OffloadBinary containing the raw image.
OffloadBinary::OffloadingImage InnerImage;
InnerImage.TheImageKind = ImageKind;
InnerImage.TheOffloadKind = OffloadKind;
@@ -395,17 +395,13 @@ Error offloading::containerizeImage(std::unique_ptr<MemoryBuffer> &Img,
for (const auto &KV : MetaData)
InnerImage.StringData[KV.first] = KV.second;
- // Wrap the raw SPIR-V binary
InnerImage.Image = std::move(Img);
- // Serialize inner OffloadBinary
SmallVector<OffloadBinary::OffloadingImage> Images;
Images.push_back(std::move(InnerImage));
SmallString<0> InnerBinaryData = OffloadBinary::write(Images);
- // Replace the buffer with the inner OffloadBinary
Img = MemoryBuffer::getMemBufferCopy(InnerBinaryData);
-
return Error::success();
}
>From d75f4ed889df40946b7c4f16d0bb54c8965887f2 Mon Sep 17 00:00:00 2001
From: "Duran, Alex" <alejandro.duran at intel.com>
Date: Mon, 9 Mar 2026 14:54:41 -0700
Subject: [PATCH 09/33] fix intel triple
---
llvm/lib/Frontend/Offloading/Utility.cpp | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/llvm/lib/Frontend/Offloading/Utility.cpp b/llvm/lib/Frontend/Offloading/Utility.cpp
index de1d69ad0b1fc..ef0a40638b444 100644
--- a/llvm/lib/Frontend/Offloading/Utility.cpp
+++ b/llvm/lib/Frontend/Offloading/Utility.cpp
@@ -411,7 +411,7 @@ Error offloading::intel::containerizeOpenMPSPIRVImage(
MapVector<StringRef, StringRef> MetaData;
MetaData["version"] = "1.0";
MetaData["format"] = "spirv";
- MetaData["triple"] = "spirv64-openmp";
+ MetaData["triple"] = "spirv64-intel";
if (!CompileOpts.empty())
MetaData["compile-opts"] = CompileOpts;
if (!LinkOpts.empty())
>From 1d2884ba72f513925464dfb7cf8af09d94c7c918 Mon Sep 17 00:00:00 2001
From: Alex Duran <alejandro.duran at intel.com>
Date: Tue, 10 Mar 2026 15:33:16 +0100
Subject: [PATCH 10/33] Update llvm/lib/Frontend/Offloading/Utility.cpp
Co-authored-by: Yury Plyakhin <yury.plyakhin at intel.com>
---
llvm/lib/Frontend/Offloading/Utility.cpp | 4 +---
1 file changed, 1 insertion(+), 3 deletions(-)
diff --git a/llvm/lib/Frontend/Offloading/Utility.cpp b/llvm/lib/Frontend/Offloading/Utility.cpp
index ef0a40638b444..ac5224e4ea718 100644
--- a/llvm/lib/Frontend/Offloading/Utility.cpp
+++ b/llvm/lib/Frontend/Offloading/Utility.cpp
@@ -397,9 +397,7 @@ Error offloading::containerizeImage(std::unique_ptr<MemoryBuffer> &Img,
InnerImage.Image = std::move(Img);
- SmallVector<OffloadBinary::OffloadingImage> Images;
- Images.push_back(std::move(InnerImage));
- SmallString<0> InnerBinaryData = OffloadBinary::write(Images);
+ SmallString<0> InnerBinaryData = OffloadBinary::write(InnerImage);
Img = MemoryBuffer::getMemBufferCopy(InnerBinaryData);
return Error::success();
>From 039815b10364342a07473ce02eee8b4350f12a2c Mon Sep 17 00:00:00 2001
From: "Duran, Alex" <alejandro.duran at intel.com>
Date: Tue, 10 Mar 2026 10:50:35 -0700
Subject: [PATCH 11/33] remove redundant format from metadata
---
llvm/lib/Frontend/Offloading/Utility.cpp | 1 -
1 file changed, 1 deletion(-)
diff --git a/llvm/lib/Frontend/Offloading/Utility.cpp b/llvm/lib/Frontend/Offloading/Utility.cpp
index ef0a40638b444..48be331540ca3 100644
--- a/llvm/lib/Frontend/Offloading/Utility.cpp
+++ b/llvm/lib/Frontend/Offloading/Utility.cpp
@@ -410,7 +410,6 @@ Error offloading::intel::containerizeOpenMPSPIRVImage(
StringRef LinkOpts) {
MapVector<StringRef, StringRef> MetaData;
MetaData["version"] = "1.0";
- MetaData["format"] = "spirv";
MetaData["triple"] = "spirv64-intel";
if (!CompileOpts.empty())
MetaData["compile-opts"] = CompileOpts;
>From 61d9430a75319b8b9b78592cd680b5e8db70fb45 Mon Sep 17 00:00:00 2001
From: "Duran, Alex" <alejandro.duran at intel.com>
Date: Tue, 10 Mar 2026 11:21:30 -0700
Subject: [PATCH 12/33] address comments
---
llvm/include/llvm/Frontend/Offloading/Utility.h | 7 ++++---
llvm/lib/Frontend/Offloading/Utility.cpp | 4 ++--
2 files changed, 6 insertions(+), 5 deletions(-)
diff --git a/llvm/include/llvm/Frontend/Offloading/Utility.h b/llvm/include/llvm/Frontend/Offloading/Utility.h
index 101a3ea73baf7..656cdcf6b4d5d 100644
--- a/llvm/include/llvm/Frontend/Offloading/Utility.h
+++ b/llvm/include/llvm/Frontend/Offloading/Utility.h
@@ -157,12 +157,13 @@ LLVM_ABI Error getAMDGPUMetaDataFromImage(
uint16_t &ELFABIVersion);
} // namespace amdgpu
-/// Containerizes an image into inner OffloadBinary format.
+/// Containerizes an image within an OffloadBinary image.
/// Creates a nested OffloadBinary structure where the inner binary contains
/// the raw image and associated metadata (version, format, triple, etc.).
/// \param Binary The image to containerize.
/// \param ImageKind The format of the image, e.g. SPIR-V or CUBIN.
-/// \param OffloadKind The expected consumer of the image, e.g. CUDA or OpenMP.
+/// \param OffloadKind The expected consuming runtime of the image, e.g. CUDA or
+/// OpenMP.
/// \param ImageFlags Flags associated with the image, e.g. for AMDGPU the
/// features.
/// \param MetaData The key-value map of metadata to be associated with the
@@ -174,7 +175,7 @@ LLVM_ABI Error containerizeImage(std::unique_ptr<MemoryBuffer> &Binary,
MapVector<StringRef, StringRef> &MetaData);
namespace intel {
-/// Containerizes OpenMP SPIR-V image into inner OffloadBinary format.
+/// Containerizes an OpenMP SPIR-V image into an OffloadBinary image.
/// \param Binary The SPIR-V binary to containerize.
/// \param CompileOpts Optional compilation options.
/// \param LinkOpts Optional linking options.
diff --git a/llvm/lib/Frontend/Offloading/Utility.cpp b/llvm/lib/Frontend/Offloading/Utility.cpp
index 1ad0fe146c2f3..2cd7e2198f421 100644
--- a/llvm/lib/Frontend/Offloading/Utility.cpp
+++ b/llvm/lib/Frontend/Offloading/Utility.cpp
@@ -392,8 +392,8 @@ Error offloading::containerizeImage(std::unique_ptr<MemoryBuffer> &Img,
InnerImage.TheOffloadKind = OffloadKind;
InnerImage.Flags = ImageFlags;
- for (const auto &KV : MetaData)
- InnerImage.StringData[KV.first] = KV.second;
+ for (const auto &[Key, Value] : MetaData)
+ InnerImage.StringData[Key] = Value;
InnerImage.Image = std::move(Img);
>From 46e2a654afae87ffb4c141d435dec495c1750d74 Mon Sep 17 00:00:00 2001
From: "Duran, Alex" <alejandro.duran at intel.com>
Date: Wed, 11 Mar 2026 03:50:10 -0700
Subject: [PATCH 13/33] [offload][l0][nfc] remove duplicated entry
---
offload/plugins-nextgen/level_zero/src/L0Plugin.cpp | 5 -----
1 file changed, 5 deletions(-)
diff --git a/offload/plugins-nextgen/level_zero/src/L0Plugin.cpp b/offload/plugins-nextgen/level_zero/src/L0Plugin.cpp
index fd8f36c28186a..7dc0b919ca5a5 100644
--- a/offload/plugins-nextgen/level_zero/src/L0Plugin.cpp
+++ b/offload/plugins-nextgen/level_zero/src/L0Plugin.cpp
@@ -271,11 +271,6 @@ Error LevelZeroPluginTy::asyncBarrierImpl(omp_interop_val_t *Interop) {
return Plugin::success();
}
-// We only need to check for formats other than ELF here
-Expected<bool> LevelZeroPluginTy::isImageCompatible(StringRef Image) const {
- return identify_magic(Image) == file_magic::spirv_object;
-}
-
} // namespace llvm::omp::target::plugin
extern "C" {
>From 02260850eed10c3d972686f6807ba9ae93abc77f Mon Sep 17 00:00:00 2001
From: "Duran, Alex" <alejandro.duran at intel.com>
Date: Wed, 11 Mar 2026 04:15:48 -0700
Subject: [PATCH 14/33] Pass triple as argument
---
clang/tools/clang-linker-wrapper/ClangLinkerWrapper.cpp | 2 +-
llvm/include/llvm/Frontend/Offloading/Utility.h | 8 +++++---
llvm/lib/Frontend/Offloading/Utility.cpp | 9 +++++----
3 files changed, 11 insertions(+), 8 deletions(-)
diff --git a/clang/tools/clang-linker-wrapper/ClangLinkerWrapper.cpp b/clang/tools/clang-linker-wrapper/ClangLinkerWrapper.cpp
index 54fad8a6ed5e7..9e24a9c26d897 100644
--- a/clang/tools/clang-linker-wrapper/ClangLinkerWrapper.cpp
+++ b/clang/tools/clang-linker-wrapper/ClangLinkerWrapper.cpp
@@ -652,7 +652,7 @@ Error containerizeRawImage(std::unique_ptr<MemoryBuffer> &Img, OffloadKind Kind,
llvm::Triple Triple(Args.getLastArgValue(OPT_triple_EQ));
if (Kind == OFK_OpenMP && Triple.isSPIRV() &&
Triple.getVendor() == llvm::Triple::Intel)
- return offloading::intel::containerizeOpenMPSPIRVImage(Img);
+ return offloading::intel::containerizeOpenMPSPIRVImage(Img, Triple);
return Error::success();
}
diff --git a/llvm/include/llvm/Frontend/Offloading/Utility.h b/llvm/include/llvm/Frontend/Offloading/Utility.h
index 656cdcf6b4d5d..db04d1fa25411 100644
--- a/llvm/include/llvm/Frontend/Offloading/Utility.h
+++ b/llvm/include/llvm/Frontend/Offloading/Utility.h
@@ -161,6 +161,7 @@ LLVM_ABI Error getAMDGPUMetaDataFromImage(
/// Creates a nested OffloadBinary structure where the inner binary contains
/// the raw image and associated metadata (version, format, triple, etc.).
/// \param Binary The image to containerize.
+/// \param Triple The target triple to be associated with the image.
/// \param ImageKind The format of the image, e.g. SPIR-V or CUBIN.
/// \param OffloadKind The expected consuming runtime of the image, e.g. CUDA or
/// OpenMP.
@@ -169,7 +170,7 @@ LLVM_ABI Error getAMDGPUMetaDataFromImage(
/// \param MetaData The key-value map of metadata to be associated with the
/// image.
LLVM_ABI Error containerizeImage(std::unique_ptr<MemoryBuffer> &Binary,
- object::ImageKind ImageKind,
+ llvm::Triple Triple, object::ImageKind ImageKind,
object::OffloadKind OffloadKind,
int32_t ImageFlags,
MapVector<StringRef, StringRef> &MetaData);
@@ -177,11 +178,12 @@ LLVM_ABI Error containerizeImage(std::unique_ptr<MemoryBuffer> &Binary,
namespace intel {
/// Containerizes an OpenMP SPIR-V image into an OffloadBinary image.
/// \param Binary The SPIR-V binary to containerize.
+/// \param Triple The target triple to be associated with the image.
/// \param CompileOpts Optional compilation options.
/// \param LinkOpts Optional linking options.
LLVM_ABI Error containerizeOpenMPSPIRVImage(
- std::unique_ptr<MemoryBuffer> &Binary, StringRef CompileOpts = "",
- StringRef LinkOpts = "");
+ std::unique_ptr<MemoryBuffer> &Binary, llvm::Triple Triple,
+ StringRef CompileOpts = "", StringRef LinkOpts = "");
} // namespace intel
} // namespace offloading
} // namespace llvm
diff --git a/llvm/lib/Frontend/Offloading/Utility.cpp b/llvm/lib/Frontend/Offloading/Utility.cpp
index 2cd7e2198f421..f46d0ec34fa48 100644
--- a/llvm/lib/Frontend/Offloading/Utility.cpp
+++ b/llvm/lib/Frontend/Offloading/Utility.cpp
@@ -380,6 +380,7 @@ Error llvm::offloading::amdgpu::getAMDGPUMetaDataFromImage(
}
Error offloading::containerizeImage(std::unique_ptr<MemoryBuffer> &Img,
+ llvm::Triple Triple,
object::ImageKind ImageKind,
object::OffloadKind OffloadKind,
int32_t ImageFlags,
@@ -392,6 +393,7 @@ Error offloading::containerizeImage(std::unique_ptr<MemoryBuffer> &Img,
InnerImage.TheOffloadKind = OffloadKind;
InnerImage.Flags = ImageFlags;
+ InnerImage.StringData["triple"] = Triple.getTriple();
for (const auto &[Key, Value] : MetaData)
InnerImage.StringData[Key] = Value;
@@ -404,17 +406,16 @@ Error offloading::containerizeImage(std::unique_ptr<MemoryBuffer> &Img,
}
Error offloading::intel::containerizeOpenMPSPIRVImage(
- std::unique_ptr<MemoryBuffer> &Binary, StringRef CompileOpts,
- StringRef LinkOpts) {
+ std::unique_ptr<MemoryBuffer> &Binary, llvm::Triple Triple,
+ StringRef CompileOpts, StringRef LinkOpts) {
MapVector<StringRef, StringRef> MetaData;
MetaData["version"] = "1.0";
- MetaData["triple"] = "spirv64-intel";
if (!CompileOpts.empty())
MetaData["compile-opts"] = CompileOpts;
if (!LinkOpts.empty())
MetaData["link-opts"] = LinkOpts;
- return containerizeImage(Binary, object::ImageKind::IMG_SPIRV,
+ return containerizeImage(Binary, Triple, object::ImageKind::IMG_SPIRV,
object::OffloadKind::OFK_OpenMP, /*ImageFlags=*/0,
MetaData);
}
>From c9b8d9339b33b24425e1785a4cbac9f548c9cdb8 Mon Sep 17 00:00:00 2001
From: "Duran, Alex" <alejandro.duran at intel.com>
Date: Wed, 11 Mar 2026 04:23:40 -0700
Subject: [PATCH 15/33] format
---
llvm/include/llvm/Frontend/Offloading/Utility.h | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/llvm/include/llvm/Frontend/Offloading/Utility.h b/llvm/include/llvm/Frontend/Offloading/Utility.h
index db04d1fa25411..eb08e7ec661e4 100644
--- a/llvm/include/llvm/Frontend/Offloading/Utility.h
+++ b/llvm/include/llvm/Frontend/Offloading/Utility.h
@@ -170,7 +170,8 @@ LLVM_ABI Error getAMDGPUMetaDataFromImage(
/// \param MetaData The key-value map of metadata to be associated with the
/// image.
LLVM_ABI Error containerizeImage(std::unique_ptr<MemoryBuffer> &Binary,
- llvm::Triple Triple, object::ImageKind ImageKind,
+ llvm::Triple Triple,
+ object::ImageKind ImageKind,
object::OffloadKind OffloadKind,
int32_t ImageFlags,
MapVector<StringRef, StringRef> &MetaData);
>From 727173a732b4e8e087debd2a775049b21a7664ae Mon Sep 17 00:00:00 2001
From: "Duran, Alex" <alejandro.duran at intel.com>
Date: Wed, 11 Mar 2026 05:56:15 -0700
Subject: [PATCH 16/33] update tests
---
llvm/test/tools/llvm-objdump/Offloading/coff.test | 4 ++++
llvm/test/tools/llvm-objdump/Offloading/elf.test | 4 ++++
2 files changed, 8 insertions(+)
diff --git a/llvm/test/tools/llvm-objdump/Offloading/coff.test b/llvm/test/tools/llvm-objdump/Offloading/coff.test
index 022277d137bd4..5bec7d60cb83e 100644
--- a/llvm/test/tools/llvm-objdump/Offloading/coff.test
+++ b/llvm/test/tools/llvm-objdump/Offloading/coff.test
@@ -22,21 +22,25 @@ symbols:
# CHECK-NEXT:arch gfx908
# CHECK-NEXT:triple amdgcn-amd-amdhsa
# CHECK-NEXT:producer openmp
+# CHECK-NEXT:image size 0 bytes
# CHECK-EMPTY:
# CHECK-NEXT:OFFLOADING IMAGE [1]:
# CHECK-NEXT:kind llvm ir
# CHECK-NEXT:arch gfx90a
# CHECK-NEXT:triple amdgcn-amd-amdhsa
# CHECK-NEXT:producer openmp
+# CHECK-NEXT:image size 0 bytes
# CHECK-EMPTY:
# CHECK-NEXT:OFFLOADING IMAGE [2]:
# CHECK-NEXT:kind cubin
# CHECK-NEXT:arch sm_52
# CHECK-NEXT:triple nvptx64-nvidia-cuda
# CHECK-NEXT:producer openmp
+# CHECK-NEXT:image size 0 bytes
# CHECK-EMPTY:
# CHECK-NEXT:OFFLOADING IMAGE [3]:
# CHECK-NEXT:kind <none>
# CHECK-NEXT:arch sm_70
# CHECK-NEXT:triple nvptx64-nvidia-cuda
# CHECK-NEXT:producer none
+# CHECK-NEXT:image size 0 bytes
diff --git a/llvm/test/tools/llvm-objdump/Offloading/elf.test b/llvm/test/tools/llvm-objdump/Offloading/elf.test
index 10182aeb856cd..3064286b9fea1 100644
--- a/llvm/test/tools/llvm-objdump/Offloading/elf.test
+++ b/llvm/test/tools/llvm-objdump/Offloading/elf.test
@@ -31,21 +31,25 @@ Sections:
# CHECK-NEXT:arch gfx908
# CHECK-NEXT:triple amdgcn-amd-amdhsa
# CHECK-NEXT:producer openmp
+# CHECK-NEXT:image size 0 bytes
# CHECK-EMPTY:
# CHECK-NEXT:OFFLOADING IMAGE [1]:
# CHECK-NEXT:kind llvm ir
# CHECK-NEXT:arch gfx90a
# CHECK-NEXT:triple amdgcn-amd-amdhsa
# CHECK-NEXT:producer openmp
+# CHECK-NEXT:image size 0 bytes
# CHECK-EMPTY:
# CHECK-NEXT:OFFLOADING IMAGE [2]:
# CHECK-NEXT:kind cubin
# CHECK-NEXT:arch sm_52
# CHECK-NEXT:triple nvptx64-nvidia-cuda
# CHECK-NEXT:producer openmp
+# CHECK-NEXT:image size 0 bytes
# CHECK-EMPTY:
# CHECK-NEXT:OFFLOADING IMAGE [3]:
# CHECK-NEXT:kind <none>
# CHECK-NEXT:arch sm_70
# CHECK-NEXT:triple nvptx64-nvidia-cuda
# CHECK-NEXT:producer none
+# CHECK-NEXT:image size 0 bytes
>From 8158cef4ede45d855551867ab25141cd06b1c172 Mon Sep 17 00:00:00 2001
From: "Duran, Alex" <alejandro.duran at intel.com>
Date: Wed, 11 Mar 2026 15:00:29 -0700
Subject: [PATCH 17/33] support arbitrary levels of nesting
---
llvm/tools/llvm-objdump/OffloadDump.cpp | 45 +++++++++++++++----------
1 file changed, 27 insertions(+), 18 deletions(-)
diff --git a/llvm/tools/llvm-objdump/OffloadDump.cpp b/llvm/tools/llvm-objdump/OffloadDump.cpp
index ffe4d52d30446..9f9c200236bd1 100644
--- a/llvm/tools/llvm-objdump/OffloadDump.cpp
+++ b/llvm/tools/llvm-objdump/OffloadDump.cpp
@@ -44,24 +44,32 @@ static StringRef getImageName(const OffloadBinary &OB) {
}
}
+std::string Indent(uint64_t Level) {
+ return std::string(Level * 2, ' ');
+}
+
static void printOffloadBinaryMetadata(const OffloadBinary &OB,
uint64_t level) {
- const std::string Indent(level * 2, ' ');
+ const std::string IndentStr = Indent(level);
- outs() << Indent << left_justify("kind", 16) << getImageName(OB) << "\n";
- outs() << Indent << left_justify("arch", 16) << OB.getArch() << "\n";
- outs() << Indent << left_justify("triple", 16) << OB.getTriple() << "\n";
- outs() << Indent << left_justify("producer", 16)
+ outs() << IndentStr << left_justify("kind", 16) << getImageName(OB) << "\n";
+ outs() << IndentStr << left_justify("arch", 16) << OB.getArch() << "\n";
+ outs() << IndentStr << left_justify("triple", 16) << OB.getTriple() << "\n";
+ outs() << IndentStr << left_justify("producer", 16)
<< getOffloadKindName(OB.getOffloadKind()) << "\n";
StringRef InnerImage = OB.getImage();
- outs() << Indent << left_justify("image size", 16) << InnerImage.size()
+ outs() << IndentStr << left_justify("image size", 16) << InnerImage.size()
<< " bytes\n";
}
+static void printBinary(const OffloadBinary &OB, uint64_t Index,
+ uint64_t Level = 0, std::string ParentIndex = "");
+
/// Print information about nested OffloadBinary (inner layer)
static void printNestedOffloadBinary(const OffloadBinary &OuterOB,
- uint64_t Index) {
+ uint64_t Index, uint64_t Level,
+ std::string ParentIndex) {
StringRef ImageData = OuterOB.getImage();
// Parse inner OffloadBinary
@@ -81,28 +89,29 @@ static void printNestedOffloadBinary(const OffloadBinary &OuterOB,
return;
}
- outs() << " [Nested OffloadBinary format detected]\n";
- outs() << " Number of inner images: " << InnerBinaries.size() << "\n";
+ outs() << Indent(Level) << left_justify("nested images", 16)
+ << InnerBinaries.size() << "\n";
// Display information for each inner image
for (uint64_t I = 0, E = InnerBinaries.size(); I != E; ++I) {
const OffloadBinary *InnerOB = InnerBinaries[I].get();
-
- if (InnerBinaries.size() > 1)
- outs() << " Inner image [" << I << "]:\n";
-
- printOffloadBinaryMetadata(*InnerOB, 1);
+ printBinary(*InnerOB, I, Level + 1, ParentIndex);
}
}
-static void printBinary(const OffloadBinary &OB, uint64_t Index) {
- outs() << "\nOFFLOADING IMAGE [" << Index << "]:\n";
- printOffloadBinaryMetadata(OB, 0);
+static void printBinary(const OffloadBinary &OB, uint64_t Index, uint64_t Level,
+ std::string ParentIndex) {
+ outs() << "\n"
+ << Indent(Level) << "OFFLOADING IMAGE [" << ParentIndex << Index
+ << "]:\n";
+
+ printOffloadBinaryMetadata(OB, Level);
StringRef ImageData = OB.getImage();
// Check for nested OffloadBinary format
if (identify_magic(ImageData) == file_magic::offload_binary)
- printNestedOffloadBinary(OB, Index);
+ printNestedOffloadBinary(OB, Index, Level,
+ ParentIndex + std::to_string(Index) + ".");
}
/// Print the embedded offloading contents of an ObjectFile \p O.
>From d7b49b35b208d61c2a41c489dc9041dac3cdf803 Mon Sep 17 00:00:00 2001
From: "Duran, Alex" <alejandro.duran at intel.com>
Date: Wed, 11 Mar 2026 15:28:34 -0700
Subject: [PATCH 18/33] format
---
llvm/tools/llvm-objdump/OffloadDump.cpp | 4 +---
1 file changed, 1 insertion(+), 3 deletions(-)
diff --git a/llvm/tools/llvm-objdump/OffloadDump.cpp b/llvm/tools/llvm-objdump/OffloadDump.cpp
index 9f9c200236bd1..3fc2466803c4c 100644
--- a/llvm/tools/llvm-objdump/OffloadDump.cpp
+++ b/llvm/tools/llvm-objdump/OffloadDump.cpp
@@ -44,9 +44,7 @@ static StringRef getImageName(const OffloadBinary &OB) {
}
}
-std::string Indent(uint64_t Level) {
- return std::string(Level * 2, ' ');
-}
+std::string Indent(uint64_t Level) { return std::string(Level * 2, ' '); }
static void printOffloadBinaryMetadata(const OffloadBinary &OB,
uint64_t level) {
>From 705925b037877fd9a1678ade3ce4737850bc5d1b Mon Sep 17 00:00:00 2001
From: "Duran, Alex" <alejandro.duran at intel.com>
Date: Wed, 11 Mar 2026 15:45:38 -0700
Subject: [PATCH 19/33] fix test
---
clang/test/Tooling/clang-linker-wrapper-spirv.cpp | 5 ++---
1 file changed, 2 insertions(+), 3 deletions(-)
diff --git a/clang/test/Tooling/clang-linker-wrapper-spirv.cpp b/clang/test/Tooling/clang-linker-wrapper-spirv.cpp
index 74d1fb2c212c1..ecbfe626129db 100644
--- a/clang/test/Tooling/clang-linker-wrapper-spirv.cpp
+++ b/clang/test/Tooling/clang-linker-wrapper-spirv.cpp
@@ -5,9 +5,8 @@
// RUN: %clangxx -fopenmp -fopenmp-targets=spirv64-intel -nogpulib -o %t %s
// RUN: llvm-objdump --offloading %t | FileCheck -check-prefix=CHECK %s
-// CHECK: [Nested OffloadBinary
-// CHECK: Number of inner images: 1
-// CHECK: spirv64-intel
+// CHECK: nested images 1
+// CHECK: triple spirv64-intel
int main(int argc, char** argv) {
return 0;
>From 5af984488477ad6a66892dc23a60faae43b96ad8 Mon Sep 17 00:00:00 2001
From: "Duran, Alex" <alejandro.duran at intel.com>
Date: Fri, 13 Mar 2026 04:27:54 -0700
Subject: [PATCH 20/33] don't use OffloadBinary::create; add test
---
.../llvm-offload-binary/llvm-offload-binary.ll | 11 +++++++++++
llvm/tools/llvm-objdump/OffloadDump.cpp | 13 ++++++-------
2 files changed, 17 insertions(+), 7 deletions(-)
diff --git a/llvm/test/tools/llvm-offload-binary/llvm-offload-binary.ll b/llvm/test/tools/llvm-offload-binary/llvm-offload-binary.ll
index df46ad3a0d38a..e9fdd1ad1a481 100644
--- a/llvm/test/tools/llvm-offload-binary/llvm-offload-binary.ll
+++ b/llvm/test/tools/llvm-offload-binary/llvm-offload-binary.ll
@@ -15,3 +15,14 @@
; RUN: llvm-offload-binary -o %t3 --image=file=%s
; RUN: llvm-offload-binary %t3 --image=file=%t4
; RUN: diff %s %t4
+
+; Test nested OffloadBinary construction with mulitiple inner images
+; RUN: llvm-offload-binary -o %t5 --image=file=%s,arch=abc,triple=x-y-z --image=file=%s,arch=def,triple=x-y-z
+; RUN: llvm-offload-binary -o %t6 --image=file=%t5,arch=nested,triple=x-y-z
+; RUN: llvm-objdump --offloading %t6 | FileCheck %s --check-prefix=NESTED
+
+; NESTED: OFFLOADING IMAGE [0]:
+; NESTED: arch nested
+; NESTED: nested images 2
+; NESTED: OFFLOADING IMAGE [0.0]:
+; NESTED: OFFLOADING IMAGE [0.1]:
\ No newline at end of file
diff --git a/llvm/tools/llvm-objdump/OffloadDump.cpp b/llvm/tools/llvm-objdump/OffloadDump.cpp
index 3fc2466803c4c..31358a4004851 100644
--- a/llvm/tools/llvm-objdump/OffloadDump.cpp
+++ b/llvm/tools/llvm-objdump/OffloadDump.cpp
@@ -72,15 +72,14 @@ static void printNestedOffloadBinary(const OffloadBinary &OuterOB,
// Parse inner OffloadBinary
MemoryBufferRef InnerBuffer(ImageData, "inner-offload-binary");
- auto InnerBinariesOrErr = OffloadBinary::create(InnerBuffer);
- if (!InnerBinariesOrErr) {
- reportWarning("failed to parse nested OffloadBinary: " +
- toString(InnerBinariesOrErr.takeError()),
+ llvm::SmallVector<OffloadFile> InnerBinaries;
+ auto Err = extractOffloadBinaries(InnerBuffer, InnerBinaries);
+ if (Err) {
+ reportWarning("failed to extract nested OffloadBinary: " +
+ toString(std::move(Err)),
OuterOB.getFileName());
return;
}
-
- auto &InnerBinaries = *InnerBinariesOrErr;
if (InnerBinaries.empty()) {
reportWarning("nested OffloadBinary contains no entries",
OuterOB.getFileName());
@@ -92,7 +91,7 @@ static void printNestedOffloadBinary(const OffloadBinary &OuterOB,
// Display information for each inner image
for (uint64_t I = 0, E = InnerBinaries.size(); I != E; ++I) {
- const OffloadBinary *InnerOB = InnerBinaries[I].get();
+ const OffloadBinary *InnerOB = InnerBinaries[I].getBinary();
printBinary(*InnerOB, I, Level + 1, ParentIndex);
}
}
>From 27b9033d8e4a334a227f0acb341e3fed53d60ae2 Mon Sep 17 00:00:00 2001
From: "Duran, Alex" <alejandro.duran at intel.com>
Date: Fri, 13 Mar 2026 04:40:09 -0700
Subject: [PATCH 21/33] typo
---
llvm/test/tools/llvm-offload-binary/llvm-offload-binary.ll | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/llvm/test/tools/llvm-offload-binary/llvm-offload-binary.ll b/llvm/test/tools/llvm-offload-binary/llvm-offload-binary.ll
index e9fdd1ad1a481..e2d970c59c0b2 100644
--- a/llvm/test/tools/llvm-offload-binary/llvm-offload-binary.ll
+++ b/llvm/test/tools/llvm-offload-binary/llvm-offload-binary.ll
@@ -16,7 +16,7 @@
; RUN: llvm-offload-binary %t3 --image=file=%t4
; RUN: diff %s %t4
-; Test nested OffloadBinary construction with mulitiple inner images
+; Test nested OffloadBinary construction with multiple inner images.
; RUN: llvm-offload-binary -o %t5 --image=file=%s,arch=abc,triple=x-y-z --image=file=%s,arch=def,triple=x-y-z
; RUN: llvm-offload-binary -o %t6 --image=file=%t5,arch=nested,triple=x-y-z
; RUN: llvm-objdump --offloading %t6 | FileCheck %s --check-prefix=NESTED
>From 9556ba38783f8b9b67005ef5eebf548df9cd5b51 Mon Sep 17 00:00:00 2001
From: "Duran, Alex" <alejandro.duran at intel.com>
Date: Fri, 13 Mar 2026 04:51:17 -0700
Subject: [PATCH 22/33] add multilevel test
---
.../llvm-offload-binary.ll | 25 ++++++++++++++++++-
1 file changed, 24 insertions(+), 1 deletion(-)
diff --git a/llvm/test/tools/llvm-offload-binary/llvm-offload-binary.ll b/llvm/test/tools/llvm-offload-binary/llvm-offload-binary.ll
index e2d970c59c0b2..6144c9692d83c 100644
--- a/llvm/test/tools/llvm-offload-binary/llvm-offload-binary.ll
+++ b/llvm/test/tools/llvm-offload-binary/llvm-offload-binary.ll
@@ -25,4 +25,27 @@
; NESTED: arch nested
; NESTED: nested images 2
; NESTED: OFFLOADING IMAGE [0.0]:
-; NESTED: OFFLOADING IMAGE [0.1]:
\ No newline at end of file
+; NESTED: OFFLOADING IMAGE [0.1]:
+
+; Test complex nested OffloadBinary construction with multiple levels.
+; RUN: llvm-offload-binary -o %t7 --image=file=%s,arch=abc,triple=x-y-z --image=file=%t5,arch=nested,triple=x-y-z
+; RUN: llvm-offload-binary -o %t8 --image=file=%t7,arch=nested,triple=x-y-z --image=file=%t5,arch=nested2,triple=x-y-z
+; RUN: llvm-objdump --offloading %t8 | FileCheck %s --check-prefix=NESTED2
+
+; NESTED2: OFFLOADING IMAGE [0]:
+; NESTED2: arch nested
+; NESTED2: nested images 2
+; NESTED2: OFFLOADING IMAGE [0.0]:
+; NESTED2: arch abc
+; NESTED2: OFFLOADING IMAGE [0.1]:
+; NESTED2: arch nested
+; NESTED2: nested images 2
+; NESTED2: OFFLOADING IMAGE [0.1.0]:
+; NESTED2: OFFLOADING IMAGE [0.1.1]:
+; NESTED2: OFFLOADING IMAGE [1]:
+; NESTED2: arch nested2
+; NESTED2: nested images 2
+; NESTED2: OFFLOADING IMAGE [1.0]:
+; NESTED2: arch abc
+; NESTED2: OFFLOADING IMAGE [1.1]:
+; NESTED2: arch def
>From 9738e46734d81b5ae22d4bf429360e23d38eab2a Mon Sep 17 00:00:00 2001
From: "Duran, Alex" <alejandro.duran at intel.com>
Date: Fri, 13 Mar 2026 06:59:42 -0700
Subject: [PATCH 23/33] cleanup
---
llvm/test/tools/llvm-offload-binary/llvm-offload-binary.ll | 4 ++++
llvm/tools/llvm-objdump/OffloadDump.cpp | 6 ++----
2 files changed, 6 insertions(+), 4 deletions(-)
diff --git a/llvm/test/tools/llvm-offload-binary/llvm-offload-binary.ll b/llvm/test/tools/llvm-offload-binary/llvm-offload-binary.ll
index 6144c9692d83c..31ee5e286717f 100644
--- a/llvm/test/tools/llvm-offload-binary/llvm-offload-binary.ll
+++ b/llvm/test/tools/llvm-offload-binary/llvm-offload-binary.ll
@@ -25,7 +25,9 @@
; NESTED: arch nested
; NESTED: nested images 2
; NESTED: OFFLOADING IMAGE [0.0]:
+; NESTED: arch abc
; NESTED: OFFLOADING IMAGE [0.1]:
+; NESTED: arch def
; Test complex nested OffloadBinary construction with multiple levels.
; RUN: llvm-offload-binary -o %t7 --image=file=%s,arch=abc,triple=x-y-z --image=file=%t5,arch=nested,triple=x-y-z
@@ -41,7 +43,9 @@
; NESTED2: arch nested
; NESTED2: nested images 2
; NESTED2: OFFLOADING IMAGE [0.1.0]:
+; NESTED2: arch abc
; NESTED2: OFFLOADING IMAGE [0.1.1]:
+; NESTED2: arch def
; NESTED2: OFFLOADING IMAGE [1]:
; NESTED2: arch nested2
; NESTED2: nested images 2
diff --git a/llvm/tools/llvm-objdump/OffloadDump.cpp b/llvm/tools/llvm-objdump/OffloadDump.cpp
index 31358a4004851..a07a4a04f8676 100644
--- a/llvm/tools/llvm-objdump/OffloadDump.cpp
+++ b/llvm/tools/llvm-objdump/OffloadDump.cpp
@@ -46,6 +46,7 @@ static StringRef getImageName(const OffloadBinary &OB) {
std::string Indent(uint64_t Level) { return std::string(Level * 2, ' '); }
+/// Print metadata from an OffloadBinary.
static void printOffloadBinaryMetadata(const OffloadBinary &OB,
uint64_t level) {
const std::string IndentStr = Indent(level);
@@ -64,13 +65,12 @@ static void printOffloadBinaryMetadata(const OffloadBinary &OB,
static void printBinary(const OffloadBinary &OB, uint64_t Index,
uint64_t Level = 0, std::string ParentIndex = "");
-/// Print information about nested OffloadBinary (inner layer)
+/// Print information about nested OffloadBinary (inner layer).
static void printNestedOffloadBinary(const OffloadBinary &OuterOB,
uint64_t Index, uint64_t Level,
std::string ParentIndex) {
StringRef ImageData = OuterOB.getImage();
- // Parse inner OffloadBinary
MemoryBufferRef InnerBuffer(ImageData, "inner-offload-binary");
llvm::SmallVector<OffloadFile> InnerBinaries;
auto Err = extractOffloadBinaries(InnerBuffer, InnerBinaries);
@@ -89,7 +89,6 @@ static void printNestedOffloadBinary(const OffloadBinary &OuterOB,
outs() << Indent(Level) << left_justify("nested images", 16)
<< InnerBinaries.size() << "\n";
- // Display information for each inner image
for (uint64_t I = 0, E = InnerBinaries.size(); I != E; ++I) {
const OffloadBinary *InnerOB = InnerBinaries[I].getBinary();
printBinary(*InnerOB, I, Level + 1, ParentIndex);
@@ -105,7 +104,6 @@ static void printBinary(const OffloadBinary &OB, uint64_t Index, uint64_t Level,
printOffloadBinaryMetadata(OB, Level);
StringRef ImageData = OB.getImage();
- // Check for nested OffloadBinary format
if (identify_magic(ImageData) == file_magic::offload_binary)
printNestedOffloadBinary(OB, Index, Level,
ParentIndex + std::to_string(Index) + ".");
>From 37205769cfd2d165700913f65fb97246cdae3b23 Mon Sep 17 00:00:00 2001
From: "Duran, Alex" <alejandro.duran at intel.com>
Date: Tue, 17 Mar 2026 06:28:33 -0700
Subject: [PATCH 24/33] refactor printBinary
---
llvm/tools/llvm-objdump/OffloadDump.cpp | 37 +++++++++----------------
1 file changed, 13 insertions(+), 24 deletions(-)
diff --git a/llvm/tools/llvm-objdump/OffloadDump.cpp b/llvm/tools/llvm-objdump/OffloadDump.cpp
index a07a4a04f8676..c46067593e633 100644
--- a/llvm/tools/llvm-objdump/OffloadDump.cpp
+++ b/llvm/tools/llvm-objdump/OffloadDump.cpp
@@ -63,13 +63,16 @@ static void printOffloadBinaryMetadata(const OffloadBinary &OB,
}
static void printBinary(const OffloadBinary &OB, uint64_t Index,
- uint64_t Level = 0, std::string ParentIndex = "");
+ uint64_t Level = 0, std::string ParentIndex = "") {
+ outs() << "\n"
+ << Indent(Level) << "OFFLOADING IMAGE [" << ParentIndex << Index
+ << "]:\n";
+
+ printOffloadBinaryMetadata(OB, Level);
-/// Print information about nested OffloadBinary (inner layer).
-static void printNestedOffloadBinary(const OffloadBinary &OuterOB,
- uint64_t Index, uint64_t Level,
- std::string ParentIndex) {
- StringRef ImageData = OuterOB.getImage();
+ StringRef ImageData = OB.getImage();
+ if (identify_magic(ImageData) != file_magic::offload_binary)
+ return;
MemoryBufferRef InnerBuffer(ImageData, "inner-offload-binary");
llvm::SmallVector<OffloadFile> InnerBinaries;
@@ -77,12 +80,11 @@ static void printNestedOffloadBinary(const OffloadBinary &OuterOB,
if (Err) {
reportWarning("failed to extract nested OffloadBinary: " +
toString(std::move(Err)),
- OuterOB.getFileName());
+ OB.getFileName());
return;
}
if (InnerBinaries.empty()) {
- reportWarning("nested OffloadBinary contains no entries",
- OuterOB.getFileName());
+ reportWarning("nested OffloadBinary contains no entries", OB.getFileName());
return;
}
@@ -91,24 +93,11 @@ static void printNestedOffloadBinary(const OffloadBinary &OuterOB,
for (uint64_t I = 0, E = InnerBinaries.size(); I != E; ++I) {
const OffloadBinary *InnerOB = InnerBinaries[I].getBinary();
- printBinary(*InnerOB, I, Level + 1, ParentIndex);
+ printBinary(*InnerOB, I, Level + 1,
+ ParentIndex + std::to_string(Index) + ".");
}
}
-static void printBinary(const OffloadBinary &OB, uint64_t Index, uint64_t Level,
- std::string ParentIndex) {
- outs() << "\n"
- << Indent(Level) << "OFFLOADING IMAGE [" << ParentIndex << Index
- << "]:\n";
-
- printOffloadBinaryMetadata(OB, Level);
-
- StringRef ImageData = OB.getImage();
- if (identify_magic(ImageData) == file_magic::offload_binary)
- printNestedOffloadBinary(OB, Index, Level,
- ParentIndex + std::to_string(Index) + ".");
-}
-
/// Print the embedded offloading contents of an ObjectFile \p O.
void llvm::dumpOffloadBinary(const ObjectFile &O, StringRef ArchName) {
if (!O.isELF() && !O.isCOFF()) {
>From 42b55307121a397f1ffcec1e7e72b82842c54d5c Mon Sep 17 00:00:00 2001
From: "Duran, Alex" <alejandro.duran at intel.com>
Date: Fri, 20 Mar 2026 08:37:23 -0700
Subject: [PATCH 25/33] Add nested offload-binary-test
---
.../Offloading/nested-offload-binary.test | 72 +++++++++++++++++++
1 file changed, 72 insertions(+)
create mode 100644 llvm/test/tools/llvm-objdump/Offloading/nested-offload-binary.test
diff --git a/llvm/test/tools/llvm-objdump/Offloading/nested-offload-binary.test b/llvm/test/tools/llvm-objdump/Offloading/nested-offload-binary.test
new file mode 100644
index 0000000000000..7b626cd21fa40
--- /dev/null
+++ b/llvm/test/tools/llvm-objdump/Offloading/nested-offload-binary.test
@@ -0,0 +1,72 @@
+## Test that llvm-objdump can display nested OffloadBinary images.
+
+# The content blobs below were generated from the following YAML Input
+#!Offload
+#Members:
+# - ImageKind: IMG_Bitcode
+# OffloadKind: OFK_OpenMP
+# String:
+# - Key: "triple"
+# Value: "x-y-z"
+# - Key: "arch"
+# Value: "arch1"
+# - ImageKind: IMG_Bitcode
+# OffloadKind: OFK_OpenMP
+# String:
+# - Key: "triple"
+# Value: "x-y-z"
+# - Key: "arch"
+# Value: "arch2"
+
+# RUN: yaml2obj %s -o %t.bin
+# RUN: llvm-objdump --offloading %t.bin | FileCheck %s
+
+!Offload
+Members:
+ - ImageKind: IMG_Object
+ OffloadKind: OFK_OpenMP
+ String:
+ - Key: "triple"
+ Value: "x-y-z"
+ - Key: "arch"
+ Value: "none"
+ Content: 10ff10ad02000000f00000000000000020000000000000000200000000000000020001000000000070000000000000000200000000000000f00000000000000000000000000000000200010000000000a0000000000000000200000000000000f0000000000000000000000000000000dc00000000000000d1000000000000000500000000000000d700000000000000e9000000000000000500000000000000dc00000000000000d1000000000000000500000000000000d700000000000000e300000000000000050000000000000000782d792d7a006172636800747269706c650061726368320061726368310000
+ - ImageKind: IMG_Object
+ OffloadKind: OFK_OpenMP
+ String:
+ - Key: "triple"
+ Value: "a-b-c"
+ - Key: "arch"
+ Value: "none"
+ Content: 10ff10ad02000000f00000000000000020000000000000000200000000000000020001000000000070000000000000000200000000000000f00000000000000000000000000000000200010000000000a0000000000000000200000000000000f0000000000000000000000000000000dc00000000000000d1000000000000000500000000000000d700000000000000e9000000000000000500000000000000dc00000000000000d1000000000000000500000000000000d700000000000000e300000000000000050000000000000000782d792d7a006172636800747269706c650061726368320061726368310000
+
+# CHECK: OFFLOADING IMAGE [0]:
+# CHECK-NEXT: kind elf
+# CHECK-NEXT: arch none
+# CHECK-NEXT: triple x-y-z
+# CHECK-NEXT: producer openmp
+# CHECK-NEXT: image size {{[0-9]+}} bytes
+# CHECK-NEXT: nested images 2
+# CHECK: OFFLOADING IMAGE [0.0]:
+# CHECK-NEXT: kind llvm ir
+# CHECK-NEXT: arch arch1
+# CHECK-NEXT: triple x-y-z
+# CHECK: OFFLOADING IMAGE [0.1]:
+# CHECK-NEXT: kind llvm ir
+# CHECK-NEXT: arch arch2
+# CHECK-NEXT: triple x-y-z
+# CHECK: OFFLOADING IMAGE [1]:
+# CHECK-NEXT: kind elf
+# CHECK-NEXT: arch none
+# CHECK-NEXT: triple a-b-c
+# CHECK-NEXT: producer openmp
+# CHECK-NEXT: image size {{[0-9]+}} bytes
+# CHECK-NEXT: nested images 2
+# CHECK: OFFLOADING IMAGE [1.0]:
+# CHECK-NEXT: kind llvm ir
+# CHECK-NEXT: arch arch1
+# CHECK-NEXT: triple x-y-z
+# CHECK: OFFLOADING IMAGE [1.1]:
+# CHECK-NEXT: kind llvm ir
+# CHECK-NEXT: arch arch2
+# CHECK-NEXT: triple x-y-z
>From 23598999d688ee02953d7d9715c13c294346a0d5 Mon Sep 17 00:00:00 2001
From: "Duran, Alex" <alejandro.duran at intel.com>
Date: Fri, 20 Mar 2026 09:16:44 -0700
Subject: [PATCH 26/33] Test for errors
---
.../Offloading/nested-offload-binary-fails.test | 17 +++++++++++++++++
1 file changed, 17 insertions(+)
create mode 100644 llvm/test/tools/llvm-objdump/Offloading/nested-offload-binary-fails.test
diff --git a/llvm/test/tools/llvm-objdump/Offloading/nested-offload-binary-fails.test b/llvm/test/tools/llvm-objdump/Offloading/nested-offload-binary-fails.test
new file mode 100644
index 0000000000000..875fdec63bdfb
--- /dev/null
+++ b/llvm/test/tools/llvm-objdump/Offloading/nested-offload-binary-fails.test
@@ -0,0 +1,17 @@
+## Test that llvm-objdump can display nested OffloadBinary images.
+
+# RUN: yaml2obj %s -o %t.bin
+# RUN: llvm-objdump --offloading %t.bin 2>&1 | FileCheck -DFILENAME=%t.bin %s
+
+!Offload
+Members:
+ - ImageKind: IMG_Object
+ OffloadKind: OFK_OpenMP
+ String:
+ - Key: "triple"
+ Value: "x-y-z"
+ - Key: "arch"
+ Value: "none"
+ Content: 10ff10ad
+
+# CHECK: warning: '[[FILENAME]]': failed to extract nested OffloadBinary:
>From 8421b5cb85e9b598de3771c2f2b6efeb5598386d Mon Sep 17 00:00:00 2001
From: "Duran, Alex" <alejandro.duran at intel.com>
Date: Fri, 20 Mar 2026 09:17:32 -0700
Subject: [PATCH 27/33] change impossible condition into assert
---
.../Offloading/nested-offload-binary-empty.test | 17 +++++++++++++++++
llvm/tools/llvm-objdump/OffloadDump.cpp | 7 +++----
2 files changed, 20 insertions(+), 4 deletions(-)
create mode 100644 llvm/test/tools/llvm-objdump/Offloading/nested-offload-binary-empty.test
diff --git a/llvm/test/tools/llvm-objdump/Offloading/nested-offload-binary-empty.test b/llvm/test/tools/llvm-objdump/Offloading/nested-offload-binary-empty.test
new file mode 100644
index 0000000000000..875fdec63bdfb
--- /dev/null
+++ b/llvm/test/tools/llvm-objdump/Offloading/nested-offload-binary-empty.test
@@ -0,0 +1,17 @@
+## Test that llvm-objdump can display nested OffloadBinary images.
+
+# RUN: yaml2obj %s -o %t.bin
+# RUN: llvm-objdump --offloading %t.bin 2>&1 | FileCheck -DFILENAME=%t.bin %s
+
+!Offload
+Members:
+ - ImageKind: IMG_Object
+ OffloadKind: OFK_OpenMP
+ String:
+ - Key: "triple"
+ Value: "x-y-z"
+ - Key: "arch"
+ Value: "none"
+ Content: 10ff10ad
+
+# CHECK: warning: '[[FILENAME]]': failed to extract nested OffloadBinary:
diff --git a/llvm/tools/llvm-objdump/OffloadDump.cpp b/llvm/tools/llvm-objdump/OffloadDump.cpp
index c46067593e633..5328548422a09 100644
--- a/llvm/tools/llvm-objdump/OffloadDump.cpp
+++ b/llvm/tools/llvm-objdump/OffloadDump.cpp
@@ -83,10 +83,9 @@ static void printBinary(const OffloadBinary &OB, uint64_t Index,
OB.getFileName());
return;
}
- if (InnerBinaries.empty()) {
- reportWarning("nested OffloadBinary contains no entries", OB.getFileName());
- return;
- }
+ assert(!InnerBinaries.empty() &&
+ "An offload binary with a magic number should contain at least one "
+ "binary");
outs() << Indent(Level) << left_justify("nested images", 16)
<< InnerBinaries.size() << "\n";
>From 1a9176c3a2163bdfd5cd9f3de1e9e440aee421b0 Mon Sep 17 00:00:00 2001
From: "Duran, Alex" <alejandro.duran at intel.com>
Date: Thu, 26 Mar 2026 06:19:23 -0700
Subject: [PATCH 28/33] Test changes
---
.../Offloading/nested-offload-binary.test | 44 +++++++++----------
1 file changed, 22 insertions(+), 22 deletions(-)
diff --git a/llvm/test/tools/llvm-objdump/Offloading/nested-offload-binary.test b/llvm/test/tools/llvm-objdump/Offloading/nested-offload-binary.test
index 7b626cd21fa40..973e0dce98545 100644
--- a/llvm/test/tools/llvm-objdump/Offloading/nested-offload-binary.test
+++ b/llvm/test/tools/llvm-objdump/Offloading/nested-offload-binary.test
@@ -1,22 +1,22 @@
## Test that llvm-objdump can display nested OffloadBinary images.
-# The content blobs below were generated from the following YAML Input
-#!Offload
-#Members:
-# - ImageKind: IMG_Bitcode
-# OffloadKind: OFK_OpenMP
-# String:
-# - Key: "triple"
-# Value: "x-y-z"
-# - Key: "arch"
-# Value: "arch1"
-# - ImageKind: IMG_Bitcode
-# OffloadKind: OFK_OpenMP
-# String:
-# - Key: "triple"
-# Value: "x-y-z"
-# - Key: "arch"
-# Value: "arch2"
+## The content blobs below were generated from the following YAML Input
+##!Offload
+##Members:
+## - ImageKind: IMG_Bitcode
+## OffloadKind: OFK_OpenMP
+## String:
+## - Key: "triple"
+## Value: "x-y-z"
+## - Key: "arch"
+## Value: "arch1"
+## - ImageKind: IMG_Bitcode
+## OffloadKind: OFK_OpenMP
+## String:
+## - Key: "triple"
+## Value: "x-y-z"
+## - Key: "arch"
+## Value: "arch2"
# RUN: yaml2obj %s -o %t.bin
# RUN: llvm-objdump --offloading %t.bin | FileCheck %s
@@ -40,18 +40,18 @@ Members:
Value: "none"
Content: 10ff10ad02000000f00000000000000020000000000000000200000000000000020001000000000070000000000000000200000000000000f00000000000000000000000000000000200010000000000a0000000000000000200000000000000f0000000000000000000000000000000dc00000000000000d1000000000000000500000000000000d700000000000000e9000000000000000500000000000000dc00000000000000d1000000000000000500000000000000d700000000000000e300000000000000050000000000000000782d792d7a006172636800747269706c650061726368320061726368310000
-# CHECK: OFFLOADING IMAGE [0]:
+# CHECK: OFFLOADING IMAGE [0]:
# CHECK-NEXT: kind elf
# CHECK-NEXT: arch none
# CHECK-NEXT: triple x-y-z
# CHECK-NEXT: producer openmp
# CHECK-NEXT: image size {{[0-9]+}} bytes
# CHECK-NEXT: nested images 2
-# CHECK: OFFLOADING IMAGE [0.0]:
+# CHECK: OFFLOADING IMAGE [0.0]:
# CHECK-NEXT: kind llvm ir
# CHECK-NEXT: arch arch1
# CHECK-NEXT: triple x-y-z
-# CHECK: OFFLOADING IMAGE [0.1]:
+# CHECK: OFFLOADING IMAGE [0.1]:
# CHECK-NEXT: kind llvm ir
# CHECK-NEXT: arch arch2
# CHECK-NEXT: triple x-y-z
@@ -62,11 +62,11 @@ Members:
# CHECK-NEXT: producer openmp
# CHECK-NEXT: image size {{[0-9]+}} bytes
# CHECK-NEXT: nested images 2
-# CHECK: OFFLOADING IMAGE [1.0]:
+# CHECK: OFFLOADING IMAGE [1.0]:
# CHECK-NEXT: kind llvm ir
# CHECK-NEXT: arch arch1
# CHECK-NEXT: triple x-y-z
-# CHECK: OFFLOADING IMAGE [1.1]:
+# CHECK: OFFLOADING IMAGE [1.1]:
# CHECK-NEXT: kind llvm ir
# CHECK-NEXT: arch arch2
# CHECK-NEXT: triple x-y-z
>From 60d466937e29318e064101692844641a7535edc6 Mon Sep 17 00:00:00 2001
From: "Duran, Alex" <alejandro.duran at intel.com>
Date: Thu, 26 Mar 2026 06:26:07 -0700
Subject: [PATCH 29/33] remove unnecessary test
---
.../Offloading/nested-offload-binary-empty.test | 17 -----------------
1 file changed, 17 deletions(-)
delete mode 100644 llvm/test/tools/llvm-objdump/Offloading/nested-offload-binary-empty.test
diff --git a/llvm/test/tools/llvm-objdump/Offloading/nested-offload-binary-empty.test b/llvm/test/tools/llvm-objdump/Offloading/nested-offload-binary-empty.test
deleted file mode 100644
index 875fdec63bdfb..0000000000000
--- a/llvm/test/tools/llvm-objdump/Offloading/nested-offload-binary-empty.test
+++ /dev/null
@@ -1,17 +0,0 @@
-## Test that llvm-objdump can display nested OffloadBinary images.
-
-# RUN: yaml2obj %s -o %t.bin
-# RUN: llvm-objdump --offloading %t.bin 2>&1 | FileCheck -DFILENAME=%t.bin %s
-
-!Offload
-Members:
- - ImageKind: IMG_Object
- OffloadKind: OFK_OpenMP
- String:
- - Key: "triple"
- Value: "x-y-z"
- - Key: "arch"
- Value: "none"
- Content: 10ff10ad
-
-# CHECK: warning: '[[FILENAME]]': failed to extract nested OffloadBinary:
>From 4d7b0daf25d509db97dcefe0759d82f1c5e1aee2 Mon Sep 17 00:00:00 2001
From: "Duran, Alex" <alejandro.duran at intel.com>
Date: Tue, 7 Apr 2026 01:54:26 -0700
Subject: [PATCH 30/33] Use indent stream method
---
llvm/tools/llvm-objdump/OffloadDump.cpp | 32 ++++++++++++-------------
1 file changed, 15 insertions(+), 17 deletions(-)
diff --git a/llvm/tools/llvm-objdump/OffloadDump.cpp b/llvm/tools/llvm-objdump/OffloadDump.cpp
index 5328548422a09..f7302c2ad6bd5 100644
--- a/llvm/tools/llvm-objdump/OffloadDump.cpp
+++ b/llvm/tools/llvm-objdump/OffloadDump.cpp
@@ -44,29 +44,27 @@ static StringRef getImageName(const OffloadBinary &OB) {
}
}
-std::string Indent(uint64_t Level) { return std::string(Level * 2, ' '); }
-
/// Print metadata from an OffloadBinary.
static void printOffloadBinaryMetadata(const OffloadBinary &OB,
uint64_t level) {
- const std::string IndentStr = Indent(level);
-
- outs() << IndentStr << left_justify("kind", 16) << getImageName(OB) << "\n";
- outs() << IndentStr << left_justify("arch", 16) << OB.getArch() << "\n";
- outs() << IndentStr << left_justify("triple", 16) << OB.getTriple() << "\n";
- outs() << IndentStr << left_justify("producer", 16)
- << getOffloadKindName(OB.getOffloadKind()) << "\n";
+ outs().indent(level * 2) << left_justify("kind", 16) << getImageName(OB)
+ << "\n";
+ outs().indent(level * 2) << left_justify("arch", 16) << OB.getArch() << "\n";
+ outs().indent(level * 2) << left_justify("triple", 16) << OB.getTriple()
+ << "\n";
+ outs().indent(level * 2) << left_justify("producer", 16)
+ << getOffloadKindName(OB.getOffloadKind()) << "\n";
StringRef InnerImage = OB.getImage();
- outs() << IndentStr << left_justify("image size", 16) << InnerImage.size()
- << " bytes\n";
+ outs().indent(level * 2) << left_justify("image size", 16)
+ << InnerImage.size() << " bytes\n";
}
static void printBinary(const OffloadBinary &OB, uint64_t Index,
uint64_t Level = 0, std::string ParentIndex = "") {
- outs() << "\n"
- << Indent(Level) << "OFFLOADING IMAGE [" << ParentIndex << Index
- << "]:\n";
+ outs() << "\n";
+ outs().indent(Level * 2) << "OFFLOADING IMAGE [" << ParentIndex << Index
+ << "]:\n";
printOffloadBinaryMetadata(OB, Level);
@@ -75,7 +73,7 @@ static void printBinary(const OffloadBinary &OB, uint64_t Index,
return;
MemoryBufferRef InnerBuffer(ImageData, "inner-offload-binary");
- llvm::SmallVector<OffloadFile> InnerBinaries;
+ SmallVector<OffloadFile> InnerBinaries;
auto Err = extractOffloadBinaries(InnerBuffer, InnerBinaries);
if (Err) {
reportWarning("failed to extract nested OffloadBinary: " +
@@ -87,8 +85,8 @@ static void printBinary(const OffloadBinary &OB, uint64_t Index,
"An offload binary with a magic number should contain at least one "
"binary");
- outs() << Indent(Level) << left_justify("nested images", 16)
- << InnerBinaries.size() << "\n";
+ outs().indent(Level * 2) << left_justify("nested images", 16)
+ << InnerBinaries.size() << "\n";
for (uint64_t I = 0, E = InnerBinaries.size(); I != E; ++I) {
const OffloadBinary *InnerOB = InnerBinaries[I].getBinary();
>From d8a71e9fc0eed105027813c3de356b8912c83c2b Mon Sep 17 00:00:00 2001
From: "Duran, Alex" <alejandro.duran at intel.com>
Date: Tue, 7 Apr 2026 02:19:14 -0700
Subject: [PATCH 31/33] adjust tests
---
.../nested-offload-binary-fails.test | 2 +-
.../Offloading/nested-offload-binary.test | 75 +++++++++++--------
2 files changed, 45 insertions(+), 32 deletions(-)
diff --git a/llvm/test/tools/llvm-objdump/Offloading/nested-offload-binary-fails.test b/llvm/test/tools/llvm-objdump/Offloading/nested-offload-binary-fails.test
index 875fdec63bdfb..7c1bf5ce8d0f1 100644
--- a/llvm/test/tools/llvm-objdump/Offloading/nested-offload-binary-fails.test
+++ b/llvm/test/tools/llvm-objdump/Offloading/nested-offload-binary-fails.test
@@ -14,4 +14,4 @@ Members:
Value: "none"
Content: 10ff10ad
-# CHECK: warning: '[[FILENAME]]': failed to extract nested OffloadBinary:
+# CHECK: warning: '[[FILENAME]]': failed to extract nested OffloadBinary: Invalid data was encountered while parsing the file
diff --git a/llvm/test/tools/llvm-objdump/Offloading/nested-offload-binary.test b/llvm/test/tools/llvm-objdump/Offloading/nested-offload-binary.test
index 973e0dce98545..d46180242144e 100644
--- a/llvm/test/tools/llvm-objdump/Offloading/nested-offload-binary.test
+++ b/llvm/test/tools/llvm-objdump/Offloading/nested-offload-binary.test
@@ -19,7 +19,7 @@
## Value: "arch2"
# RUN: yaml2obj %s -o %t.bin
-# RUN: llvm-objdump --offloading %t.bin | FileCheck %s
+# RUN: llvm-objdump --offloading %t.bin | FileCheck --match-full-lines --strict-whitespace --implicit-check-not={{.}} %s
!Offload
Members:
@@ -40,33 +40,46 @@ Members:
Value: "none"
Content: 10ff10ad02000000f00000000000000020000000000000000200000000000000020001000000000070000000000000000200000000000000f00000000000000000000000000000000200010000000000a0000000000000000200000000000000f0000000000000000000000000000000dc00000000000000d1000000000000000500000000000000d700000000000000e9000000000000000500000000000000dc00000000000000d1000000000000000500000000000000d700000000000000e300000000000000050000000000000000782d792d7a006172636800747269706c650061726368320061726368310000
-# CHECK: OFFLOADING IMAGE [0]:
-# CHECK-NEXT: kind elf
-# CHECK-NEXT: arch none
-# CHECK-NEXT: triple x-y-z
-# CHECK-NEXT: producer openmp
-# CHECK-NEXT: image size {{[0-9]+}} bytes
-# CHECK-NEXT: nested images 2
-# CHECK: OFFLOADING IMAGE [0.0]:
-# CHECK-NEXT: kind llvm ir
-# CHECK-NEXT: arch arch1
-# CHECK-NEXT: triple x-y-z
-# CHECK: OFFLOADING IMAGE [0.1]:
-# CHECK-NEXT: kind llvm ir
-# CHECK-NEXT: arch arch2
-# CHECK-NEXT: triple x-y-z
-# CHECK: OFFLOADING IMAGE [1]:
-# CHECK-NEXT: kind elf
-# CHECK-NEXT: arch none
-# CHECK-NEXT: triple a-b-c
-# CHECK-NEXT: producer openmp
-# CHECK-NEXT: image size {{[0-9]+}} bytes
-# CHECK-NEXT: nested images 2
-# CHECK: OFFLOADING IMAGE [1.0]:
-# CHECK-NEXT: kind llvm ir
-# CHECK-NEXT: arch arch1
-# CHECK-NEXT: triple x-y-z
-# CHECK: OFFLOADING IMAGE [1.1]:
-# CHECK-NEXT: kind llvm ir
-# CHECK-NEXT: arch arch2
-# CHECK-NEXT: triple x-y-z
+# CHECK:OFFLOADING IMAGE [0]:
+# CHECK-NEXT:kind elf
+# CHECK-NEXT:arch none
+# CHECK-NEXT:triple x-y-z
+# CHECK-NEXT:producer openmp
+# CHECK-NEXT:image size {{[0-9]+}} bytes
+# CHECK-NEXT:nested images 2
+# CHECK-EMPTY:
+# CHECK-NEXT: OFFLOADING IMAGE [0.0]:
+# CHECK-NEXT: kind llvm ir
+# CHECK-NEXT: arch arch1
+# CHECK-NEXT: triple x-y-z
+# CHECK-NEXT: producer openmp
+# CHECK-NEXT: image size {{[0-9]+}} bytes
+# CHECK-EMPTY:
+# CHECK-NEXT: OFFLOADING IMAGE [0.1]:
+# CHECK-NEXT: kind llvm ir
+# CHECK-NEXT: arch arch2
+# CHECK-NEXT: triple x-y-z
+# CHECK-NEXT: producer openmp
+# CHECK-NEXT: image size {{[0-9]+}} bytes
+# CHECK-EMPTY:
+# CHECK-NEXT:OFFLOADING IMAGE [1]:
+# CHECK-NEXT:kind elf
+# CHECK-NEXT:arch none
+# CHECK-NEXT:triple a-b-c
+# CHECK-NEXT:producer openmp
+# CHECK-NEXT:image size {{[0-9]+}} bytes
+# CHECK-NEXT:nested images 2
+# CHECK-EMPTY:
+# CHECK-NEXT: OFFLOADING IMAGE [1.0]:
+# CHECK-NEXT: kind llvm ir
+# CHECK-NEXT: arch arch1
+# CHECK-NEXT: triple x-y-z
+# CHECK-NEXT: producer openmp
+# CHECK-NEXT: image size {{[0-9]+}} bytes
+# CHECK-EMPTY:
+# CHECK-NEXT: OFFLOADING IMAGE [1.1]:
+# CHECK-NEXT: kind llvm ir
+# CHECK-NEXT: arch arch2
+# CHECK-NEXT: triple x-y-z
+# CHECK-NEXT: producer openmp
+# CHECK-NEXT: image size {{[0-9]+}} bytes
>From d5088d72fdb7d4f7c7a0a06262bc8ed704e618f5 Mon Sep 17 00:00:00 2001
From: "Duran, Alex" <alejandro.duran at intel.com>
Date: Mon, 13 Apr 2026 02:24:41 -0700
Subject: [PATCH 32/33] Address review comments
---
.../Offloading/nested-offload-binary-fails.test | 2 ++
llvm/tools/llvm-objdump/OffloadDump.cpp | 9 +++++----
2 files changed, 7 insertions(+), 4 deletions(-)
diff --git a/llvm/test/tools/llvm-objdump/Offloading/nested-offload-binary-fails.test b/llvm/test/tools/llvm-objdump/Offloading/nested-offload-binary-fails.test
index 7c1bf5ce8d0f1..4ac6706bc6410 100644
--- a/llvm/test/tools/llvm-objdump/Offloading/nested-offload-binary-fails.test
+++ b/llvm/test/tools/llvm-objdump/Offloading/nested-offload-binary-fails.test
@@ -15,3 +15,5 @@ Members:
Content: 10ff10ad
# CHECK: warning: '[[FILENAME]]': failed to extract nested OffloadBinary: Invalid data was encountered while parsing the file
+## Check no information about the nested image is printed
+# CHECK-NOT: OFFLOADING IMAGE [0.0]:
diff --git a/llvm/tools/llvm-objdump/OffloadDump.cpp b/llvm/tools/llvm-objdump/OffloadDump.cpp
index f7302c2ad6bd5..0070b7280abec 100644
--- a/llvm/tools/llvm-objdump/OffloadDump.cpp
+++ b/llvm/tools/llvm-objdump/OffloadDump.cpp
@@ -61,9 +61,10 @@ static void printOffloadBinaryMetadata(const OffloadBinary &OB,
}
static void printBinary(const OffloadBinary &OB, uint64_t Index,
- uint64_t Level = 0, std::string ParentIndex = "") {
+ uint64_t Level = 0,
+ Twine ParentIndexPrefix = "") {
outs() << "\n";
- outs().indent(Level * 2) << "OFFLOADING IMAGE [" << ParentIndex << Index
+ outs().indent(Level * 2) << "OFFLOADING IMAGE [" << ParentIndexPrefix << Index
<< "]:\n";
printOffloadBinaryMetadata(OB, Level);
@@ -74,7 +75,7 @@ static void printBinary(const OffloadBinary &OB, uint64_t Index,
MemoryBufferRef InnerBuffer(ImageData, "inner-offload-binary");
SmallVector<OffloadFile> InnerBinaries;
- auto Err = extractOffloadBinaries(InnerBuffer, InnerBinaries);
+ Error Err = extractOffloadBinaries(InnerBuffer, InnerBinaries);
if (Err) {
reportWarning("failed to extract nested OffloadBinary: " +
toString(std::move(Err)),
@@ -91,7 +92,7 @@ static void printBinary(const OffloadBinary &OB, uint64_t Index,
for (uint64_t I = 0, E = InnerBinaries.size(); I != E; ++I) {
const OffloadBinary *InnerOB = InnerBinaries[I].getBinary();
printBinary(*InnerOB, I, Level + 1,
- ParentIndex + std::to_string(Index) + ".");
+ ParentIndexPrefix + Twine(Index) + ".");
}
}
>From 739ce09b605a48784dc00dd0c66212971965d2ea Mon Sep 17 00:00:00 2001
From: "Duran, Alex" <alejandro.duran at intel.com>
Date: Mon, 13 Apr 2026 02:52:58 -0700
Subject: [PATCH 33/33] format
---
llvm/tools/llvm-objdump/OffloadDump.cpp | 6 ++----
1 file changed, 2 insertions(+), 4 deletions(-)
diff --git a/llvm/tools/llvm-objdump/OffloadDump.cpp b/llvm/tools/llvm-objdump/OffloadDump.cpp
index 0070b7280abec..af3ee3d0826f5 100644
--- a/llvm/tools/llvm-objdump/OffloadDump.cpp
+++ b/llvm/tools/llvm-objdump/OffloadDump.cpp
@@ -61,8 +61,7 @@ static void printOffloadBinaryMetadata(const OffloadBinary &OB,
}
static void printBinary(const OffloadBinary &OB, uint64_t Index,
- uint64_t Level = 0,
- Twine ParentIndexPrefix = "") {
+ uint64_t Level = 0, Twine ParentIndexPrefix = "") {
outs() << "\n";
outs().indent(Level * 2) << "OFFLOADING IMAGE [" << ParentIndexPrefix << Index
<< "]:\n";
@@ -91,8 +90,7 @@ static void printBinary(const OffloadBinary &OB, uint64_t Index,
for (uint64_t I = 0, E = InnerBinaries.size(); I != E; ++I) {
const OffloadBinary *InnerOB = InnerBinaries[I].getBinary();
- printBinary(*InnerOB, I, Level + 1,
- ParentIndexPrefix + Twine(Index) + ".");
+ printBinary(*InnerOB, I, Level + 1, ParentIndexPrefix + Twine(Index) + ".");
}
}
More information about the cfe-commits
mailing list