[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