[llvm] Add llvm-extract-bundle-entry to extend llvm-objcopy (PR #169386)
David Salinas via llvm-commits
llvm-commits at lists.llvm.org
Fri Mar 27 09:11:46 PDT 2026
https://github.com/david-salinas updated https://github.com/llvm/llvm-project/pull/169386
>From 10eb5769b876032b2b1935c88b6c52d524099217 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/9] 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 | 6 +-
10 files changed, 236 insertions(+), 12 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 f006298c1f4b9..9aa9b789447c9 100644
--- a/llvm/lib/Object/OffloadBundle.cpp
+++ b/llvm/lib/Object/OffloadBundle.cpp
@@ -219,24 +219,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();
}
@@ -261,6 +274,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();
@@ -277,7 +291,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 34213cd18e38a..e0973ad35fab1 100644
--- a/llvm/test/CMakeLists.txt
+++ b/llvm/test/CMakeLists.txt
@@ -102,6 +102,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 36d1a34a2fcdf..e0e0c6416c7bb 100644
--- a/llvm/test/lit.cfg.py
+++ b/llvm/test/lit.cfg.py
@@ -243,6 +243,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")),
]
@@ -275,6 +276,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 b907e023da31e..aad8a37e33a22 100644
--- a/llvm/tools/llvm-objcopy/llvm-objcopy.cpp
+++ b/llvm/tools/llvm-objcopy/llvm-objcopy.cpp
@@ -79,8 +79,10 @@ static Expected<DriverConfig> getDriverConfig(ArrayRef<const char *> Args) {
if (Is("install-name-tool") || Is("install_name_tool"))
return parseInstallNameToolOptions(Args);
-
- return parseObjcopyOptions(Args, reportWarning);
+ else if (Is("llvm-extract-bundle-entry"))
+ return parseExtractBundleEntryOptions(Args, reportWarning);
+ else
+ return parseObjcopyOptions(Args, reportWarning);
}
/// The function executeObjcopyOnIHex does the dispatch based on the format
>From 4e5d2feb4fd134c6a0366ed36f2480681175c55e 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/9] 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 9aa9b789447c9..9080b3f6dca26 100644
--- a/llvm/lib/Object/OffloadBundle.cpp
+++ b/llvm/lib/Object/OffloadBundle.cpp
@@ -224,8 +224,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())
@@ -236,8 +236,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 45c237eb3dbf69560a023524c81a31bd761c4027 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/9] 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 | 7 +-
6 files changed, 80 insertions(+), 40 deletions(-)
diff --git a/llvm/lib/Object/OffloadBundle.cpp b/llvm/lib/Object/OffloadBundle.cpp
index 9080b3f6dca26..d06190bf7a4e2 100644
--- a/llvm/lib/Object/OffloadBundle.cpp
+++ b/llvm/lib/Object/OffloadBundle.cpp
@@ -230,18 +230,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 aad8a37e33a22..4addd5a056c12 100644
--- a/llvm/tools/llvm-objcopy/llvm-objcopy.cpp
+++ b/llvm/tools/llvm-objcopy/llvm-objcopy.cpp
@@ -79,10 +79,11 @@ static Expected<DriverConfig> getDriverConfig(ArrayRef<const char *> Args) {
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 e58845c8f2fa3c6da1a10d85ed3a6bfee5347061 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/9] 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 +-
3 files changed, 12 insertions(+), 10 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
>From 22d29bf34aea77c247682991a0dfd961456510e6 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/9] 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 4addd5a056c12..ce00a80fe252d 100644
--- a/llvm/tools/llvm-objcopy/llvm-objcopy.cpp
+++ b/llvm/tools/llvm-objcopy/llvm-objcopy.cpp
@@ -81,7 +81,7 @@ static Expected<DriverConfig> getDriverConfig(ArrayRef<const char *> Args) {
return parseInstallNameToolOptions(Args);
if (Is("llvm-extract-bundle-entry"))
- return parseExtractBundleEntryOptions(Args, reportWarning);
+ return parseExtractBundleEntryOptions(Args);
return parseObjcopyOptions(Args, reportWarning);
}
>From 067910b109c83b59574613825c3c5de6bc21e034 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/9] Correct LLVM doc build failure
---
llvm/docs/CommandGuide/llvm-extract-bundle-entry.rst | 9 ++++-----
1 file changed, 4 insertions(+), 5 deletions(-)
diff --git a/llvm/docs/CommandGuide/llvm-extract-bundle-entry.rst b/llvm/docs/CommandGuide/llvm-extract-bundle-entry.rst
index c1e321b21e7d3..df0f98fd89519 100644
--- a/llvm/docs/CommandGuide/llvm-extract-bundle-entry.rst
+++ b/llvm/docs/CommandGuide/llvm-extract-bundle-entry.rst
@@ -1,18 +1,18 @@
llvm-extract-bundle-entry - object stripping tool
-==================================
+=================================================
.. program:: llvm-extract-bundle-entry
SYNOPSIS
--------
-:program:`llvm-extract-bundle-entry` [*options*] *URI*
+: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.
+object file based on the details of the URI given.
The URI syntax is defined as:
@@ -27,8 +27,7 @@ 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.
+The output is always written to a file, whose name is generated from the URI input given.
OPTIONS
>From 6eea9fbccd17e46c3a8222508c3ae1f02e51b674 Mon Sep 17 00:00:00 2001
From: dsalinas_amdeng <david.salinas at amd.com>
Date: Tue, 10 Mar 2026 14:38:22 +0000
Subject: [PATCH 7/9] clean up LLVM Doc error
---
llvm/docs/CommandGuide/index.rst | 1 +
llvm/docs/CommandGuide/llvm-extract-bundle-entry.rst | 12 +++++-------
2 files changed, 6 insertions(+), 7 deletions(-)
diff --git a/llvm/docs/CommandGuide/index.rst b/llvm/docs/CommandGuide/index.rst
index c76d302ba41fc..e70ad57a4d511 100644
--- a/llvm/docs/CommandGuide/index.rst
+++ b/llvm/docs/CommandGuide/index.rst
@@ -62,6 +62,7 @@ GNU binutils replacements
llvm-size
llvm-strings
llvm-strip
+ llvm-extract-bundle-entry
Debugging Tools
~~~~~~~~~~~~~~~
diff --git a/llvm/docs/CommandGuide/llvm-extract-bundle-entry.rst b/llvm/docs/CommandGuide/llvm-extract-bundle-entry.rst
index df0f98fd89519..7f28f2a8242be 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
-=================================================
+llvm-extract-bundle-entry - extract an offload bundle entry
+===========================================================
.. program:: llvm-extract-bundle-entry
@@ -11,8 +11,9 @@ SYNOPSIS
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.
+:program:`llvm-extract-offload-entry` is a tool thet takes a URI argument, and
+generates a code object file by extracting an offload bundle entry specified
+by the URI given.
The URI syntax is defined as:
@@ -24,9 +25,6 @@ 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.
>From b52bf69115d508d7c105a9e1b2bdc14ca15c9b59 Mon Sep 17 00:00:00 2001
From: David Salinas <David.Salinas at amd.com>
Date: Fri, 20 Mar 2026 19:15:00 +0000
Subject: [PATCH 8/9] Correct LIT test Failure on Windows.
---
llvm/test/tools/llvm-objcopy/extract-bundle-entry.test | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/llvm/test/tools/llvm-objcopy/extract-bundle-entry.test b/llvm/test/tools/llvm-objcopy/extract-bundle-entry.test
index 05d10fcbe27b6..e08df304e82b7 100644
--- a/llvm/test/tools/llvm-objcopy/extract-bundle-entry.test
+++ b/llvm/test/tools/llvm-objcopy/extract-bundle-entry.test
@@ -1,7 +1,7 @@
## 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-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
@@ -25,15 +25,15 @@
# 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: 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: not llvm-extract-bundle-entry file://%t.elf#offset=819200000\&size=4048 2>&1 | \
+# 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: not llvm-extract-bundle-entry file://%t.elf#offset=8192\&size=8048 2>&1 | \
+# 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)
>From f4e09690e61feb44e0b8f57a775307dc759e0f2d Mon Sep 17 00:00:00 2001
From: dsalinas_amdeng <david.salinas at amd.com>
Date: Thu, 26 Mar 2026 20:20:26 +0000
Subject: [PATCH 9/9] Address PR comments.
---
.../llvm-extract-bundle-entry.rst | 24 ++++++++-----------
llvm/lib/Object/OffloadBundle.cpp | 7 +++---
.../llvm-objcopy/extract-bundle-entry.test | 10 ++++----
.../tools/llvm-objcopy/tool-help-message.test | 3 +--
.../llvm-objcopy/ExtractBundleEntryOpts.td | 12 ++++------
llvm/tools/llvm-objcopy/ObjcopyOptions.cpp | 22 ++++++++++-------
llvm/tools/llvm-objcopy/ObjcopyOptions.h | 4 ----
7 files changed, 38 insertions(+), 44 deletions(-)
diff --git a/llvm/docs/CommandGuide/llvm-extract-bundle-entry.rst b/llvm/docs/CommandGuide/llvm-extract-bundle-entry.rst
index 7f28f2a8242be..a95262292ec1b 100644
--- a/llvm/docs/CommandGuide/llvm-extract-bundle-entry.rst
+++ b/llvm/docs/CommandGuide/llvm-extract-bundle-entry.rst
@@ -16,20 +16,21 @@ generates a code object file by extracting an offload bundle entry specified
by the URI given.
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
+
+-- code-block::bnf
+ <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> ::== DECIMAL_NUMBER
The output is always written to a file, whose name is generated from the URI input given.
OPTIONS
-----------------------------------
+-------
The following options are either agnostic of the file format, or apply to
multiple file formats.
@@ -57,8 +58,3 @@ 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 439d97f293c71..56fa4acfe7008 100644
--- a/llvm/lib/Object/OffloadBundle.cpp
+++ b/llvm/lib/Object/OffloadBundle.cpp
@@ -226,11 +226,10 @@ Error object::extractCodeObject(const ObjectFile &Source, size_t Offset,
if (!BufferOrErr)
return BufferOrErr.takeError();
- ;
Expected<MemoryBufferRef> InputBuffOrErr = Source.getMemoryBufferRef();
if (Error Err = InputBuffOrErr.takeError())
- return createFileError(OutputFileName, std::move(Err));
+ return createFileError(Source.getFileName(), std::move(Err));
if (Size > InputBuffOrErr->getBufferSize())
return createStringError("size in URI (%llu) is larger than source (%llu)",
@@ -238,12 +237,12 @@ Error object::extractCodeObject(const ObjectFile &Source, size_t Offset,
if (Offset > InputBuffOrErr->getBufferSize())
return createStringError(
- "offset in URI (%llu) is beyond the size of the source (%llu)", Offset,
+ "offset in URI (%llu) is beyond the end of the source (%llu)", Offset,
InputBuffOrErr->getBufferSize());
if (Offset + Size > InputBuffOrErr->getBufferSize())
return createStringError(
- "offset + size (%llu) in URI is beyond the size of the source (%llu)",
+ "offset + size (%llu) in URI is beyond the end of the source (%llu)",
Offset + Size, InputBuffOrErr->getBufferSize());
std::unique_ptr<FileOutputBuffer> Buf = std::move(*BufferOrErr);
diff --git a/llvm/test/tools/llvm-objcopy/extract-bundle-entry.test b/llvm/test/tools/llvm-objcopy/extract-bundle-entry.test
index e08df304e82b7..f1517c9f0ca60 100644
--- a/llvm/test/tools/llvm-objcopy/extract-bundle-entry.test
+++ b/llvm/test/tools/llvm-objcopy/extract-bundle-entry.test
@@ -25,17 +25,17 @@
# 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: 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: not llvm-extract-bundle-entry "file://%t.elf#offset=819200000\&size=4048" 2>&1 | \
+# 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)
+# EXTRACT-BUNDLE-ENTRY-ERROR2: offset in URI (819200000) is beyond the end of the source (12640)
-# RUN: not llvm-extract-bundle-entry "file://%t.elf#offset=8192\&size=8048" 2>&1 | \
+# 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)
+# EXTRACT-BUNDLE-ENTRY-ERROR3: offset + size (16240) in URI is beyond the end of the source (12640)
# RUN: not llvm-extract-bundle-entry --error 2>&1 | \
# RUN: FileCheck %s --check-prefix=EXTRACT-BUNDLE-ENTRY-ERROR4
diff --git a/llvm/test/tools/llvm-objcopy/tool-help-message.test b/llvm/test/tools/llvm-objcopy/tool-help-message.test
index 1f29fe978bb68..059319f5ec82a 100644
--- a/llvm/test/tools/llvm-objcopy/tool-help-message.test
+++ b/llvm/test/tools/llvm-objcopy/tool-help-message.test
@@ -29,7 +29,6 @@
# 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
@@ -51,7 +50,7 @@
# 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 f27312e04c08c..27a9d754c2fc8 100644
--- a/llvm/tools/llvm-objcopy/ExtractBundleEntryOpts.td
+++ b/llvm/tools/llvm-objcopy/ExtractBundleEntryOpts.td
@@ -17,15 +17,13 @@ def help : Flag<["--"], "help">,
"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"
+ "\t<code_object_uri> ::== <file_uri> | <memory_uri>\n"
+ "\t<file_uri> ::== \"file://\" <extract_file><range_specifier>\n"
+ "\t<memory_uri> ::== \"memory://\"<process_id><range_specifier>\n"
+ "\t<range_specifier> ::== [ \"#\" | \"?\" ]\"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"
+ "\tnumber ::== DECIMAL_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 71b1226ffc33d..7a3deaf5159b0 100644
--- a/llvm/tools/llvm-objcopy/ObjcopyOptions.cpp
+++ b/llvm/tools/llvm-objcopy/ObjcopyOptions.cpp
@@ -1717,9 +1717,16 @@ objcopy::parseStripOptions(ArrayRef<const char *> RawArgsArr,
return std::move(DC);
}
+Error runExtractBundleEntry(SmallVector<StringRef, 256> args) {
+ for (StringRef Input : args)
+ if (Error Err = object::extractOffloadBundleByURI(Input))
+ return Err;
+
+ return Error::success();
+}
+
Expected<DriverConfig>
objcopy::parseExtractBundleEntryOptions(ArrayRef<const char *> ArgsArr) {
- DriverConfig DC;
ExtractBundleEntryOptTable T;
unsigned MissingArgumentIndex, MissingArgumentCount;
opt::InputArgList InputArgs =
@@ -1745,16 +1752,15 @@ objcopy::parseExtractBundleEntryOptions(ArrayRef<const char *> ArgsArr) {
return createStringError(errc::invalid_argument, "unknown argument '%s'",
Arg->getAsString(InputArgs).c_str());
- SmallVector<StringRef, 256> Positional;
+ DriverConfig DC;
+ SmallVector<StringRef, 256> Arguments;
for (auto *Arg : InputArgs.filtered(EXTRACT_BUNDLE_ENTRY_INPUT))
- Positional.push_back(Arg->getValue());
- assert(!Positional.empty());
+ Arguments.push_back(Arg->getValue());
+ assert(!Arguments.empty());
- // Iterate over all input arguments.
- for (StringRef Input : Positional)
- if (Error Err = object::extractOffloadBundleByURI(Input))
- return std::move(Err);
+ if (Error Err = runExtractBundleEntry(Arguments))
+ 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 fb26b32643eb6..6e35310217c1e 100644
--- a/llvm/tools/llvm-objcopy/ObjcopyOptions.h
+++ b/llvm/tools/llvm-objcopy/ObjcopyOptions.h
@@ -59,10 +59,6 @@ parseStripOptions(ArrayRef<const char *> ArgsArr,
// returned by this function.
Expected<DriverConfig>
parseExtractBundleEntryOptions(ArrayRef<const char *> ArgsArr);
-/*parseExtractBundleEntryOptions(ArrayRef<const char *> ArgsArr,
- llvm::function_ref<Error(Error)>
- ErrorCallback);*/
-
} // namespace objcopy
} // namespace llvm
More information about the llvm-commits
mailing list