[lld] [llvm] [AMDGPU] Omit ELF XNACK modes for hardwired-on targets (PR #227740)
via llvm-commits
llvm-commits at lists.llvm.org
Wed Sep 30 08:01:44 PDT 2026
llvmorg-github-actions[bot] wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-llvm-binary-utilities
Author: Jacob Lambert (lamb-j)
<details>
<summary>Changes</summary>
Since #<!-- -->212792, gfx1250 and other hardwired-on targets emit `XNACK_ON`, breaking links with older objects and causing consumers to infer an unsupported `:xnack+` modifier.
Encode ELF XNACK modes only for targets with selectable on/off modes, preserving the internal `On` setting for code generation. Update the ABI documentation and add regressions. SRAMECC encodings remain unchanged; its mode-capability work is in #<!-- -->225540.
Assisted by: Codex (GPT-6)
---
Full diff: https://github.com/llvm/llvm-project/pull/227740.diff
6 Files Affected:
- (added) lld/test/ELF/amdgpu-xnack-hardwired.s (+28)
- (modified) llvm/docs/AMDGPUUsage.rst (+8-2)
- (modified) llvm/include/llvm/BinaryFormat/ELF.h (+1-1)
- (modified) llvm/lib/Target/AMDGPU/MCTargetDesc/AMDGPUTargetStreamer.cpp (+5-1)
- (modified) llvm/test/CodeGen/AMDGPU/module-flag-xnack-no-on-off-modes.ll (+9)
- (added) llvm/test/MC/AMDGPU/elf-xnack-hardwired.s (+21)
``````````diff
diff --git a/lld/test/ELF/amdgpu-xnack-hardwired.s b/lld/test/ELF/amdgpu-xnack-hardwired.s
new file mode 100644
index 0000000000000..95db5257edea7
--- /dev/null
+++ b/lld/test/ELF/amdgpu-xnack-hardwired.s
@@ -0,0 +1,28 @@
+# REQUIRES: amdgpu
+
+# Link new gfx1250 objects with the zero XNACK field used before the subtarget
+# feature removal. This must not report an incompatible XNACK mode.
+# RUN: split-file %s %t
+# RUN: llvm-mc -triple=amdgpu12.50-amd-amdhsa --amdhsa-code-object-version=6 -filetype=obj %t/new.s -o %t/new.o
+# RUN: yaml2obj %t/old.yaml -o %t/old.o
+# RUN: ld.lld -shared %t/old.o %t/new.o -o %t/linked.so
+# RUN: llvm-readobj --file-headers %t/linked.so | FileCheck %s
+# RUN: ld.lld -shared %t/new.o %t/old.o -o %t/reversed.so
+# RUN: llvm-readobj --file-headers %t/reversed.so | FileCheck %s
+
+# CHECK: Flags [ (0x449)
+# CHECK: EF_AMDGPU_FEATURE_SRAMECC_ANY_V4
+
+#--- new.s
+s_endpgm
+
+#--- old.yaml
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ OSABI: ELFOSABI_AMDGPU_HSA
+ ABIVersion: 4
+ Type: ET_REL
+ Machine: EM_AMDGPU
+ Flags: [ EF_AMDGPU_MACH_AMDGCN_GFX1250, EF_AMDGPU_FEATURE_SRAMECC_ANY_V4 ]
diff --git a/llvm/docs/AMDGPUUsage.rst b/llvm/docs/AMDGPUUsage.rst
index 899e796cec225..7747d863e52a8 100644
--- a/llvm/docs/AMDGPUUsage.rst
+++ b/llvm/docs/AMDGPUUsage.rst
@@ -3278,7 +3278,7 @@ The AMDGPU backend uses the following ELF header:
``EF_AMDGPU_FEATURE_XNACK_V4`` 0x300 XNACK selection mask for
``EF_AMDGPU_FEATURE_XNACK_*_V4``
values.
- ``EF_AMDGPU_FEATURE_XNACK_UNSUPPORTED_V4`` 0x000 XNACK unsupported.
+ ``EF_AMDGPU_FEATURE_XNACK_UNSUPPORTED_V4`` 0x000 XNACK mode selection unsupported.
``EF_AMDGPU_FEATURE_XNACK_ANY_V4`` 0x100 XNACK can have any value.
``EF_AMDGPU_FEATURE_XNACK_OFF_V4`` 0x200 XNACK disabled.
``EF_AMDGPU_FEATURE_XNACK_ON_V4`` 0x300 XNACK enabled.
@@ -3291,6 +3291,12 @@ The AMDGPU backend uses the following ELF header:
``EF_AMDGPU_FEATURE_SRAMECC_ON_V4`` 0xc00 SRAMECC enabled.
============================================ ===== ===================================
+ For code object V4 and later, the XNACK field describes a selectable mode.
+ Processors with hardwired-on XNACK, such as ``gfx1250``, use
+ ``EF_AMDGPU_FEATURE_XNACK_UNSUPPORTED_V4`` (zero) because they do not support
+ mode selection. Their XNACK behavior is implied by ``EF_AMDGPU_MACH``; a zero
+ XNACK field does not mean replay is disabled on these processors.
+
.. table:: AMDGPU ELF Header ``e_flags`` for Code Object V6 and After
:name: amdgpu-elf-header-e_flags-table-v6-onwards
@@ -3305,7 +3311,7 @@ The AMDGPU backend uses the following ELF header:
``EF_AMDGPU_FEATURE_XNACK_V4`` 0x300 XNACK selection mask for
``EF_AMDGPU_FEATURE_XNACK_*_V4``
values.
- ``EF_AMDGPU_FEATURE_XNACK_UNSUPPORTED_V4`` 0x000 XNACK unsupported.
+ ``EF_AMDGPU_FEATURE_XNACK_UNSUPPORTED_V4`` 0x000 XNACK mode selection unsupported.
``EF_AMDGPU_FEATURE_XNACK_ANY_V4`` 0x100 XNACK can have any value.
``EF_AMDGPU_FEATURE_XNACK_OFF_V4`` 0x200 XNACK disabled.
``EF_AMDGPU_FEATURE_XNACK_ON_V4`` 0x300 XNACK enabled.
diff --git a/llvm/include/llvm/BinaryFormat/ELF.h b/llvm/include/llvm/BinaryFormat/ELF.h
index e530c4d8e08f8..fbb9850d08d2d 100644
--- a/llvm/include/llvm/BinaryFormat/ELF.h
+++ b/llvm/include/llvm/BinaryFormat/ELF.h
@@ -904,7 +904,7 @@ enum : unsigned {
//
// Only valid for ELFOSABI_AMDGPU_HSA and ELFABIVERSION_AMDGPU_HSA_V4.
EF_AMDGPU_FEATURE_XNACK_V4 = 0x300,
- // XNACK is not supported.
+ // XNACK mode selection is not supported.
EF_AMDGPU_FEATURE_XNACK_UNSUPPORTED_V4 = 0x000,
// XNACK is any/default/unspecified.
EF_AMDGPU_FEATURE_XNACK_ANY_V4 = 0x100,
diff --git a/llvm/lib/Target/AMDGPU/MCTargetDesc/AMDGPUTargetStreamer.cpp b/llvm/lib/Target/AMDGPU/MCTargetDesc/AMDGPUTargetStreamer.cpp
index 6b1e58b52f305..4d29955938ecc 100644
--- a/llvm/lib/Target/AMDGPU/MCTargetDesc/AMDGPUTargetStreamer.cpp
+++ b/llvm/lib/Target/AMDGPU/MCTargetDesc/AMDGPUTargetStreamer.cpp
@@ -933,7 +933,11 @@ unsigned AMDGPUTargetELFStreamer::getEFlagsV4() {
EFlagsV4 |= getElfMach(STI.getCPU());
// xnack.
- switch (getTargetID()->getXnackSetting()) {
+ // Hardwired-on XNACK is implied by the processor, not an ELF mode selection.
+ auto XnackSetting = STI.hasFeature(AMDGPU::FeatureXNACKOnOffModes)
+ ? getTargetID()->getXnackSetting()
+ : AMDGPU::TargetIDSetting::Unsupported;
+ switch (XnackSetting) {
case AMDGPU::TargetIDSetting::Unsupported:
EFlagsV4 |= ELF::EF_AMDGPU_FEATURE_XNACK_UNSUPPORTED_V4;
break;
diff --git a/llvm/test/CodeGen/AMDGPU/module-flag-xnack-no-on-off-modes.ll b/llvm/test/CodeGen/AMDGPU/module-flag-xnack-no-on-off-modes.ll
index 18b1f5193acc0..d0986e85e8ec2 100644
--- a/llvm/test/CodeGen/AMDGPU/module-flag-xnack-no-on-off-modes.ll
+++ b/llvm/test/CodeGen/AMDGPU/module-flag-xnack-no-on-off-modes.ll
@@ -16,6 +16,15 @@
; RUN: llc -mtriple=amdgpu12.51-amd-amdhsa < %t/off.ll | FileCheck --check-prefix=CHECK %s
; RUN: llc -mtriple=amdgpu12.51-amd-amdhsa < %t/absent.ll | FileCheck --check-prefix=CHECK %s
+; The ELF field stays zero without changing the replay-safe code above.
+; RUN: llc -mtriple=amdgpu12.50-amd-amdhsa -filetype=obj < %t/on.ll | llvm-readobj --file-headers - | FileCheck --check-prefix=ELF %s
+; RUN: llc -mtriple=amdgpu12.50-amd-amdhsa -filetype=obj < %t/off.ll | llvm-readobj --file-headers - | FileCheck --check-prefix=ELF %s
+; RUN: llc -mtriple=amdgpu12.50-amd-amdhsa -filetype=obj < %t/absent.ll | llvm-readobj --file-headers - | FileCheck --check-prefix=ELF %s
+; RUN: llc -mtriple=amdgpu12.50-amd-amdhsa < %t/absent.ll | llvm-mc -triple=amdgpu12.50-amd-amdhsa -filetype=obj | llvm-readobj --file-headers - | FileCheck --check-prefix=ELF %s
+
+; ELF: Flags [ (0x449)
+; ELF: EF_AMDGPU_FEATURE_SRAMECC_ANY_V4
+
; Module flags are ignored - target ID has no xnack specifier
; CHECK: .amdgcn_target "amdgpu12.5{{[0-1]?}}-amd-amdhsa-unknown-gfx{{12-5-generic|1250|1251}}"
diff --git a/llvm/test/MC/AMDGPU/elf-xnack-hardwired.s b/llvm/test/MC/AMDGPU/elf-xnack-hardwired.s
new file mode 100644
index 0000000000000..f2a948eca4d15
--- /dev/null
+++ b/llvm/test/MC/AMDGPU/elf-xnack-hardwired.s
@@ -0,0 +1,21 @@
+// Hardwired-on XNACK is implied by the processor, not an ELF mode selection.
+// RUN: llvm-mc -triple=amdgpu12.50-amd-amdhsa --amdhsa-code-object-version=4 -filetype=obj %s | llvm-readobj --file-headers - | FileCheck %s -DFLAGS=449
+// RUN: llvm-mc -triple=amdgpu12.50-amd-amdhsa --amdhsa-code-object-version=5 -filetype=obj %s | llvm-readobj --file-headers - | FileCheck %s -DFLAGS=449
+// RUN: llvm-mc -triple=amdgpu12.50-amd-amdhsa --amdhsa-code-object-version=6 -filetype=obj %s | llvm-readobj --file-headers - | FileCheck %s -DFLAGS=449
+// RUN: llvm-mc -triple=amdgpu12.50s-amd-amdhsa --amdhsa-code-object-version=6 -filetype=obj %s | llvm-readobj --file-headers - | FileCheck %s -DFLAGS=4EB
+// RUN: llvm-mc -triple=amdgpu12.51-amd-amdhsa --amdhsa-code-object-version=6 -filetype=obj %s | llvm-readobj --file-headers - | FileCheck %s -DFLAGS=45A
+// RUN: llvm-mc -triple=amdgpu12.5-amd-amdhsa --amdhsa-code-object-version=6 --amdgpu-force-generic-version=1 -filetype=obj %s | llvm-readobj --file-headers - | FileCheck %s -DFLAGS=100045B
+
+// CHECK: Flags [ (0x[[FLAGS]])
+// CHECK: EF_AMDGPU_FEATURE_SRAMECC_ANY_V4
+
+// SRAMECC remains selectable on gfx1250 even though XNACK is hardwired on.
+// RUN: echo '.amdgcn_target "amdgpu12.50-amd-amdhsa--gfx1250:sramecc+"' | llvm-mc -triple=amdgpu12.50-amd-amdhsa --amdhsa-code-object-version=6 -filetype=obj | llvm-readobj --file-headers - | FileCheck %s --check-prefix=SRAMECC-ON
+// RUN: echo '.amdgcn_target "amdgpu12.50-amd-amdhsa--gfx1250:sramecc-"' | llvm-mc -triple=amdgpu12.50-amd-amdhsa --amdhsa-code-object-version=6 -filetype=obj | llvm-readobj --file-headers - | FileCheck %s --check-prefix=SRAMECC-OFF
+
+// SRAMECC-ON: Flags [ (0xC49)
+// SRAMECC-ON: EF_AMDGPU_FEATURE_SRAMECC_ON_V4
+// SRAMECC-OFF: Flags [ (0x849)
+// SRAMECC-OFF: EF_AMDGPU_FEATURE_SRAMECC_OFF_V4
+
+s_endpgm
``````````
</details>
https://github.com/llvm/llvm-project/pull/227740
More information about the llvm-commits
mailing list