[llvm] Add llvm-extract-bundle-entry to extend llvm-objcopy (PR #169386)
David Salinas via llvm-commits
llvm-commits at lists.llvm.org
Mon Mar 9 13:46:46 PDT 2026
https://github.com/david-salinas updated https://github.com/llvm/llvm-project/pull/169386
>From d51441126c696e45b1389ede37c0c12aac2f0ef9 Mon Sep 17 00:00:00 2001
From: dsalinas_amdeng <david.salinas at amd.com>
Date: Thu, 20 Nov 2025 19:52:40 +0000
Subject: [PATCH 1/6] Add llvm-extract-bundle-entry to extend llvm-objcopy
This commit creates llvm-extract-bundle-entry as a wrapper to llvm-objcopy,
to allow extracting HIP offload fatbin bundles given a URI argument.
---
llvm/include/llvm/Object/OffloadBundle.h | 4 +-
llvm/lib/Object/OffloadBundle.cpp | 28 ++++--
llvm/test/CMakeLists.txt | 1 +
llvm/test/lit.cfg.py | 2 +
.../llvm-objcopy/extract-bundle-entry.test | 74 ++++++++++++++++
llvm/tools/llvm-objcopy/CMakeLists.txt | 6 ++
.../llvm-objcopy/ExtractBundleEntryOpts.td | 31 +++++++
llvm/tools/llvm-objcopy/ObjcopyOptions.cpp | 86 ++++++++++++++++++-
llvm/tools/llvm-objcopy/ObjcopyOptions.h | 10 +++
llvm/tools/llvm-objcopy/llvm-objcopy.cpp | 2 +
10 files changed, 234 insertions(+), 10 deletions(-)
create mode 100644 llvm/test/tools/llvm-objcopy/extract-bundle-entry.test
create mode 100644 llvm/tools/llvm-objcopy/ExtractBundleEntryOpts.td
diff --git a/llvm/include/llvm/Object/OffloadBundle.h b/llvm/include/llvm/Object/OffloadBundle.h
index bbb313c06c441..24be9397f8d84 100644
--- a/llvm/include/llvm/Object/OffloadBundle.h
+++ b/llvm/include/llvm/Object/OffloadBundle.h
@@ -210,8 +210,8 @@ LLVM_ABI Error extractOffloadBundleFatBinary(
/// Extract code object memory from the given \p Source object file at \p Offset
/// and of \p Size, and copy into \p OutputFileName.
-LLVM_ABI Error extractCodeObject(const ObjectFile &Source, int64_t Offset,
- int64_t Size, StringRef OutputFileName);
+LLVM_ABI Error extractCodeObject(const ObjectFile &Source, size_t Offset,
+ size_t Size, StringRef OutputFileName);
/// Extract code object memory from the given \p Source object file at \p Offset
/// and of \p Size, and copy into \p OutputFileName.
diff --git a/llvm/lib/Object/OffloadBundle.cpp b/llvm/lib/Object/OffloadBundle.cpp
index 046cde8640b49..f16d694716ed0 100644
--- a/llvm/lib/Object/OffloadBundle.cpp
+++ b/llvm/lib/Object/OffloadBundle.cpp
@@ -217,24 +217,37 @@ Error object::extractOffloadBundleFatBinary(
return Error::success();
}
-Error object::extractCodeObject(const ObjectFile &Source, int64_t Offset,
- int64_t Size, StringRef OutputFileName) {
+Error object::extractCodeObject(const ObjectFile &Source, size_t Offset,
+ size_t Size, StringRef OutputFileName) {
Expected<std::unique_ptr<FileOutputBuffer>> BufferOrErr =
FileOutputBuffer::create(OutputFileName, Size);
- if (!BufferOrErr)
- return BufferOrErr.takeError();
+ if (auto EC = BufferOrErr.takeError())
+ return EC;
Expected<MemoryBufferRef> InputBuffOrErr = Source.getMemoryBufferRef();
if (Error Err = InputBuffOrErr.takeError())
- return Err;
+ return createFileError(OutputFileName, std::move(Err));
+ ;
+
+ if (Size > InputBuffOrErr->getBufferSize())
+ return createStringError("size in URI is larger than source");
+
+ if (Offset > InputBuffOrErr->getBufferSize())
+ return createStringError(inconvertibleErrorCode(),
+ "offset in URI is beyond the size of the source");
+
+ if (Offset + Size > InputBuffOrErr->getBufferSize())
+ return createStringError(
+ inconvertibleErrorCode(),
+ "offset + size in URI is beyond the size of the source");
std::unique_ptr<FileOutputBuffer> Buf = std::move(*BufferOrErr);
std::copy(InputBuffOrErr->getBufferStart() + Offset,
InputBuffOrErr->getBufferStart() + Offset + Size,
Buf->getBufferStart());
if (Error E = Buf->commit())
- return E;
+ return createFileError(OutputFileName, std::move(E));
return Error::success();
}
@@ -259,6 +272,7 @@ Error object::extractOffloadBundleByURI(StringRef URIstr) {
// create a URI object
Expected<std::unique_ptr<OffloadBundleURI>> UriOrErr(
OffloadBundleURI::createOffloadBundleURI(URIstr, FILE_URI));
+
if (!UriOrErr)
return UriOrErr.takeError();
@@ -275,7 +289,7 @@ Error object::extractOffloadBundleByURI(StringRef URIstr) {
auto Obj = ObjOrErr->getBinary();
if (Error Err =
object::extractCodeObject(*Obj, Uri.Offset, Uri.Size, OutputFile))
- return Err;
+ return createFileError(Uri.FileName, std::move(Err));
return Error::success();
}
diff --git a/llvm/test/CMakeLists.txt b/llvm/test/CMakeLists.txt
index e547c3429058b..4f62bd75cdced 100644
--- a/llvm/test/CMakeLists.txt
+++ b/llvm/test/CMakeLists.txt
@@ -103,6 +103,7 @@ set(LLVM_TEST_DEPENDS
llvm-dwp
llvm-exegesis
llvm-extract
+ llvm-extract-bundle-entry
llvm-gsymutil
llvm-ir2vec
llvm-isel-fuzzer
diff --git a/llvm/test/lit.cfg.py b/llvm/test/lit.cfg.py
index 725ddb877f9ec..9aebe654e4095 100644
--- a/llvm/test/lit.cfg.py
+++ b/llvm/test/lit.cfg.py
@@ -219,6 +219,7 @@ def get_asan_rtlib():
ToolSubst("%llvm-strip", FindTool("llvm-strip")),
ToolSubst("%llvm-install-name-tool", FindTool("llvm-install-name-tool")),
ToolSubst("%llvm-bitcode-strip", FindTool("llvm-bitcode-strip")),
+ ToolSubst("%llvm-extract-bundle-entry", FindTool("llvm-extract-bundle-entry")),
ToolSubst("%split-file", FindTool("split-file")),
]
@@ -250,6 +251,7 @@ def get_asan_rtlib():
"llvm-dlltool",
"llvm-exegesis",
"llvm-extract",
+ "llvm-extract-bundle-entry",
"llvm-ir2vec",
"llvm-isel-fuzzer",
"llvm-ifs",
diff --git a/llvm/test/tools/llvm-objcopy/extract-bundle-entry.test b/llvm/test/tools/llvm-objcopy/extract-bundle-entry.test
new file mode 100644
index 0000000000000..25aa6f1e9271b
--- /dev/null
+++ b/llvm/test/tools/llvm-objcopy/extract-bundle-entry.test
@@ -0,0 +1,74 @@
+## Test llvm-extract-bundle-entry
+# REQUIRES: target={{x86_64-.*-linux.*}}
+# REQUIRES: amdgpu-registered-target
+
+# RUN: yaml2obj %s -o %t.elf
+# RUN: llvm-extract-bundle-entry file://%t.elf#offset=8192\&size=4048
+# RUN: llvm-objdump -d %t.elf-offset8192-size4048.co | FileCheck %s
+
+# RUN: not llvm-extract-bundle-entry file://%t.elf#offset=8192\&size=4048000 2>&1 | \
+# RUN: FileCheck %s --check-prefix=ERR1
+
+# RUN: not llvm-extract-bundle-entry file://%t.elf#offset=819200000\&size=4048 2>&1 | \
+# RUN: FileCheck %s --check-prefix=ERR2
+
+# RUN: not llvm-extract-bundle-entry file://%t.elf#offset=8192\&size=8048 2>&1 | \
+# RUN: FileCheck %s --check-prefix=ERR3
+
+# CHECK: s_load_dword s7, s[4:5], 0x24 // 000000001900: C00201C2 00000024
+# CHECK-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 // 000000001908: C00A0002 00000000
+# CHECK-NEXT: v_mov_b32_e32 v1, 0 // 000000001910: 7E020280
+# CHECK-NEXT: s_waitcnt lgkmcnt(0) // 000000001914: BF8CC07F
+# CHECK-NEXT: s_and_b32 s4, s7, 0xffff // 000000001918: 8604FF07 0000FFFF
+# CHECK-NEXT: s_mul_i32 s6, s6, s4 // 000000001920: 92060406
+# CHECK-NEXT: v_add_u32_e32 v0, s6, v0 // 000000001924: 68000006
+# CHECK-NEXT: v_lshlrev_b64 v[0:1], 2, v[0:1] // 000000001928: D28F0000 00020082
+# CHECK-NEXT: v_mov_b32_e32 v3, s3 // 000000001930: 7E060203
+# CHECK-NEXT: v_add_co_u32_e32 v2, vcc, s2, v0 // 000000001934: 32040002
+# CHECK-NEXT: v_addc_co_u32_e32 v3, vcc, v3, v1, vcc // 000000001938: 38060303
+# CHECK-NEXT: global_load_dword v2, v[2:3], off // 00000000193C: DC508000 027F0002
+# CHECK-NEXT: v_mov_b32_e32 v3, s1 // 000000001944: 7E060201
+# CHECK-NEXT: v_add_co_u32_e32 v0, vcc, s0, v0 // 000000001948: 32000000
+# CHECK-NEXT: v_addc_co_u32_e32 v1, vcc, v3, v1, vcc // 00000000194C: 38020303
+# CHECK-NEXT: global_load_dword v3, v[0:1], off // 000000001950: DC508000 037F0000
+# CHECK-NEXT: s_waitcnt vmcnt(0) // 000000001958: BF8C0F70
+# CHECK-NEXT: v_add_u32_e32 v2, v3, v2 // 00000000195C: 68040503
+# CHECK-NEXT: global_store_dword v[0:1], v2, off // 000000001960: DC708000 007F0200
+# CHECK-NEXT: s_endpgm // 000000001968: BF810000
+
+# ERR1: size in URI is larger than source
+# ERR2: offset in URI is beyond the size of the source
+# ERR3: offset + size in URI is beyond the size of the source
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_EXEC
+ Machine: EM_X86_64
+ Entry: 0x2041B0
+ProgramHeaders:
+ - Type: PT_PHDR
+ Flags: [ PF_R ]
+ VAddr: 0x200040
+ Align: 0x8
+ Offset: 0x40
+ - Type: PT_GNU_STACK
+ Flags: [ PF_W, PF_R ]
+ Align: 0x0
+ Offset: 0x0
+Sections:
+ - Name: .hip_fatbin
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC ]
+ Address: 0x201000
+ AddressAlign: 0x1000
+ Content: 5F5F434C414E475F4F46464C4F41445F42554E444C455F5F0200000000000000001000000000000000000000000000001B00000000000000686F73742D7838365F36342D756E6B6E6F776E2D6C696E75782D2D0010000000000000D00F0000000000001F0000000000000068697076342D616D6467636E2D616D642D616D646873612D2D676678393038000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007F454C460201014003000000000000000300E0000100000000000000000000004000000000000000100C0000000000003005000040003800090040000F000D000600000004000000400000000000000040000000000000004000000000000000F801000000000000F80100000000000008000000000000000100000004000000000000000000000000000000000000000000000000000000C008000000000000C008000000000000001000000000000001000000050000000009000000000000001900000000000000190000000000006C000000000000006C00000000000000001000000000000001000000060000007009000000000000702900000000000070290000000000007000000000000000900600000000000000100000000000000100000006000000E009000000000000E039000000000000E039000000000000000000000000000001000000000000000010000000000000020000000600000070090000000000007029000000000000702900000000000070000000000000007000000000000000080000000000000052E574640400000070090000000000007029000000000000702900000000000070000000000000009006000000000000010000000000000051E57464060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000004000000380200000000000038020000000000003802000000000000340500000000000034050000000000000400000000000000070000001D05000020000000414D44475055000083AE616D646873612E6B65726E656C7391DE0012AB2E616770725F636F756E7400A52E61726773DC001085AE2E616464726573735F7370616365A6676C6F62616CA52E6E616D65AA415F642E636F65726365A72E6F666673657400A52E73697A6508AB2E76616C75655F6B696E64AD676C6F62616C5F62756666657285AE2E616464726573735F7370616365A6676C6F62616CA52E6E616D65AA425F642E636F65726365A72E6F666673657408A52E73697A6508AB2E76616C75655F6B696E64AD676C6F62616C5F62756666657284A52E6E616D65A14EA72E6F666673657410A52E73697A6508AB2E76616C75655F6B696E64A862795F76616C756583A72E6F666673657418A52E73697A6504AB2E76616C75655F6B696E64B468696464656E5F626C6F636B5F636F756E745F7883A72E6F66667365741CA52E73697A6504AB2E76616C75655F6B696E64B468696464656E5F626C6F636B5F636F756E745F7983A72E6F666673657420A52E73697A6504AB2E76616C75655F6B696E64B468696464656E5F626C6F636B5F636F756E745F7A83A72E6F666673657424A52E73697A6502AB2E76616C75655F6B696E64B368696464656E5F67726F75705F73697A655F7883A72E6F666673657426A52E73697A6502AB2E76616C75655F6B696E64B368696464656E5F67726F75705F73697A655F7983A72E6F666673657428A52E73697A6502AB2E76616C75655F6B696E64B368696464656E5F67726F75705F73697A655F7A83A72E6F66667365742AA52E73697A6502AB2E76616C75655F6B696E64B268696464656E5F72656D61696E6465725F7883A72E6F66667365742CA52E73697A6502AB2E76616C75655F6B696E64B268696464656E5F72656D61696E6465725F7983A72E6F66667365742EA52E73697A6502AB2E76616C75655F6B696E64B268696464656E5F72656D61696E6465725F7A83A72E6F666673657440A52E73697A6508AB2E76616C75655F6B696E64B668696464656E5F676C6F62616C5F6F66667365745F7883A72E6F666673657448A52E73697A6508AB2E76616C75655F6B696E64B668696464656E5F676C6F62616C5F6F66667365745F7983A72E6F666673657450A52E73697A6508AB2E76616C75655F6B696E64B668696464656E5F676C6F62616C5F6F66667365745F7A83A72E6F666673657458A52E73697A6502AB2E76616C75655F6B696E64B068696464656E5F677269645F64696D73B92E67726F75705F7365676D656E745F66697865645F73697A6500B62E6B65726E6172675F7365676D656E745F616C69676E08B52E6B65726E6172675F7365676D656E745F73697A65CD0118A92E6C616E6775616765A84F70656E434C2043B12E6C616E67756167655F76657273696F6E920200B82E6D61785F666C61745F776F726B67726F75705F73697A65CD0400A52E6E616D65B25F5A3973696D706C65416464506A504B6A6DBB2E707269766174655F7365676D656E745F66697865645F73697A6500AB2E736770725F636F756E740CB12E736770725F7370696C6C5F636F756E7400A72E73796D626F6CB55F5A3973696D706C65416464506A504B6A6D2E6B64B82E756E69666F726D5F776F726B5F67726F75705F73697A6501B32E757365735F64796E616D69635F737461636BC2AB2E766770725F636F756E7404B12E766770725F7370696C6C5F636F756E7400AF2E7761766566726F6E745F73697A6540AD616D646873612E746172676574B9616D6467636E2D616D642D616D646873612D2D676678393038AE616D646873612E76657273696F6E92010200000000000000000000000000000000000000000000000000000000000000010000001203070000190000000000006C000000000000001400000011030600800800000000000040000000000000002A00000011000A00E03900000000000001000000000000000100000001000000010000001A000000000008400000D20001000000360A4A7A5238A4D3F113F4DD04000000040000000200000001000000000000000300000000000000000000000000000000000000005F5A3973696D706C65416464506A504B6A6D005F5A3973696D706C65416464506A504B6A6D2E6B64005F5F6869705F637569645F623730363264386333326134613933330000000000000000000000000000000000000000000000000000000000000000000000180100000000000080100000000000000000000000000000000000000000000000000000000000004000AF008C000000090000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000C20102C02400000002000AC0000000008002027E7FC08CBF07FF0486FFFF0000060406920600006800008FD2820002000302067E0200043203030638008050DC02007F020102067E0000003203030238008050DC00007F03700F8CBF03050468008070DC00027F00000081BF00000000060000000000000070070000000000000B000000000000001800000000000000050000000000000020080000000000000A000000000000004600000000000000F5FEFF6F00000000D0070000000000000400000000000000F807000000000000000000000000000000000000000000004C696E6B65723A20414D44204C4C442031392E302E3000414D4420636C616E672076657273696F6E2031392E302E306769742028202032343231322063393630313665636534313337356462646438663037356266333762643666633333323230376233290000414D4420636C616E672076657273696F6E2031382E302E3067697420287373683A2F2F6765727269746769742F6C696768746E696E672F65632F6C6C766D2D70726F6A65637420616D642D6D61696E6C696E652D6F70656E20323431373620663935303039613166393032313232343865313036333964653837653635636163616338643961372900000000000000000000000000000000000000000000000000460000000002080070290000000000000000000000000000010000001203070000190000000000006C000000000000001400000011030600800800000000000040000000000000002A00000011000A00E0390000000000000100000000000000002E6E6F7465002E64796E73796D002E676E752E68617368002E68617368002E64796E737472002E726F64617461002E74657874002E64796E616D6963002E72656C726F5F70616464696E67002E627373002E636F6D6D656E74002E73796D746162002E7368737472746162002E73747274616200005F5A3973696D706C65416464506A504B6A6D005F5A3973696D706C65416464506A504B6A6D2E6B64005F5F6869705F637569645F62373036326438633332613461393333005F44594E414D494300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000070000000200000000000000380200000000000038020000000000003405000000000000000000000000000004000000000000000000000000000000070000000B00000002000000000000007007000000000000700700000000000060000000000000000500000001000000080000000000000018000000000000000F000000F6FFFF6F0200000000000000D007000000000000D007000000000000280000000000000002000000000000000800000000000000000000000000000019000000050000000200000000000000F807000000000000F80700000000000028000000000000000200000000000000040000000000000004000000000000001F000000030000000200000000000000200800000000000020080000000000004600000000000000000000000000000001000000000000000000000000000000270000000100000002000000000000008008000000000000800800000000000040000000000000000000000000000000400000000000000000000000000000002F000000010000000600000000000000001900000000000000090000000000006C00000000000000000000000000000000010000000000000000000000000000350000000600000003000000000000007029000000000000700900000000000070000000000000000500000000000000080000000000000010000000000000003E000000080000000300000000000000E029000000000000E00900000000000020060000000000000000000000000000010000000000000000000000000000004D000000080000000300000000000000E039000000000000E0090000000000000100000000000000000000000000000001000000000000000000000000000000520000000100000030000000000000000000000000000000E009000000000000F0000000000000000000000000000000010000000000000001000000000000005B0000000200000000000000000000000000000000000000D00A00000000000078000000000000000E0000000200000008000000000000001800000000000000630000000300000000000000000000000000000000000000480B00000000000075000000000000000000000000000000010000000000000000000000000000006D0000000300000000000000000000000000000000000000BD0B0000000000004F00000000000000000000000000000001000000000000000000000000000000
+ - Name: .hipFatBinSegment
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC ]
+ Address: 0x202FD0
+ AddressAlign: 0x8
+ Content: '465049480100000000102000000000000000000000000000'
+...
+
diff --git a/llvm/tools/llvm-objcopy/CMakeLists.txt b/llvm/tools/llvm-objcopy/CMakeLists.txt
index 1c73a1781e801..ae66fff43db71 100644
--- a/llvm/tools/llvm-objcopy/CMakeLists.txt
+++ b/llvm/tools/llvm-objcopy/CMakeLists.txt
@@ -24,6 +24,10 @@ set(LLVM_TARGET_DEFINITIONS StripOpts.td)
tablegen(LLVM StripOpts.inc -gen-opt-parser-defs)
add_public_tablegen_target(StripOptsTableGen)
+set(LLVM_TARGET_DEFINITIONS ExtractBundleEntryOpts.td)
+tablegen(LLVM ExtractBundleEntryOpts.inc -gen-opt-parser-defs)
+add_public_tablegen_target(ExtractBundleEntryOptsTableGen)
+
add_llvm_tool(llvm-objcopy
ObjcopyOptions.cpp
llvm-objcopy.cpp
@@ -37,10 +41,12 @@ add_llvm_tool(llvm-objcopy
add_llvm_tool_symlink(llvm-install-name-tool llvm-objcopy)
add_llvm_tool_symlink(llvm-bitcode-strip llvm-objcopy)
add_llvm_tool_symlink(llvm-strip llvm-objcopy)
+add_llvm_tool_symlink(llvm-extract-bundle-entry llvm-objcopy)
if(LLVM_INSTALL_BINUTILS_SYMLINKS)
add_llvm_tool_symlink(objcopy llvm-objcopy)
add_llvm_tool_symlink(strip llvm-objcopy)
+ add_llvm_tool_symlink(extract-bundle-entry llvm-objcopy)
endif()
if(LLVM_INSTALL_CCTOOLS_SYMLINKS)
diff --git a/llvm/tools/llvm-objcopy/ExtractBundleEntryOpts.td b/llvm/tools/llvm-objcopy/ExtractBundleEntryOpts.td
new file mode 100644
index 0000000000000..8330c1ddaf784
--- /dev/null
+++ b/llvm/tools/llvm-objcopy/ExtractBundleEntryOpts.td
@@ -0,0 +1,31 @@
+//===-- ExtractBundleEntryOpts.td - llvm-bitcode-strip options ---------------*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+//
+// This file describes the command line options of llvm-extract-offload-entry.
+//
+//===----------------------------------------------------------------------===//
+
+include "llvm/Option/OptParser.td"
+
+def help : Flag<["--"], "Help">,
+ HelpText<"URIs can be read from STDIN, one per line.\n"
+ "From the URIs specified, extracts code objects into files named:\n"
+ "\t<executable_name>-[pid<number>]-offset<number>-size<number>.co\n\n"
+ "URI syntax:\n"
+ "\tcode_object_uri ::== file_uri | memory_uri\n"
+ "\tfile_uri ::== \"file://\" extract_file [ range_specifier ] \n"
+ "\tmemory_uri ::== \"memory://\" process_id range_specifier\n"
+ "\trange_specifier ::== range_delimiter range_attribute [\"&\" range_attribute]\n"
+ "\trange_delimiter ::== \"#\" | \"?\"\n"
+ "\trange_attribute ::== [\"offset=\" number | \"size=\" number ]\n"
+ "\textract_file ::== URI_ENCODED_OS_FILE_PATH\n"
+ "\tprocess_id ::== DECIMAL_NUMBER\n"
+ "\tnumber ::== HEX_NUMBER | DECIMAL_NUMBER | OCTAL_NUMBER\n"
+ "\nExample: file://dir1/dir2/hello_world#offset=133&size=14472 \n"
+ " memory://1234#offset=0x20000&size=3000\n">;
+def h : Flag<["-"], "h">, Alias<help>;
diff --git a/llvm/tools/llvm-objcopy/ObjcopyOptions.cpp b/llvm/tools/llvm-objcopy/ObjcopyOptions.cpp
index 8aa843b6a5155..cc49178447fb5 100644
--- a/llvm/tools/llvm-objcopy/ObjcopyOptions.cpp
+++ b/llvm/tools/llvm-objcopy/ObjcopyOptions.cpp
@@ -16,6 +16,7 @@
#include "llvm/ObjCopy/ConfigManager.h"
#include "llvm/ObjCopy/MachO/MachOConfig.h"
#include "llvm/Object/Binary.h"
+#include "llvm/Object/OffloadBundle.h"
#include "llvm/Option/Arg.h"
#include "llvm/Option/ArgList.h"
#include "llvm/Support/CRC.h"
@@ -164,6 +165,41 @@ class StripOptTable : public opt::GenericOptTable {
}
};
+enum ExtractBundleEntryID {
+ EXTRACT_BUNDLE_ENTRY_INVALID = 0, // This is not an option ID.
+#define OPTION(...) \
+ LLVM_MAKE_OPT_ID_WITH_ID_PREFIX(EXTRACT_BUNDLE_ENTRY_, __VA_ARGS__),
+#include "ExtractBundleEntryOpts.inc"
+#undef OPTION
+};
+
+namespace extract_bundle_entry {
+#define OPTTABLE_STR_TABLE_CODE
+#include "ExtractBundleEntryOpts.inc"
+#undef OPTTABLE_STR_TABLE_CODE
+
+#define OPTTABLE_PREFIXES_TABLE_CODE
+#include "ExtractBundleEntryOpts.inc"
+#undef OPTTABLE_PREFIXES_TABLE_CODE
+
+static constexpr opt::OptTable::Info ExtractBundleEntryInfoTable[] = {
+#define OPTION(...) \
+ LLVM_CONSTRUCT_OPT_INFO_WITH_ID_PREFIX(EXTRACT_BUNDLE_ENTRY_, __VA_ARGS__),
+#include "ExtractBundleEntryOpts.inc"
+#undef OPTION
+};
+} // namespace extract_bundle_entry
+
+class ExtractBundleEntryOptTable : public opt::GenericOptTable {
+public:
+ ExtractBundleEntryOptTable()
+ : GenericOptTable(extract_bundle_entry::OptionStrTable,
+ extract_bundle_entry::OptionPrefixesTable,
+ extract_bundle_entry::ExtractBundleEntryInfoTable) {
+ setGroupedShortOptions(true);
+ }
+};
+
} // namespace
static SectionFlag parseSectionRenameFlag(StringRef SectionName) {
@@ -418,7 +454,13 @@ template <class T> static ErrorOr<T> getAsInteger(StringRef Val) {
namespace {
-enum class ToolType { Objcopy, Strip, InstallNameTool, BitcodeStrip };
+enum class ToolType {
+ Objcopy,
+ Strip,
+ InstallNameTool,
+ BitcodeStrip,
+ ExtractBundleEntry
+};
} // anonymous namespace
@@ -442,6 +484,10 @@ static void printHelp(const opt::OptTable &OptTable, raw_ostream &OS,
ToolName = "llvm-bitcode-strip";
HelpText = " [options] input";
break;
+ case ToolType::ExtractBundleEntry:
+ ToolName = "llvm-extract-bundle-entry";
+ HelpText = " URI";
+ break;
}
OptTable.printHelp(OS, (ToolName + HelpText).str().c_str(),
(ToolName + " tool").str().c_str());
@@ -1670,3 +1716,41 @@ objcopy::parseStripOptions(ArrayRef<const char *> RawArgsArr,
return std::move(DC);
}
+
+Expected<DriverConfig> objcopy::parseExtractBundleEntryOptions(
+ ArrayRef<const char *> ArgsArr, function_ref<Error(Error)> ErrorCallback) {
+
+ DriverConfig DC;
+
+ ExtractBundleEntryOptTable T;
+ unsigned MissingArgumentIndex, MissingArgumentCount;
+ opt::InputArgList InputArgs =
+ T.ParseArgs(ArgsArr, MissingArgumentIndex, MissingArgumentCount);
+
+ if (InputArgs.size() == 0) {
+ printHelp(T, errs(), ToolType::ExtractBundleEntry);
+ exit(1);
+ }
+
+ if (InputArgs.hasArg(EXTRACT_BUNDLE_ENTRY_help)) {
+ printHelp(T, outs(), ToolType::ExtractBundleEntry);
+ exit(0);
+ }
+
+ for (auto *Arg : InputArgs.filtered(EXTRACT_BUNDLE_ENTRY_UNKNOWN))
+ return createStringError(errc::invalid_argument, "unknown argument '%s'",
+ Arg->getAsString(InputArgs).c_str());
+
+ SmallVector<StringRef, 256> Positional;
+
+ for (auto *Arg : InputArgs.filtered(EXTRACT_BUNDLE_ENTRY_INPUT))
+ Positional.push_back(Arg->getValue());
+ assert(!Positional.empty());
+
+ // iterate over all input arguments
+ for (auto input : Positional)
+ if (Error Err = object::extractOffloadBundleByURI(input))
+ return std::move(Err);
+
+ return std::move(DC);
+}
diff --git a/llvm/tools/llvm-objcopy/ObjcopyOptions.h b/llvm/tools/llvm-objcopy/ObjcopyOptions.h
index 3b8878981da47..5665881c82734 100644
--- a/llvm/tools/llvm-objcopy/ObjcopyOptions.h
+++ b/llvm/tools/llvm-objcopy/ObjcopyOptions.h
@@ -51,6 +51,16 @@ parseBitcodeStripOptions(ArrayRef<const char *> ArgsArr,
Expected<DriverConfig>
parseStripOptions(ArrayRef<const char *> ArgsArr,
llvm::function_ref<Error(Error)> ErrorCallback);
+
+// ParseExtractBundleEntryOptions returns the config and sets the input
+// arguments. If a help flag is set then ParseExtractBundleEntryOptions will
+// print the help messege and exit. ErrorCallback is used to handle recoverable
+// errors. An Error returned by the callback aborts the parsing and is then
+// returned by this function.
+Expected<DriverConfig>
+parseExtractBundleEntryOptions(ArrayRef<const char *> ArgsArr,
+ llvm::function_ref<Error(Error)> ErrorCallback);
+
} // namespace objcopy
} // namespace llvm
diff --git a/llvm/tools/llvm-objcopy/llvm-objcopy.cpp b/llvm/tools/llvm-objcopy/llvm-objcopy.cpp
index ad67b673b2cc7..484cf9d329716 100644
--- a/llvm/tools/llvm-objcopy/llvm-objcopy.cpp
+++ b/llvm/tools/llvm-objcopy/llvm-objcopy.cpp
@@ -77,6 +77,8 @@ static Expected<DriverConfig> getDriverConfig(ArrayRef<const char *> Args) {
return parseStripOptions(Args, reportWarning);
else if (Is("install-name-tool") || Is("install_name_tool"))
return parseInstallNameToolOptions(Args);
+ else if (Is("llvm-extract-bundle-entry"))
+ return parseExtractBundleEntryOptions(Args, reportWarning);
else
return parseObjcopyOptions(Args, reportWarning);
}
>From be7435dae26aed9c404949c5f56c6e539eb115e2 Mon Sep 17 00:00:00 2001
From: david-salinas <dsalinas at amd.com>
Date: Thu, 18 Dec 2025 16:32:34 +0000
Subject: [PATCH 2/6] Address PR comments.
---
llvm/lib/Object/OffloadBundle.cpp | 7 +++----
llvm/tools/llvm-objcopy/CMakeLists.txt | 1 -
llvm/tools/llvm-objcopy/ObjcopyOptions.cpp | 8 +++-----
3 files changed, 6 insertions(+), 10 deletions(-)
diff --git a/llvm/lib/Object/OffloadBundle.cpp b/llvm/lib/Object/OffloadBundle.cpp
index f16d694716ed0..6a1a67c43f571 100644
--- a/llvm/lib/Object/OffloadBundle.cpp
+++ b/llvm/lib/Object/OffloadBundle.cpp
@@ -222,8 +222,8 @@ Error object::extractCodeObject(const ObjectFile &Source, size_t Offset,
Expected<std::unique_ptr<FileOutputBuffer>> BufferOrErr =
FileOutputBuffer::create(OutputFileName, Size);
- if (auto EC = BufferOrErr.takeError())
- return EC;
+ if (Error Err = BufferOrErr.takeError())
+ return Err;
Expected<MemoryBufferRef> InputBuffOrErr = Source.getMemoryBufferRef();
if (Error Err = InputBuffOrErr.takeError())
@@ -234,8 +234,7 @@ Error object::extractCodeObject(const ObjectFile &Source, size_t Offset,
return createStringError("size in URI is larger than source");
if (Offset > InputBuffOrErr->getBufferSize())
- return createStringError(inconvertibleErrorCode(),
- "offset in URI is beyond the size of the source");
+ return createStringError("offset in URI is beyond the size of the source");
if (Offset + Size > InputBuffOrErr->getBufferSize())
return createStringError(
diff --git a/llvm/tools/llvm-objcopy/CMakeLists.txt b/llvm/tools/llvm-objcopy/CMakeLists.txt
index ae66fff43db71..10897769d2826 100644
--- a/llvm/tools/llvm-objcopy/CMakeLists.txt
+++ b/llvm/tools/llvm-objcopy/CMakeLists.txt
@@ -46,7 +46,6 @@ add_llvm_tool_symlink(llvm-extract-bundle-entry llvm-objcopy)
if(LLVM_INSTALL_BINUTILS_SYMLINKS)
add_llvm_tool_symlink(objcopy llvm-objcopy)
add_llvm_tool_symlink(strip llvm-objcopy)
- add_llvm_tool_symlink(extract-bundle-entry llvm-objcopy)
endif()
if(LLVM_INSTALL_CCTOOLS_SYMLINKS)
diff --git a/llvm/tools/llvm-objcopy/ObjcopyOptions.cpp b/llvm/tools/llvm-objcopy/ObjcopyOptions.cpp
index cc49178447fb5..ee8abffcd7fa1 100644
--- a/llvm/tools/llvm-objcopy/ObjcopyOptions.cpp
+++ b/llvm/tools/llvm-objcopy/ObjcopyOptions.cpp
@@ -1719,9 +1719,7 @@ objcopy::parseStripOptions(ArrayRef<const char *> RawArgsArr,
Expected<DriverConfig> objcopy::parseExtractBundleEntryOptions(
ArrayRef<const char *> ArgsArr, function_ref<Error(Error)> ErrorCallback) {
-
DriverConfig DC;
-
ExtractBundleEntryOptTable T;
unsigned MissingArgumentIndex, MissingArgumentCount;
opt::InputArgList InputArgs =
@@ -1747,9 +1745,9 @@ Expected<DriverConfig> objcopy::parseExtractBundleEntryOptions(
Positional.push_back(Arg->getValue());
assert(!Positional.empty());
- // iterate over all input arguments
- for (auto input : Positional)
- if (Error Err = object::extractOffloadBundleByURI(input))
+ // Iterate over all input arguments.
+ for (StringRef Input : Positional)
+ if (Error Err = object::extractOffloadBundleByURI(Input))
return std::move(Err);
return std::move(DC);
>From 3f65a3a53a55a3ed72bb302a8aec2661df377cbc Mon Sep 17 00:00:00 2001
From: david-salinas <dsalinas at amd.com>
Date: Mon, 26 Jan 2026 22:03:28 +0000
Subject: [PATCH 3/6] Address more PR comments
---
llvm/lib/Object/OffloadBundle.cpp | 12 +--
.../llvm-objcopy/extract-bundle-entry.test | 85 ++++++++++++-------
.../test/tools/llvm-objcopy/tool-version.test | 3 +
.../llvm-objcopy/ExtractBundleEntryOpts.td | 7 ++
llvm/tools/llvm-objcopy/ObjcopyOptions.cpp | 6 ++
llvm/tools/llvm-objcopy/llvm-objcopy.cpp | 10 +--
6 files changed, 81 insertions(+), 42 deletions(-)
diff --git a/llvm/lib/Object/OffloadBundle.cpp b/llvm/lib/Object/OffloadBundle.cpp
index 6a1a67c43f571..cee0ef2a672ff 100644
--- a/llvm/lib/Object/OffloadBundle.cpp
+++ b/llvm/lib/Object/OffloadBundle.cpp
@@ -228,18 +228,20 @@ Error object::extractCodeObject(const ObjectFile &Source, size_t Offset,
Expected<MemoryBufferRef> InputBuffOrErr = Source.getMemoryBufferRef();
if (Error Err = InputBuffOrErr.takeError())
return createFileError(OutputFileName, std::move(Err));
- ;
if (Size > InputBuffOrErr->getBufferSize())
- return createStringError("size in URI is larger than source");
+ // SALINAS return createStringError("size in URI is larger than source");
+ return createStringError("size in URI(%llu) is larger than source (%llu)",Size, InputBuffOrErr->getBufferSize());
if (Offset > InputBuffOrErr->getBufferSize())
- return createStringError("offset in URI is beyond the size of the source");
+ // SALINAS return createStringError("offset in URI is beyond the size of the source");
+ return createStringError("offset in URI (%llu) is beyond the size of the source (%llu)", Offset, InputBuffOrErr->getBufferSize());
if (Offset + Size > InputBuffOrErr->getBufferSize())
- return createStringError(
+/* SALINAS return createStringError(
inconvertibleErrorCode(),
- "offset + size in URI is beyond the size of the source");
+ "offset + size in URI is beyond the size of the source"); */
+ return createStringError("offset + size (%llu) in URI is beyond the size of the source (%llu)", Offset + Size, InputBuffOrErr->getBufferSize());
std::unique_ptr<FileOutputBuffer> Buf = std::move(*BufferOrErr);
std::copy(InputBuffOrErr->getBufferStart() + Offset,
diff --git a/llvm/test/tools/llvm-objcopy/extract-bundle-entry.test b/llvm/test/tools/llvm-objcopy/extract-bundle-entry.test
index 25aa6f1e9271b..85cbbd8c10fd8 100644
--- a/llvm/test/tools/llvm-objcopy/extract-bundle-entry.test
+++ b/llvm/test/tools/llvm-objcopy/extract-bundle-entry.test
@@ -1,44 +1,66 @@
-## Test llvm-extract-bundle-entry
-# REQUIRES: target={{x86_64-.*-linux.*}}
-# REQUIRES: amdgpu-registered-target
+## Test llvm-extract-bundle-entry.
# RUN: yaml2obj %s -o %t.elf
# RUN: llvm-extract-bundle-entry file://%t.elf#offset=8192\&size=4048
-# RUN: llvm-objdump -d %t.elf-offset8192-size4048.co | FileCheck %s
+# RUN: llvm-objdump -d %t.elf-offset8192-size4048.co | FileCheck %s --check-prefix=EXTRACT_BUNDLE_ENTRY
+# EXTRACT_BUNDLE_ENTRY: s_load_dword s7, s[4:5], 0x24 // 000000001900: C00201C2 00000024
+# EXTRACT_BUNDLE_ENTRY-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 // 000000001908: C00A0002 00000000
+# EXTRACT_BUNDLE_ENTRY-NEXT: v_mov_b32_e32 v1, 0 // 000000001910: 7E020280
+# EXTRACT_BUNDLE_ENTRY-NEXT: s_waitcnt lgkmcnt(0) // 000000001914: BF8CC07F
+# EXTRACT_BUNDLE_ENTRY-NEXT: s_and_b32 s4, s7, 0xffff // 000000001918: 8604FF07 0000FFFF
+# EXTRACT_BUNDLE_ENTRY-NEXT: s_mul_i32 s6, s6, s4 // 000000001920: 92060406
+# EXTRACT_BUNDLE_ENTRY-NEXT: v_add_u32_e32 v0, s6, v0 // 000000001924: 68000006
+# EXTRACT_BUNDLE_ENTRY-NEXT: v_lshlrev_b64 v[0:1], 2, v[0:1] // 000000001928: D28F0000 00020082
+# EXTRACT_BUNDLE_ENTRY-NEXT: v_mov_b32_e32 v3, s3 // 000000001930: 7E060203
+# EXTRACT_BUNDLE_ENTRY-NEXT: v_add_co_u32_e32 v2, vcc, s2, v0 // 000000001934: 32040002
+# EXTRACT_BUNDLE_ENTRY-NEXT: v_addc_co_u32_e32 v3, vcc, v3, v1, vcc // 000000001938: 38060303
+# EXTRACT_BUNDLE_ENTRY-NEXT: global_load_dword v2, v[2:3], off // 00000000193C: DC508000 027F0002
+# EXTRACT_BUNDLE_ENTRY-NEXT: v_mov_b32_e32 v3, s1 // 000000001944: 7E060201
+# EXTRACT_BUNDLE_ENTRY-NEXT: v_add_co_u32_e32 v0, vcc, s0, v0 // 000000001948: 32000000
+# EXTRACT_BUNDLE_ENTRY-NEXT: v_addc_co_u32_e32 v1, vcc, v3, v1, vcc // 00000000194C: 38020303
+# EXTRACT_BUNDLE_ENTRY-NEXT: global_load_dword v3, v[0:1], off // 000000001950: DC508000 037F0000
+# EXTRACT_BUNDLE_ENTRY-NEXT: s_waitcnt vmcnt(0) // 000000001958: BF8C0F70
+# EXTRACT_BUNDLE_ENTRY-NEXT: v_add_u32_e32 v2, v3, v2 // 00000000195C: 68040503
+# EXTRACT_BUNDLE_ENTRY-NEXT: global_store_dword v[0:1], v2, off // 000000001960: DC708000 007F0200
+# EXTRACT_BUNDLE_ENTRY-NEXT: s_endpgm // 000000001968: BF810000
+
+# RUN: llvm-extract-bundle-entry 2>&1 | \
+# RUN: FileCheck %s --check-prefix=EXTRACT_BUNDLE_ENTRY_HELP
+# EXTRACT_BUNDLE_ENTRY_HELP: OVERVIEW: llvm-extract-bundle-entry tool
+# EXTRACT_BUNDLE_ENTRY_HELP: USAGE: llvm-extract-bundle-entry URI
+# EXTRACT_BUNDLE_ENTRY_HELP: OPTIONS:
+# EXTRACT_BUNDLE_ENTRY_HELP-NEXT: --Help URIs can be read from STDIN, one per line.
+# EXTRACT_BUNDLE_ENTRY_HELP-NEXT: From the URIs specified, extracts code objects into files named:
+# EXTRACT_BUNDLE_ENTRY_HELP-NEXT: <executable_name>-[pid<number>]-offset<number>-size<number>.co
+# EXTRACT_BUNDLE_ENTRY_HELP: URI syntax:
+# EXTRACT_BUNDLE_ENTRY_HELP-NEXT: code_object_uri ::== file_uri | memory_uri
+# EXTRACT_BUNDLE_ENTRY_HELP-NEXT: file_uri ::== "file://" extract_file [ range_specifier ]
+# EXTRACT_BUNDLE_ENTRY_HELP-NEXT: memory_uri ::== "memory://" process_id range_specifier
+# EXTRACT_BUNDLE_ENTRY_HELP-NEXT: range_specifier ::== range_delimiter range_attribute ["&" range_attribute]
+# EXTRACT_BUNDLE_ENTRY_HELP-NEXT: range_delimiter ::== "#" | "?"
+# EXTRACT_BUNDLE_ENTRY_HELP-NEXT: range_attribute ::== ["offset=" number | "size=" number ]
+# EXTRACT_BUNDLE_ENTRY_HELP-NEXT: extract_file ::== URI_ENCODED_OS_FILE_PATH
+# EXTRACT_BUNDLE_ENTRY_HELP-NEXT: process_id ::== DECIMAL_NUMBER
+# EXTRACT_BUNDLE_ENTRY_HELP-NEXT: number ::== HEX_NUMBER | DECIMAL_NUMBER | OCTAL_NUMBER
+# EXTRACT_BUNDLE_ENTRY_HELP: Example: file://dir1/dir2/hello_world#offset=133&size=14472
+# EXTRACT_BUNDLE_ENTRY_HELP-NEXT: memory://1234#offset=0x20000&size=3000
+# EXTRACT_BUNDLE_ENTRY_HELP: Pass @FILE as argument to read options from FILE.
# RUN: not llvm-extract-bundle-entry file://%t.elf#offset=8192\&size=4048000 2>&1 | \
-# RUN: FileCheck %s --check-prefix=ERR1
+# RUN: FileCheck %s --check-prefix=EXTRACT_BUNDLE_ENTRY_ERROR1
+# EXTRACT_BUNDLE_ENTRY_ERROR1: size in URI(4048000) is larger than source (12640)
# RUN: not llvm-extract-bundle-entry file://%t.elf#offset=819200000\&size=4048 2>&1 | \
-# RUN: FileCheck %s --check-prefix=ERR2
+# RUN: FileCheck %s --check-prefix=EXTRACT_BUNDLE_ENTRY_ERROR2
+# EXTRACT_BUNDLE_ENTRY_ERROR2: offset in URI (819200000) is beyond the size of the source (12640)
# RUN: not llvm-extract-bundle-entry file://%t.elf#offset=8192\&size=8048 2>&1 | \
-# RUN: FileCheck %s --check-prefix=ERR3
-
-# CHECK: s_load_dword s7, s[4:5], 0x24 // 000000001900: C00201C2 00000024
-# CHECK-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 // 000000001908: C00A0002 00000000
-# CHECK-NEXT: v_mov_b32_e32 v1, 0 // 000000001910: 7E020280
-# CHECK-NEXT: s_waitcnt lgkmcnt(0) // 000000001914: BF8CC07F
-# CHECK-NEXT: s_and_b32 s4, s7, 0xffff // 000000001918: 8604FF07 0000FFFF
-# CHECK-NEXT: s_mul_i32 s6, s6, s4 // 000000001920: 92060406
-# CHECK-NEXT: v_add_u32_e32 v0, s6, v0 // 000000001924: 68000006
-# CHECK-NEXT: v_lshlrev_b64 v[0:1], 2, v[0:1] // 000000001928: D28F0000 00020082
-# CHECK-NEXT: v_mov_b32_e32 v3, s3 // 000000001930: 7E060203
-# CHECK-NEXT: v_add_co_u32_e32 v2, vcc, s2, v0 // 000000001934: 32040002
-# CHECK-NEXT: v_addc_co_u32_e32 v3, vcc, v3, v1, vcc // 000000001938: 38060303
-# CHECK-NEXT: global_load_dword v2, v[2:3], off // 00000000193C: DC508000 027F0002
-# CHECK-NEXT: v_mov_b32_e32 v3, s1 // 000000001944: 7E060201
-# CHECK-NEXT: v_add_co_u32_e32 v0, vcc, s0, v0 // 000000001948: 32000000
-# CHECK-NEXT: v_addc_co_u32_e32 v1, vcc, v3, v1, vcc // 00000000194C: 38020303
-# CHECK-NEXT: global_load_dword v3, v[0:1], off // 000000001950: DC508000 037F0000
-# CHECK-NEXT: s_waitcnt vmcnt(0) // 000000001958: BF8C0F70
-# CHECK-NEXT: v_add_u32_e32 v2, v3, v2 // 00000000195C: 68040503
-# CHECK-NEXT: global_store_dword v[0:1], v2, off // 000000001960: DC708000 007F0200
-# CHECK-NEXT: s_endpgm // 000000001968: BF810000
+# RUN: FileCheck %s --check-prefix=EXTRACT_BUNDLE_ENTRY_ERROR3
+# EXTRACT_BUNDLE_ENTRY_ERROR3: offset + size (16240) in URI is beyond the size of the source (12640)
-# ERR1: size in URI is larger than source
-# ERR2: offset in URI is beyond the size of the source
-# ERR3: offset + size in URI is beyond the size of the source
+# RUN: not llvm-extract-bundle-entry --error 2>&1 | \
+# RUN: FileCheck %s --check-prefix=EXTRACT_BUNDLE_ENTRY_ERROR4
+# EXTRACT_BUNDLE_ENTRY_ERROR4: unknown argument '--error'
--- !ELF
FileHeader:
@@ -71,4 +93,3 @@ Sections:
AddressAlign: 0x8
Content: '465049480100000000102000000000000000000000000000'
...
-
diff --git a/llvm/test/tools/llvm-objcopy/tool-version.test b/llvm/test/tools/llvm-objcopy/tool-version.test
index e2fb551ad7951..eff98f4191c76 100644
--- a/llvm/test/tools/llvm-objcopy/tool-version.test
+++ b/llvm/test/tools/llvm-objcopy/tool-version.test
@@ -10,6 +10,9 @@
# RUN: llvm-bitcode-strip --version | FileCheck %s
# RUN: llvm-bitcode-strip -V | FileCheck %s
+# RUN: llvm-extract-bundle-entry --version | FileCheck %s
+# RUN: llvm-extract-bundle-entry -V | FileCheck %s
+#
# OBJCOPY-DAG: {{ version }}
# OBJCOPY-DAG: GNU objcopy
diff --git a/llvm/tools/llvm-objcopy/ExtractBundleEntryOpts.td b/llvm/tools/llvm-objcopy/ExtractBundleEntryOpts.td
index 8330c1ddaf784..5c75ca7be4991 100644
--- a/llvm/tools/llvm-objcopy/ExtractBundleEntryOpts.td
+++ b/llvm/tools/llvm-objcopy/ExtractBundleEntryOpts.td
@@ -29,3 +29,10 @@ def help : Flag<["--"], "Help">,
"\nExample: file://dir1/dir2/hello_world#offset=133&size=14472 \n"
" memory://1234#offset=0x20000&size=3000\n">;
def h : Flag<["-"], "h">, Alias<help>;
+
+def version : Flag<["--"], "version">,
+ HelpText<"Print the version and exit">;
+
+def V : Flag<["-"], "V">,
+ Alias<version>,
+ HelpText<"Alias for --version">;
diff --git a/llvm/tools/llvm-objcopy/ObjcopyOptions.cpp b/llvm/tools/llvm-objcopy/ObjcopyOptions.cpp
index ee8abffcd7fa1..8534628d741a6 100644
--- a/llvm/tools/llvm-objcopy/ObjcopyOptions.cpp
+++ b/llvm/tools/llvm-objcopy/ObjcopyOptions.cpp
@@ -1735,6 +1735,12 @@ Expected<DriverConfig> objcopy::parseExtractBundleEntryOptions(
exit(0);
}
+ if (InputArgs.hasArg(EXTRACT_BUNDLE_ENTRY_version)) {
+ outs() << "llvm-extract-bundle-entry, compatible with roc-obj-ls\n";
+ cl::PrintVersionMessage();
+ exit(0);
+ }
+
for (auto *Arg : InputArgs.filtered(EXTRACT_BUNDLE_ENTRY_UNKNOWN))
return createStringError(errc::invalid_argument, "unknown argument '%s'",
Arg->getAsString(InputArgs).c_str());
diff --git a/llvm/tools/llvm-objcopy/llvm-objcopy.cpp b/llvm/tools/llvm-objcopy/llvm-objcopy.cpp
index 484cf9d329716..e0d1ee39afaf8 100644
--- a/llvm/tools/llvm-objcopy/llvm-objcopy.cpp
+++ b/llvm/tools/llvm-objcopy/llvm-objcopy.cpp
@@ -73,14 +73,14 @@ static Expected<DriverConfig> getDriverConfig(ArrayRef<const char *> Args) {
if (Is("bitcode-strip") || Is("bitcode_strip"))
return parseBitcodeStripOptions(Args, reportWarning);
- else if (Is("strip"))
+ if (Is("strip"))
return parseStripOptions(Args, reportWarning);
- else if (Is("install-name-tool") || Is("install_name_tool"))
+ if (Is("install-name-tool") || Is("install_name_tool"))
return parseInstallNameToolOptions(Args);
- else if (Is("llvm-extract-bundle-entry"))
+ if (Is("llvm-extract-bundle-entry"))
return parseExtractBundleEntryOptions(Args, reportWarning);
- else
- return parseObjcopyOptions(Args, reportWarning);
+
+ return parseObjcopyOptions(Args, reportWarning);
}
/// The function executeObjcopyOnIHex does the dispatch based on the format
>From a341dc643d14f4b1070200b8c4f2f011aecd8640 Mon Sep 17 00:00:00 2001
From: david-salinas <dsalinas at amd.com>
Date: Tue, 27 Jan 2026 19:10:41 +0000
Subject: [PATCH 4/6] Fix failing LIT test
General clean up.
---
llvm/lib/Object/OffloadBundle.cpp | 16 ++++++++--------
.../tools/llvm-objcopy/extract-bundle-entry.test | 4 +++-
llvm/test/tools/llvm-objcopy/tool-version.test | 2 +-
llvm/tools/llvm-objcopy/llvm-objcopy.cpp | 3 ---
4 files changed, 12 insertions(+), 13 deletions(-)
diff --git a/llvm/lib/Object/OffloadBundle.cpp b/llvm/lib/Object/OffloadBundle.cpp
index d06190bf7a4e2..9257a8537b967 100644
--- a/llvm/lib/Object/OffloadBundle.cpp
+++ b/llvm/lib/Object/OffloadBundle.cpp
@@ -232,18 +232,18 @@ Error object::extractCodeObject(const ObjectFile &Source, size_t Offset,
return createFileError(OutputFileName, std::move(Err));
if (Size > InputBuffOrErr->getBufferSize())
- // SALINAS return createStringError("size in URI is larger than source");
- return createStringError("size in URI(%llu) is larger than source (%llu)",Size, InputBuffOrErr->getBufferSize());
+ return createStringError("size in URI(%llu) is larger than source (%llu)",
+ Size, InputBuffOrErr->getBufferSize());
if (Offset > InputBuffOrErr->getBufferSize())
- // SALINAS return createStringError("offset in URI is beyond the size of the source");
- return createStringError("offset in URI (%llu) is beyond the size of the source (%llu)", Offset, InputBuffOrErr->getBufferSize());
+ return createStringError(
+ "offset in URI (%llu) is beyond the size of the source (%llu)", Offset,
+ InputBuffOrErr->getBufferSize());
if (Offset + Size > InputBuffOrErr->getBufferSize())
-/* SALINAS return createStringError(
- inconvertibleErrorCode(),
- "offset + size in URI is beyond the size of the source"); */
- return createStringError("offset + size (%llu) in URI is beyond the size of the source (%llu)", Offset + Size, InputBuffOrErr->getBufferSize());
+ return createStringError(
+ "offset + size (%llu) in URI is beyond the size of the source (%llu)",
+ Offset + Size, InputBuffOrErr->getBufferSize());
std::unique_ptr<FileOutputBuffer> Buf = std::move(*BufferOrErr);
std::copy(InputBuffOrErr->getBufferStart() + Offset,
diff --git a/llvm/test/tools/llvm-objcopy/extract-bundle-entry.test b/llvm/test/tools/llvm-objcopy/extract-bundle-entry.test
index 85cbbd8c10fd8..d9f93aa0039ff 100644
--- a/llvm/test/tools/llvm-objcopy/extract-bundle-entry.test
+++ b/llvm/test/tools/llvm-objcopy/extract-bundle-entry.test
@@ -24,7 +24,9 @@
# EXTRACT_BUNDLE_ENTRY-NEXT: global_store_dword v[0:1], v2, off // 000000001960: DC708000 007F0200
# EXTRACT_BUNDLE_ENTRY-NEXT: s_endpgm // 000000001968: BF810000
-# RUN: llvm-extract-bundle-entry 2>&1 | \
+# RUN: llvm-extract-bundle-entry -help 2>&1 | \
+# RUN: FileCheck %s --check-prefix=EXTRACT_BUNDLE_ENTRY_HELP
+# RUN: not llvm-extract-bundle-entry 2>&1 | \
# RUN: FileCheck %s --check-prefix=EXTRACT_BUNDLE_ENTRY_HELP
# EXTRACT_BUNDLE_ENTRY_HELP: OVERVIEW: llvm-extract-bundle-entry tool
# EXTRACT_BUNDLE_ENTRY_HELP: USAGE: llvm-extract-bundle-entry URI
diff --git a/llvm/test/tools/llvm-objcopy/tool-version.test b/llvm/test/tools/llvm-objcopy/tool-version.test
index eff98f4191c76..8dcea29236843 100644
--- a/llvm/test/tools/llvm-objcopy/tool-version.test
+++ b/llvm/test/tools/llvm-objcopy/tool-version.test
@@ -12,7 +12,7 @@
# RUN: llvm-extract-bundle-entry --version | FileCheck %s
# RUN: llvm-extract-bundle-entry -V | FileCheck %s
-#
+
# OBJCOPY-DAG: {{ version }}
# OBJCOPY-DAG: GNU objcopy
diff --git a/llvm/tools/llvm-objcopy/llvm-objcopy.cpp b/llvm/tools/llvm-objcopy/llvm-objcopy.cpp
index 3f368a4d6eeed..e0d1ee39afaf8 100644
--- a/llvm/tools/llvm-objcopy/llvm-objcopy.cpp
+++ b/llvm/tools/llvm-objcopy/llvm-objcopy.cpp
@@ -73,13 +73,10 @@ static Expected<DriverConfig> getDriverConfig(ArrayRef<const char *> Args) {
if (Is("bitcode-strip") || Is("bitcode_strip"))
return parseBitcodeStripOptions(Args, reportWarning);
-
if (Is("strip"))
return parseStripOptions(Args, reportWarning);
-
if (Is("install-name-tool") || Is("install_name_tool"))
return parseInstallNameToolOptions(Args);
-
if (Is("llvm-extract-bundle-entry"))
return parseExtractBundleEntryOptions(Args, reportWarning);
>From 2d82752039e297d63997b3df59936b2b8cd1426b Mon Sep 17 00:00:00 2001
From: dsalinas_amdeng <david.salinas at amd.com>
Date: Mon, 9 Mar 2026 20:34:49 +0000
Subject: [PATCH 5/6] Address PR comments
---
.../llvm-extract-bundle-entry.rst | 67 +++++++++++++++
llvm/lib/Object/OffloadBundle.cpp | 7 +-
.../llvm-objcopy/extract-bundle-entry.test | 81 +++++++------------
.../tools/llvm-objcopy/tool-help-message.test | 11 +++
.../llvm-objcopy/ExtractBundleEntryOpts.td | 2 +-
llvm/tools/llvm-objcopy/ObjcopyOptions.cpp | 6 +-
llvm/tools/llvm-objcopy/ObjcopyOptions.h | 6 +-
llvm/tools/llvm-objcopy/llvm-objcopy.cpp | 2 +-
8 files changed, 120 insertions(+), 62 deletions(-)
create mode 100644 llvm/docs/CommandGuide/llvm-extract-bundle-entry.rst
diff --git a/llvm/docs/CommandGuide/llvm-extract-bundle-entry.rst b/llvm/docs/CommandGuide/llvm-extract-bundle-entry.rst
new file mode 100644
index 0000000000000..c1e321b21e7d3
--- /dev/null
+++ b/llvm/docs/CommandGuide/llvm-extract-bundle-entry.rst
@@ -0,0 +1,67 @@
+llvm-extract-bundle-entry - object stripping tool
+==================================
+
+.. program:: llvm-extract-bundle-entry
+
+SYNOPSIS
+--------
+
+:program:`llvm-extract-bundle-entry` [*options*] *URI*
+
+DESCRIPTION
+-----------
+
+:program: The `llvm-extract-offload-entry` command takes a URI argument, and generates a code
+object file based on the details of the URI given, such as <executable_name>-[pid<number>]-offset<number>-size<number>.co.
+
+The URI syntax is defined as:
+
+code_object_uri ::== file_uri | memory_uri
+file_uri ::== file:// extract_file [ range_specifier ]
+memory_uri ::== memory:// process_id range_specifier
+range_specifier ::== [ # | ? ] offset= number & size= number
+extract_file ::== URI_ENCODED_OS_FILE_PATH
+process_id ::== DECIMAL_NUMBER
+number ::== HEX_NUMBER | DECIMAL_NUMBER | OCTAL_NUMBER
+
+The `llvm-extract-offload-entry` command reads its input from standard input if the URI is omitted
+or if the URI argument is -.
+
+The output is always written to a file, whose name is generated from the URI input given,
+unless the -o option is specified.
+
+
+OPTIONS
+----------------------------------
+
+The following options are either agnostic of the file format, or apply to
+multiple file formats.
+
+.. option:: --help, -h
+
+ Print a summary of command line options.
+
+.. option:: -o <file>
+
+ Write output to <file>. Multiple input files cannot be used in combination
+ with -o.
+
+.. option:: --version, -V
+
+ Display the version of the :program:`llvm-extract-bundle-entry` executable.
+
+EXIT STATUS
+-----------
+
+:program:`llvm-extract-bundle-entry` exits with a non-zero exit code if there is an error.
+Otherwise, it exits with code 0.
+
+BUGS
+----
+
+To report bugs, please visit <https://github.com/llvm/llvm-project/labels/tools:llvm-objcopy%2Fextract-offload-entry>.
+
+SEE ALSO
+--------
+
+:manpage:`llvm-objcopy(1)`
diff --git a/llvm/lib/Object/OffloadBundle.cpp b/llvm/lib/Object/OffloadBundle.cpp
index 9257a8537b967..439d97f293c71 100644
--- a/llvm/lib/Object/OffloadBundle.cpp
+++ b/llvm/lib/Object/OffloadBundle.cpp
@@ -224,15 +224,16 @@ Error object::extractCodeObject(const ObjectFile &Source, size_t Offset,
Expected<std::unique_ptr<FileOutputBuffer>> BufferOrErr =
FileOutputBuffer::create(OutputFileName, Size);
- if (Error Err = BufferOrErr.takeError())
- return Err;
+ if (!BufferOrErr)
+ return BufferOrErr.takeError();
+ ;
Expected<MemoryBufferRef> InputBuffOrErr = Source.getMemoryBufferRef();
if (Error Err = InputBuffOrErr.takeError())
return createFileError(OutputFileName, std::move(Err));
if (Size > InputBuffOrErr->getBufferSize())
- return createStringError("size in URI(%llu) is larger than source (%llu)",
+ return createStringError("size in URI (%llu) is larger than source (%llu)",
Size, InputBuffOrErr->getBufferSize());
if (Offset > InputBuffOrErr->getBufferSize())
diff --git a/llvm/test/tools/llvm-objcopy/extract-bundle-entry.test b/llvm/test/tools/llvm-objcopy/extract-bundle-entry.test
index d9f93aa0039ff..05d10fcbe27b6 100644
--- a/llvm/test/tools/llvm-objcopy/extract-bundle-entry.test
+++ b/llvm/test/tools/llvm-objcopy/extract-bundle-entry.test
@@ -2,67 +2,44 @@
# RUN: yaml2obj %s -o %t.elf
# RUN: llvm-extract-bundle-entry file://%t.elf#offset=8192\&size=4048
-# RUN: llvm-objdump -d %t.elf-offset8192-size4048.co | FileCheck %s --check-prefix=EXTRACT_BUNDLE_ENTRY
-# EXTRACT_BUNDLE_ENTRY: s_load_dword s7, s[4:5], 0x24 // 000000001900: C00201C2 00000024
-# EXTRACT_BUNDLE_ENTRY-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 // 000000001908: C00A0002 00000000
-# EXTRACT_BUNDLE_ENTRY-NEXT: v_mov_b32_e32 v1, 0 // 000000001910: 7E020280
-# EXTRACT_BUNDLE_ENTRY-NEXT: s_waitcnt lgkmcnt(0) // 000000001914: BF8CC07F
-# EXTRACT_BUNDLE_ENTRY-NEXT: s_and_b32 s4, s7, 0xffff // 000000001918: 8604FF07 0000FFFF
-# EXTRACT_BUNDLE_ENTRY-NEXT: s_mul_i32 s6, s6, s4 // 000000001920: 92060406
-# EXTRACT_BUNDLE_ENTRY-NEXT: v_add_u32_e32 v0, s6, v0 // 000000001924: 68000006
-# EXTRACT_BUNDLE_ENTRY-NEXT: v_lshlrev_b64 v[0:1], 2, v[0:1] // 000000001928: D28F0000 00020082
-# EXTRACT_BUNDLE_ENTRY-NEXT: v_mov_b32_e32 v3, s3 // 000000001930: 7E060203
-# EXTRACT_BUNDLE_ENTRY-NEXT: v_add_co_u32_e32 v2, vcc, s2, v0 // 000000001934: 32040002
-# EXTRACT_BUNDLE_ENTRY-NEXT: v_addc_co_u32_e32 v3, vcc, v3, v1, vcc // 000000001938: 38060303
-# EXTRACT_BUNDLE_ENTRY-NEXT: global_load_dword v2, v[2:3], off // 00000000193C: DC508000 027F0002
-# EXTRACT_BUNDLE_ENTRY-NEXT: v_mov_b32_e32 v3, s1 // 000000001944: 7E060201
-# EXTRACT_BUNDLE_ENTRY-NEXT: v_add_co_u32_e32 v0, vcc, s0, v0 // 000000001948: 32000000
-# EXTRACT_BUNDLE_ENTRY-NEXT: v_addc_co_u32_e32 v1, vcc, v3, v1, vcc // 00000000194C: 38020303
-# EXTRACT_BUNDLE_ENTRY-NEXT: global_load_dword v3, v[0:1], off // 000000001950: DC508000 037F0000
-# EXTRACT_BUNDLE_ENTRY-NEXT: s_waitcnt vmcnt(0) // 000000001958: BF8C0F70
-# EXTRACT_BUNDLE_ENTRY-NEXT: v_add_u32_e32 v2, v3, v2 // 00000000195C: 68040503
-# EXTRACT_BUNDLE_ENTRY-NEXT: global_store_dword v[0:1], v2, off // 000000001960: DC708000 007F0200
-# EXTRACT_BUNDLE_ENTRY-NEXT: s_endpgm // 000000001968: BF810000
+# RUN: llvm-objdump -d %t.elf-offset8192-size4048.co | FileCheck %s --check-prefix=EXTRACT-BUNDLE-ENTRY
-# RUN: llvm-extract-bundle-entry -help 2>&1 | \
-# RUN: FileCheck %s --check-prefix=EXTRACT_BUNDLE_ENTRY_HELP
-# RUN: not llvm-extract-bundle-entry 2>&1 | \
-# RUN: FileCheck %s --check-prefix=EXTRACT_BUNDLE_ENTRY_HELP
-# EXTRACT_BUNDLE_ENTRY_HELP: OVERVIEW: llvm-extract-bundle-entry tool
-# EXTRACT_BUNDLE_ENTRY_HELP: USAGE: llvm-extract-bundle-entry URI
-# EXTRACT_BUNDLE_ENTRY_HELP: OPTIONS:
-# EXTRACT_BUNDLE_ENTRY_HELP-NEXT: --Help URIs can be read from STDIN, one per line.
-# EXTRACT_BUNDLE_ENTRY_HELP-NEXT: From the URIs specified, extracts code objects into files named:
-# EXTRACT_BUNDLE_ENTRY_HELP-NEXT: <executable_name>-[pid<number>]-offset<number>-size<number>.co
-# EXTRACT_BUNDLE_ENTRY_HELP: URI syntax:
-# EXTRACT_BUNDLE_ENTRY_HELP-NEXT: code_object_uri ::== file_uri | memory_uri
-# EXTRACT_BUNDLE_ENTRY_HELP-NEXT: file_uri ::== "file://" extract_file [ range_specifier ]
-# EXTRACT_BUNDLE_ENTRY_HELP-NEXT: memory_uri ::== "memory://" process_id range_specifier
-# EXTRACT_BUNDLE_ENTRY_HELP-NEXT: range_specifier ::== range_delimiter range_attribute ["&" range_attribute]
-# EXTRACT_BUNDLE_ENTRY_HELP-NEXT: range_delimiter ::== "#" | "?"
-# EXTRACT_BUNDLE_ENTRY_HELP-NEXT: range_attribute ::== ["offset=" number | "size=" number ]
-# EXTRACT_BUNDLE_ENTRY_HELP-NEXT: extract_file ::== URI_ENCODED_OS_FILE_PATH
-# EXTRACT_BUNDLE_ENTRY_HELP-NEXT: process_id ::== DECIMAL_NUMBER
-# EXTRACT_BUNDLE_ENTRY_HELP-NEXT: number ::== HEX_NUMBER | DECIMAL_NUMBER | OCTAL_NUMBER
-# EXTRACT_BUNDLE_ENTRY_HELP: Example: file://dir1/dir2/hello_world#offset=133&size=14472
-# EXTRACT_BUNDLE_ENTRY_HELP-NEXT: memory://1234#offset=0x20000&size=3000
-# EXTRACT_BUNDLE_ENTRY_HELP: Pass @FILE as argument to read options from FILE.
+# EXTRACT-BUNDLE-ENTRY: s_load_dword s7, s[4:5], 0x24 // 000000001900: C00201C2 00000024
+# EXTRACT-BUNDLE-ENTRY-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 // 000000001908: C00A0002 00000000
+# EXTRACT-BUNDLE-ENTRY-NEXT: v_mov_b32_e32 v1, 0 // 000000001910: 7E020280
+# EXTRACT-BUNDLE-ENTRY-NEXT: s_waitcnt lgkmcnt(0) // 000000001914: BF8CC07F
+# EXTRACT-BUNDLE-ENTRY-NEXT: s_and_b32 s4, s7, 0xffff // 000000001918: 8604FF07 0000FFFF
+# EXTRACT-BUNDLE-ENTRY-NEXT: s_mul_i32 s6, s6, s4 // 000000001920: 92060406
+# EXTRACT-BUNDLE-ENTRY-NEXT: v_add_u32_e32 v0, s6, v0 // 000000001924: 68000006
+# EXTRACT-BUNDLE-ENTRY-NEXT: v_lshlrev_b64 v[0:1], 2, v[0:1] // 000000001928: D28F0000 00020082
+# EXTRACT-BUNDLE-ENTRY-NEXT: v_mov_b32_e32 v3, s3 // 000000001930: 7E060203
+# EXTRACT-BUNDLE-ENTRY-NEXT: v_add_co_u32_e32 v2, vcc, s2, v0 // 000000001934: 32040002
+# EXTRACT-BUNDLE-ENTRY-NEXT: v_addc_co_u32_e32 v3, vcc, v3, v1, vcc // 000000001938: 38060303
+# EXTRACT-BUNDLE-ENTRY-NEXT: global_load_dword v2, v[2:3], off // 00000000193C: DC508000 027F0002
+# EXTRACT-BUNDLE-ENTRY-NEXT: v_mov_b32_e32 v3, s1 // 000000001944: 7E060201
+# EXTRACT-BUNDLE-ENTRY-NEXT: v_add_co_u32_e32 v0, vcc, s0, v0 // 000000001948: 32000000
+# EXTRACT-BUNDLE-ENTRY-NEXT: v_addc_co_u32_e32 v1, vcc, v3, v1, vcc // 00000000194C: 38020303
+# EXTRACT-BUNDLE-ENTRY-NEXT: global_load_dword v3, v[0:1], off // 000000001950: DC508000 037F0000
+# EXTRACT-BUNDLE-ENTRY-NEXT: s_waitcnt vmcnt(0) // 000000001958: BF8C0F70
+# EXTRACT-BUNDLE-ENTRY-NEXT: v_add_u32_e32 v2, v3, v2 // 00000000195C: 68040503
+# EXTRACT-BUNDLE-ENTRY-NEXT: global_store_dword v[0:1], v2, off // 000000001960: DC708000 007F0200
+# EXTRACT-BUNDLE-ENTRY-NEXT: s_endpgm // 000000001968: BF810000
# RUN: not llvm-extract-bundle-entry file://%t.elf#offset=8192\&size=4048000 2>&1 | \
-# RUN: FileCheck %s --check-prefix=EXTRACT_BUNDLE_ENTRY_ERROR1
-# EXTRACT_BUNDLE_ENTRY_ERROR1: size in URI(4048000) is larger than source (12640)
+# RUN: FileCheck %s --check-prefix=EXTRACT-BUNDLE-ENTRY-ERROR1
+# EXTRACT-BUNDLE-ENTRY-ERROR1: size in URI (4048000) is larger than source (12640)
# RUN: not llvm-extract-bundle-entry file://%t.elf#offset=819200000\&size=4048 2>&1 | \
-# RUN: FileCheck %s --check-prefix=EXTRACT_BUNDLE_ENTRY_ERROR2
-# EXTRACT_BUNDLE_ENTRY_ERROR2: offset in URI (819200000) is beyond the size of the source (12640)
+# RUN: FileCheck %s --check-prefix=EXTRACT-BUNDLE-ENTRY-ERROR2
+# EXTRACT-BUNDLE-ENTRY-ERROR2: offset in URI (819200000) is beyond the size of the source (12640)
# RUN: not llvm-extract-bundle-entry file://%t.elf#offset=8192\&size=8048 2>&1 | \
-# RUN: FileCheck %s --check-prefix=EXTRACT_BUNDLE_ENTRY_ERROR3
-# EXTRACT_BUNDLE_ENTRY_ERROR3: offset + size (16240) in URI is beyond the size of the source (12640)
+# RUN: FileCheck %s --check-prefix=EXTRACT-BUNDLE-ENTRY-ERROR3
+# EXTRACT-BUNDLE-ENTRY-ERROR3: offset + size (16240) in URI is beyond the size of the source (12640)
# RUN: not llvm-extract-bundle-entry --error 2>&1 | \
-# RUN: FileCheck %s --check-prefix=EXTRACT_BUNDLE_ENTRY_ERROR4
-# EXTRACT_BUNDLE_ENTRY_ERROR4: unknown argument '--error'
+# RUN: FileCheck %s --check-prefix=EXTRACT-BUNDLE-ENTRY-ERROR4
+# EXTRACT-BUNDLE-ENTRY-ERROR4: unknown argument '--error'
--- !ELF
FileHeader:
diff --git a/llvm/test/tools/llvm-objcopy/tool-help-message.test b/llvm/test/tools/llvm-objcopy/tool-help-message.test
index 7e72acbbe5073..1f29fe978bb68 100644
--- a/llvm/test/tools/llvm-objcopy/tool-help-message.test
+++ b/llvm/test/tools/llvm-objcopy/tool-help-message.test
@@ -29,6 +29,14 @@
# RUN: not llvm-bitcode-strip --abcabc 2>&1 | FileCheck --check-prefix=UNKNOWN-ARG-LONG %s
# RUN: not llvm-bitcode-strip f1 f2 2>&1 | FileCheck %s --check-prefix=MULTIPLE-INPUT-FILES
+
+# RUN: llvm-extract-bundle-entry -h | FileCheck --check-prefix=EXTRACT-BUNDLE-ENTRY-USAGE %s --match-full-lines
+# RUN: llvm-extract-bundle-entry --help | FileCheck --check-prefix=EXTRACT-BUNDLE-ENTRY-USAGE %s --match-full-lines
+# RUN: not llvm-extract-bundle-entry 2>&1 | FileCheck --check-prefix=EXTRACT-BUNDLE-ENTRY-USAGE %s --match-full-lines
+# RUN: not llvm-extract-bundle-entry 2>&1 | FileCheck --check-prefix=EXTRACT-BUNDLE-ENTRY-USAGE %s --match-full-lines
+# RUN: not llvm-extract-bundle-entry -abcabc 2>&1 | FileCheck --check-prefix=UNKNOWN-ARG-SHORT %s
+# RUN: not llvm-extract-bundle-entry --abcabc 2>&1 | FileCheck --check-prefix=UNKNOWN-ARG-LONG %s
+
# OBJCOPY-USAGE: USAGE: llvm-objcopy [options] input [output]
# OBJCOPY-USAGE: Pass @FILE as argument to read options from FILE.
@@ -41,6 +49,9 @@
# BITCODE-STRIP-USAGE: USAGE: llvm-bitcode-strip [options] input
# BITCODE-STRIP-USAGE: Pass @FILE as argument to read options from FILE.
+# EXTRACT-BUNDLE-ENTRY-USAGE: USAGE: llvm-extract-bundle-entry URI
+# EXTRACT-BUNDLE-ENTRY-USAGE: Pass @FILE as argument to read options from FILE.
+#
# UNKNOWN-ARG-SHORT: unknown argument '-a'
# UNKNOWN-ARG-LONG: unknown argument '{{-+}}abcabc'
# NO-INPUT-FILES: no input file specified
diff --git a/llvm/tools/llvm-objcopy/ExtractBundleEntryOpts.td b/llvm/tools/llvm-objcopy/ExtractBundleEntryOpts.td
index 5c75ca7be4991..f27312e04c08c 100644
--- a/llvm/tools/llvm-objcopy/ExtractBundleEntryOpts.td
+++ b/llvm/tools/llvm-objcopy/ExtractBundleEntryOpts.td
@@ -12,7 +12,7 @@
include "llvm/Option/OptParser.td"
-def help : Flag<["--"], "Help">,
+def help : Flag<["--"], "help">,
HelpText<"URIs can be read from STDIN, one per line.\n"
"From the URIs specified, extracts code objects into files named:\n"
"\t<executable_name>-[pid<number>]-offset<number>-size<number>.co\n\n"
diff --git a/llvm/tools/llvm-objcopy/ObjcopyOptions.cpp b/llvm/tools/llvm-objcopy/ObjcopyOptions.cpp
index 8534628d741a6..71b1226ffc33d 100644
--- a/llvm/tools/llvm-objcopy/ObjcopyOptions.cpp
+++ b/llvm/tools/llvm-objcopy/ObjcopyOptions.cpp
@@ -1717,8 +1717,8 @@ objcopy::parseStripOptions(ArrayRef<const char *> RawArgsArr,
return std::move(DC);
}
-Expected<DriverConfig> objcopy::parseExtractBundleEntryOptions(
- ArrayRef<const char *> ArgsArr, function_ref<Error(Error)> ErrorCallback) {
+Expected<DriverConfig>
+objcopy::parseExtractBundleEntryOptions(ArrayRef<const char *> ArgsArr) {
DriverConfig DC;
ExtractBundleEntryOptTable T;
unsigned MissingArgumentIndex, MissingArgumentCount;
@@ -1736,7 +1736,7 @@ Expected<DriverConfig> objcopy::parseExtractBundleEntryOptions(
}
if (InputArgs.hasArg(EXTRACT_BUNDLE_ENTRY_version)) {
- outs() << "llvm-extract-bundle-entry, compatible with roc-obj-ls\n";
+ outs() << "llvm-extract-bundle-entry\n";
cl::PrintVersionMessage();
exit(0);
}
diff --git a/llvm/tools/llvm-objcopy/ObjcopyOptions.h b/llvm/tools/llvm-objcopy/ObjcopyOptions.h
index 5665881c82734..fb26b32643eb6 100644
--- a/llvm/tools/llvm-objcopy/ObjcopyOptions.h
+++ b/llvm/tools/llvm-objcopy/ObjcopyOptions.h
@@ -58,8 +58,10 @@ parseStripOptions(ArrayRef<const char *> ArgsArr,
// errors. An Error returned by the callback aborts the parsing and is then
// returned by this function.
Expected<DriverConfig>
-parseExtractBundleEntryOptions(ArrayRef<const char *> ArgsArr,
- llvm::function_ref<Error(Error)> ErrorCallback);
+parseExtractBundleEntryOptions(ArrayRef<const char *> ArgsArr);
+/*parseExtractBundleEntryOptions(ArrayRef<const char *> ArgsArr,
+ llvm::function_ref<Error(Error)>
+ ErrorCallback);*/
} // namespace objcopy
} // namespace llvm
diff --git a/llvm/tools/llvm-objcopy/llvm-objcopy.cpp b/llvm/tools/llvm-objcopy/llvm-objcopy.cpp
index e0d1ee39afaf8..e73ec25821dfa 100644
--- a/llvm/tools/llvm-objcopy/llvm-objcopy.cpp
+++ b/llvm/tools/llvm-objcopy/llvm-objcopy.cpp
@@ -78,7 +78,7 @@ static Expected<DriverConfig> getDriverConfig(ArrayRef<const char *> Args) {
if (Is("install-name-tool") || Is("install_name_tool"))
return parseInstallNameToolOptions(Args);
if (Is("llvm-extract-bundle-entry"))
- return parseExtractBundleEntryOptions(Args, reportWarning);
+ return parseExtractBundleEntryOptions(Args);
return parseObjcopyOptions(Args, reportWarning);
}
>From 4dc83a4b26690552b650a2806e1e430ce833fdd1 Mon Sep 17 00:00:00 2001
From: dsalinas_amdeng <david.salinas at amd.com>
Date: Mon, 9 Mar 2026 20:46:08 +0000
Subject: [PATCH 6/6] Correct LLVM doc build failure
---
llvm/docs/CommandGuide/llvm-extract-bundle-entry.rst | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/llvm/docs/CommandGuide/llvm-extract-bundle-entry.rst b/llvm/docs/CommandGuide/llvm-extract-bundle-entry.rst
index c1e321b21e7d3..a05ded674d527 100644
--- a/llvm/docs/CommandGuide/llvm-extract-bundle-entry.rst
+++ b/llvm/docs/CommandGuide/llvm-extract-bundle-entry.rst
@@ -1,5 +1,5 @@
llvm-extract-bundle-entry - object stripping tool
-==================================
+=================================================
.. program:: llvm-extract-bundle-entry
More information about the llvm-commits
mailing list