[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