[llvm] [AMDGPU] Add AMDGPU support for llvm-objcopy (PR #190020)

David Salinas via llvm-commits llvm-commits at lists.llvm.org
Mon Jul 27 18:05:30 PDT 2026


https://github.com/david-salinas updated https://github.com/llvm/llvm-project/pull/190020

>From 852577bd7123015ba157e7f55a3f7c49745c413c Mon Sep 17 00:00:00 2001
From: david-salinas <dsalinas at amd.com>
Date: Wed, 1 Apr 2026 18:28:51 +0000
Subject: [PATCH 1/4] [AMDGPU] Add AMDGPU support for llvm-objcopy

---
 .../tools/llvm-objcopy/ELF/cross-arch-headers.test  | 13 +++++++++++--
 llvm/tools/llvm-objcopy/ObjcopyOptions.cpp          |  2 ++
 2 files changed, 13 insertions(+), 2 deletions(-)

diff --git a/llvm/test/tools/llvm-objcopy/ELF/cross-arch-headers.test b/llvm/test/tools/llvm-objcopy/ELF/cross-arch-headers.test
index 9a8128611792d..2d69dec933d5d 100644
--- a/llvm/test/tools/llvm-objcopy/ELF/cross-arch-headers.test
+++ b/llvm/test/tools/llvm-objcopy/ELF/cross-arch-headers.test
@@ -2,7 +2,8 @@
 # and DWO output.
 # Note that we don't actually need any DWARF to produce the DWO file.
 
-# RUN: yaml2obj %s -o %t.o
+# RUN: yaml2obj -DMACHINE=EM_NONE %s -o %t.o
+# RUN: yaml2obj -DMACHINE=EM_AMDGPU -DFLAGS=[EF_AMDGPU_MACH_AMDGCN_GFX900] %s -o %t-amdgpu.o
 
 # Without --output-format, the format should match the input.
 # RUN: llvm-objcopy %t.o %t.default.o --split-dwo=%t.default.dwo
@@ -121,13 +122,18 @@
 # RUN: llvm-readobj --file-headers %t.elf64_s390.o | FileCheck %s --check-prefixes=CHECK,BE,S390X,64,SYSV
 # RUN: llvm-readobj --file-headers %t.elf64_s390.dwo | FileCheck %s --check-prefixes=CHECK,BE,S390X,64,SYSV
 
+# RUN: llvm-objcopy %t-amdgpu.o -O elf64-amdgpu %t-amdgpu.elf64_amdgpu.o --split-dwo=%t-amdgpu.elf64_amdgpu.dwo
+# RUN: llvm-readobj --file-headers %t-amdgpu.elf64_amdgpu.o | FileCheck %s --check-prefixes=CHECK,LE,AMDGPU,64,SYSV
+# RUN: llvm-readobj --file-headers %t-amdgpu.elf64_amdgpu.dwo | FileCheck %s --check-prefixes=CHECK,LE,AMDGPU,64,SYSV
+
 !ELF
 FileHeader:
   Class:           ELFCLASS32
   Data:            ELFDATA2LSB
   Type:            ET_EXEC
   # Arbitrary values that do not match any value we convert to via --output-format.
-  Machine:         EM_NONE
+  Machine:         [[MACHINE]]
+  Flags:           [[FLAGS=<none>]]
   OSABI:           ELFOSABI_STANDALONE
 Sections:
   - Name:            .text
@@ -154,6 +160,7 @@ Symbols:
 # I386-SAME:    i386
 # IAMCU-SAME:   iamcu
 # AARCH-SAME:   aarch64
+# AMDGPU-SAME:  amdgpu
 # ARM-SAME:     littlearm
 # HEXAGON-SAME: hexagon
 # LA32-SAME:    loongarch{{$}}
@@ -171,6 +178,7 @@ Symbols:
 # I386-NEXT:     Arch: i386
 # IAMCU-NEXT:    Arch: i386
 # AARCH-NEXT:    Arch: aarch64
+# AMDGPU-NEXT:   Arch: amdgcn
 # ARM-NEXT:      Arch: arm
 # HEXAGON-NEXT:  Arch: hexagon
 # LA32-NEXT:     Arch: loongarch32
@@ -204,6 +212,7 @@ Symbols:
 # DEFAULT: OS/ABI: Standalone (0xFF)
 
 # AARCH:   Machine: EM_AARCH64 (0xB7)
+# AMDGPU:  Machine: EM_AMDGPU (0xE0)
 # ARM:     Machine: EM_ARM (0x28)
 # HEXAGON: Machine: EM_HEXAGON (0xA4)
 # I386:    Machine: EM_386 (0x3)
diff --git a/llvm/tools/llvm-objcopy/ObjcopyOptions.cpp b/llvm/tools/llvm-objcopy/ObjcopyOptions.cpp
index 59e750f5e88df..2e0ad6481c28e 100644
--- a/llvm/tools/llvm-objcopy/ObjcopyOptions.cpp
+++ b/llvm/tools/llvm-objcopy/ObjcopyOptions.cpp
@@ -369,6 +369,8 @@ static const StringMap<MachineInfo> TargetMap{
     {"elf64-loongarch", {ELF::EM_LOONGARCH, true, true}},
     // SystemZ
     {"elf64-s390", {ELF::EM_S390, true, false}},
+    // AMDGPU
+    {"elf64-amdgpu", {ELF::EM_AMDGPU, true, true}},
 };
 
 static Expected<TargetInfo>

>From fb8afd2615962e47ea9d22dd42976cfa7a45beb9 Mon Sep 17 00:00:00 2001
From: dsalinas <dsalinas at amd.com>
Date: Mon, 27 Jul 2026 13:39:22 -0500
Subject: [PATCH 2/4] [llvm-objcopy] Fix AMDGPU arch string in test: amdgpu not
 amdgcn

llvm-readobj reports 'Arch: amdgpu' for EM_AMDGPU ELF files
(the generic AMDGPU ELF format used by elf64-amdgpu). The test
was incorrectly expecting 'amdgcn', which is the AMDGCN-specific
arch string used by ROCm HSA code objects.
---
 llvm/test/tools/llvm-objcopy/ELF/cross-arch-headers.test | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/llvm/test/tools/llvm-objcopy/ELF/cross-arch-headers.test b/llvm/test/tools/llvm-objcopy/ELF/cross-arch-headers.test
index 2d69dec933d5d..61e3cc383c791 100644
--- a/llvm/test/tools/llvm-objcopy/ELF/cross-arch-headers.test
+++ b/llvm/test/tools/llvm-objcopy/ELF/cross-arch-headers.test
@@ -178,7 +178,7 @@ Symbols:
 # I386-NEXT:     Arch: i386
 # IAMCU-NEXT:    Arch: i386
 # AARCH-NEXT:    Arch: aarch64
-# AMDGPU-NEXT:   Arch: amdgcn
+# AMDGPU-NEXT:   Arch: amdgpu
 # ARM-NEXT:      Arch: arm
 # HEXAGON-NEXT:  Arch: hexagon
 # LA32-NEXT:     Arch: loongarch32

>From cc8e2b806ef832eecb0c0aff094615d866e12f60 Mon Sep 17 00:00:00 2001
From: dsalinas <dsalinas at amd.com>
Date: Mon, 27 Jul 2026 18:21:19 -0500
Subject: [PATCH 3/4] [llvm-objcopy] Add AMDGPU case to
 binary-output-target.test

Add test coverage for converting binary input to elf64-amdgpu format,
verifying the output has the correct format string, arch (amdgpu),
and machine type (EM_AMDGPU 0xE0). Follows the same pattern as all
other architectures in this test file.
---
 llvm/test/tools/llvm-objcopy/ELF/binary-output-target.test | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/llvm/test/tools/llvm-objcopy/ELF/binary-output-target.test b/llvm/test/tools/llvm-objcopy/ELF/binary-output-target.test
index 3547b728a426d..deb1813994380 100644
--- a/llvm/test/tools/llvm-objcopy/ELF/binary-output-target.test
+++ b/llvm/test/tools/llvm-objcopy/ELF/binary-output-target.test
@@ -57,6 +57,9 @@
 # RUN: llvm-objcopy -I binary -O elf64-s390 %t.txt %t.s390x.o
 # RUN: llvm-readobj --file-headers %t.s390x.o | FileCheck %s --check-prefixes=CHECK,BE,S390X,64
 
+# RUN: llvm-objcopy -I binary -O elf64-amdgpu %t.txt %t.amdgpu.o
+# RUN: llvm-readobj --file-headers %t.amdgpu.o | FileCheck %s --check-prefixes=CHECK,LE,AMDGPU,64
+
 # CHECK: Format:
 # 32-SAME:      elf32-
 # 64-SAME:      elf64-
@@ -75,6 +78,7 @@
 # SPARCEL-SAME: sparc
 # S390X-SAME:   s390
 # X86-64-SAME:  x86-64
+# AMDGPU-SAME:  amdgpu
 
 # AARCH64-NEXT: Arch: aarch64
 # ARM-NEXT:     Arch: arm
@@ -93,6 +97,7 @@
 # SPARCEL-NEXT: Arch: sparcel
 # S390X-NEXT:   Arch: s390x
 # X86-64-NEXT:  Arch: x86_64
+# AMDGPU-NEXT:  Arch: amdgpu
 
 # 32-NEXT:      AddressSize: 32bit
 # 64-NEXT:      AddressSize: 64bit
@@ -129,6 +134,7 @@
 # SPARCEL-NEXT:   Machine: EM_SPARC (0x2)
 # S390X-NEXT:     Machine: EM_S390 (0x16)
 # X86-64-NEXT:    Machine: EM_X86_64 (0x3E)
+# AMDGPU-NEXT:    Machine: EM_AMDGPU (0xE0)
 
 # CHECK-NEXT:     Version: 1
 # CHECK-NEXT:     Entry: 0x0

>From d111119cc00781381d5d09ba3c352351d8a8fe77 Mon Sep 17 00:00:00 2001
From: dsalinas <dsalinas at amd.com>
Date: Mon, 27 Jul 2026 19:33:51 -0500
Subject: [PATCH 4/4] [llvm-objcopy] Fix AMDGPU arch checks in tests

ELFObjectFile.h getArch() for EM_AMDGPU returns Triple::UnknownArch
when e_flags & EF_AMDGPU_MACH is 0 (no GPU target specified). Only
when a MACH flag in the AMDGCN range is present does it return
Triple::amdgpu.

- cross-arch-headers.test: restore EF_AMDGPU_MACH_AMDGCN_GFX900 flag
  on the input ELF so that after format conversion the output correctly
  reports Arch: amdgpu.

- binary-output-target.test: expect Arch: unknown since converting
  from raw binary input (-I binary) produces an ELF with e_flags=0
  (no MACH flags), giving UnknownArch. This is correct behavior.
---
 llvm/test/tools/llvm-objcopy/ELF/binary-output-target.test | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/llvm/test/tools/llvm-objcopy/ELF/binary-output-target.test b/llvm/test/tools/llvm-objcopy/ELF/binary-output-target.test
index deb1813994380..a0370018c2e81 100644
--- a/llvm/test/tools/llvm-objcopy/ELF/binary-output-target.test
+++ b/llvm/test/tools/llvm-objcopy/ELF/binary-output-target.test
@@ -97,7 +97,7 @@
 # SPARCEL-NEXT: Arch: sparcel
 # S390X-NEXT:   Arch: s390x
 # X86-64-NEXT:  Arch: x86_64
-# AMDGPU-NEXT:  Arch: amdgpu
+# AMDGPU-NEXT:  Arch: unknown
 
 # 32-NEXT:      AddressSize: 32bit
 # 64-NEXT:      AddressSize: 64bit



More information about the llvm-commits mailing list