[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