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.saff...@microsoft.com> Date: Wed, 9 Apr 2025 21:05:58 +0000 Subject: [PATCH 01/12] 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.saff...@microsoft.com> Date: Wed, 9 Apr 2025 21:19:25 +0000 Subject: [PATCH 02/12] 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.saff...@microsoft.com> Date: Mon, 14 Apr 2025 19:02:15 +0000 Subject: [PATCH 03/12] 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.saff...@microsoft.com> Date: Mon, 14 Apr 2025 19:53:16 +0000 Subject: [PATCH 04/12] 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.saff...@microsoft.com> Date: Mon, 14 Apr 2025 20:48:00 +0000 Subject: [PATCH 05/12] 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.saff...@microsoft.com> Date: Mon, 14 Apr 2025 20:52:22 +0000 Subject: [PATCH 06/12] 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.saff...@microsoft.com> Date: Mon, 14 Apr 2025 20:53:05 +0000 Subject: [PATCH 07/12] 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.saff...@microsoft.com> Date: Tue, 15 Apr 2025 01:11:12 +0000 Subject: [PATCH 08/12] 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.saff...@microsoft.com> Date: Wed, 16 Apr 2025 16:46:16 +0000 Subject: [PATCH 09/12] 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.saff...@microsoft.com> Date: Wed, 16 Apr 2025 18:36:50 +0000 Subject: [PATCH 10/12] 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.saff...@microsoft.com> Date: Wed, 16 Apr 2025 20:50:37 +0000 Subject: [PATCH 11/12] 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.saff...@microsoft.com> Date: Wed, 16 Apr 2025 22:24:54 +0000 Subject: [PATCH 12/12] 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; _______________________________________________ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits