[llvm-branch-commits] [llvm] [HLSL] Add descriptor table metadata parsing (PR #142492)
via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Tue Jun 3 11:40:39 PDT 2025
https://github.com/joaosaffran updated https://github.com/llvm/llvm-project/pull/142492
>From 3e6b07e119988058defd305199ad3e08d424eebd Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Mon, 2 Jun 2025 19:36:32 +0000
Subject: [PATCH 1/5] add parsing
---
.../BinaryFormat/DXContainerConstants.def | 11 ++
llvm/lib/Target/DirectX/DXILRootSignature.cpp | 176 ++++++++++++++++++
llvm/lib/Target/DirectX/DXILRootSignature.h | 3 +-
3 files changed, 189 insertions(+), 1 deletion(-)
diff --git a/llvm/include/llvm/BinaryFormat/DXContainerConstants.def b/llvm/include/llvm/BinaryFormat/DXContainerConstants.def
index 501ef0c31cdd0..fa66450c563c4 100644
--- a/llvm/include/llvm/BinaryFormat/DXContainerConstants.def
+++ b/llvm/include/llvm/BinaryFormat/DXContainerConstants.def
@@ -98,6 +98,17 @@ DESCRIPTOR_RANGE_FLAG(16, DESCRIPTORS_STATIC_KEEPING_BUFFER_BOUNDS_CHECKS)
#undef DESCRIPTOR_RANGE_FLAG
#endif // DESCRIPTOR_RANGE_FLAG
+// DESCRIPTOR_RANGE(value, name).
+#ifdef DESCRIPTOR_RANGE
+ DESCRIPTOR_RANGE(4, ERROR)
+ DESCRIPTOR_RANGE(0, SRV)
+ DESCRIPTOR_RANGE(1, UAV)
+ DESCRIPTOR_RANGE(2, CBV)
+ DESCRIPTOR_RANGE(3, Sampler)
+DESCRIPTOR_RANGE(0, NONE)
+#undef DESCRIPTOR_RANGE
+#endif // DESCRIPTOR_RANGE
+
#ifdef ROOT_PARAMETER
ROOT_PARAMETER(0, DescriptorTable)
diff --git a/llvm/lib/Target/DirectX/DXILRootSignature.cpp b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
index 878272537d366..a14a9fdce5cbd 100644
--- a/llvm/lib/Target/DirectX/DXILRootSignature.cpp
+++ b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
@@ -12,6 +12,7 @@
//===----------------------------------------------------------------------===//
#include "DXILRootSignature.h"
#include "DirectX.h"
+#include "llvm/ADT/STLForwardCompat.h"
#include "llvm/ADT/StringSwitch.h"
#include "llvm/ADT/Twine.h"
#include "llvm/Analysis/DXILMetadataAnalysis.h"
@@ -27,6 +28,7 @@
#include "llvm/Support/Error.h"
#include "llvm/Support/ErrorHandling.h"
#include "llvm/Support/raw_ostream.h"
+#include <cstddef>
#include <cstdint>
#include <optional>
#include <utility>
@@ -166,6 +168,88 @@ static bool parseRootDescriptors(LLVMContext *Ctx,
return false;
}
+static bool parseDescriptorRange(LLVMContext *Ctx,
+ mcdxbc::RootSignatureDesc &RSD,
+ mcdxbc::DescriptorTable &Table,
+ MDNode *RangeDescriptorNode) {
+
+ if (RangeDescriptorNode->getNumOperands() != 6)
+ return reportError(Ctx, "Invalid format for Descriptor Range");
+
+ dxbc::RTS0::v2::DescriptorRange Range;
+
+ std::optional<StringRef> ElementText =
+ extractMdStringValue(RangeDescriptorNode, 0);
+
+ if (!ElementText.has_value())
+ return reportError(Ctx, "Descriptor Range, first element is not a string.");
+
+ Range.RangeType =
+ StringSwitch<uint32_t>(*ElementText)
+ .Case("CBV", llvm::to_underlying(dxbc::DescriptorRangeType::CBV))
+ .Case("SRV", llvm::to_underlying(dxbc::DescriptorRangeType::SRV))
+ .Case("UAV", llvm::to_underlying(dxbc::DescriptorRangeType::UAV))
+ .Case("Sampler",
+ llvm::to_underlying(dxbc::DescriptorRangeType::Sampler))
+ .Default(llvm::to_underlying(dxbc::DescriptorRangeType::ERROR));
+
+ if (std::optional<uint32_t> Val = extractMdIntValue(RangeDescriptorNode, 1))
+ Range.NumDescriptors = *Val;
+ else
+ return reportError(Ctx, "Invalid value for Number of Descriptor in Range");
+
+ if (std::optional<uint32_t> Val = extractMdIntValue(RangeDescriptorNode, 2))
+ Range.BaseShaderRegister = *Val;
+ else
+ return reportError(Ctx, "Invalid value for BaseShaderRegister");
+
+ if (std::optional<uint32_t> Val = extractMdIntValue(RangeDescriptorNode, 3))
+ Range.RegisterSpace = *Val;
+ else
+ return reportError(Ctx, "Invalid value for RegisterSpace");
+
+ if (std::optional<uint32_t> Val = extractMdIntValue(RangeDescriptorNode, 4))
+ Range.OffsetInDescriptorsFromTableStart = *Val;
+ else
+ return reportError(Ctx,
+ "Invalid value for OffsetInDescriptorsFromTableStart");
+
+ if (std::optional<uint32_t> Val = extractMdIntValue(RangeDescriptorNode, 5))
+ Range.Flags = *Val;
+ else
+ return reportError(Ctx, "Invalid value for Descriptor Range Flags");
+
+ Table.Ranges.push_back(Range);
+ return false;
+}
+
+static bool parseDescriptorTable(LLVMContext *Ctx,
+ mcdxbc::RootSignatureDesc &RSD,
+ MDNode *DescriptorTableNode) {
+ if (DescriptorTableNode->getNumOperands() < 2)
+ return reportError(Ctx, "Invalid format for Descriptor Table");
+
+ dxbc::RTS0::v1::RootParameterHeader Header;
+ if (std::optional<uint32_t> Val = extractMdIntValue(DescriptorTableNode, 1))
+ Header.ShaderVisibility = *Val;
+ else
+ return reportError(Ctx, "Invalid value for ShaderVisibility");
+
+ mcdxbc::DescriptorTable Table;
+
+ for (unsigned int I = 2; I < DescriptorTableNode->getNumOperands(); I++) {
+ MDNode *Element = dyn_cast<MDNode>(DescriptorTableNode->getOperand(I));
+ if (Element == nullptr)
+ return reportError(Ctx, "Missing Root Element Metadata Node.");
+
+ if (parseDescriptorRange(Ctx, RSD, Table, Element))
+ return true;
+ }
+
+ RSD.ParametersContainer.addParameter(Header, Table);
+ return false;
+}
+
static bool parseRootSignatureElement(LLVMContext *Ctx,
mcdxbc::RootSignatureDesc &RSD,
MDNode *Element) {
@@ -180,6 +264,7 @@ static bool parseRootSignatureElement(LLVMContext *Ctx,
.Case("RootCBV", RootSignatureElementKind::RootDescriptors)
.Case("RootSRV", RootSignatureElementKind::RootDescriptors)
.Case("RootUAV", RootSignatureElementKind::RootDescriptors)
+ .Case("DescriptorTable", RootSignatureElementKind::DescriptorTable)
.Default(RootSignatureElementKind::Error);
switch (ElementKind) {
@@ -190,6 +275,8 @@ static bool parseRootSignatureElement(LLVMContext *Ctx,
return parseRootConstants(Ctx, RSD, Element);
case RootSignatureElementKind::RootDescriptors:
return parseRootDescriptors(Ctx, RSD, Element);
+ case RootSignatureElementKind::DescriptorTable:
+ return parseDescriptorTable(Ctx, RSD, Element);
case RootSignatureElementKind::Error:
return reportError(Ctx, "Invalid Root Signature Element: " +
ElementText->getString());
@@ -230,6 +317,79 @@ static bool verifyRegisterSpace(uint32_t RegisterSpace) {
static bool verifyDescriptorFlag(uint32_t Flags) { return (Flags & ~0xE) == 0; }
+static bool verifyRangeType(uint32_t Type) {
+ switch (Type) {
+ case llvm::to_underlying(dxbc::DescriptorRangeType::CBV):
+ case llvm::to_underlying(dxbc::DescriptorRangeType::SRV):
+ case llvm::to_underlying(dxbc::DescriptorRangeType::UAV):
+ case llvm::to_underlying(dxbc::DescriptorRangeType::Sampler):
+ return true;
+ };
+
+ return false;
+}
+
+static bool verifyDescriptorRangeFlag(uint32_t Version, uint32_t Type,
+ uint32_t Flags) {
+ if (Version == 1 &&
+ Type == llvm::to_underlying(dxbc::DescriptorRangeType::Sampler))
+ return Flags == 0;
+
+ if (Version == 2 &&
+ Type == llvm::to_underlying(dxbc::DescriptorRangeType::Sampler)) {
+ switch (Flags) {
+ case 0:
+ case llvm::to_underlying(dxbc::DescriptorRangeFlag::DATA_VOLATILE):
+ case llvm::to_underlying(
+ dxbc::DescriptorRangeFlag::
+ DESCRIPTORS_STATIC_KEEPING_BUFFER_BOUNDS_CHECKS):
+ return true;
+ }
+ return false;
+ }
+
+ if (Version == 1 &&
+ Type != llvm::to_underlying(dxbc::DescriptorRangeType::Sampler))
+ return Flags ==
+ llvm::to_underlying(dxbc::DescriptorRangeFlag::DESCRIPTORS_VOLATILE);
+
+ if (Version == 2 &&
+ Type != llvm::to_underlying(dxbc::DescriptorRangeType::Sampler)) {
+ switch (Flags) {
+ case 0:
+ case llvm::to_underlying(dxbc::DescriptorRangeFlag::DESCRIPTORS_VOLATILE):
+ case llvm::to_underlying(dxbc::DescriptorRangeFlag::DATA_VOLATILE):
+ case llvm::to_underlying(dxbc::DescriptorRangeFlag::DATA_STATIC):
+ case llvm::to_underlying(
+ dxbc::DescriptorRangeFlag::DATA_STATIC_WHILE_SET_AT_EXECUTE):
+ case llvm::to_underlying(
+ dxbc::DescriptorRangeFlag::
+ DESCRIPTORS_STATIC_KEEPING_BUFFER_BOUNDS_CHECKS):
+ case llvm::to_underlying(dxbc::DescriptorRangeFlag::DESCRIPTORS_VOLATILE) |
+ llvm::to_underlying(dxbc::DescriptorRangeFlag::DATA_VOLATILE):
+ case llvm::to_underlying(dxbc::DescriptorRangeFlag::DESCRIPTORS_VOLATILE) |
+ llvm::to_underlying(
+ dxbc::DescriptorRangeFlag::DATA_STATIC_WHILE_SET_AT_EXECUTE):
+ case llvm::to_underlying(
+ dxbc::DescriptorRangeFlag::
+ DESCRIPTORS_STATIC_KEEPING_BUFFER_BOUNDS_CHECKS) |
+ llvm::to_underlying(dxbc::DescriptorRangeFlag::DATA_VOLATILE):
+ case llvm::to_underlying(
+ dxbc::DescriptorRangeFlag::
+ DESCRIPTORS_STATIC_KEEPING_BUFFER_BOUNDS_CHECKS) |
+ llvm::to_underlying(dxbc::DescriptorRangeFlag::DATA_STATIC):
+ case llvm::to_underlying(
+ dxbc::DescriptorRangeFlag::
+ DESCRIPTORS_STATIC_KEEPING_BUFFER_BOUNDS_CHECKS) |
+ llvm::to_underlying(
+ dxbc::DescriptorRangeFlag::DATA_STATIC_WHILE_SET_AT_EXECUTE):
+ return true;
+ }
+ return false;
+ }
+ return false;
+}
+
static bool validate(LLVMContext *Ctx, const mcdxbc::RootSignatureDesc &RSD) {
if (!verifyVersion(RSD.Version)) {
@@ -268,6 +428,22 @@ static bool validate(LLVMContext *Ctx, const mcdxbc::RootSignatureDesc &RSD) {
}
break;
}
+ case llvm::to_underlying(dxbc::RootParameterType::DescriptorTable): {
+ const mcdxbc::DescriptorTable &Table =
+ RSD.ParametersContainer.getDescriptorTable(Info.Location);
+ for (const dxbc::RTS0::v2::DescriptorRange &Range : Table) {
+ if (!verifyRangeType(Range.RangeType))
+ return reportValueError(Ctx, "RangeType", Range.RangeType);
+
+ if (!verifyRegisterSpace(Range.RegisterSpace))
+ return reportValueError(Ctx, "RegisterSpace", Range.RegisterSpace);
+
+ if (!verifyDescriptorRangeFlag(RSD.Version, Range.RangeType,
+ Range.Flags))
+ return reportValueError(Ctx, "DescriptorFlag", Range.Flags);
+ }
+ break;
+ }
}
}
diff --git a/llvm/lib/Target/DirectX/DXILRootSignature.h b/llvm/lib/Target/DirectX/DXILRootSignature.h
index b8742d1b1fdfd..d1ffc8cacd6f0 100644
--- a/llvm/lib/Target/DirectX/DXILRootSignature.h
+++ b/llvm/lib/Target/DirectX/DXILRootSignature.h
@@ -28,7 +28,8 @@ enum class RootSignatureElementKind {
Error = 0,
RootFlags = 1,
RootConstants = 2,
- RootDescriptors = 3
+ RootDescriptors = 3,
+ DescriptorTable = 4,
};
class RootSignatureAnalysis : public AnalysisInfoMixin<RootSignatureAnalysis> {
friend AnalysisInfoMixin<RootSignatureAnalysis>;
>From bb1a61f94b28fc9d908b83e2ae6ed9af2dcdcedb Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Mon, 2 Jun 2025 21:20:37 +0000
Subject: [PATCH 2/5] add tests
---
llvm/lib/Target/DirectX/DXILRootSignature.cpp | 4 +-
...tSignature-DescriptorTable-Invalid-Flag.ll | 20 ++++++++
...ature-DescriptorTable-Invalid-RangeType.ll | 20 ++++++++
...e-DescriptorTable-Invalid-RegisterSpace.ll | 20 ++++++++
.../RootSignature-DescriptorTable.ll | 48 +++++++++++++++++++
5 files changed, 111 insertions(+), 1 deletion(-)
create mode 100644 llvm/test/CodeGen/DirectX/ContainerData/RootSignature-DescriptorTable-Invalid-Flag.ll
create mode 100644 llvm/test/CodeGen/DirectX/ContainerData/RootSignature-DescriptorTable-Invalid-RangeType.ll
create mode 100644 llvm/test/CodeGen/DirectX/ContainerData/RootSignature-DescriptorTable-Invalid-RegisterSpace.ll
create mode 100644 llvm/test/CodeGen/DirectX/ContainerData/RootSignature-DescriptorTable.ll
diff --git a/llvm/lib/Target/DirectX/DXILRootSignature.cpp b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
index a14a9fdce5cbd..0e34e480e38d5 100644
--- a/llvm/lib/Target/DirectX/DXILRootSignature.cpp
+++ b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
@@ -236,6 +236,8 @@ static bool parseDescriptorTable(LLVMContext *Ctx,
return reportError(Ctx, "Invalid value for ShaderVisibility");
mcdxbc::DescriptorTable Table;
+ Header.ParameterType =
+ llvm::to_underlying(dxbc::RootParameterType::DescriptorTable);
for (unsigned int I = 2; I < DescriptorTableNode->getNumOperands(); I++) {
MDNode *Element = dyn_cast<MDNode>(DescriptorTableNode->getOperand(I));
@@ -312,7 +314,7 @@ static bool verifyRegisterValue(uint32_t RegisterValue) {
}
static bool verifyRegisterSpace(uint32_t RegisterSpace) {
- return !(RegisterSpace >= 0xFFFFFFF0 && RegisterSpace <= 0xFFFFFFFF);
+ return !(RegisterSpace >= 0xFFFFFFF0 && RegisterSpace < 0xFFFFFFFF);
}
static bool verifyDescriptorFlag(uint32_t Flags) { return (Flags & ~0xE) == 0; }
diff --git a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-DescriptorTable-Invalid-Flag.ll b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-DescriptorTable-Invalid-Flag.ll
new file mode 100644
index 0000000000000..37d87986aa25f
--- /dev/null
+++ b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-DescriptorTable-Invalid-Flag.ll
@@ -0,0 +1,20 @@
+; RUN: not opt -passes='print<dxil-root-signature>' %s -S -o - 2>&1 | FileCheck %s
+
+target triple = "dxil-unknown-shadermodel6.0-compute"
+
+; CHECK: error: Invalid value for DescriptorFlag: 22
+; CHECK-NOT: Root Signature Definitions
+
+define void @main() #0 {
+entry:
+ ret void
+}
+attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" }
+
+
+!dx.rootsignatures = !{!2} ; list of function/root signature pairs
+!2 = !{ ptr @main, !3 } ; function, root signature
+!3 = !{ !5 } ; list of root signature elements
+!5 = !{ !"DescriptorTable", i32 0, !6, !7 }
+!6 = !{ !"SRV", i32 0, i32 0, i32 -1, i32 -1, i32 22 }
+!7 = !{ !"UAV", i32 5, i32 1, i32 10, i32 5, i32 2 }
diff --git a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-DescriptorTable-Invalid-RangeType.ll b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-DescriptorTable-Invalid-RangeType.ll
new file mode 100644
index 0000000000000..1d18c0c7ff882
--- /dev/null
+++ b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-DescriptorTable-Invalid-RangeType.ll
@@ -0,0 +1,20 @@
+; RUN: not opt -passes='print<dxil-root-signature>' %s -S -o - 2>&1 | FileCheck %s
+
+target triple = "dxil-unknown-shadermodel6.0-compute"
+
+; CHECK: error: Invalid value for RangeType: 4
+; CHECK-NOT: Root Signature Definitions
+
+define void @main() #0 {
+entry:
+ ret void
+}
+attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" }
+
+
+!dx.rootsignatures = !{!2} ; list of function/root signature pairs
+!2 = !{ ptr @main, !3 } ; function, root signature
+!3 = !{ !5 } ; list of root signature elements
+!5 = !{ !"DescriptorTable", i32 0, !6, !7 }
+!6 = !{ !"Invalid", i32 0, i32 0, i32 -1, i32 -1, i32 4 }
+!7 = !{ !"UAV", i32 5, i32 1, i32 10, i32 5, i32 2 }
diff --git a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-DescriptorTable-Invalid-RegisterSpace.ll b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-DescriptorTable-Invalid-RegisterSpace.ll
new file mode 100644
index 0000000000000..7f046a5748d5b
--- /dev/null
+++ b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-DescriptorTable-Invalid-RegisterSpace.ll
@@ -0,0 +1,20 @@
+; RUN: not opt -passes='print<dxil-root-signature>' %s -S -o - 2>&1 | FileCheck %s
+
+target triple = "dxil-unknown-shadermodel6.0-compute"
+
+; CHECK: error: Invalid value for RegisterSpace: 4294967280
+; CHECK-NOT: Root Signature Definitions
+
+define void @main() #0 {
+entry:
+ ret void
+}
+attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" }
+
+
+!dx.rootsignatures = !{!2} ; list of function/root signature pairs
+!2 = !{ ptr @main, !3 } ; function, root signature
+!3 = !{ !5 } ; list of root signature elements
+!5 = !{ !"DescriptorTable", i32 0, !6, !7 }
+!6 = !{ !"SRV", i32 0, i32 0, i32 10, i32 -1, i32 4 }
+!7 = !{ !"UAV", i32 5, i32 1, i32 4294967280, i32 5, i32 2 }
diff --git a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-DescriptorTable.ll b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-DescriptorTable.ll
new file mode 100644
index 0000000000000..af4acfd2736d9
--- /dev/null
+++ b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-DescriptorTable.ll
@@ -0,0 +1,48 @@
+; RUN: opt %s -dxil-embed -dxil-globals -S -o - | FileCheck %s
+; RUN: llc %s --filetype=obj -o - | obj2yaml | FileCheck %s --check-prefix=DXC
+
+target triple = "dxil-unknown-shadermodel6.0-compute"
+
+; CHECK: @dx.rts0 = private constant [92 x i8] c"{{.*}}", section "RTS0", align 4
+
+define void @main() #0 {
+entry:
+ ret void
+}
+attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" }
+
+
+!dx.rootsignatures = !{!2} ; list of function/root signature pairs
+!2 = !{ ptr @main, !3 } ; function, root signature
+!3 = !{ !5 } ; list of root signature elements
+!5 = !{ !"DescriptorTable", i32 0, !6, !7 }
+!6 = !{ !"SRV", i32 0, i32 0, i32 -1, i32 -1, i32 4 }
+!7 = !{ !"UAV", i32 5, i32 1, i32 10, i32 5, i32 2 }
+
+; DXC: - Name: RTS0
+; DXC-NEXT: Size: 92
+; DXC-NEXT: RootSignature:
+; DXC-NEXT: Version: 2
+; DXC-NEXT: NumRootParameters: 1
+; DXC-NEXT: RootParametersOffset: 24
+; DXC-NEXT: NumStaticSamplers: 0
+; DXC-NEXT: StaticSamplersOffset: 0
+; DXC-NEXT: Parameters:
+; DXC-NEXT: - ParameterType: 0
+; DXC-NEXT: ShaderVisibility: 0
+; DXC-NEXT: Table:
+; DXC-NEXT: NumRanges: 2
+; DXC-NEXT: RangesOffset: 44
+; DXC-NEXT: Ranges:
+; DXC-NEXT: - RangeType: 0
+; DXC-NEXT: NumDescriptors: 0
+; DXC-NEXT: BaseShaderRegister: 0
+; DXC-NEXT: RegisterSpace: 4294967295
+; DXC-NEXT: OffsetInDescriptorsFromTableStart: 4294967295
+; DXC-NEXT: DATA_VOLATILE: true
+; DXC-NEXT: - RangeType: 1
+; DXC-NEXT: NumDescriptors: 5
+; DXC-NEXT: BaseShaderRegister: 1
+; DXC-NEXT: RegisterSpace: 10
+; DXC-NEXT: OffsetInDescriptorsFromTableStart: 5
+; DXC-NEXT: DESCRIPTORS_VOLATILE: true
>From 8979ab71d182a590153d8fc16cbe09eb327b0c3d Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Mon, 2 Jun 2025 21:45:02 +0000
Subject: [PATCH 3/5] adding support on analysis printer
---
llvm/lib/Target/DirectX/DXILRootSignature.cpp | 27 ++++++++++++++++---
.../ContainerData/RootSignature-Parameters.ll | 22 +++++++++++++--
2 files changed, 43 insertions(+), 6 deletions(-)
diff --git a/llvm/lib/Target/DirectX/DXILRootSignature.cpp b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
index 0e34e480e38d5..c4d5fe254cbf5 100644
--- a/llvm/lib/Target/DirectX/DXILRootSignature.cpp
+++ b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
@@ -558,14 +558,12 @@ PreservedAnalyses RootSignatureAnalysisPrinter::run(Module &M,
OS << "Definition for '" << F.getName() << "':\n";
// start root signature header
- Space++;
OS << indent(Space) << "Flags: " << format_hex(RS.Flags, 8) << "\n";
OS << indent(Space) << "Version: " << RS.Version << "\n";
OS << indent(Space) << "RootParametersOffset: " << RS.RootParameterOffset
<< "\n";
OS << indent(Space) << "NumParameters: " << RS.ParametersContainer.size()
<< "\n";
- Space++;
for (size_t I = 0; I < RS.ParametersContainer.size(); I++) {
const auto &[Type, Loc] =
RS.ParametersContainer.getTypeAndLocForParameter(I);
@@ -588,7 +586,7 @@ PreservedAnalyses RootSignatureAnalysisPrinter::run(Module &M,
<< "Num 32 Bit Values: " << Constants.Num32BitValues << "\n";
break;
}
- case llvm::to_underlying(dxbc::RootParameterType::CBV):
+ case llvm::to_underlying(dxbc::RootParameterType::CBV):
case llvm::to_underlying(dxbc::RootParameterType::UAV):
case llvm::to_underlying(dxbc::RootParameterType::SRV): {
const dxbc::RTS0::v2::RootDescriptor &Descriptor =
@@ -601,8 +599,29 @@ PreservedAnalyses RootSignatureAnalysisPrinter::run(Module &M,
OS << indent(Space + 2) << "Flags: " << Descriptor.Flags << "\n";
break;
}
+ case llvm::to_underlying(dxbc::RootParameterType::DescriptorTable): {
+ const mcdxbc::DescriptorTable &Table =
+ RS.ParametersContainer.getDescriptorTable(Loc);
+ OS << indent(Space+ 2) << "NumRanges: " << Table.Ranges.size() << "\n";
+
+ for(const dxbc::RTS0::v2::DescriptorRange Range : Table){
+ OS << indent(Space + 2) << "- Range Type: " << Range.RangeType
+ << "\n";
+ OS << indent(Space + 4) << "Register Space: " << Range.RegisterSpace
+ << "\n";
+ OS << indent(Space + 4) << "Base Shader Register: " << Range.BaseShaderRegister
+ << "\n";
+ OS << indent(Space + 4) << "Num Descriptors: " << Range.NumDescriptors
+ << "\n";
+ OS << indent(Space + 4) << "Offset In Descriptors From Table Start: " << Range.OffsetInDescriptorsFromTableStart
+ << "\n";
+ if(RS.Version > 1)
+ OS << indent(Space + 4) << "Flags: " << Range.Flags
+ << "\n";
+ }
+ break;
+ }
}
- Space--;
}
OS << indent(Space) << "NumStaticSamplers: " << 0 << "\n";
OS << indent(Space) << "StaticSamplersOffset: " << RS.StaticSamplersOffset
diff --git a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Parameters.ll b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Parameters.ll
index 714c76213e1b5..28768e252d85a 100644
--- a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Parameters.ll
+++ b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Parameters.ll
@@ -12,16 +12,19 @@ attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" }
!dx.rootsignatures = !{!2} ; list of function/root signature pairs
!2 = !{ ptr @main, !3 } ; function, root signature
-!3 = !{ !4, !5, !6 } ; list of root signature elements
+!3 = !{ !4, !5, !6, !7 } ; list of root signature elements
!4 = !{ !"RootFlags", i32 1 } ; 1 = allow_input_assembler_input_layout
!5 = !{ !"RootConstants", i32 0, i32 1, i32 2, i32 3 }
!6 = !{ !"RootSRV", i32 1, i32 4, i32 5, i32 6 }
+!7 = !{ !"DescriptorTable", i32 0, !8, !9 }
+!8 = !{ !"SRV", i32 0, i32 0, i32 -1, i32 -1, i32 4 }
+!9 = !{ !"UAV", i32 5, i32 1, i32 10, i32 5, i32 2 }
;CHECK-LABEL: Definition for 'main':
;CHECK-NEXT: Flags: 0x000001
;CHECK-NEXT: Version: 2
;CHECK-NEXT: RootParametersOffset: 24
-;CHECK-NEXT: NumParameters: 2
+;CHECK-NEXT: NumParameters: 3
;CHECK-NEXT: - Parameter Type: 1
;CHECK-NEXT: Shader Visibility: 0
;CHECK-NEXT: Register Space: 2
@@ -32,5 +35,20 @@ attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" }
;CHECK-NEXT: Register Space: 5
;CHECK-NEXT: Shader Register: 4
;CHECK-NEXT: Flags: 6
+;CHECK-NEXT: - Parameter Type: 0
+;CHECK-NEXT: Shader Visibility: 0
+;CHECK-NEXT: NumRanges: 2
+;CHECK-NEXT: - Range Type: 0
+;CHECK-NEXT: Register Space: 4294967295
+;CHECK-NEXT: Base Shader Register: 0
+;CHECK-NEXT: Num Descriptors: 0
+;CHECK-NEXT: Offset In Descriptors From Table Start: 4294967295
+;CHECK-NEXT: Flags: 4
+;CHECK-NEXT: - Range Type: 1
+;CHECK-NEXT: Register Space: 10
+;CHECK-NEXT: Base Shader Register: 1
+;CHECK-NEXT: Num Descriptors: 5
+;CHECK-NEXT: Offset In Descriptors From Table Start: 5
+;CHECK-NEXT: Flags: 2
;CHECK-NEXT: NumStaticSamplers: 0
;CHECK-NEXT: StaticSamplersOffset: 0
>From be60d51757c62c137b1ca62d6df39eda58dad46e Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Mon, 2 Jun 2025 21:49:17 +0000
Subject: [PATCH 4/5] adding support on analysis printer
---
llvm/lib/Target/DirectX/DXILRootSignature.cpp | 31 +++++++++----------
1 file changed, 15 insertions(+), 16 deletions(-)
diff --git a/llvm/lib/Target/DirectX/DXILRootSignature.cpp b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
index c4d5fe254cbf5..33a74d71027aa 100644
--- a/llvm/lib/Target/DirectX/DXILRootSignature.cpp
+++ b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
@@ -602,22 +602,21 @@ PreservedAnalyses RootSignatureAnalysisPrinter::run(Module &M,
case llvm::to_underlying(dxbc::RootParameterType::DescriptorTable): {
const mcdxbc::DescriptorTable &Table =
RS.ParametersContainer.getDescriptorTable(Loc);
- OS << indent(Space+ 2) << "NumRanges: " << Table.Ranges.size() << "\n";
-
- for(const dxbc::RTS0::v2::DescriptorRange Range : Table){
- OS << indent(Space + 2) << "- Range Type: " << Range.RangeType
- << "\n";
- OS << indent(Space + 4) << "Register Space: " << Range.RegisterSpace
- << "\n";
- OS << indent(Space + 4) << "Base Shader Register: " << Range.BaseShaderRegister
- << "\n";
- OS << indent(Space + 4) << "Num Descriptors: " << Range.NumDescriptors
- << "\n";
- OS << indent(Space + 4) << "Offset In Descriptors From Table Start: " << Range.OffsetInDescriptorsFromTableStart
- << "\n";
- if(RS.Version > 1)
- OS << indent(Space + 4) << "Flags: " << Range.Flags
- << "\n";
+ OS << indent(Space + 2) << "NumRanges: " << Table.Ranges.size() << "\n";
+
+ for (const dxbc::RTS0::v2::DescriptorRange Range : Table) {
+ OS << indent(Space + 2) << "- Range Type: " << Range.RangeType
+ << "\n";
+ OS << indent(Space + 4) << "Register Space: " << Range.RegisterSpace
+ << "\n";
+ OS << indent(Space + 4)
+ << "Base Shader Register: " << Range.BaseShaderRegister << "\n";
+ OS << indent(Space + 4) << "Num Descriptors: " << Range.NumDescriptors
+ << "\n";
+ OS << indent(Space + 4) << "Offset In Descriptors From Table Start: "
+ << Range.OffsetInDescriptorsFromTableStart << "\n";
+ if (RS.Version > 1)
+ OS << indent(Space + 4) << "Flags: " << Range.Flags << "\n";
}
break;
}
>From c3d24b6133ff7f6f128e56e42f20dfe111a780c7 Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Tue, 3 Jun 2025 17:12:35 +0000
Subject: [PATCH 5/5] clean up
---
llvm/lib/Target/DirectX/DXILRootSignature.cpp | 2 --
1 file changed, 2 deletions(-)
diff --git a/llvm/lib/Target/DirectX/DXILRootSignature.cpp b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
index 33a74d71027aa..0dca2582bc714 100644
--- a/llvm/lib/Target/DirectX/DXILRootSignature.cpp
+++ b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
@@ -12,7 +12,6 @@
//===----------------------------------------------------------------------===//
#include "DXILRootSignature.h"
#include "DirectX.h"
-#include "llvm/ADT/STLForwardCompat.h"
#include "llvm/ADT/StringSwitch.h"
#include "llvm/ADT/Twine.h"
#include "llvm/Analysis/DXILMetadataAnalysis.h"
@@ -28,7 +27,6 @@
#include "llvm/Support/Error.h"
#include "llvm/Support/ErrorHandling.h"
#include "llvm/Support/raw_ostream.h"
-#include <cstddef>
#include <cstdint>
#include <optional>
#include <utility>
More information about the llvm-branch-commits
mailing list