https://github.com/joaosaffran created https://github.com/llvm/llvm-project/pull/139781
- adds parsing from metadata into dxcontainer binary - adds validations as described in the spec - adds testing scenarios closes: [#126638](https://github.com/llvm/llvm-project/issues/126638) >From f8755551e2049418d6f09bedaa685e72d3a76f15 Mon Sep 17 00:00:00 2001 From: joaosaffran <joao.saff...@microsoft.com> Date: Tue, 13 May 2025 02:07:31 +0000 Subject: [PATCH 1/4] adding support for root descriptors --- llvm/lib/Target/DirectX/DXILRootSignature.cpp | 64 ++++++++++++++++++- llvm/lib/Target/DirectX/DXILRootSignature.h | 3 +- .../RootSignature-RootDescriptor.ll | 34 ++++++++++ 3 files changed, 99 insertions(+), 2 deletions(-) create mode 100644 llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootDescriptor.ll diff --git a/llvm/lib/Target/DirectX/DXILRootSignature.cpp b/llvm/lib/Target/DirectX/DXILRootSignature.cpp index 1bd816b026fec..77bdb2c2f588f 100644 --- a/llvm/lib/Target/DirectX/DXILRootSignature.cpp +++ b/llvm/lib/Target/DirectX/DXILRootSignature.cpp @@ -55,6 +55,14 @@ static std::optional<uint32_t> extractMdIntValue(MDNode *Node, return std::nullopt; } +static std::optional<StringRef> extractMdStringValue(MDNode *Node, + unsigned int OpId) { + MDString *NodeText = cast<MDString>(Node->getOperand(OpId)); + if (NodeText == nullptr) + return std::nullopt; + return NodeText->getString(); +} + static bool parseRootFlags(LLVMContext *Ctx, mcdxbc::RootSignatureDesc &RSD, MDNode *RootFlagNode) { @@ -105,6 +113,56 @@ static bool parseRootConstants(LLVMContext *Ctx, mcdxbc::RootSignatureDesc &RSD, return false; } +static bool parseRootDescriptors(LLVMContext *Ctx, + mcdxbc::RootSignatureDesc &RSD, + MDNode *RootDescriptorNode) { + + if (RootDescriptorNode->getNumOperands() != 5) + return reportError(Ctx, "Invalid format for RootConstants Element"); + + std::optional<StringRef> ElementText = + extractMdStringValue(RootDescriptorNode, 0); + assert(!ElementText->empty()); + + dxbc::RootParameterHeader Header; + Header.ParameterType = + StringSwitch<uint32_t>(*ElementText) + .Case("RootCBV", llvm::to_underlying(dxbc::RootParameterType::CBV)) + .Case("RootSRV", llvm::to_underlying(dxbc::RootParameterType::SRV)) + .Case("RootUAV", llvm::to_underlying(dxbc::RootParameterType::UAV)); + + if (std::optional<uint32_t> Val = extractMdIntValue(RootDescriptorNode, 1)) + Header.ShaderVisibility = *Val; + else + return reportError(Ctx, "Invalid value for ShaderVisibility"); + + dxbc::RTS0::v1::RootDescriptor Descriptor; + if (std::optional<uint32_t> Val = extractMdIntValue(RootDescriptorNode, 2)) + Descriptor.ShaderRegister = *Val; + else + return reportError(Ctx, "Invalid value for ShaderRegister"); + + if (std::optional<uint32_t> Val = extractMdIntValue(RootDescriptorNode, 3)) + Descriptor.RegisterSpace = *Val; + else + return reportError(Ctx, "Invalid value for RegisterSpace"); + + if (RSD.Version == 1) { + RSD.ParametersContainer.addParameter(Header, Descriptor); + return false; + } + assert(RSD.Version > 1); + dxbc::RTS0::v2::RootDescriptor DescriptorV2(Descriptor); + + if (std::optional<uint32_t> Val = extractMdIntValue(RootDescriptorNode, 4)) + DescriptorV2.Flags = *Val; + else + return reportError(Ctx, "Invalid value for Root Descriptor Flags"); + + RSD.ParametersContainer.addParameter(Header, DescriptorV2); + return false; +} + static bool parseRootSignatureElement(LLVMContext *Ctx, mcdxbc::RootSignatureDesc &RSD, MDNode *Element) { @@ -116,6 +174,9 @@ static bool parseRootSignatureElement(LLVMContext *Ctx, StringSwitch<RootSignatureElementKind>(ElementText->getString()) .Case("RootFlags", RootSignatureElementKind::RootFlags) .Case("RootConstants", RootSignatureElementKind::RootConstants) + .Case("RootCBV", RootSignatureElementKind::RootDescriptors) + .Case("RootSRV", RootSignatureElementKind::RootDescriptors) + .Case("RootUAV", RootSignatureElementKind::RootDescriptors) .Default(RootSignatureElementKind::Error); switch (ElementKind) { @@ -124,7 +185,8 @@ static bool parseRootSignatureElement(LLVMContext *Ctx, return parseRootFlags(Ctx, RSD, Element); case RootSignatureElementKind::RootConstants: return parseRootConstants(Ctx, RSD, Element); - break; + case RootSignatureElementKind::RootDescriptors: + return parseRootDescriptors(Ctx, RSD, Element); case RootSignatureElementKind::Error: return reportError(Ctx, "Invalid Root Signature Element: " + ElementText->getString()); diff --git a/llvm/lib/Target/DirectX/DXILRootSignature.h b/llvm/lib/Target/DirectX/DXILRootSignature.h index 93ec614f1ab85..b8742d1b1fdfd 100644 --- a/llvm/lib/Target/DirectX/DXILRootSignature.h +++ b/llvm/lib/Target/DirectX/DXILRootSignature.h @@ -27,7 +27,8 @@ namespace dxil { enum class RootSignatureElementKind { Error = 0, RootFlags = 1, - RootConstants = 2 + RootConstants = 2, + RootDescriptors = 3 }; class RootSignatureAnalysis : public AnalysisInfoMixin<RootSignatureAnalysis> { friend AnalysisInfoMixin<RootSignatureAnalysis>; diff --git a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootDescriptor.ll b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootDescriptor.ll new file mode 100644 index 0000000000000..4143e56b609b9 --- /dev/null +++ b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootDescriptor.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 = !{ !5 } ; list of root signature elements +!5 = !{ !"RootCBV", i32 0, i32 1, i32 2, i32 3 } + +; DXC: - Name: RTS0 +; DXC-NEXT: Size: 48 +; DXC-NEXT: RootSignature: +; DXC-NEXT: Version: 2 +; DXC-NEXT: NumRootParameters: 1 +; DXC-NEXT: RootParametersOffset: 24 +; DXC-NEXT: NumStaticSamplers: 0 +; DXC-NEXT: StaticSamplersOffset: 0 +; DXC-NEXT: Parameters: +; DXC-NEXT: - ParameterType: 2 +; DXC-NEXT: ShaderVisibility: 0 +; DXC-NEXT: Descriptor: +; DXC-NEXT: RegisterSpace: 2 +; DXC-NEXT: ShaderRegister: 1 +; DXC: DATA_VOLATILE: true >From 4f7f9986503dca40f01b1a8bc7a54a440a620cdf Mon Sep 17 00:00:00 2001 From: joaosaffran <joao.saff...@microsoft.com> Date: Tue, 13 May 2025 16:34:57 +0000 Subject: [PATCH 2/4] removing none as a flag option --- llvm/include/llvm/BinaryFormat/DXContainerConstants.def | 1 - .../DirectX/ContainerData/RootSignature-RootDescriptor.ll | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/llvm/include/llvm/BinaryFormat/DXContainerConstants.def b/llvm/include/llvm/BinaryFormat/DXContainerConstants.def index 1645018aebedb..eb67c82628716 100644 --- a/llvm/include/llvm/BinaryFormat/DXContainerConstants.def +++ b/llvm/include/llvm/BinaryFormat/DXContainerConstants.def @@ -78,7 +78,6 @@ ROOT_ELEMENT_FLAG(11, SamplerHeapDirectlyIndexed) // ROOT_DESCRIPTOR_FLAG(bit offset for the flag, name). #ifdef ROOT_DESCRIPTOR_FLAG -ROOT_DESCRIPTOR_FLAG(0, NONE) ROOT_DESCRIPTOR_FLAG(1, DATA_VOLATILE) ROOT_DESCRIPTOR_FLAG(2, DATA_STATIC_WHILE_SET_AT_EXECUTE) ROOT_DESCRIPTOR_FLAG(3, DATA_STATIC) diff --git a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootDescriptor.ll b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootDescriptor.ll index 4143e56b609b9..5f2ce37afd893 100644 --- a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootDescriptor.ll +++ b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootDescriptor.ll @@ -31,4 +31,4 @@ attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" } ; DXC-NEXT: Descriptor: ; DXC-NEXT: RegisterSpace: 2 ; DXC-NEXT: ShaderRegister: 1 -; DXC: DATA_VOLATILE: true +; DXC-NEXT: DATA_VOLATILE: true >From 3eb5e101b0087fcb29f7ecb6655c82fddf34428a Mon Sep 17 00:00:00 2001 From: joaosaffran <joao.saff...@microsoft.com> Date: Tue, 13 May 2025 18:06:42 +0000 Subject: [PATCH 3/4] adding tests --- .../BinaryFormat/DXContainerConstants.def | 1 + llvm/lib/Target/DirectX/DXILRootSignature.cpp | 61 +++++++++++++++++++ ...tSignature-RootDescriptor-Invalid-Flags.ll | 18 ++++++ ...re-RootDescriptor-Invalid-RegisterSpace.ll | 18 ++++++ ...re-RootDescriptor-Invalid-RegisterValue.ll | 18 ++++++ .../RootSignature-RootDescriptor.ll | 4 +- 6 files changed, 118 insertions(+), 2 deletions(-) create mode 100644 llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootDescriptor-Invalid-Flags.ll create mode 100644 llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootDescriptor-Invalid-RegisterSpace.ll create mode 100644 llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootDescriptor-Invalid-RegisterValue.ll diff --git a/llvm/include/llvm/BinaryFormat/DXContainerConstants.def b/llvm/include/llvm/BinaryFormat/DXContainerConstants.def index eb67c82628716..1645018aebedb 100644 --- a/llvm/include/llvm/BinaryFormat/DXContainerConstants.def +++ b/llvm/include/llvm/BinaryFormat/DXContainerConstants.def @@ -78,6 +78,7 @@ ROOT_ELEMENT_FLAG(11, SamplerHeapDirectlyIndexed) // ROOT_DESCRIPTOR_FLAG(bit offset for the flag, name). #ifdef ROOT_DESCRIPTOR_FLAG +ROOT_DESCRIPTOR_FLAG(0, NONE) ROOT_DESCRIPTOR_FLAG(1, DATA_VOLATILE) ROOT_DESCRIPTOR_FLAG(2, DATA_STATIC_WHILE_SET_AT_EXECUTE) ROOT_DESCRIPTOR_FLAG(3, DATA_STATIC) diff --git a/llvm/lib/Target/DirectX/DXILRootSignature.cpp b/llvm/lib/Target/DirectX/DXILRootSignature.cpp index 77bdb2c2f588f..a2242dff2c2c1 100644 --- a/llvm/lib/Target/DirectX/DXILRootSignature.cpp +++ b/llvm/lib/Target/DirectX/DXILRootSignature.cpp @@ -12,6 +12,7 @@ //===----------------------------------------------------------------------===// #include "DXILRootSignature.h" #include "DirectX.h" +#include "llvm/ADT/STLForwardCompat.h" #include "llvm/ADT/StringSwitch.h" #include "llvm/ADT/Twine.h" #include "llvm/Analysis/DXILMetadataAnalysis.h" @@ -30,6 +31,7 @@ #include <cstdint> #include <optional> #include <utility> +#include <variant> using namespace llvm; using namespace llvm::dxil; @@ -217,6 +219,19 @@ static bool verifyVersion(uint32_t Version) { return (Version == 1 || Version == 2); } +static bool verifyRegisterValue(uint32_t RegisterValue) { + return !(RegisterValue == 0xFFFFFFFF); +} + +static bool verifyRegisterSpace(uint32_t RegisterSpace) { + return !(RegisterSpace >= 0xFFFFFFF0 && RegisterSpace <= 0xFFFFFFFF); +} + +static bool verifyDescriptorFlag(uint32_t Flags) { + return (Flags & ~0xE) == 0; +} + + static bool validate(LLVMContext *Ctx, const mcdxbc::RootSignatureDesc &RSD) { if (!verifyVersion(RSD.Version)) { @@ -234,6 +249,38 @@ static bool validate(LLVMContext *Ctx, const mcdxbc::RootSignatureDesc &RSD) { assert(dxbc::isValidParameterType(Info.Header.ParameterType) && "Invalid value for ParameterType"); + + + auto P = RSD.ParametersContainer.getParameter(&Info); + if(!P) + return reportError(Ctx, "Cannot locate parameter from Header Info"); + + if( std::holds_alternative<const dxbc::RTS0::v1::RootDescriptor *>(*P)){ + auto *Descriptor = std::get<const dxbc::RTS0::v1::RootDescriptor *>(P.value()); + + if(!verifyRegisterValue(Descriptor->ShaderRegister)) + return reportValueError(Ctx, "ShaderRegister", + Descriptor->ShaderRegister); + + if(!verifyRegisterSpace(Descriptor->RegisterSpace)) + return reportValueError(Ctx, "RegisterSpace", + Descriptor->RegisterSpace); + + } else if( std::holds_alternative<const dxbc::RTS0::v2::RootDescriptor *>(*P)){ + auto *Descriptor = std::get<const dxbc::RTS0::v2::RootDescriptor *>(P.value()); + + if(!verifyRegisterValue(Descriptor->ShaderRegister)) + return reportValueError(Ctx, "ShaderRegister", + Descriptor->ShaderRegister); + + if(!verifyRegisterSpace(Descriptor->RegisterSpace)) + return reportValueError(Ctx, "RegisterSpace", + Descriptor->RegisterSpace); + + if(!verifyDescriptorFlag(Descriptor->Flags)) + return reportValueError(Ctx, "DescriptorFlag", + Descriptor->Flags); + } } return false; @@ -370,6 +417,20 @@ PreservedAnalyses RootSignatureAnalysisPrinter::run(Module &M, << "Shader Register: " << Constants->ShaderRegister << "\n"; OS << indent(Space + 2) << "Num 32 Bit Values: " << Constants->Num32BitValues << "\n"; + } else if (std::holds_alternative<const dxbc::RTS0::v1::RootDescriptor *>(*P)) { + auto *Constants = std::get<const dxbc::RTS0::v1::RootDescriptor *>(*P); + OS << indent(Space + 2) + << "Register Space: " << Constants->RegisterSpace << "\n"; + OS << indent(Space + 2) + << "Shader Register: " << Constants->ShaderRegister << "\n"; + } else if (std::holds_alternative<const dxbc::RTS0::v2::RootDescriptor *>(*P)) { + auto *Constants = std::get<const dxbc::RTS0::v2::RootDescriptor *>(*P); + OS << indent(Space + 2) + << "Register Space: " << Constants->RegisterSpace << "\n"; + OS << indent(Space + 2) + << "Shader Register: " << Constants->ShaderRegister << "\n"; + OS << indent(Space + 2) + << "Flags: " << Constants->Flags << "\n"; } } Space--; diff --git a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootDescriptor-Invalid-Flags.ll b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootDescriptor-Invalid-Flags.ll new file mode 100644 index 0000000000000..4229981240918 --- /dev/null +++ b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootDescriptor-Invalid-Flags.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 DescriptorFlag: 3 +; 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 = !{ !"RootCBV", i32 0, i32 1, i32 2, i32 3 } diff --git a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootDescriptor-Invalid-RegisterSpace.ll b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootDescriptor-Invalid-RegisterSpace.ll new file mode 100644 index 0000000000000..020d117ba45dc --- /dev/null +++ b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootDescriptor-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: 4294967280 +; CHECK-NOT: Root Signature Definitions +define void @main() #0 { +entry: + ret void +} +attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" } + + +!dx.rootsignatures = !{!2} ; list of function/root signature pairs +!2 = !{ ptr @main, !3 } ; function, root signature +!3 = !{ !5 } ; list of root signature elements +!5 = !{ !"RootCBV", i32 0, i32 1, i32 4294967280, i32 0 } diff --git a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootDescriptor-Invalid-RegisterValue.ll b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootDescriptor-Invalid-RegisterValue.ll new file mode 100644 index 0000000000000..edb8b943c6e35 --- /dev/null +++ b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootDescriptor-Invalid-RegisterValue.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: 4294967295 +; 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 = !{ !"RootCBV", i32 0, i32 4294967295, i32 2, i32 3 } diff --git a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootDescriptor.ll b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootDescriptor.ll index 5f2ce37afd893..9217945855cd9 100644 --- a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootDescriptor.ll +++ b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootDescriptor.ll @@ -15,7 +15,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 = !{ !5 } ; list of root signature elements -!5 = !{ !"RootCBV", i32 0, i32 1, i32 2, i32 3 } +!5 = !{ !"RootCBV", i32 0, i32 1, i32 2, i32 8 } ; DXC: - Name: RTS0 ; DXC-NEXT: Size: 48 @@ -31,4 +31,4 @@ attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" } ; DXC-NEXT: Descriptor: ; DXC-NEXT: RegisterSpace: 2 ; DXC-NEXT: ShaderRegister: 1 -; DXC-NEXT: DATA_VOLATILE: true +; DXC-NEXT: DATA_STATIC: true >From 58e17890afd06822d4fd663e8bd9195b4bc206a8 Mon Sep 17 00:00:00 2001 From: joaosaffran <joao.saff...@microsoft.com> Date: Tue, 13 May 2025 19:30:07 +0000 Subject: [PATCH 4/4] clean up and add more tests --- llvm/lib/Target/DirectX/DXILRootSignature.cpp | 53 +++++++++---------- ...ure-RootDescriptor-Invalid-RegisterKind.ll | 18 +++++++ 2 files changed, 43 insertions(+), 28 deletions(-) create mode 100644 llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootDescriptor-Invalid-RegisterKind.ll diff --git a/llvm/lib/Target/DirectX/DXILRootSignature.cpp b/llvm/lib/Target/DirectX/DXILRootSignature.cpp index a2242dff2c2c1..3ee52d32eaf2d 100644 --- a/llvm/lib/Target/DirectX/DXILRootSignature.cpp +++ b/llvm/lib/Target/DirectX/DXILRootSignature.cpp @@ -12,7 +12,6 @@ //===----------------------------------------------------------------------===// #include "DXILRootSignature.h" #include "DirectX.h" -#include "llvm/ADT/STLForwardCompat.h" #include "llvm/ADT/StringSwitch.h" #include "llvm/ADT/Twine.h" #include "llvm/Analysis/DXILMetadataAnalysis.h" @@ -31,7 +30,6 @@ #include <cstdint> #include <optional> #include <utility> -#include <variant> using namespace llvm; using namespace llvm::dxil; @@ -227,10 +225,7 @@ static bool verifyRegisterSpace(uint32_t RegisterSpace) { return !(RegisterSpace >= 0xFFFFFFF0 && RegisterSpace <= 0xFFFFFFFF); } -static bool verifyDescriptorFlag(uint32_t Flags) { - return (Flags & ~0xE) == 0; -} - +static bool verifyDescriptorFlag(uint32_t Flags) { return (Flags & ~0xE) == 0; } static bool validate(LLVMContext *Ctx, const mcdxbc::RootSignatureDesc &RSD) { @@ -249,37 +244,38 @@ static bool validate(LLVMContext *Ctx, const mcdxbc::RootSignatureDesc &RSD) { assert(dxbc::isValidParameterType(Info.Header.ParameterType) && "Invalid value for ParameterType"); - - + auto P = RSD.ParametersContainer.getParameter(&Info); - if(!P) - return reportError(Ctx, "Cannot locate parameter from Header Info"); - - if( std::holds_alternative<const dxbc::RTS0::v1::RootDescriptor *>(*P)){ - auto *Descriptor = std::get<const dxbc::RTS0::v1::RootDescriptor *>(P.value()); + if (!P) + return reportError(Ctx, "Cannot locate parameter from Header Info"); + + if (std::holds_alternative<const dxbc::RTS0::v1::RootDescriptor *>(*P)) { + auto *Descriptor = + std::get<const dxbc::RTS0::v1::RootDescriptor *>(P.value()); - if(!verifyRegisterValue(Descriptor->ShaderRegister)) + if (!verifyRegisterValue(Descriptor->ShaderRegister)) return reportValueError(Ctx, "ShaderRegister", Descriptor->ShaderRegister); - - if(!verifyRegisterSpace(Descriptor->RegisterSpace)) + + if (!verifyRegisterSpace(Descriptor->RegisterSpace)) return reportValueError(Ctx, "RegisterSpace", Descriptor->RegisterSpace); - } else if( std::holds_alternative<const dxbc::RTS0::v2::RootDescriptor *>(*P)){ - auto *Descriptor = std::get<const dxbc::RTS0::v2::RootDescriptor *>(P.value()); + } else if (std::holds_alternative<const dxbc::RTS0::v2::RootDescriptor *>( + *P)) { + auto *Descriptor = + std::get<const dxbc::RTS0::v2::RootDescriptor *>(P.value()); - if(!verifyRegisterValue(Descriptor->ShaderRegister)) + if (!verifyRegisterValue(Descriptor->ShaderRegister)) return reportValueError(Ctx, "ShaderRegister", Descriptor->ShaderRegister); - - if(!verifyRegisterSpace(Descriptor->RegisterSpace)) + + if (!verifyRegisterSpace(Descriptor->RegisterSpace)) return reportValueError(Ctx, "RegisterSpace", Descriptor->RegisterSpace); - if(!verifyDescriptorFlag(Descriptor->Flags)) - return reportValueError(Ctx, "DescriptorFlag", - Descriptor->Flags); + if (!verifyDescriptorFlag(Descriptor->Flags)) + return reportValueError(Ctx, "DescriptorFlag", Descriptor->Flags); } } @@ -417,20 +413,21 @@ PreservedAnalyses RootSignatureAnalysisPrinter::run(Module &M, << "Shader Register: " << Constants->ShaderRegister << "\n"; OS << indent(Space + 2) << "Num 32 Bit Values: " << Constants->Num32BitValues << "\n"; - } else if (std::holds_alternative<const dxbc::RTS0::v1::RootDescriptor *>(*P)) { + } else if (std::holds_alternative<const dxbc::RTS0::v1::RootDescriptor *>( + *P)) { auto *Constants = std::get<const dxbc::RTS0::v1::RootDescriptor *>(*P); OS << indent(Space + 2) << "Register Space: " << Constants->RegisterSpace << "\n"; OS << indent(Space + 2) << "Shader Register: " << Constants->ShaderRegister << "\n"; - } else if (std::holds_alternative<const dxbc::RTS0::v2::RootDescriptor *>(*P)) { + } else if (std::holds_alternative<const dxbc::RTS0::v2::RootDescriptor *>( + *P)) { auto *Constants = std::get<const dxbc::RTS0::v2::RootDescriptor *>(*P); OS << indent(Space + 2) << "Register Space: " << Constants->RegisterSpace << "\n"; OS << indent(Space + 2) << "Shader Register: " << Constants->ShaderRegister << "\n"; - OS << indent(Space + 2) - << "Flags: " << Constants->Flags << "\n"; + OS << indent(Space + 2) << "Flags: " << Constants->Flags << "\n"; } } Space--; diff --git a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootDescriptor-Invalid-RegisterKind.ll b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootDescriptor-Invalid-RegisterKind.ll new file mode 100644 index 0000000000000..4aed84efbe2bc --- /dev/null +++ b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootDescriptor-Invalid-RegisterKind.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 Root Signature Element: Invalid +; 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 = !{ !"Invalid", i32 0, i32 1, i32 2, i32 3 } _______________________________________________ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits