[llvm-branch-commits] [llvm] [HLSL] Adding support for Root Constants in LLVM Metadata (PR #135085)
via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Wed Apr 16 16:26:50 PDT 2025
https://github.com/joaosaffran updated https://github.com/llvm/llvm-project/pull/135085
>From 9b59d0108f6b23c039e2c417247216862073cd4b Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Wed, 9 Apr 2025 21:05:58 +0000
Subject: [PATCH 01/13] adding support for root constants in metadata
generation
---
llvm/lib/Target/DirectX/DXILRootSignature.cpp | 120 +++++++++++++++++-
llvm/lib/Target/DirectX/DXILRootSignature.h | 6 +-
.../RootSignature-Flags-Validation-Error.ll | 7 +-
.../RootSignature-RootConstants.ll | 34 +++++
...ature-ShaderVisibility-Validation-Error.ll | 20 +++
5 files changed, 182 insertions(+), 5 deletions(-)
create mode 100644 llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootConstants.ll
create mode 100644 llvm/test/CodeGen/DirectX/ContainerData/RootSignature-ShaderVisibility-Validation-Error.ll
diff --git a/llvm/lib/Target/DirectX/DXILRootSignature.cpp b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
index 412ab7765a7ae..7686918b0fc75 100644
--- a/llvm/lib/Target/DirectX/DXILRootSignature.cpp
+++ b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
@@ -40,6 +40,13 @@ static bool reportError(LLVMContext *Ctx, Twine Message,
return true;
}
+static bool reportValueError(LLVMContext *Ctx, Twine ParamName, uint32_t Value,
+ DiagnosticSeverity Severity = DS_Error) {
+ Ctx->diagnose(DiagnosticInfoGeneric(
+ "Invalid value for " + ParamName + ": " + Twine(Value), Severity));
+ return true;
+}
+
static bool parseRootFlags(LLVMContext *Ctx, mcdxbc::RootSignatureDesc &RSD,
MDNode *RootFlagNode) {
@@ -52,6 +59,45 @@ static bool parseRootFlags(LLVMContext *Ctx, mcdxbc::RootSignatureDesc &RSD,
return false;
}
+static bool extractMdValue(uint32_t &Value, MDNode *Node, unsigned int OpId) {
+
+ auto *CI = mdconst::extract<ConstantInt>(Node->getOperand(OpId));
+ if (CI == nullptr)
+ return true;
+
+ Value = CI->getZExtValue();
+ return false;
+}
+
+static bool parseRootConstants(LLVMContext *Ctx, mcdxbc::RootSignatureDesc &RSD,
+ MDNode *RootFlagNode) {
+
+ if (RootFlagNode->getNumOperands() != 5)
+ return reportError(Ctx, "Invalid format for RootConstants Element");
+
+ mcdxbc::RootParameter NewParameter;
+ NewParameter.Header.ParameterType = dxbc::RootParameterType::Constants32Bit;
+
+ uint32_t SV;
+ if (extractMdValue(SV, RootFlagNode, 1))
+ return reportError(Ctx, "Invalid value for ShaderVisibility");
+
+ NewParameter.Header.ShaderVisibility = (dxbc::ShaderVisibility)SV;
+
+ if (extractMdValue(NewParameter.Constants.ShaderRegister, RootFlagNode, 2))
+ return reportError(Ctx, "Invalid value for ShaderRegister");
+
+ if (extractMdValue(NewParameter.Constants.RegisterSpace, RootFlagNode, 3))
+ return reportError(Ctx, "Invalid value for RegisterSpace");
+
+ if (extractMdValue(NewParameter.Constants.Num32BitValues, RootFlagNode, 4))
+ return reportError(Ctx, "Invalid value for Num32BitValues");
+
+ RSD.Parameters.push_back(NewParameter);
+
+ return false;
+}
+
static bool parseRootSignatureElement(LLVMContext *Ctx,
mcdxbc::RootSignatureDesc &RSD,
MDNode *Element) {
@@ -62,12 +108,16 @@ static bool parseRootSignatureElement(LLVMContext *Ctx,
RootSignatureElementKind ElementKind =
StringSwitch<RootSignatureElementKind>(ElementText->getString())
.Case("RootFlags", RootSignatureElementKind::RootFlags)
+ .Case("RootConstants", RootSignatureElementKind::RootConstants)
.Default(RootSignatureElementKind::Error);
switch (ElementKind) {
case RootSignatureElementKind::RootFlags:
return parseRootFlags(Ctx, RSD, Element);
+ case RootSignatureElementKind::RootConstants:
+ return parseRootConstants(Ctx, RSD, Element);
+ break;
case RootSignatureElementKind::Error:
return reportError(Ctx, "Invalid Root Signature Element: " +
ElementText->getString());
@@ -94,10 +144,56 @@ static bool parse(LLVMContext *Ctx, mcdxbc::RootSignatureDesc &RSD,
static bool verifyRootFlag(uint32_t Flags) { return (Flags & ~0xfff) == 0; }
+static bool verifyShaderVisibility(dxbc::ShaderVisibility Flags) {
+ switch (Flags) {
+
+ case dxbc::ShaderVisibility::All:
+ case dxbc::ShaderVisibility::Vertex:
+ case dxbc::ShaderVisibility::Hull:
+ case dxbc::ShaderVisibility::Domain:
+ case dxbc::ShaderVisibility::Geometry:
+ case dxbc::ShaderVisibility::Pixel:
+ case dxbc::ShaderVisibility::Amplification:
+ case dxbc::ShaderVisibility::Mesh:
+ return true;
+ }
+
+ return false;
+}
+
+static bool verifyParameterType(dxbc::RootParameterType Flags) {
+ switch (Flags) {
+ case dxbc::RootParameterType::Constants32Bit:
+ return true;
+ }
+
+ return false;
+}
+
+static bool verifyVersion(uint32_t Version) {
+ return (Version == 1 || Version == 2);
+}
+
static bool validate(LLVMContext *Ctx, const mcdxbc::RootSignatureDesc &RSD) {
+
+ if (!verifyVersion(RSD.Header.Version)) {
+ return reportValueError(Ctx, "Version", RSD.Header.Version);
+ }
+
if (!verifyRootFlag(RSD.Header.Flags)) {
- return reportError(Ctx, "Invalid Root Signature flag value");
+ return reportValueError(Ctx, "RootFlags", RSD.Header.Flags);
+ }
+
+ for (const auto &P : RSD.Parameters) {
+ if (!verifyShaderVisibility(P.Header.ShaderVisibility))
+ return reportValueError(Ctx, "ShaderVisibility",
+ (uint32_t)P.Header.ShaderVisibility);
+
+ if (!verifyParameterType(P.Header.ParameterType))
+ return reportValueError(Ctx, "ParameterType",
+ (uint32_t)P.Header.ParameterType);
}
+
return false;
}
@@ -211,6 +307,28 @@ PreservedAnalyses RootSignatureAnalysisPrinter::run(Module &M,
OS << indent(Space) << "NumStaticSamplers: " << 0 << ":\n";
OS << indent(Space) << "StaticSamplersOffset: "
<< sizeof(RS.Header) + RS.Parameters.size_in_bytes() << ":\n";
+
+ Space++;
+ for (auto const &P : RS.Parameters) {
+ OS << indent(Space) << "Parameter Type: " << &P.Header.ParameterType
+ << ":\n";
+ OS << indent(Space) << "Shader Visibility: " << &P.Header.ShaderVisibility
+ << ":\n";
+ OS << indent(Space) << "Parameter Offset: " << &P.Header.ParameterOffset
+ << ":\n";
+ switch (P.Header.ParameterType) {
+ case dxbc::RootParameterType::Constants32Bit:
+ OS << indent(Space) << "Register Space: " << &P.Constants.RegisterSpace
+ << ":\n";
+ OS << indent(Space)
+ << "Shader Register: " << &P.Constants.ShaderRegister << ":\n";
+ OS << indent(Space)
+ << "Num 32 Bit Values: " << &P.Constants.Num32BitValues << ":\n";
+ break;
+ }
+ }
+ Space--;
+
Space--;
// end root signature header
}
diff --git a/llvm/lib/Target/DirectX/DXILRootSignature.h b/llvm/lib/Target/DirectX/DXILRootSignature.h
index 8c25b2eb3fadf..93ec614f1ab85 100644
--- a/llvm/lib/Target/DirectX/DXILRootSignature.h
+++ b/llvm/lib/Target/DirectX/DXILRootSignature.h
@@ -24,7 +24,11 @@
namespace llvm {
namespace dxil {
-enum class RootSignatureElementKind { Error = 0, RootFlags = 1 };
+enum class RootSignatureElementKind {
+ Error = 0,
+ RootFlags = 1,
+ RootConstants = 2
+};
class RootSignatureAnalysis : public AnalysisInfoMixin<RootSignatureAnalysis> {
friend AnalysisInfoMixin<RootSignatureAnalysis>;
static AnalysisKey Key;
diff --git a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Flags-Validation-Error.ll b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Flags-Validation-Error.ll
index fe93c9993c1c3..3af9a524e77f4 100644
--- a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Flags-Validation-Error.ll
+++ b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Flags-Validation-Error.ll
@@ -1,6 +1,6 @@
; RUN: not opt -passes='print<dxil-root-signature>' %s -S -o - 2>&1 | FileCheck %s
-; CHECK: error: Invalid Root Signature flag value
+; CHECK: error: Invalid value for ShaderVisibility: 255
; CHECK-NOT: Root Signature Definitions
target triple = "dxil-unknown-shadermodel6.0-compute"
@@ -16,5 +16,6 @@ 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 } ; list of root signature elements
-!4 = !{ !"RootFlags", i32 2147487744 } ; 1 = allow_input_assembler_input_layout
+!3 = !{ !4, !5 } ; list of root signature elements
+!4 = !{ !"RootFlags", i32 1 } ; 1 = allow_input_assembler_input_layout
+!5 = !{ !"RootConstants", i32 255, i32 1, i32 2, i32 3 }
diff --git a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootConstants.ll b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootConstants.ll
new file mode 100644
index 0000000000000..d0520632df2a2
--- /dev/null
+++ b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootConstants.ll
@@ -0,0 +1,34 @@
+; 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 [48 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 = !{ !4, !5 } ; 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 }
+
+; DXC: - Name: RTS0
+; DXC-NEXT: Size: 48
+; DXC-NEXT: RootSignature:
+; DXC-NEXT: Version: 2
+; DXC-NEXT: NumStaticSamplers: 0
+; DXC-NEXT: StaticSamplersOffset: 0
+; DXC-NEXT: Parameters:
+; DXC-NEXT: - ParameterType: Constants32Bit
+; DXC-NEXT: ShaderVisibility: All
+; DXC-NEXT: Constants:
+; DXC-NEXT: Num32BitValues: 3
+; DXC-NEXT: RegisterSpace: 2
+; DXC-NEXT: ShaderRegister: 1
+; DXC-NEXT: AllowInputAssemblerInputLayout: true
diff --git a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-ShaderVisibility-Validation-Error.ll b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-ShaderVisibility-Validation-Error.ll
new file mode 100644
index 0000000000000..4b8e6abacd7ad
--- /dev/null
+++ b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-ShaderVisibility-Validation-Error.ll
@@ -0,0 +1,20 @@
+; RUN: not opt -passes='print<dxil-root-signature>' %s -S -o - 2>&1 | FileCheck %s
+
+; CHECK: error: Invalid value for RootFlags: 2147487744
+; CHECK-NOT: Root Signature Definitions
+
+target triple = "dxil-unknown-shadermodel6.0-compute"
+
+
+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 = !{ !4 } ; list of root signature elements
+!4 = !{ !"RootFlags", i32 2147487744 } ; 1 = allow_input_assembler_input_layout
>From efc5e52bb8843a025f49e41b322682753c061c3f Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Wed, 9 Apr 2025 21:19:25 +0000
Subject: [PATCH 02/13] add test
---
llvm/lib/Target/DirectX/DXILRootSignature.cpp | 33 +++++++++----------
.../ContainerData/RootSignature-Parameters.ll | 30 +++++++++++++++++
2 files changed, 46 insertions(+), 17 deletions(-)
create mode 100644 llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Parameters.ll
diff --git a/llvm/lib/Target/DirectX/DXILRootSignature.cpp b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
index 7686918b0fc75..7f30cef239696 100644
--- a/llvm/lib/Target/DirectX/DXILRootSignature.cpp
+++ b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
@@ -299,31 +299,30 @@ PreservedAnalyses RootSignatureAnalysisPrinter::run(Module &M,
// start root signature header
Space++;
- OS << indent(Space) << "Flags: " << format_hex(RS.Header.Flags, 8) << ":\n";
- OS << indent(Space) << "Version: " << RS.Header.Version << ":\n";
- OS << indent(Space) << "NumParameters: " << RS.Parameters.size() << ":\n";
+ OS << indent(Space) << "Flags: " << format_hex(RS.Header.Flags, 8) << "\n";
+ OS << indent(Space) << "Version: " << RS.Header.Version << "\n";
+ OS << indent(Space) << "NumParameters: " << RS.Parameters.size() << "\n";
OS << indent(Space) << "RootParametersOffset: " << sizeof(RS.Header)
- << ":\n";
- OS << indent(Space) << "NumStaticSamplers: " << 0 << ":\n";
+ << "\n";
+ OS << indent(Space) << "NumStaticSamplers: " << 0 << "\n";
OS << indent(Space) << "StaticSamplersOffset: "
- << sizeof(RS.Header) + RS.Parameters.size_in_bytes() << ":\n";
+ << sizeof(RS.Header) + RS.Parameters.size_in_bytes() << "\n";
Space++;
for (auto const &P : RS.Parameters) {
- OS << indent(Space) << "Parameter Type: " << &P.Header.ParameterType
- << ":\n";
- OS << indent(Space) << "Shader Visibility: " << &P.Header.ShaderVisibility
- << ":\n";
- OS << indent(Space) << "Parameter Offset: " << &P.Header.ParameterOffset
- << ":\n";
+ OS << indent(Space)
+ << "Parameter Type: " << (uint32_t)P.Header.ParameterType << "\n";
+ OS << indent(Space)
+ << "Shader Visibility: " << (uint32_t)P.Header.ShaderVisibility
+ << "\n";
switch (P.Header.ParameterType) {
case dxbc::RootParameterType::Constants32Bit:
- OS << indent(Space) << "Register Space: " << &P.Constants.RegisterSpace
- << ":\n";
+ OS << indent(Space) << "Register Space: " << P.Constants.RegisterSpace
+ << "\n";
+ OS << indent(Space) << "Shader Register: " << P.Constants.ShaderRegister
+ << "\n";
OS << indent(Space)
- << "Shader Register: " << &P.Constants.ShaderRegister << ":\n";
- OS << indent(Space)
- << "Num 32 Bit Values: " << &P.Constants.Num32BitValues << ":\n";
+ << "Num 32 Bit Values: " << P.Constants.Num32BitValues << "\n";
break;
}
}
diff --git a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Parameters.ll b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Parameters.ll
new file mode 100644
index 0000000000000..9a2f7d840a236
--- /dev/null
+++ b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Parameters.ll
@@ -0,0 +1,30 @@
+; RUN: opt -passes='print<dxil-root-signature>' %s -S -o - 2>&1 | FileCheck %s
+
+target triple = "dxil-unknown-shadermodel6.0-compute"
+
+
+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 = !{ !4, !5 } ; 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 }
+
+; CHECK-LABEL: Definition for 'main':
+; CHECK-NEXT: Flags: 0x000001
+; CHECK-NEXT: Version: 2
+; CHECK-NEXT: NumParameters: 1
+; CHECK-NEXT: RootParametersOffset: 24
+; CHECK-NEXT: NumStaticSamplers: 0
+; CHECK-NEXT: StaticSamplersOffset: 48
+; CHECK-NEXT: Parameter Type: 1
+; CHECK-NEXT: Shader Visibility: 0
+; CHECK-NEXT: Register Space: 2
+; CHECK-NEXT: Shader Register: 1
+; CHECK-NEXT: Num 32 Bit Values: 3
>From c4b78d88b89818fe1f4cae553dcfdf7cad00ccf3 Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Mon, 14 Apr 2025 19:02:15 +0000
Subject: [PATCH 03/13] address comments
---
llvm/lib/Target/DirectX/DXILRootSignature.cpp | 39 ++++++++++---------
...re-RootConstants-Invalid-Num32BitValues.ll | 18 +++++++++
...ure-RootConstants-Invalid-RegisterSpace.ll | 18 +++++++++
...re-RootConstants-Invalid-ShaderRegister.ll | 18 +++++++++
.../RootSignature-RootConstants.ll | 4 +-
5 files changed, 76 insertions(+), 21 deletions(-)
create mode 100644 llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootConstants-Invalid-Num32BitValues.ll
create mode 100644 llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootConstants-Invalid-RegisterSpace.ll
create mode 100644 llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootConstants-Invalid-ShaderRegister.ll
diff --git a/llvm/lib/Target/DirectX/DXILRootSignature.cpp b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
index 6793be3e83acf..607b025d3653d 100644
--- a/llvm/lib/Target/DirectX/DXILRootSignature.cpp
+++ b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
@@ -47,50 +47,53 @@ static bool reportValueError(LLVMContext *Ctx, Twine ParamName, uint32_t Value,
return true;
}
+static bool extractMdIntValue(uint32_t &Value, MDNode *Node,
+ unsigned int OpId) {
+ auto *CI = mdconst::dyn_extract<ConstantInt>(Node->getOperand(OpId).get());
+ if (CI == nullptr)
+ return true;
+
+ Value = CI->getZExtValue();
+ return false;
+}
+
static bool parseRootFlags(LLVMContext *Ctx, mcdxbc::RootSignatureDesc &RSD,
MDNode *RootFlagNode) {
if (RootFlagNode->getNumOperands() != 2)
return reportError(Ctx, "Invalid format for RootFlag Element");
- auto *Flag = mdconst::extract<ConstantInt>(RootFlagNode->getOperand(1));
- RSD.Flags = Flag->getZExtValue();
+ if (extractMdIntValue(RSD.Flags, RootFlagNode, 1))
+ return reportError(Ctx, "Invalid value for RootFlag");
return false;
}
-static bool extractMdValue(uint32_t &Value, MDNode *Node, unsigned int OpId) {
-
- auto *CI = mdconst::extract<ConstantInt>(Node->getOperand(OpId));
- if (CI == nullptr)
- return true;
-
- Value = CI->getZExtValue();
- return false;
-}
-
static bool parseRootConstants(LLVMContext *Ctx, mcdxbc::RootSignatureDesc &RSD,
- MDNode *RootFlagNode) {
+ MDNode *RootConstantNode) {
- if (RootFlagNode->getNumOperands() != 5)
+ if (RootConstantNode->getNumOperands() != 5)
return reportError(Ctx, "Invalid format for RootConstants Element");
mcdxbc::RootParameter NewParameter;
NewParameter.Header.ParameterType = dxbc::RootParameterType::Constants32Bit;
uint32_t SV;
- if (extractMdValue(SV, RootFlagNode, 1))
+ if (extractMdIntValue(SV, RootConstantNode, 1))
return reportError(Ctx, "Invalid value for ShaderVisibility");
NewParameter.Header.ShaderVisibility = (dxbc::ShaderVisibility)SV;
- if (extractMdValue(NewParameter.Constants.ShaderRegister, RootFlagNode, 2))
+ if (extractMdIntValue(NewParameter.Constants.ShaderRegister, RootConstantNode,
+ 2))
return reportError(Ctx, "Invalid value for ShaderRegister");
- if (extractMdValue(NewParameter.Constants.RegisterSpace, RootFlagNode, 3))
+ if (extractMdIntValue(NewParameter.Constants.RegisterSpace, RootConstantNode,
+ 3))
return reportError(Ctx, "Invalid value for RegisterSpace");
- if (extractMdValue(NewParameter.Constants.Num32BitValues, RootFlagNode, 4))
+ if (extractMdIntValue(NewParameter.Constants.Num32BitValues, RootConstantNode,
+ 4))
return reportError(Ctx, "Invalid value for Num32BitValues");
RSD.Parameters.push_back(NewParameter);
diff --git a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootConstants-Invalid-Num32BitValues.ll b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootConstants-Invalid-Num32BitValues.ll
new file mode 100644
index 0000000000000..b06678519eef7
--- /dev/null
+++ b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootConstants-Invalid-Num32BitValues.ll
@@ -0,0 +1,18 @@
+; 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 Num32BitValues
+; 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 = !{ !"RootConstants", i32 0, i32 1, i32 2, !"Invalid" }
diff --git a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootConstants-Invalid-RegisterSpace.ll b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootConstants-Invalid-RegisterSpace.ll
new file mode 100644
index 0000000000000..1087b414942e2
--- /dev/null
+++ b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootConstants-Invalid-RegisterSpace.ll
@@ -0,0 +1,18 @@
+; 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
+; 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 = !{ !"RootConstants", i32 0, i32 1, !"Invalid", i32 3 }
diff --git a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootConstants-Invalid-ShaderRegister.ll b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootConstants-Invalid-ShaderRegister.ll
new file mode 100644
index 0000000000000..53fd924e8f46e
--- /dev/null
+++ b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootConstants-Invalid-ShaderRegister.ll
@@ -0,0 +1,18 @@
+; 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 ShaderRegister
+; 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 = !{ !"RootConstants", i32 0, !"Invalid", i32 2, i32 3 }
diff --git a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootConstants.ll b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootConstants.ll
index 5812106e651f4..71511ff523340 100644
--- a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootConstants.ll
+++ b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootConstants.ll
@@ -14,8 +14,7 @@ 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 } ; list of root signature elements
-!4 = !{ !"RootFlags", i32 1 } ; 1 = allow_input_assembler_input_layout
+!3 = !{ !5 } ; list of root signature elements
!5 = !{ !"RootConstants", i32 0, i32 1, i32 2, i32 3 }
; DXC: - Name: RTS0
@@ -33,4 +32,3 @@ attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" }
; DXC-NEXT: Num32BitValues: 3
; DXC-NEXT: RegisterSpace: 2
; DXC-NEXT: ShaderRegister: 1
-; DXC-NEXT: AllowInputAssemblerInputLayout: true
>From 8bdc206ee809bf40dead3e3aaa4b6e7750e152e9 Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Mon, 14 Apr 2025 19:53:16 +0000
Subject: [PATCH 04/13] address comments
---
llvm/lib/Target/DirectX/DXILRootSignature.cpp | 5 ++---
...Error.ll => RootSignature-Parameters-Validation-Error.ll} | 3 +--
... => RootSignature-RootFlags-VisibilityValidationError.ll} | 0
3 files changed, 3 insertions(+), 5 deletions(-)
rename llvm/test/CodeGen/DirectX/ContainerData/{RootSignature-Flags-Validation-Error.ll => RootSignature-Parameters-Validation-Error.ll} (81%)
rename llvm/test/CodeGen/DirectX/ContainerData/{RootSignature-ShaderVisibility-Validation-Error.ll => RootSignature-RootFlags-VisibilityValidationError.ll} (100%)
diff --git a/llvm/lib/Target/DirectX/DXILRootSignature.cpp b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
index 607b025d3653d..0605c565ba6b1 100644
--- a/llvm/lib/Target/DirectX/DXILRootSignature.cpp
+++ b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
@@ -192,9 +192,8 @@ static bool validate(LLVMContext *Ctx, const mcdxbc::RootSignatureDesc &RSD) {
return reportValueError(Ctx, "ShaderVisibility",
(uint32_t)P.Header.ShaderVisibility);
- if (!verifyParameterType(P.Header.ParameterType))
- return reportValueError(Ctx, "ParameterType",
- (uint32_t)P.Header.ParameterType);
+ assert(verifyParameterType(P.Header.ParameterType) &&
+ "Invalid value for ParameterType");
}
return false;
diff --git a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Flags-Validation-Error.ll b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Parameters-Validation-Error.ll
similarity index 81%
rename from llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Flags-Validation-Error.ll
rename to llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Parameters-Validation-Error.ll
index 3af9a524e77f4..2b4a075281f80 100644
--- a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Flags-Validation-Error.ll
+++ b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Parameters-Validation-Error.ll
@@ -16,6 +16,5 @@ 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 } ; list of root signature elements
-!4 = !{ !"RootFlags", i32 1 } ; 1 = allow_input_assembler_input_layout
+!3 = !{ !5 } ; list of root signature elements
!5 = !{ !"RootConstants", i32 255, i32 1, i32 2, i32 3 }
diff --git a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-ShaderVisibility-Validation-Error.ll b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootFlags-VisibilityValidationError.ll
similarity index 100%
rename from llvm/test/CodeGen/DirectX/ContainerData/RootSignature-ShaderVisibility-Validation-Error.ll
rename to llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootFlags-VisibilityValidationError.ll
>From 1e5eee549ea70efe181b635c84e278415b1e9e2b Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Mon, 14 Apr 2025 20:48:00 +0000
Subject: [PATCH 05/13] addressing pr comments
---
llvm/lib/Object/DXContainer.cpp | 2 --
1 file changed, 2 deletions(-)
diff --git a/llvm/lib/Object/DXContainer.cpp b/llvm/lib/Object/DXContainer.cpp
index 77303edce1a41..95f6788e75aa6 100644
--- a/llvm/lib/Object/DXContainer.cpp
+++ b/llvm/lib/Object/DXContainer.cpp
@@ -272,8 +272,6 @@ Error DirectX::RootSignature::parse() {
Flags = support::endian::read<uint32_t, llvm::endianness::little>(Current);
Current += sizeof(uint32_t);
- assert(Current == PartData.begin() + RootParametersOffset);
-
ParametersHeaders.Data = PartData.substr(
RootParametersOffset, NumParameters * sizeof(dxbc::RootParameterHeader));
>From a968d81f3e212ed1621095c6886dec27eb06d1e6 Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Mon, 14 Apr 2025 20:52:22 +0000
Subject: [PATCH 06/13] Revert "addressing pr comments"
This reverts commit 1e5eee549ea70efe181b635c84e278415b1e9e2b.
---
llvm/lib/Object/DXContainer.cpp | 2 ++
1 file changed, 2 insertions(+)
diff --git a/llvm/lib/Object/DXContainer.cpp b/llvm/lib/Object/DXContainer.cpp
index 95f6788e75aa6..77303edce1a41 100644
--- a/llvm/lib/Object/DXContainer.cpp
+++ b/llvm/lib/Object/DXContainer.cpp
@@ -272,6 +272,8 @@ Error DirectX::RootSignature::parse() {
Flags = support::endian::read<uint32_t, llvm::endianness::little>(Current);
Current += sizeof(uint32_t);
+ assert(Current == PartData.begin() + RootParametersOffset);
+
ParametersHeaders.Data = PartData.substr(
RootParametersOffset, NumParameters * sizeof(dxbc::RootParameterHeader));
>From 8511fa99d3ec267ae1d53dd1b5a4d8357de84fc9 Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Mon, 14 Apr 2025 20:53:05 +0000
Subject: [PATCH 07/13] address comments
---
llvm/lib/Object/DXContainer.cpp | 2 --
1 file changed, 2 deletions(-)
diff --git a/llvm/lib/Object/DXContainer.cpp b/llvm/lib/Object/DXContainer.cpp
index 77303edce1a41..95f6788e75aa6 100644
--- a/llvm/lib/Object/DXContainer.cpp
+++ b/llvm/lib/Object/DXContainer.cpp
@@ -272,8 +272,6 @@ Error DirectX::RootSignature::parse() {
Flags = support::endian::read<uint32_t, llvm::endianness::little>(Current);
Current += sizeof(uint32_t);
- assert(Current == PartData.begin() + RootParametersOffset);
-
ParametersHeaders.Data = PartData.substr(
RootParametersOffset, NumParameters * sizeof(dxbc::RootParameterHeader));
>From 330369abd95a28411fb238d41adaf5ea1c5ab97d Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Tue, 15 Apr 2025 01:11:12 +0000
Subject: [PATCH 08/13] changing back enums to enum class
---
llvm/include/llvm/BinaryFormat/DXContainer.h | 4 ++--
llvm/include/llvm/Object/DXContainer.h | 8 ++++++--
llvm/lib/MC/DXContainerRootSignature.cpp | 4 ++--
llvm/lib/ObjectYAML/DXContainerEmitter.cpp | 3 ++-
llvm/lib/ObjectYAML/DXContainerYAML.cpp | 4 +++-
5 files changed, 15 insertions(+), 8 deletions(-)
diff --git a/llvm/include/llvm/BinaryFormat/DXContainer.h b/llvm/include/llvm/BinaryFormat/DXContainer.h
index 56df554b56e2e..819e7d3f4d571 100644
--- a/llvm/include/llvm/BinaryFormat/DXContainer.h
+++ b/llvm/include/llvm/BinaryFormat/DXContainer.h
@@ -159,7 +159,7 @@ enum class RootElementFlag : uint32_t {
};
#define ROOT_PARAMETER(Val, Enum) Enum = Val,
-enum RootParameterType : uint32_t {
+enum class RootParameterType : uint32_t {
#include "DXContainerConstants.def"
};
@@ -176,7 +176,7 @@ inline bool isValidParameterType(uint32_t V) {
}
#define SHADER_VISIBILITY(Val, Enum) Enum = Val,
-enum ShaderVisibility : uint32_t {
+enum class ShaderVisibility : uint32_t {
#include "DXContainerConstants.def"
};
diff --git a/llvm/include/llvm/Object/DXContainer.h b/llvm/include/llvm/Object/DXContainer.h
index 561e4c1d1c634..e666a3df95ba6 100644
--- a/llvm/include/llvm/Object/DXContainer.h
+++ b/llvm/include/llvm/Object/DXContainer.h
@@ -139,7 +139,8 @@ struct RootParameterView {
struct RootConstantView : RootParameterView {
static bool classof(const RootParameterView *V) {
- return V->Header.ParameterType == dxbc::RootParameterType::Constants32Bit;
+ return V->Header.ParameterType ==
+ (uint32_t)dxbc::RootParameterType::Constants32Bit;
}
llvm::Expected<dxbc::RootConstants> read() {
@@ -183,7 +184,10 @@ class RootSignature {
getParameter(const dxbc::RootParameterHeader &Header) const {
size_t DataSize;
- switch (Header.ParameterType) {
+ if (!dxbc::isValidParameterType(Header.ParameterType))
+ return parseFailed("invalid parameter type");
+
+ switch (static_cast<dxbc::RootParameterType>(Header.ParameterType)) {
case dxbc::RootParameterType::Constants32Bit:
DataSize = sizeof(dxbc::RootConstants);
break;
diff --git a/llvm/lib/MC/DXContainerRootSignature.cpp b/llvm/lib/MC/DXContainerRootSignature.cpp
index 63de60acc9bc2..fc85f275297fe 100644
--- a/llvm/lib/MC/DXContainerRootSignature.cpp
+++ b/llvm/lib/MC/DXContainerRootSignature.cpp
@@ -34,7 +34,7 @@ size_t RootSignatureDesc::getSize() const {
for (const auto &P : Parameters) {
switch (P.Header.ParameterType) {
- case dxbc::RootParameterType::Constants32Bit:
+ case static_cast<uint32_t>(dxbc::RootParameterType::Constants32Bit):
Size += sizeof(dxbc::RootConstants);
break;
}
@@ -75,7 +75,7 @@ void RootSignatureDesc::write(raw_ostream &OS) const {
const auto &P = Parameters[I];
switch (P.Header.ParameterType) {
- case dxbc::RootParameterType::Constants32Bit:
+ case static_cast<uint32_t>(dxbc::RootParameterType::Constants32Bit):
support::endian::write(BOS, P.Constants.ShaderRegister,
llvm::endianness::little);
support::endian::write(BOS, P.Constants.RegisterSpace,
diff --git a/llvm/lib/ObjectYAML/DXContainerEmitter.cpp b/llvm/lib/ObjectYAML/DXContainerEmitter.cpp
index 1342629df84f3..f1fe224e240b7 100644
--- a/llvm/lib/ObjectYAML/DXContainerEmitter.cpp
+++ b/llvm/lib/ObjectYAML/DXContainerEmitter.cpp
@@ -19,6 +19,7 @@
#include "llvm/Support/Errc.h"
#include "llvm/Support/Error.h"
#include "llvm/Support/raw_ostream.h"
+#include <cstdint>
using namespace llvm;
@@ -276,7 +277,7 @@ void DXContainerWriter::writeParts(raw_ostream &OS) {
switch (Param.Type) {
- case dxbc::RootParameterType::Constants32Bit:
+ case static_cast<uint32_t>(dxbc::RootParameterType::Constants32Bit):
NewParam.Constants.Num32BitValues = Param.Constants.Num32BitValues;
NewParam.Constants.RegisterSpace = Param.Constants.RegisterSpace;
NewParam.Constants.ShaderRegister = Param.Constants.ShaderRegister;
diff --git a/llvm/lib/ObjectYAML/DXContainerYAML.cpp b/llvm/lib/ObjectYAML/DXContainerYAML.cpp
index d94347a946123..f892e687e101b 100644
--- a/llvm/lib/ObjectYAML/DXContainerYAML.cpp
+++ b/llvm/lib/ObjectYAML/DXContainerYAML.cpp
@@ -16,6 +16,7 @@
#include "llvm/BinaryFormat/DXContainer.h"
#include "llvm/Support/Error.h"
#include "llvm/Support/ScopedPrinter.h"
+#include <cstdint>
#include <system_error>
namespace llvm {
@@ -279,8 +280,9 @@ void MappingTraits<llvm::DXContainerYAML::RootParameterYamlDesc>::mapping(
IO &IO, llvm::DXContainerYAML::RootParameterYamlDesc &P) {
IO.mapRequired("ParameterType", P.Type);
IO.mapRequired("ShaderVisibility", P.Visibility);
+
switch (P.Type) {
- case dxbc::RootParameterType::Constants32Bit:
+ case static_cast<uint32_t>(dxbc::RootParameterType::Constants32Bit):
IO.mapRequired("Constants", P.Constants);
break;
}
>From d747bcc6d7c3681a52528f2809aeb4258d721a5d Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Wed, 16 Apr 2025 16:46:16 +0000
Subject: [PATCH 09/13] addressing PR comments and adding more tests
---
llvm/include/llvm/Object/DXContainer.h | 7 +--
llvm/lib/MC/DXContainerRootSignature.cpp | 10 ++--
llvm/lib/ObjectYAML/DXContainerEmitter.cpp | 3 +-
llvm/lib/ObjectYAML/DXContainerYAML.cpp | 8 +--
llvm/unittests/Object/DXContainerTest.cpp | 38 +++++++++++++-
.../ObjectYAML/DXContainerYAMLTest.cpp | 52 +++++++++++++++++++
6 files changed, 104 insertions(+), 14 deletions(-)
diff --git a/llvm/include/llvm/Object/DXContainer.h b/llvm/include/llvm/Object/DXContainer.h
index e666a3df95ba6..e8287ce078365 100644
--- a/llvm/include/llvm/Object/DXContainer.h
+++ b/llvm/include/llvm/Object/DXContainer.h
@@ -23,6 +23,7 @@
#include "llvm/Support/MemoryBufferRef.h"
#include "llvm/TargetParser/Triple.h"
#include <array>
+#include <cstddef>
#include <variant>
namespace llvm {
@@ -192,9 +193,9 @@ class RootSignature {
DataSize = sizeof(dxbc::RootConstants);
break;
}
- auto EndOfSectionByte = getNumStaticSamplers() == 0
- ? PartData.size()
- : getStaticSamplersOffset();
+ size_t EndOfSectionByte = getNumStaticSamplers() == 0
+ ? PartData.size()
+ : getStaticSamplersOffset();
if (Header.ParameterOffset + DataSize > EndOfSectionByte)
return parseFailed("Reading structure out of file bounds");
diff --git a/llvm/lib/MC/DXContainerRootSignature.cpp b/llvm/lib/MC/DXContainerRootSignature.cpp
index fc85f275297fe..619c3ec337d4c 100644
--- a/llvm/lib/MC/DXContainerRootSignature.cpp
+++ b/llvm/lib/MC/DXContainerRootSignature.cpp
@@ -32,9 +32,9 @@ size_t RootSignatureDesc::getSize() const {
size_t Size = sizeof(dxbc::RootSignatureHeader) +
Parameters.size() * sizeof(dxbc::RootParameterHeader);
- for (const auto &P : Parameters) {
+ for (const mcdxbc::RootParameter &P : Parameters) {
switch (P.Header.ParameterType) {
- case static_cast<uint32_t>(dxbc::RootParameterType::Constants32Bit):
+ case llvm::to_underlying(dxbc::RootParameterType::Constants32Bit):
Size += sizeof(dxbc::RootConstants);
break;
}
@@ -60,7 +60,7 @@ void RootSignatureDesc::write(raw_ostream &OS) const {
support::endian::write(BOS, Flags, llvm::endianness::little);
SmallVector<uint32_t> ParamsOffsets;
- for (const auto &P : Parameters) {
+ for (const mcdxbc::RootParameter &P : Parameters) {
support::endian::write(BOS, P.Header.ParameterType,
llvm::endianness::little);
support::endian::write(BOS, P.Header.ShaderVisibility,
@@ -72,10 +72,10 @@ void RootSignatureDesc::write(raw_ostream &OS) const {
assert(NumParameters == ParamsOffsets.size());
for (size_t I = 0; I < NumParameters; ++I) {
rewriteOffsetToCurrentByte(BOS, ParamsOffsets[I]);
- const auto &P = Parameters[I];
+ const mcdxbc::RootParameter &P = Parameters[I];
switch (P.Header.ParameterType) {
- case static_cast<uint32_t>(dxbc::RootParameterType::Constants32Bit):
+ case llvm::to_underlying(dxbc::RootParameterType::Constants32Bit):
support::endian::write(BOS, P.Constants.ShaderRegister,
llvm::endianness::little);
support::endian::write(BOS, P.Constants.RegisterSpace,
diff --git a/llvm/lib/ObjectYAML/DXContainerEmitter.cpp b/llvm/lib/ObjectYAML/DXContainerEmitter.cpp
index f1fe224e240b7..dee30b77d888d 100644
--- a/llvm/lib/ObjectYAML/DXContainerEmitter.cpp
+++ b/llvm/lib/ObjectYAML/DXContainerEmitter.cpp
@@ -276,8 +276,7 @@ void DXContainerWriter::writeParts(raw_ostream &OS) {
Param.Type, Param.Visibility, Param.Offset};
switch (Param.Type) {
-
- case static_cast<uint32_t>(dxbc::RootParameterType::Constants32Bit):
+ case llvm::to_underlying(dxbc::RootParameterType::Constants32Bit):
NewParam.Constants.Num32BitValues = Param.Constants.Num32BitValues;
NewParam.Constants.RegisterSpace = Param.Constants.RegisterSpace;
NewParam.Constants.ShaderRegister = Param.Constants.ShaderRegister;
diff --git a/llvm/lib/ObjectYAML/DXContainerYAML.cpp b/llvm/lib/ObjectYAML/DXContainerYAML.cpp
index f892e687e101b..fa8551c0ca5a1 100644
--- a/llvm/lib/ObjectYAML/DXContainerYAML.cpp
+++ b/llvm/lib/ObjectYAML/DXContainerYAML.cpp
@@ -12,6 +12,7 @@
//===----------------------------------------------------------------------===//
#include "llvm/ObjectYAML/DXContainerYAML.h"
+#include "llvm/ADT/STLForwardCompat.h"
#include "llvm/ADT/ScopeExit.h"
#include "llvm/BinaryFormat/DXContainer.h"
#include "llvm/Support/Error.h"
@@ -45,7 +46,7 @@ DXContainerYAML::RootSignatureYamlDesc::create(
RootSigDesc.RootParametersOffset = Data.getRootParametersOffset();
uint32_t Flags = Data.getFlags();
- for (const auto &PH : Data.param_headers()) {
+ for (const dxbc::RootParameterHeader &PH : Data.param_headers()) {
RootParameterYamlDesc NewP;
NewP.Offset = PH.ParameterOffset;
@@ -84,7 +85,8 @@ DXContainerYAML::RootSignatureYamlDesc::create(
RootSigDesc.Parameters.push_back(NewP);
}
#define ROOT_ELEMENT_FLAG(Num, Val) \
- RootSigDesc.Val = (Flags & (uint32_t)dxbc::RootElementFlag::Val) > 0;
+ RootSigDesc.Val = \
+ (Flags & llvm::to_underlying(dxbc::RootElementFlag::Val)) > 0;
#include "llvm/BinaryFormat/DXContainerConstants.def"
return RootSigDesc;
}
@@ -282,7 +284,7 @@ void MappingTraits<llvm::DXContainerYAML::RootParameterYamlDesc>::mapping(
IO.mapRequired("ShaderVisibility", P.Visibility);
switch (P.Type) {
- case static_cast<uint32_t>(dxbc::RootParameterType::Constants32Bit):
+ case llvm::to_underlying(dxbc::RootParameterType::Constants32Bit):
IO.mapRequired("Constants", P.Constants);
break;
}
diff --git a/llvm/unittests/Object/DXContainerTest.cpp b/llvm/unittests/Object/DXContainerTest.cpp
index bf32c07951520..7c721f38c6301 100644
--- a/llvm/unittests/Object/DXContainerTest.cpp
+++ b/llvm/unittests/Object/DXContainerTest.cpp
@@ -822,6 +822,43 @@ TEST(DXCFile, MalformedSignature) {
}
}
+TEST(RootSignature, MalformedData) {
+ {
+ // RootParametersOffset is 255.
+ uint8_t Buffer[] = {
+ 0x44, 0x58, 0x42, 0x43, 0x32, 0x9a, 0x53, 0xd8, 0xec, 0xbe, 0x35, 0x6f,
+ 0x05, 0x39, 0xe1, 0xfe, 0x31, 0x20, 0xf0, 0xc1, 0x01, 0x00, 0x00, 0x00,
+ 0x85, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00,
+ 0x52, 0x54, 0x53, 0x30, 0x59, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
+ 0x01, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x2c, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
+ 0x02, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00,
+ 0x0e, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00};
+ DXContainer C =
+ llvm::cantFail(DXContainer::create(getMemoryBuffer<133>(Buffer)));
+
+ auto MaybeRS = C.getRootSignature();
+ ASSERT_TRUE(MaybeRS.has_value());
+ const auto &RS = MaybeRS.value();
+ ASSERT_EQ(RS.getVersion(), 2u);
+ ASSERT_EQ(RS.getNumParameters(), 1u);
+ ASSERT_EQ(RS.getRootParametersOffset(), 255u);
+ ASSERT_EQ(RS.getNumStaticSamplers(), 0u);
+ ASSERT_EQ(RS.getStaticSamplersOffset(), 44u);
+ ASSERT_EQ(RS.getFlags(), 17u);
+
+ // Since the offset is wrong, the data becomes invalid.
+ auto RootParam = *RS.param_headers().begin();
+ auto ParamView = RS.getParameter(RootParam);
+ ASSERT_THAT_ERROR(ParamView.takeError(),
+ FailedWithMessage("invalid parameter type"));
+ }
+}
+
TEST(RootSignature, ParseRootFlags) {
{
uint8_t Buffer[] = {
@@ -844,7 +881,6 @@ TEST(RootSignature, ParseRootFlags) {
ASSERT_EQ(RS->getStaticSamplersOffset(), 0u);
ASSERT_EQ(RS->getFlags(), 0x01u);
}
-
{
// this parameter has the root signature definition missing some values.
uint8_t Buffer[] = {
diff --git a/llvm/unittests/ObjectYAML/DXContainerYAMLTest.cpp b/llvm/unittests/ObjectYAML/DXContainerYAMLTest.cpp
index 99ca161883498..3a40fc457d2dc 100644
--- a/llvm/unittests/ObjectYAML/DXContainerYAMLTest.cpp
+++ b/llvm/unittests/ObjectYAML/DXContainerYAMLTest.cpp
@@ -148,6 +148,58 @@ TEST(RootSignature, ParseRootFlags) {
EXPECT_TRUE(memcmp(Buffer, Storage.data(), 68u) == 0);
}
+TEST(RootSignature, MalformedData) {
+ SmallString<128> Storage;
+
+ // First read a fully explicit yaml with all sizes and offsets provided
+ ASSERT_TRUE(convert(Storage, R"(--- !dxcontainer
+ Header:
+ Hash: [ 0x32, 0x9A, 0x53, 0xD8, 0xEC, 0xBE, 0x35, 0x6F, 0x5,
+ 0x39, 0xE1, 0xFE, 0x31, 0x20, 0xF0, 0xC1 ]
+ Version:
+ Major: 1
+ Minor: 0
+ FileSize: 133
+ PartCount: 1
+ PartOffsets: [ 36 ]
+ Parts:
+ - Name: RTS0
+ Size: 89
+ RootSignature:
+ Version: 2
+ NumRootParameters: 1
+ RootParametersOffset: 255
+ NumStaticSamplers: 0
+ StaticSamplersOffset: 56
+ Parameters:
+ - ParameterType: 1
+ ShaderVisibility: 2
+ Constants:
+ Num32BitValues: 16
+ ShaderRegister: 15
+ RegisterSpace: 14
+ AllowInputAssemblerInputLayout: true
+ DenyGeometryShaderRootAccess: true
+ )"));
+
+ uint8_t Buffer[] = {
+ 0x44, 0x58, 0x42, 0x43, 0x32, 0x9a, 0x53, 0xd8, 0xec, 0xbe, 0x35, 0x6f,
+ 0x05, 0x39, 0xe1, 0xfe, 0x31, 0x20, 0xf0, 0xc1, 0x01, 0x00, 0x00, 0x00,
+ 0x85, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00,
+ 0x52, 0x54, 0x53, 0x30, 0x59, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
+ 0x01, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
+ 0x02, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00,
+ 0x0e, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00};
+
+ EXPECT_EQ(Storage.size(), 133u);
+ EXPECT_TRUE(memcmp(Buffer, Storage.data(), 133u) == 0);
+}
+
TEST(RootSignature, ParseRootConstants) {
SmallString<128> Storage;
>From 6cef56775f0f19203a936cbdc4c8e58eb7c2828c Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Wed, 16 Apr 2025 18:36:50 +0000
Subject: [PATCH 10/13] adding tests and fixing code
---
.../llvm/MC/DXContainerRootSignature.h | 3 ++
llvm/lib/MC/DXContainerRootSignature.cpp | 7 ++--
llvm/lib/ObjectYAML/DXContainerEmitter.cpp | 4 +++
.../ContainerData/RootSignature-Flags.ll | 2 +-
.../DXContainer/RootSignature-Flags.yaml | 6 ++--
.../RootSignature-MultipleParameters.yaml | 4 +--
llvm/unittests/Object/DXContainerTest.cpp | 33 ++++++++++++++-----
.../ObjectYAML/DXContainerYAMLTest.cpp | 12 +++----
8 files changed, 45 insertions(+), 26 deletions(-)
diff --git a/llvm/include/llvm/MC/DXContainerRootSignature.h b/llvm/include/llvm/MC/DXContainerRootSignature.h
index d0f5e2af861d8..fee799249b255 100644
--- a/llvm/include/llvm/MC/DXContainerRootSignature.h
+++ b/llvm/include/llvm/MC/DXContainerRootSignature.h
@@ -25,6 +25,9 @@ struct RootSignatureDesc {
uint32_t Version = 2U;
uint32_t Flags = 0U;
+ uint32_t RootParameterOffset = 0U;
+ uint32_t StaticSamplersOffset = 0u;
+ uint32_t NumStaticSamplers = 0u;
SmallVector<mcdxbc::RootParameter> Parameters;
void write(raw_ostream &OS) const;
diff --git a/llvm/lib/MC/DXContainerRootSignature.cpp b/llvm/lib/MC/DXContainerRootSignature.cpp
index 619c3ec337d4c..c2731d95c955e 100644
--- a/llvm/lib/MC/DXContainerRootSignature.cpp
+++ b/llvm/lib/MC/DXContainerRootSignature.cpp
@@ -48,15 +48,12 @@ void RootSignatureDesc::write(raw_ostream &OS) const {
BOS.reserveExtraSpace(getSize());
const uint32_t NumParameters = Parameters.size();
- const uint32_t StaticSamplerOffset = 0u;
- const uint32_t NumStaticSamplers = 0u;
support::endian::write(BOS, Version, llvm::endianness::little);
support::endian::write(BOS, NumParameters, llvm::endianness::little);
- support::endian::write(BOS, (uint32_t)sizeof(dxbc::RootSignatureHeader),
- llvm::endianness::little);
- support::endian::write(BOS, StaticSamplerOffset, llvm::endianness::little);
+ support::endian::write(BOS, RootParameterOffset, llvm::endianness::little);
support::endian::write(BOS, NumStaticSamplers, llvm::endianness::little);
+ support::endian::write(BOS, StaticSamplersOffset, llvm::endianness::little);
support::endian::write(BOS, Flags, llvm::endianness::little);
SmallVector<uint32_t> ParamsOffsets;
diff --git a/llvm/lib/ObjectYAML/DXContainerEmitter.cpp b/llvm/lib/ObjectYAML/DXContainerEmitter.cpp
index dee30b77d888d..0c5f562990bdb 100644
--- a/llvm/lib/ObjectYAML/DXContainerEmitter.cpp
+++ b/llvm/lib/ObjectYAML/DXContainerEmitter.cpp
@@ -270,6 +270,10 @@ void DXContainerWriter::writeParts(raw_ostream &OS) {
mcdxbc::RootSignatureDesc RS;
RS.Flags = P.RootSignature->getEncodedFlags();
RS.Version = P.RootSignature->Version;
+ RS.RootParameterOffset = P.RootSignature->RootParametersOffset;
+ RS.NumStaticSamplers = P.RootSignature->NumStaticSamplers;
+ RS.StaticSamplersOffset = P.RootSignature->StaticSamplersOffset;
+
for (const auto &Param : P.RootSignature->Parameters) {
mcdxbc::RootParameter NewParam;
NewParam.Header = dxbc::RootParameterHeader{
diff --git a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Flags.ll b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Flags.ll
index e81679732a5d8..ef2b97860bfae 100644
--- a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Flags.ll
+++ b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Flags.ll
@@ -23,7 +23,7 @@ attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" }
; DXC-NEXT: RootSignature:
; DXC-NEXT: Version: 2
; DXC-NEXT: NumRootParameters: 0
-; DXC-NEXT: RootParametersOffset: 24
+; DXC-NEXT: RootParametersOffset: 0
; DXC-NEXT: NumStaticSamplers: 0
; DXC-NEXT: StaticSamplersOffset: 0
; DXC-NEXT: Parameters: []
diff --git a/llvm/test/ObjectYAML/DXContainer/RootSignature-Flags.yaml b/llvm/test/ObjectYAML/DXContainer/RootSignature-Flags.yaml
index 831664de2c9d9..2caae2afc2204 100644
--- a/llvm/test/ObjectYAML/DXContainer/RootSignature-Flags.yaml
+++ b/llvm/test/ObjectYAML/DXContainer/RootSignature-Flags.yaml
@@ -16,8 +16,8 @@ Parts:
Version: 2
NumRootParameters: 0
RootParametersOffset: 24
- NumStaticSamplers: 4
- StaticSamplersOffset: 5
+ NumStaticSamplers: 0
+ StaticSamplersOffset: 12
Parameters: []
AllowInputAssemblerInputLayout: true
DenyGeometryShaderRootAccess: true
@@ -29,7 +29,7 @@ Parts:
# CHECK-NEXT: NumRootParameters: 0
# CHECK-NEXT: RootParametersOffset: 24
# CHECK-NEXT: NumStaticSamplers: 0
-# CHECK-NEXT: StaticSamplersOffset: 0
+# CHECK-NEXT: StaticSamplersOffset: 12
# CHECK-NEXT: Parameters: []
# CHECK-NEXT: AllowInputAssemblerInputLayout: true
# CHECK-NEXT: DenyGeometryShaderRootAccess: true
diff --git a/llvm/test/ObjectYAML/DXContainer/RootSignature-MultipleParameters.yaml b/llvm/test/ObjectYAML/DXContainer/RootSignature-MultipleParameters.yaml
index d6316765e42fb..4342e57f43785 100644
--- a/llvm/test/ObjectYAML/DXContainer/RootSignature-MultipleParameters.yaml
+++ b/llvm/test/ObjectYAML/DXContainer/RootSignature-MultipleParameters.yaml
@@ -17,7 +17,7 @@ Parts:
NumRootParameters: 2
RootParametersOffset: 24
NumStaticSamplers: 0
- StaticSamplersOffset: 64
+ StaticSamplersOffset: 12
Parameters:
- ParameterType: 1 # Constants32Bit
ShaderVisibility: 2 # Hull
@@ -41,7 +41,7 @@ Parts:
# CHECK-NEXT: NumRootParameters: 2
# CHECK-NEXT: RootParametersOffset: 24
# CHECK-NEXT: NumStaticSamplers: 0
-# CHECK-NEXT: StaticSamplersOffset: 0
+# CHECK-NEXT: StaticSamplersOffset: 12
# CHECK-NEXT: Parameters:
# CHECK-NEXT: - ParameterType: 1
# CHECK-NEXT: ShaderVisibility: 2
diff --git a/llvm/unittests/Object/DXContainerTest.cpp b/llvm/unittests/Object/DXContainerTest.cpp
index 7c721f38c6301..e86310ae2e5d5 100644
--- a/llvm/unittests/Object/DXContainerTest.cpp
+++ b/llvm/unittests/Object/DXContainerTest.cpp
@@ -11,6 +11,7 @@
#include "llvm/BinaryFormat/Magic.h"
#include "llvm/ObjectYAML/DXContainerYAML.h"
#include "llvm/ObjectYAML/yaml2obj.h"
+#include "llvm/Support/Error.h"
#include "llvm/Support/MemoryBufferRef.h"
#include "llvm/Testing/Support/Error.h"
#include "gtest/gtest.h"
@@ -824,38 +825,52 @@ TEST(DXCFile, MalformedSignature) {
TEST(RootSignature, MalformedData) {
{
- // RootParametersOffset is 255.
+ // Root Parameters offset has changed to 36, additional padding was added,
+ // as well as fixing the parameter offset.
uint8_t Buffer[] = {
0x44, 0x58, 0x42, 0x43, 0x32, 0x9a, 0x53, 0xd8, 0xec, 0xbe, 0x35, 0x6f,
0x05, 0x39, 0xe1, 0xfe, 0x31, 0x20, 0xf0, 0xc1, 0x01, 0x00, 0x00, 0x00,
0x85, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00,
0x52, 0x54, 0x53, 0x30, 0x59, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
- 0x01, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x2c, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
- 0x02, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00,
+ 0x01, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x2c, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
+ 0x02, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00,
0x0e, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00};
+
DXContainer C =
- llvm::cantFail(DXContainer::create(getMemoryBuffer<133>(Buffer)));
+ llvm::cantFail(DXContainer::create(getMemoryBuffer<144>(Buffer)));
auto MaybeRS = C.getRootSignature();
ASSERT_TRUE(MaybeRS.has_value());
const auto &RS = MaybeRS.value();
ASSERT_EQ(RS.getVersion(), 2u);
ASSERT_EQ(RS.getNumParameters(), 1u);
- ASSERT_EQ(RS.getRootParametersOffset(), 255u);
+ ASSERT_EQ(RS.getRootParametersOffset(), 36u);
ASSERT_EQ(RS.getNumStaticSamplers(), 0u);
ASSERT_EQ(RS.getStaticSamplersOffset(), 44u);
ASSERT_EQ(RS.getFlags(), 17u);
- // Since the offset is wrong, the data becomes invalid.
auto RootParam = *RS.param_headers().begin();
+ ASSERT_EQ((unsigned)RootParam.ParameterType, 1u);
+ ASSERT_EQ((unsigned)RootParam.ShaderVisibility, 2u);
auto ParamView = RS.getParameter(RootParam);
- ASSERT_THAT_ERROR(ParamView.takeError(),
- FailedWithMessage("invalid parameter type"));
+ ASSERT_THAT_ERROR(ParamView.takeError(), Succeeded());
+
+ DirectX::RootConstantView *RootConstantsView =
+ dyn_cast<DirectX::RootConstantView>(&*ParamView);
+ ASSERT_TRUE(RootConstantsView != nullptr);
+ auto Constants = RootConstantsView->read();
+
+ ASSERT_THAT_ERROR(Constants.takeError(), Succeeded());
+
+ ASSERT_EQ(Constants->ShaderRegister, 15u);
+ ASSERT_EQ(Constants->RegisterSpace, 14u);
+ ASSERT_EQ(Constants->Num32BitValues, 16u);
}
}
diff --git a/llvm/unittests/ObjectYAML/DXContainerYAMLTest.cpp b/llvm/unittests/ObjectYAML/DXContainerYAMLTest.cpp
index 3a40fc457d2dc..61390049bc0df 100644
--- a/llvm/unittests/ObjectYAML/DXContainerYAMLTest.cpp
+++ b/llvm/unittests/ObjectYAML/DXContainerYAMLTest.cpp
@@ -148,7 +148,7 @@ TEST(RootSignature, ParseRootFlags) {
EXPECT_TRUE(memcmp(Buffer, Storage.data(), 68u) == 0);
}
-TEST(RootSignature, MalformedData) {
+TEST(RootSignature, HeaderData) {
SmallString<128> Storage;
// First read a fully explicit yaml with all sizes and offsets provided
@@ -170,7 +170,7 @@ TEST(RootSignature, MalformedData) {
NumRootParameters: 1
RootParametersOffset: 255
NumStaticSamplers: 0
- StaticSamplersOffset: 56
+ StaticSamplersOffset: 0
Parameters:
- ParameterType: 1
ShaderVisibility: 2
@@ -187,7 +187,7 @@ TEST(RootSignature, MalformedData) {
0x05, 0x39, 0xe1, 0xfe, 0x31, 0x20, 0xf0, 0xc1, 0x01, 0x00, 0x00, 0x00,
0x85, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00,
0x52, 0x54, 0x53, 0x30, 0x59, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
- 0x01, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x01, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
0x02, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00,
0x0e, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
@@ -220,9 +220,9 @@ TEST(RootSignature, ParseRootConstants) {
RootSignature:
Version: 2
NumRootParameters: 1
- RootParametersOffset: 24
+ RootParametersOffset: 36
NumStaticSamplers: 0
- StaticSamplersOffset: 56
+ StaticSamplersOffset: 0
Parameters:
- ParameterType: 1
ShaderVisibility: 2
@@ -239,7 +239,7 @@ TEST(RootSignature, ParseRootConstants) {
0x05, 0x39, 0xe1, 0xfe, 0x31, 0x20, 0xf0, 0xc1, 0x01, 0x00, 0x00, 0x00,
0x85, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00,
0x52, 0x54, 0x53, 0x30, 0x59, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
- 0x01, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x01, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
0x02, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00,
0x0e, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
>From 246d5d3de84d819126b38688c145c78c02958ad4 Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Wed, 16 Apr 2025 20:50:37 +0000
Subject: [PATCH 11/13] addressing comments
---
llvm/test/ObjectYAML/DXContainer/RootSignature-Flags.yaml | 4 ++--
.../DXContainer/RootSignature-MultipleParameters.yaml | 4 ++--
llvm/unittests/Object/DXContainerTest.cpp | 2 +-
3 files changed, 5 insertions(+), 5 deletions(-)
diff --git a/llvm/test/ObjectYAML/DXContainer/RootSignature-Flags.yaml b/llvm/test/ObjectYAML/DXContainer/RootSignature-Flags.yaml
index 2caae2afc2204..74816d403183a 100644
--- a/llvm/test/ObjectYAML/DXContainer/RootSignature-Flags.yaml
+++ b/llvm/test/ObjectYAML/DXContainer/RootSignature-Flags.yaml
@@ -17,7 +17,7 @@ Parts:
NumRootParameters: 0
RootParametersOffset: 24
NumStaticSamplers: 0
- StaticSamplersOffset: 12
+ StaticSamplersOffset: 60
Parameters: []
AllowInputAssemblerInputLayout: true
DenyGeometryShaderRootAccess: true
@@ -29,7 +29,7 @@ Parts:
# CHECK-NEXT: NumRootParameters: 0
# CHECK-NEXT: RootParametersOffset: 24
# CHECK-NEXT: NumStaticSamplers: 0
-# CHECK-NEXT: StaticSamplersOffset: 12
+# CHECK-NEXT: StaticSamplersOffset: 60
# CHECK-NEXT: Parameters: []
# CHECK-NEXT: AllowInputAssemblerInputLayout: true
# CHECK-NEXT: DenyGeometryShaderRootAccess: true
diff --git a/llvm/test/ObjectYAML/DXContainer/RootSignature-MultipleParameters.yaml b/llvm/test/ObjectYAML/DXContainer/RootSignature-MultipleParameters.yaml
index 4342e57f43785..f366d71714359 100644
--- a/llvm/test/ObjectYAML/DXContainer/RootSignature-MultipleParameters.yaml
+++ b/llvm/test/ObjectYAML/DXContainer/RootSignature-MultipleParameters.yaml
@@ -17,7 +17,7 @@ Parts:
NumRootParameters: 2
RootParametersOffset: 24
NumStaticSamplers: 0
- StaticSamplersOffset: 12
+ StaticSamplersOffset: 60
Parameters:
- ParameterType: 1 # Constants32Bit
ShaderVisibility: 2 # Hull
@@ -41,7 +41,7 @@ Parts:
# CHECK-NEXT: NumRootParameters: 2
# CHECK-NEXT: RootParametersOffset: 24
# CHECK-NEXT: NumStaticSamplers: 0
-# CHECK-NEXT: StaticSamplersOffset: 12
+# CHECK-NEXT: StaticSamplersOffset: 60
# CHECK-NEXT: Parameters:
# CHECK-NEXT: - ParameterType: 1
# CHECK-NEXT: ShaderVisibility: 2
diff --git a/llvm/unittests/Object/DXContainerTest.cpp b/llvm/unittests/Object/DXContainerTest.cpp
index e86310ae2e5d5..62ef8e385373f 100644
--- a/llvm/unittests/Object/DXContainerTest.cpp
+++ b/llvm/unittests/Object/DXContainerTest.cpp
@@ -823,7 +823,7 @@ TEST(DXCFile, MalformedSignature) {
}
}
-TEST(RootSignature, MalformedData) {
+TEST(RootSignature, RootParameters) {
{
// Root Parameters offset has changed to 36, additional padding was added,
// as well as fixing the parameter offset.
>From bb6c0cfe35a0c1eb30cf9675fef3b05220051e3a Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Wed, 16 Apr 2025 22:24:54 +0000
Subject: [PATCH 12/13] clean up
---
llvm/lib/ObjectYAML/DXContainerEmitter.cpp | 1 -
1 file changed, 1 deletion(-)
diff --git a/llvm/lib/ObjectYAML/DXContainerEmitter.cpp b/llvm/lib/ObjectYAML/DXContainerEmitter.cpp
index 0c5f562990bdb..86e24eae4abc6 100644
--- a/llvm/lib/ObjectYAML/DXContainerEmitter.cpp
+++ b/llvm/lib/ObjectYAML/DXContainerEmitter.cpp
@@ -19,7 +19,6 @@
#include "llvm/Support/Errc.h"
#include "llvm/Support/Error.h"
#include "llvm/Support/raw_ostream.h"
-#include <cstdint>
using namespace llvm;
>From 7aed7d1f48ca09b6fa7844ef6cffab5a57b058d9 Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Wed, 16 Apr 2025 23:26:34 +0000
Subject: [PATCH 13/13] fixing bugs
---
.../llvm/MC/DXContainerRootSignature.h | 2 +-
llvm/lib/Target/DirectX/DXILRootSignature.cpp | 29 ++++++++++---------
.../ContainerData/RootSignature-Flags.ll | 2 +-
...re-RootConstants-Invalid-Num32BitValues.ll | 4 +--
4 files changed, 18 insertions(+), 19 deletions(-)
diff --git a/llvm/include/llvm/MC/DXContainerRootSignature.h b/llvm/include/llvm/MC/DXContainerRootSignature.h
index fee799249b255..6d3329a2c6ce9 100644
--- a/llvm/include/llvm/MC/DXContainerRootSignature.h
+++ b/llvm/include/llvm/MC/DXContainerRootSignature.h
@@ -25,7 +25,7 @@ struct RootSignatureDesc {
uint32_t Version = 2U;
uint32_t Flags = 0U;
- uint32_t RootParameterOffset = 0U;
+ uint32_t RootParameterOffset = 24U;
uint32_t StaticSamplersOffset = 0u;
uint32_t NumStaticSamplers = 0u;
SmallVector<mcdxbc::RootParameter> Parameters;
diff --git a/llvm/lib/Target/DirectX/DXILRootSignature.cpp b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
index 0605c565ba6b1..5e615461df4f3 100644
--- a/llvm/lib/Target/DirectX/DXILRootSignature.cpp
+++ b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
@@ -76,13 +76,14 @@ static bool parseRootConstants(LLVMContext *Ctx, mcdxbc::RootSignatureDesc &RSD,
return reportError(Ctx, "Invalid format for RootConstants Element");
mcdxbc::RootParameter NewParameter;
- NewParameter.Header.ParameterType = dxbc::RootParameterType::Constants32Bit;
+ NewParameter.Header.ParameterType =
+ llvm::to_underlying(dxbc::RootParameterType::Constants32Bit);
uint32_t SV;
if (extractMdIntValue(SV, RootConstantNode, 1))
return reportError(Ctx, "Invalid value for ShaderVisibility");
- NewParameter.Header.ShaderVisibility = (dxbc::ShaderVisibility)SV;
+ NewParameter.Header.ShaderVisibility = SV;
if (extractMdIntValue(NewParameter.Constants.ShaderRegister, RootConstantNode,
2))
@@ -150,23 +151,23 @@ static bool verifyRootFlag(uint32_t Flags) { return (Flags & ~0xfff) == 0; }
static bool verifyShaderVisibility(uint32_t Flags) {
switch (Flags) {
- case dxbc::ShaderVisibility::All:
- case dxbc::ShaderVisibility::Vertex:
- case dxbc::ShaderVisibility::Hull:
- case dxbc::ShaderVisibility::Domain:
- case dxbc::ShaderVisibility::Geometry:
- case dxbc::ShaderVisibility::Pixel:
- case dxbc::ShaderVisibility::Amplification:
- case dxbc::ShaderVisibility::Mesh:
+ case llvm::to_underlying(dxbc::ShaderVisibility::All):
+ case llvm::to_underlying(dxbc::ShaderVisibility::Vertex):
+ case llvm::to_underlying(dxbc::ShaderVisibility::Hull):
+ case llvm::to_underlying(dxbc::ShaderVisibility::Domain):
+ case llvm::to_underlying(dxbc::ShaderVisibility::Geometry):
+ case llvm::to_underlying(dxbc::ShaderVisibility::Pixel):
+ case llvm::to_underlying(dxbc::ShaderVisibility::Amplification):
+ case llvm::to_underlying(dxbc::ShaderVisibility::Mesh):
return true;
}
return false;
}
-static bool verifyParameterType(uint32_t Flags) {
- switch (Flags) {
- case dxbc::RootParameterType::Constants32Bit:
+static bool verifyParameterType(uint32_t Type) {
+ switch (Type) {
+ case llvm::to_underlying(dxbc::RootParameterType::Constants32Bit):
return true;
}
@@ -320,7 +321,7 @@ PreservedAnalyses RootSignatureAnalysisPrinter::run(Module &M,
<< "Shader Visibility: " << (uint32_t)P.Header.ShaderVisibility
<< "\n";
switch (P.Header.ParameterType) {
- case dxbc::RootParameterType::Constants32Bit:
+ case llvm::to_underlying(dxbc::RootParameterType::Constants32Bit):
OS << indent(Space) << "Register Space: " << P.Constants.RegisterSpace
<< "\n";
OS << indent(Space) << "Shader Register: " << P.Constants.ShaderRegister
diff --git a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Flags.ll b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Flags.ll
index ef2b97860bfae..e81679732a5d8 100644
--- a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Flags.ll
+++ b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Flags.ll
@@ -23,7 +23,7 @@ attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" }
; DXC-NEXT: RootSignature:
; DXC-NEXT: Version: 2
; DXC-NEXT: NumRootParameters: 0
-; DXC-NEXT: RootParametersOffset: 0
+; DXC-NEXT: RootParametersOffset: 24
; DXC-NEXT: NumStaticSamplers: 0
; DXC-NEXT: StaticSamplersOffset: 0
; DXC-NEXT: Parameters: []
diff --git a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootConstants-Invalid-Num32BitValues.ll b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootConstants-Invalid-Num32BitValues.ll
index b06678519eef7..552c128e5ab57 100644
--- a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootConstants-Invalid-Num32BitValues.ll
+++ b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootConstants-Invalid-Num32BitValues.ll
@@ -5,12 +5,10 @@ target triple = "dxil-unknown-shadermodel6.0-compute"
; CHECK: error: Invalid value for Num32BitValues
; CHECK-NOT: Root Signature Definitions
-define void @main() #0 {
+define void @main() {
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
More information about the llvm-branch-commits
mailing list