[llvm] [DirectX] Generate shader source info part in llc (PR #202761)
Ilia Kuklin via llvm-commits
llvm-commits at lists.llvm.org
Wed Jun 10 07:47:02 PDT 2026
https://github.com/kuilpd updated https://github.com/llvm/llvm-project/pull/202761
>From 714f24c52c76a7ed5d071745e20c17ef05e8cd11 Mon Sep 17 00:00:00 2001
From: Vladislav Dzhidzhoev <vdzhidzhoev at accesssoftek.com>
Date: Sun, 26 Apr 2026 14:16:56 +0200
Subject: [PATCH 1/5] [DirectX] Generate shader source info part in llc
This change modifies DXContainerGlobals pass and DXILMetadataAnalysis
to generate source info (SRCI) part in DXContainer, using information
from dx.source.contants and dx.source.args metadata nodes.
This part is typically generated for debug shader builds.
---
.../llvm/Analysis/DXILMetadataAnalysis.h | 2 +
llvm/include/llvm/BinaryFormat/DXContainer.h | 5 ++
llvm/lib/Analysis/DXILMetadataAnalysis.cpp | 25 +++++++
.../lib/Target/DirectX/DXContainerGlobals.cpp | 21 ++++++
.../ContainerData/Inputs/SourceInfo.ll | 15 +++++
.../DirectX/ContainerData/SourceInfo-Args.ll | 35 ++++++++++
.../ContainerData/SourceInfo-Compressed.ll | 67 +++++++++++++++++++
.../ContainerData/SourceInfo-Uncompressed.ll | 67 +++++++++++++++++++
8 files changed, 237 insertions(+)
create mode 100644 llvm/test/CodeGen/DirectX/ContainerData/Inputs/SourceInfo.ll
create mode 100644 llvm/test/CodeGen/DirectX/ContainerData/SourceInfo-Args.ll
create mode 100644 llvm/test/CodeGen/DirectX/ContainerData/SourceInfo-Compressed.ll
create mode 100644 llvm/test/CodeGen/DirectX/ContainerData/SourceInfo-Uncompressed.ll
diff --git a/llvm/include/llvm/Analysis/DXILMetadataAnalysis.h b/llvm/include/llvm/Analysis/DXILMetadataAnalysis.h
index fe02e72bb84cd..b05a1a94e8339 100644
--- a/llvm/include/llvm/Analysis/DXILMetadataAnalysis.h
+++ b/llvm/include/llvm/Analysis/DXILMetadataAnalysis.h
@@ -11,6 +11,7 @@
#include "llvm/ADT/SmallVector.h"
#include "llvm/IR/PassManager.h"
+#include "llvm/MC/DXContainerInfo.h"
#include "llvm/Pass.h"
#include "llvm/Support/VersionTuple.h"
#include "llvm/TargetParser/Triple.h"
@@ -40,6 +41,7 @@ struct ModuleMetadataInfo {
Triple::EnvironmentType ShaderProfile{Triple::UnknownEnvironment};
VersionTuple ValidatorVersion{};
SmallVector<EntryProperties> EntryPropertyVec{};
+ std::optional<mcdxbc::SourceInfoBuilder> SourceInfo;
LLVM_ABI void print(raw_ostream &OS) const;
};
diff --git a/llvm/include/llvm/BinaryFormat/DXContainer.h b/llvm/include/llvm/BinaryFormat/DXContainer.h
index 84c822ddbd2cb..c13010e0e08c6 100644
--- a/llvm/include/llvm/BinaryFormat/DXContainer.h
+++ b/llvm/include/llvm/BinaryFormat/DXContainer.h
@@ -897,6 +897,11 @@ struct SectionHeader {
sys::swapByteOrder(Flags);
sys::swapByteOrder(Type);
}
+
+ void updateSize(uint32_t ContentSize) {
+ AlignedSizeInBytes =
+ alignTo(sizeof(*this) + ContentSize, DXCONTAINER_STRUCT_ALIGNMENT);
+ }
};
static_assert(sizeof(SectionHeader) == 8,
diff --git a/llvm/lib/Analysis/DXILMetadataAnalysis.cpp b/llvm/lib/Analysis/DXILMetadataAnalysis.cpp
index bd77cba385667..ec29d91ffada7 100644
--- a/llvm/lib/Analysis/DXILMetadataAnalysis.cpp
+++ b/llvm/lib/Analysis/DXILMetadataAnalysis.cpp
@@ -15,6 +15,7 @@
#include "llvm/IR/Metadata.h"
#include "llvm/IR/Module.h"
#include "llvm/InitializePasses.h"
+#include "llvm/Support/Compression.h"
#include "llvm/Support/ErrorHandling.h"
#define DEBUG_TYPE "dxil-metadata-analysis"
@@ -22,6 +23,10 @@
using namespace llvm;
using namespace dxil;
+static StringRef asStringRef(Metadata *S) {
+ return dyn_cast<MDString>(S)->getString();
+}
+
static ModuleMetadataInfo collectMetadataInfo(Module &M) {
ModuleMetadataInfo MMDAI;
const Triple &TT = M.getTargetTriple();
@@ -37,6 +42,26 @@ static ModuleMetadataInfo collectMetadataInfo(Module &M) {
VersionTuple(MajorMD->getZExtValue(), MinorMD->getZExtValue());
}
+ NamedMDNode *ContentsNode = M.getNamedMetadata("dx.source.contents");
+ NamedMDNode *ArgsNode = M.getNamedMetadata("dx.source.args");
+ // TODO Don't emit SRCI in cases when it is not emitted in
+ // DirectXShaderCompiler.
+ // TODO should we remove dx.source.contents/args?
+ if (ContentsNode && ArgsNode) {
+ MMDAI.SourceInfo.emplace();
+ MMDAI.SourceInfo->setCompressionType(
+ compression::zlib::isAvailable()
+ ? dxbc::SourceInfo::Contents::CompressionType::Zlib
+ : dxbc::SourceInfo::Contents::CompressionType::None);
+ for (Metadata *FileInfoNode : ContentsNode->operands()) {
+ auto *FileInfo = dyn_cast<MDTuple>(FileInfoNode);
+ MMDAI.SourceInfo->addFile(asStringRef(FileInfo->getOperand(0)),
+ asStringRef(FileInfo->getOperand(1)));
+ }
+ for (Metadata *ArgNode : ArgsNode->getOperand(0)->operands())
+ MMDAI.SourceInfo->addArg(asStringRef(ArgNode), "");
+ }
+
// For all HLSL Shader functions
for (auto &F : M.functions()) {
if (!F.hasFnAttribute("hlsl.shader"))
diff --git a/llvm/lib/Target/DirectX/DXContainerGlobals.cpp b/llvm/lib/Target/DirectX/DXContainerGlobals.cpp
index 9a68961473dbd..858cce75877ac 100644
--- a/llvm/lib/Target/DirectX/DXContainerGlobals.cpp
+++ b/llvm/lib/Target/DirectX/DXContainerGlobals.cpp
@@ -26,6 +26,7 @@
#include "llvm/MC/DXContainerInfo.h"
#include "llvm/MC/DXContainerPSVInfo.h"
#include "llvm/Pass.h"
+#include "llvm/Support/Compression.h"
#include "llvm/Support/MD5.h"
#include "llvm/TargetParser/Triple.h"
#include "llvm/Transforms/Utils/ModuleUtils.h"
@@ -54,6 +55,7 @@ class DXContainerGlobals : public llvm::ModulePass {
void addPipelineStateValidationInfo(Module &M,
SmallVector<GlobalValue *> &Globals);
void addCompilerVersion(Module &M, SmallVector<GlobalValue *> &Globals);
+ void addSourceInfo(Module &M, SmallVector<GlobalValue *> &Globals);
public:
static char ID; // Pass identification, replacement for typeid
@@ -85,6 +87,7 @@ bool DXContainerGlobals::runOnModule(Module &M) {
addRootSignature(M, Globals);
addPipelineStateValidationInfo(M, Globals);
addCompilerVersion(M, Globals);
+ addSourceInfo(M, Globals);
appendToCompilerUsed(M, Globals);
return true;
}
@@ -352,6 +355,24 @@ void DXContainerGlobals::addCompilerVersion(
addSection(M, Globals, Data, "dx.vers", "VERS");
}
+void DXContainerGlobals::addSourceInfo(Module &M,
+ SmallVector<GlobalValue *> &Globals) {
+ dxil::ModuleMetadataInfo &MMI =
+ getAnalysis<DXILMetadataAnalysisWrapperPass>().getModuleMetadata();
+
+ if (!MMI.SourceInfo)
+ return;
+
+ MMI.SourceInfo->computeEntries();
+ MMI.SourceInfo->finalize();
+ SmallString<256> Data;
+ raw_svector_ostream OS(Data);
+ MMI.SourceInfo->write(OS);
+ Constant *Constant =
+ ConstantDataArray::getString(M.getContext(), Data, /*AddNull*/ false);
+ Globals.emplace_back(buildContainerGlobal(M, Constant, "dx.srci", "SRCI"));
+}
+
char DXContainerGlobals::ID = 0;
INITIALIZE_PASS_BEGIN(DXContainerGlobals, "dxil-globals",
"DXContainer Global Emitter", false, true)
diff --git a/llvm/test/CodeGen/DirectX/ContainerData/Inputs/SourceInfo.ll b/llvm/test/CodeGen/DirectX/ContainerData/Inputs/SourceInfo.ll
new file mode 100644
index 0000000000000..74a7c0063c947
--- /dev/null
+++ b/llvm/test/CodeGen/DirectX/ContainerData/Inputs/SourceInfo.ll
@@ -0,0 +1,15 @@
+target triple = "dxilv1.3-pc-shadermodel6.3-library"
+
+define float @_Z3fooff(float %a, float %b) {
+entry:
+ %add = fadd float %a, %b
+ ret float %add
+}
+
+!dx.source.args = !{!0}
+!dx.source.contents = !{!1, !2, !3}
+
+!0 = !{!"-g", !"-Tlib_6_3", !"-DUSER_DEF0=42", !"-DUSER_DEF1=43", !"C:\\\\dx-source-metadata.hlsl"}
+!1 = !{!"C:\\dx-source-metadata.hlsl", !"#include \22a.hlsl\22\0A#include \22b.hlsl\22\0A\0Afloat foo(float a, float b) {\0A return a + b;\0A}\0A"}
+!2 = !{!"C:\\a.hlsl", !"#include \22b.hlsl\22\0A"}
+!3 = !{!"C:\\b.hlsl", !"#include <c.hlsl>\0A"}
diff --git a/llvm/test/CodeGen/DirectX/ContainerData/SourceInfo-Args.ll b/llvm/test/CodeGen/DirectX/ContainerData/SourceInfo-Args.ll
new file mode 100644
index 0000000000000..9b22812e212df
--- /dev/null
+++ b/llvm/test/CodeGen/DirectX/ContainerData/SourceInfo-Args.ll
@@ -0,0 +1,35 @@
+; RUN: llc %S/Inputs/SourceInfo.ll --filetype=obj -o - | obj2yaml | FileCheck %s --check-prefix=DXC
+
+; DXC: - Name: SRCI
+; DXC: SourceInfo:
+; DXC: Header:
+; DXC: Flags: 0
+; DXC: SectionCount: 3
+; DXC: Names:
+; DXC: SectionHeader:
+; DXC: Header:
+; DXC: Entries:
+; DXC: Contents:
+; DXC: SectionHeader:
+; DXC: Header:
+; DXC: Entries:
+; DXC: Args:
+; DXC-NEXT: SectionHeader:
+; DXC-NEXT: AlignedSizeInBytes: 96
+; DXC-NEXT: Flags: 0
+; DXC-NEXT: Type: Args
+; DXC-NEXT: Header:
+; DXC-NEXT: Flags: 0
+; DXC-NEXT: SizeInBytes: 76
+; DXC-NEXT: Count: 5
+; DXC-NEXT: Args:
+; DXC-NEXT: - Arg: '-g'
+; DXC-NEXT: Value: ''
+; DXC-NEXT: - Arg: '-Tlib_6_3'
+; DXC-NEXT: Value: ''
+; DXC-NEXT: - Arg: '-DUSER_DEF0=42'
+; DXC-NEXT: Value: ''
+; DXC-NEXT: - Arg: '-DUSER_DEF1=43'
+; DXC-NEXT: Value: ''
+; DXC-NEXT: - Arg: 'C:\\dx-source-metadata.hlsl'
+; DXC-NEXT: Value: ''
diff --git a/llvm/test/CodeGen/DirectX/ContainerData/SourceInfo-Compressed.ll b/llvm/test/CodeGen/DirectX/ContainerData/SourceInfo-Compressed.ll
new file mode 100644
index 0000000000000..1d7e39fb77ff2
--- /dev/null
+++ b/llvm/test/CodeGen/DirectX/ContainerData/SourceInfo-Compressed.ll
@@ -0,0 +1,67 @@
+; RUN: opt %S/Inputs/SourceInfo.ll -dxil-embed -dxil-globals -S -o - | FileCheck %s
+; RUN: llc %S/Inputs/SourceInfo.ll --filetype=obj -o - | obj2yaml | FileCheck %s --check-prefix=DXC
+; REQUIRES: zlib
+
+; CHECK: @dx.srci = private constant [348 x i8] c"{{.*}}", section "SRCI", align 4
+
+; DXC: - Name: SRCI
+; DXC-NEXT: Size: 348
+; DXC-NEXT: SourceInfo:
+; DXC-NEXT: Header:
+; DXC-NEXT: AlignedSizeInBytes: 348
+; DXC-NEXT: Flags: 0
+; DXC-NEXT: SectionCount: 3
+; DXC-NEXT: Names:
+; DXC-NEXT: SectionHeader:
+; DXC-NEXT: AlignedSizeInBytes: 120
+; DXC-NEXT: Flags: 0
+; DXC-NEXT: Type: SourceNames
+; DXC-NEXT: Header:
+; DXC-NEXT: Flags: 0
+; DXC-NEXT: Count: 3
+; DXC-NEXT: EntriesSizeInBytes: 100
+; DXC-NEXT: Entries:
+; DXC-NEXT: - AlignedSizeInBytes: 44
+; DXC-NEXT: Flags: 0
+; DXC-NEXT: NameSizeInBytes: 27
+; DXC-NEXT: ContentSizeInBytes: 86
+; DXC-NEXT: FileName: 'C:\dx-source-metadata.hlsl'
+; DXC-NEXT: - AlignedSizeInBytes: 28
+; DXC-NEXT: Flags: 0
+; DXC-NEXT: NameSizeInBytes: 10
+; DXC-NEXT: ContentSizeInBytes: 19
+; DXC-NEXT: FileName: 'C:\a.hlsl'
+; DXC-NEXT: - AlignedSizeInBytes: 28
+; DXC-NEXT: Flags: 0
+; DXC-NEXT: NameSizeInBytes: 10
+; DXC-NEXT: ContentSizeInBytes: 19
+; DXC-NEXT: FileName: 'C:\b.hlsl'
+; DXC-NEXT: Contents:
+; DXC-NEXT: SectionHeader:
+; DXC-NEXT: AlignedSizeInBytes: 124
+; DXC-NEXT: Flags: 0
+; DXC-NEXT: Type: SourceContents
+; DXC-NEXT: Header:
+; DXC-NEXT: AlignedSizeInBytes: 116
+; DXC-NEXT: Flags: 0
+; DXC-NEXT: Type: Zlib
+; DXC-NEXT: EntriesSizeInBytes: 96
+; DXC-NEXT: UncompressedEntriesSizeInBytes: 164
+; DXC-NEXT: Count: 3
+; DXC-NEXT: Entries:
+; DXC-NEXT: - AlignedSizeInBytes: 100
+; DXC-NEXT: Flags: 0
+; DXC-NEXT: ContentSizeInBytes: 86
+; DXC-NEXT: FileContent: "#include \"a.hlsl\"\n#include \"b.hlsl\"\n\nfloat foo(float a, float b) {\n return a + b;\n}\n"
+; DXC-NEXT: - AlignedSizeInBytes: 32
+; DXC-NEXT: Flags: 0
+; DXC-NEXT: ContentSizeInBytes: 19
+; DXC-NEXT: FileContent: "#include \"b.hlsl\"\n"
+; DXC-NEXT: - AlignedSizeInBytes: 32
+; DXC-NEXT: Flags: 0
+; DXC-NEXT: ContentSizeInBytes: 19
+; DXC-NEXT: FileContent: "#include <c.hlsl>\n"
+; DXC-NEXT: Args:
+; DXC: SectionHeader:
+; DXC: Header:
+; DXC: Args:
diff --git a/llvm/test/CodeGen/DirectX/ContainerData/SourceInfo-Uncompressed.ll b/llvm/test/CodeGen/DirectX/ContainerData/SourceInfo-Uncompressed.ll
new file mode 100644
index 0000000000000..e5c83193e5814
--- /dev/null
+++ b/llvm/test/CodeGen/DirectX/ContainerData/SourceInfo-Uncompressed.ll
@@ -0,0 +1,67 @@
+; RUN: opt %S/Inputs/SourceInfo.ll -dxil-embed -dxil-globals -S -o - | FileCheck %s
+; RUN: llc %S/Inputs/SourceInfo.ll --filetype=obj -o - | obj2yaml | FileCheck %s --check-prefix=DXC
+; REQUIRES: !zlib
+
+; CHECK: @dx.srci = private constant [416 x i8] c"{{.*}}", section "SRCI", align 4
+
+; DXC: - Name: SRCI
+; DXC-NEXT: Size: 416
+; DXC-NEXT: SourceInfo:
+; DXC-NEXT: Header:
+; DXC-NEXT: AlignedSizeInBytes: 416
+; DXC-NEXT: Flags: 0
+; DXC-NEXT: SectionCount: 3
+; DXC-NEXT: Names:
+; DXC-NEXT: SectionHeader:
+; DXC-NEXT: AlignedSizeInBytes: 120
+; DXC-NEXT: Flags: 0
+; DXC-NEXT: Type: SourceNames
+; DXC-NEXT: Header:
+; DXC-NEXT: Flags: 0
+; DXC-NEXT: Count: 3
+; DXC-NEXT: EntriesSizeInBytes: 100
+; DXC-NEXT: Entries:
+; DXC-NEXT: - AlignedSizeInBytes: 44
+; DXC-NEXT: Flags: 0
+; DXC-NEXT: NameSizeInBytes: 27
+; DXC-NEXT: ContentSizeInBytes: 86
+; DXC-NEXT: FileName: 'C:\dx-source-metadata.hlsl'
+; DXC-NEXT: - AlignedSizeInBytes: 28
+; DXC-NEXT: Flags: 0
+; DXC-NEXT: NameSizeInBytes: 10
+; DXC-NEXT: ContentSizeInBytes: 19
+; DXC-NEXT: FileName: 'C:\a.hlsl'
+; DXC-NEXT: - AlignedSizeInBytes: 28
+; DXC-NEXT: Flags: 0
+; DXC-NEXT: NameSizeInBytes: 10
+; DXC-NEXT: ContentSizeInBytes: 19
+; DXC-NEXT: FileName: 'C:\b.hlsl'
+; DXC-NEXT: Contents:
+; DXC-NEXT: SectionHeader:
+; DXC-NEXT: AlignedSizeInBytes: 192
+; DXC-NEXT: Flags: 0
+; DXC-NEXT: Type: SourceContents
+; DXC-NEXT: Header:
+; DXC-NEXT: AlignedSizeInBytes: 184
+; DXC-NEXT: Flags: 0
+; DXC-NEXT: Type: None
+; DXC-NEXT: EntriesSizeInBytes: 164
+; DXC-NEXT: UncompressedEntriesSizeInBytes: 164
+; DXC-NEXT: Count: 3
+; DXC-NEXT: Entries:
+; DXC-NEXT: - AlignedSizeInBytes: 100
+; DXC-NEXT: Flags: 0
+; DXC-NEXT: ContentSizeInBytes: 86
+; DXC-NEXT: FileContent: "#include \"a.hlsl\"\n#include \"b.hlsl\"\n\nfloat foo(float a, float b) {\n return a + b;\n}\n"
+; DXC-NEXT: - AlignedSizeInBytes: 32
+; DXC-NEXT: Flags: 0
+; DXC-NEXT: ContentSizeInBytes: 19
+; DXC-NEXT: FileContent: "#include \"b.hlsl\"\n"
+; DXC-NEXT: - AlignedSizeInBytes: 32
+; DXC-NEXT: Flags: 0
+; DXC-NEXT: ContentSizeInBytes: 19
+; DXC-NEXT: FileContent: "#include <c.hlsl>\n"
+; DXC-NEXT: Args:
+; DXC: SectionHeader:
+; DXC: Header:
+; DXC: Args:
>From 860801e775cf3dd0371d859d493e05c13d73c00a Mon Sep 17 00:00:00 2001
From: Ilia Kuklin <ikuklin at accesssoftek.com>
Date: Tue, 9 Jun 2026 23:56:49 +0500
Subject: [PATCH 2/5] Expand tests
---
.../CodeGen/DirectX/ContainerData/Inputs/SourceInfo.ll | 7 +++++++
llvm/test/CodeGen/DirectX/embed-ildb.ll | 6 +++++-
2 files changed, 12 insertions(+), 1 deletion(-)
diff --git a/llvm/test/CodeGen/DirectX/ContainerData/Inputs/SourceInfo.ll b/llvm/test/CodeGen/DirectX/ContainerData/Inputs/SourceInfo.ll
index 74a7c0063c947..11113b8988cae 100644
--- a/llvm/test/CodeGen/DirectX/ContainerData/Inputs/SourceInfo.ll
+++ b/llvm/test/CodeGen/DirectX/ContainerData/Inputs/SourceInfo.ll
@@ -6,6 +6,9 @@ entry:
ret float %add
}
+!llvm.dbg.cu = !{!4}
+!llvm.module.flags = !{!6, !7}
+
!dx.source.args = !{!0}
!dx.source.contents = !{!1, !2, !3}
@@ -13,3 +16,7 @@ entry:
!1 = !{!"C:\\dx-source-metadata.hlsl", !"#include \22a.hlsl\22\0A#include \22b.hlsl\22\0A\0Afloat foo(float a, float b) {\0A return a + b;\0A}\0A"}
!2 = !{!"C:\\a.hlsl", !"#include \22b.hlsl\22\0A"}
!3 = !{!"C:\\b.hlsl", !"#include <c.hlsl>\0A"}
+!4 = distinct !DICompileUnit(language: DW_LANG_C99, file: !5, emissionKind: FullDebug)
+!5 = !DIFile(filename: "dx-source-metadata.hlsl", directory: "C:\\")
+!6 = !{i32 2, !"Dwarf Version", i32 4}
+!7 = !{i32 2, !"Debug Info Version", i32 3}
diff --git a/llvm/test/CodeGen/DirectX/embed-ildb.ll b/llvm/test/CodeGen/DirectX/embed-ildb.ll
index 1f4289f3b725e..ee9700df40c2c 100644
--- a/llvm/test/CodeGen/DirectX/embed-ildb.ll
+++ b/llvm/test/CodeGen/DirectX/embed-ildb.ll
@@ -31,10 +31,11 @@ define i32 @add(i32 %a, i32 %b) {
!7 = !{!"hlsl.hlsl"}
!8 = !{!"-T", !"lib_6_5", !"-g", !"hlsl.hlsl"}
-; Check that both parts are emitted as a GV and used by the compiler.
+; Check that DXIL, ILDB and SRCI parts are emitted as a GV and used by the compiler.
; CHECK: @dx.ildb = private constant [[BC_TYPE:\[[0-9]+ x i8\]]] c"BC\C0\DE{{[^"]+}}", section "ILDB", align 4
; CHECK: @dx.dxil = private constant [[BC_TYPE:\[[0-9]+ x i8\]]] c"BC\C0\DE{{[^"]+}}", section "DXIL", align 4
+; CHECK: @dx.srci = private constant {{\[[0-9]+ x i8\]}}
; CHECK: @llvm.compiler.used = appending global {{\[[0-9]+ x ptr\]}} [ptr @dx.ildb, ptr @dx.dxil
; This is using regex matches on some sizes, offsets and fields. These are all
@@ -79,6 +80,9 @@ define i32 @add(i32 %a, i32 %b) {
; YAML-NEXT: DXILSize: [[#DXILSIZE - 24]]
; YAML-NEXT: DXIL: [ 0x42, 0x43, 0xC0, 0xDE,
+; Check that despite dx.source is stripped from DXIL, SRCI is still emitted:
+; YAML: - Name: SRCI
+
; Check that ILDB has the debug info, and DXIL does not:
; ILDB-DIS: define i32 @add(i32 %a, i32 %b)
>From d8fb484eaca8a5a12d6a2c03479e9d3801f0e3fc Mon Sep 17 00:00:00 2001
From: Ilia Kuklin <ikuklin at accesssoftek.com>
Date: Wed, 10 Jun 2026 00:59:22 +0500
Subject: [PATCH 3/5] Remove comments
---
llvm/lib/Analysis/DXILMetadataAnalysis.cpp | 3 ---
1 file changed, 3 deletions(-)
diff --git a/llvm/lib/Analysis/DXILMetadataAnalysis.cpp b/llvm/lib/Analysis/DXILMetadataAnalysis.cpp
index ec29d91ffada7..8dde71b64af08 100644
--- a/llvm/lib/Analysis/DXILMetadataAnalysis.cpp
+++ b/llvm/lib/Analysis/DXILMetadataAnalysis.cpp
@@ -44,9 +44,6 @@ static ModuleMetadataInfo collectMetadataInfo(Module &M) {
NamedMDNode *ContentsNode = M.getNamedMetadata("dx.source.contents");
NamedMDNode *ArgsNode = M.getNamedMetadata("dx.source.args");
- // TODO Don't emit SRCI in cases when it is not emitted in
- // DirectXShaderCompiler.
- // TODO should we remove dx.source.contents/args?
if (ContentsNode && ArgsNode) {
MMDAI.SourceInfo.emplace();
MMDAI.SourceInfo->setCompressionType(
>From 0b1251e7e166450c5f207a087d3bb4658810685e Mon Sep 17 00:00:00 2001
From: Ilia Kuklin <ikuklin at accesssoftek.com>
Date: Wed, 10 Jun 2026 18:47:20 +0500
Subject: [PATCH 4/5] Adjust casting code
---
llvm/lib/Analysis/DXILMetadataAnalysis.cpp | 13 +++++--------
1 file changed, 5 insertions(+), 8 deletions(-)
diff --git a/llvm/lib/Analysis/DXILMetadataAnalysis.cpp b/llvm/lib/Analysis/DXILMetadataAnalysis.cpp
index 8dde71b64af08..ebde35accd7eb 100644
--- a/llvm/lib/Analysis/DXILMetadataAnalysis.cpp
+++ b/llvm/lib/Analysis/DXILMetadataAnalysis.cpp
@@ -23,10 +23,6 @@
using namespace llvm;
using namespace dxil;
-static StringRef asStringRef(Metadata *S) {
- return dyn_cast<MDString>(S)->getString();
-}
-
static ModuleMetadataInfo collectMetadataInfo(Module &M) {
ModuleMetadataInfo MMDAI;
const Triple &TT = M.getTargetTriple();
@@ -51,12 +47,13 @@ static ModuleMetadataInfo collectMetadataInfo(Module &M) {
? dxbc::SourceInfo::Contents::CompressionType::Zlib
: dxbc::SourceInfo::Contents::CompressionType::None);
for (Metadata *FileInfoNode : ContentsNode->operands()) {
- auto *FileInfo = dyn_cast<MDTuple>(FileInfoNode);
- MMDAI.SourceInfo->addFile(asStringRef(FileInfo->getOperand(0)),
- asStringRef(FileInfo->getOperand(1)));
+ auto *FileInfo = cast<MDTuple>(FileInfoNode);
+ MMDAI.SourceInfo->addFile(
+ cast<MDString>(FileInfo->getOperand(0))->getString(),
+ cast<MDString>(FileInfo->getOperand(1))->getString());
}
for (Metadata *ArgNode : ArgsNode->getOperand(0)->operands())
- MMDAI.SourceInfo->addArg(asStringRef(ArgNode), "");
+ MMDAI.SourceInfo->addArg(cast<MDString>(ArgNode)->getString(), "");
}
// For all HLSL Shader functions
>From ced2985249bcae52e8cbab81783f563982356d93 Mon Sep 17 00:00:00 2001
From: Ilia Kuklin <ikuklin at accesssoftek.com>
Date: Wed, 10 Jun 2026 19:40:54 +0500
Subject: [PATCH 5/5] Add -compress-srci option to `opt`
---
llvm/lib/Analysis/DXILMetadataAnalysis.cpp | 24 +++++++++++++++----
.../ContainerData/SourceInfo-Uncompressed.ll | 5 ++--
2 files changed, 22 insertions(+), 7 deletions(-)
diff --git a/llvm/lib/Analysis/DXILMetadataAnalysis.cpp b/llvm/lib/Analysis/DXILMetadataAnalysis.cpp
index ebde35accd7eb..d2ccb6d55de5a 100644
--- a/llvm/lib/Analysis/DXILMetadataAnalysis.cpp
+++ b/llvm/lib/Analysis/DXILMetadataAnalysis.cpp
@@ -15,6 +15,7 @@
#include "llvm/IR/Metadata.h"
#include "llvm/IR/Module.h"
#include "llvm/InitializePasses.h"
+#include "llvm/Support/CommandLine.h"
#include "llvm/Support/Compression.h"
#include "llvm/Support/ErrorHandling.h"
@@ -23,6 +24,16 @@
using namespace llvm;
using namespace dxil;
+cl::OptionCategory DXContainerCategory("DXContainer Options");
+static cl::opt<dxbc::SourceInfo::Contents::CompressionType> CompressSRCI(
+ "compress-srci", cl::ValueOptional,
+ cl::desc("Choose SCRI part compression:"),
+ cl::values(clEnumValN(dxbc::SourceInfo::Contents::CompressionType::None,
+ "none", "No compression"),
+ clEnumValN(dxbc::SourceInfo::Contents::CompressionType::Zlib,
+ "zlib", "Use zlib")),
+ cl::cat(DXContainerCategory));
+
static ModuleMetadataInfo collectMetadataInfo(Module &M) {
ModuleMetadataInfo MMDAI;
const Triple &TT = M.getTargetTriple();
@@ -42,10 +53,15 @@ static ModuleMetadataInfo collectMetadataInfo(Module &M) {
NamedMDNode *ArgsNode = M.getNamedMetadata("dx.source.args");
if (ContentsNode && ArgsNode) {
MMDAI.SourceInfo.emplace();
- MMDAI.SourceInfo->setCompressionType(
- compression::zlib::isAvailable()
- ? dxbc::SourceInfo::Contents::CompressionType::Zlib
- : dxbc::SourceInfo::Contents::CompressionType::None);
+ if (CompressSRCI.getNumOccurrences() > 0) {
+ MMDAI.SourceInfo->setCompressionType(CompressSRCI);
+ } else {
+ // If the option is not specified, pick zlib if available.
+ MMDAI.SourceInfo->setCompressionType(
+ compression::zlib::isAvailable()
+ ? dxbc::SourceInfo::Contents::CompressionType::Zlib
+ : dxbc::SourceInfo::Contents::CompressionType::None);
+ }
for (Metadata *FileInfoNode : ContentsNode->operands()) {
auto *FileInfo = cast<MDTuple>(FileInfoNode);
MMDAI.SourceInfo->addFile(
diff --git a/llvm/test/CodeGen/DirectX/ContainerData/SourceInfo-Uncompressed.ll b/llvm/test/CodeGen/DirectX/ContainerData/SourceInfo-Uncompressed.ll
index e5c83193e5814..df42386f1c418 100644
--- a/llvm/test/CodeGen/DirectX/ContainerData/SourceInfo-Uncompressed.ll
+++ b/llvm/test/CodeGen/DirectX/ContainerData/SourceInfo-Uncompressed.ll
@@ -1,6 +1,5 @@
-; RUN: opt %S/Inputs/SourceInfo.ll -dxil-embed -dxil-globals -S -o - | FileCheck %s
-; RUN: llc %S/Inputs/SourceInfo.ll --filetype=obj -o - | obj2yaml | FileCheck %s --check-prefix=DXC
-; REQUIRES: !zlib
+; RUN: opt %S/Inputs/SourceInfo.ll -compress-srci=none -dxil-embed -dxil-globals -S -o - | FileCheck %s
+; RUN: llc %S/Inputs/SourceInfo.ll -compress-srci=none --filetype=obj -o - | obj2yaml | FileCheck %s --check-prefix=DXC
; CHECK: @dx.srci = private constant [416 x i8] c"{{.*}}", section "SRCI", align 4
More information about the llvm-commits
mailing list