[llvm] [DirectX] Warn when !llvm.ident is missing during metadata translation (PR #215081)
Niyati Jain via llvm-commits
llvm-commits at lists.llvm.org
Sun Aug 9 02:04:36 PDT 2026
https://github.com/niy-ati created https://github.com/llvm/llvm-project/pull/215081
!llvm.ident is a frontend requirement for the DirectX target: Clang and DXC always emit it, and certain hardware drivers (e.g. NVIDIA RTX series) depend on its presence during CreateComputePipelineState. Without it, DXIL containers can pass dxv validation cleanly while causing runtime driver crashes during PSO creation.
DXILTranslateMetadata currently passes !llvm.ident through when present via CompatibleNamedModuleMDs. This patch adds a diagnostic warning when !llvm.ident is absent to alert frontend authors targeting DXIL.
### Changes
- Emits a diagnostic warning in DXILTranslateMetadata if !llvm.ident is missing from the module.
- Adds lit test coverage in llvm/test/CodeGen/DirectX/Metadata/llvm-ident.ll.
>From adbe09dcc68210f3f45125d2fa91d365caa12ee6 Mon Sep 17 00:00:00 2001
From: Niyati Jain <niyati.jainn15 at gmail.com>
Date: Wed, 29 Jul 2026 14:27:37 +0530
Subject: [PATCH] [DirectX] Warn when !llvm.ident is missing in
dxil-translate-metadata
!llvm.ident is a frontend contract: Clang and DXC always emit it, and
D3D12 drivers expect it for some pipeline state operations (e.g.
CreateComputePipelineState on certain NVIDIA hardware).
dxil-translate-metadata already preserves frontend-emitted !llvm.ident
via CompatibleNamedModuleMDs. Add an explicit DS_Warning when the
metadata is absent so that toolchain authors (e.g. LDC, custom
frontends) get a clear signal that their frontend needs to supply it,
rather than silently producing a container that may fail at runtime.
Add a lit test covering both cases:
- frontend emits !llvm.ident -> preserved verbatim, no warning
- frontend omits !llvm.ident -> warning emitted
---
.../Target/DirectX/DXILTranslateMetadata.cpp | 7 ++++
.../CodeGen/DirectX/Metadata/llvm-ident.ll | 35 +++++++++++++++++++
2 files changed, 42 insertions(+)
create mode 100644 llvm/test/CodeGen/DirectX/Metadata/llvm-ident.ll
diff --git a/llvm/lib/Target/DirectX/DXILTranslateMetadata.cpp b/llvm/lib/Target/DirectX/DXILTranslateMetadata.cpp
index 49a20e2f7517a..a46b453f34ced 100644
--- a/llvm/lib/Target/DirectX/DXILTranslateMetadata.cpp
+++ b/llvm/lib/Target/DirectX/DXILTranslateMetadata.cpp
@@ -535,6 +535,13 @@ static void translateGlobalMetadata(Module &M, DXILResourceMap &DRM,
emitValidatorVersionMD(M, MMDI);
emitShaderModelVersionMD(M, MMDI);
emitDXILVersionTupleMD(M, MMDI);
+
+ // !llvm.ident is a frontend responsibility (Clang/DXC/LDC emits it).
+ // Warn if the frontend forgot to emit it; do not synthesize one here.
+ if (!M.getNamedMetadata("llvm.ident"))
+ reportError(M, "missing !llvm.ident metadata; frontend should emit it",
+ DS_Warning);
+
NamedMDNode *NamedResourceMD = emitResourceMetadata(M, DRM, DRTM);
auto *ResourceMD =
(NamedResourceMD != nullptr) ? NamedResourceMD->getOperand(0) : nullptr;
diff --git a/llvm/test/CodeGen/DirectX/Metadata/llvm-ident.ll b/llvm/test/CodeGen/DirectX/Metadata/llvm-ident.ll
new file mode 100644
index 0000000000000..b493929ba30fc
--- /dev/null
+++ b/llvm/test/CodeGen/DirectX/Metadata/llvm-ident.ll
@@ -0,0 +1,35 @@
+; RUN: split-file %s %t
+; RUN: opt -S --dxil-translate-metadata %t/present.ll 2>&1 | FileCheck %t/present.ll
+; RUN: opt -S --dxil-translate-metadata %t/missing.ll 2>&1 | FileCheck %t/missing.ll
+
+; Test that !llvm.ident is preserved when a frontend emits it, and that
+; a warning is produced when it is absent.
+
+;--- present.ll
+
+; CHECK-NOT: missing !llvm.ident
+; CHECK-DAG: !llvm.ident = !{![[#IDENT:]]}
+; CHECK-DAG: ![[#IDENT]] = !{!"frontend v1.0"}
+
+target triple = "dxil-pc-shadermodel6.6-compute"
+
+define void @CSMain() #0 {
+ ret void
+}
+
+attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" }
+
+!llvm.ident = !{!0}
+!0 = !{!"frontend v1.0"}
+
+;--- missing.ll
+
+; CHECK: warning: {{.*}}missing !llvm.ident metadata; frontend should emit it
+
+target triple = "dxil-pc-shadermodel6.6-compute"
+
+define void @CSMain() #0 {
+ ret void
+}
+
+attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" }
More information about the llvm-commits
mailing list