https://github.com/joaosaffran updated https://github.com/llvm/llvm-project/pull/127932
>From 86a52d82e858c24a0f756f583a1b3d8dac3087d8 Mon Sep 17 00:00:00 2001 From: joaosaffran <joao.saff...@microsoft.com> Date: Wed, 19 Feb 2025 22:53:55 +0000 Subject: [PATCH 1/4] parsing root constant --- llvm/lib/Target/DirectX/DXILRootSignature.cpp | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/llvm/lib/Target/DirectX/DXILRootSignature.cpp b/llvm/lib/Target/DirectX/DXILRootSignature.cpp index 8702f0eecf2aa..6f7e3418782a3 100644 --- a/llvm/lib/Target/DirectX/DXILRootSignature.cpp +++ b/llvm/lib/Target/DirectX/DXILRootSignature.cpp @@ -40,6 +40,38 @@ static bool reportError(LLVMContext *Ctx, Twine Message, return true; } +static bool parseRootConstants(LLVMContext *Ctx, mcdxbc::RootSignatureDesc &RSD, + MDNode *RootConstNode) { + if (RootConstNode->getNumOperands() != 5) + return reportError(Ctx, "Invalid format for RootFlag Element"); + + dxbc::RootParameter NewParam; + NewParam.ParameterType = dxbc::RootParameterType::Constants32Bit; + + auto *ShaderVisibility = + mdconst::extract<ConstantInt>(RootConstNode->getOperand(1)); + dxbc::ShaderVisibilityFlag SvFlag = + (dxbc::ShaderVisibilityFlag)ShaderVisibility->getZExtValue(); + if (!dxbc::RootSignatureValidations::isValidShaderVisibility(SvFlag)) + return reportError( + Ctx, "Invalid shader visibility flag value in root constant."); + NewParam.ShaderVisibility = SvFlag; + + auto *ShaderRegister = + mdconst::extract<ConstantInt>(RootConstNode->getOperand(2)); + NewParam.Constants.ShaderRegister = ShaderRegister->getZExtValue(); + + auto *RegisterSpace = + mdconst::extract<ConstantInt>(RootConstNode->getOperand(3)); + NewParam.Constants.RegisterSpace = RegisterSpace->getZExtValue(); + + auto *Num32BitValues = + mdconst::extract<ConstantInt>(RootConstNode->getOperand(4)); + NewParam.Constants.Num32BitValues = Num32BitValues->getZExtValue(); + + return false; +} + static bool parseRootFlags(LLVMContext *Ctx, mcdxbc::RootSignatureDesc &RSD, MDNode *RootFlagNode) { >From f181f4dbae982c948e81aff41bcb84f59048fbed Mon Sep 17 00:00:00 2001 From: joaosaffran <joao.saff...@microsoft.com> Date: Thu, 20 Feb 2025 00:51:23 +0000 Subject: [PATCH 2/4] add root constant support --- llvm/lib/Target/DirectX/DXILRootSignature.cpp | 36 +++++++++++++++++-- llvm/lib/Target/DirectX/DXILRootSignature.h | 7 +++- ...nature-Constants-Error-invalid-metadata.ll | 17 +++++++++ ...nstants-Error-invalid-shader-visibility.ll | 17 +++++++++ .../ContainerData/RootSignature-Constants.ll | 33 +++++++++++++++++ 5 files changed, 107 insertions(+), 3 deletions(-) create mode 100644 llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Constants-Error-invalid-metadata.ll create mode 100644 llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Constants-Error-invalid-shader-visibility.ll create mode 100644 llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Constants.ll diff --git a/llvm/lib/Target/DirectX/DXILRootSignature.cpp b/llvm/lib/Target/DirectX/DXILRootSignature.cpp index 6f7e3418782a3..388a3f5e8af0b 100644 --- a/llvm/lib/Target/DirectX/DXILRootSignature.cpp +++ b/llvm/lib/Target/DirectX/DXILRootSignature.cpp @@ -43,7 +43,7 @@ static bool reportError(LLVMContext *Ctx, Twine Message, static bool parseRootConstants(LLVMContext *Ctx, mcdxbc::RootSignatureDesc &RSD, MDNode *RootConstNode) { if (RootConstNode->getNumOperands() != 5) - return reportError(Ctx, "Invalid format for RootFlag Element"); + return reportError(Ctx, "Invalid format for Root constants element"); dxbc::RootParameter NewParam; NewParam.ParameterType = dxbc::RootParameterType::Constants32Bit; @@ -69,6 +69,8 @@ static bool parseRootConstants(LLVMContext *Ctx, mcdxbc::RootSignatureDesc &RSD, mdconst::extract<ConstantInt>(RootConstNode->getOperand(4)); NewParam.Constants.Num32BitValues = Num32BitValues->getZExtValue(); + RSD.Parameters.push_back(NewParam); + return false; } @@ -94,10 +96,12 @@ 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::RootConstants: + return parseRootConstants(Ctx, RSD, Element); case RootSignatureElementKind::RootFlags: return parseRootFlags(Ctx, RSD, Element); case RootSignatureElementKind::Error: @@ -241,6 +245,34 @@ PreservedAnalyses RootSignatureAnalysisPrinter::run(Module &M, OS << indent(Space) << "NumStaticSamplers: " << 0 << ":\n"; OS << indent(Space) << "StaticSamplersOffset: " << sizeof(RS.Header) + RS.Parameters.size_in_bytes() << ":\n"; + + OS << indent(Space) << "- Parameters: \n"; + Space++; + for (const auto &Param : RS.Parameters) { + OS << indent(Space) << "Type: " << &Param.ParameterType << " \n"; + OS << indent(Space) << "ShaderVisibility: " << &Param.ShaderVisibility + << " \n"; + Space++; + + switch (Param.ParameterType) { + + case dxbc::RootParameterType::Constants32Bit: { + OS << indent(Space) << "- Constants: \n"; + Space++; + OS << indent(Space) + << "RegisterSpace: " << &Param.Constants.RegisterSpace << " \n"; + OS << indent(Space) + << "ShaderRegister: " << &Param.Constants.ShaderRegister << " \n"; + OS << indent(Space) + << "Num32BitValues: " << &Param.Constants.Num32BitValues << " \n"; + Space--; + } break; + case dxbc::RootParameterType::Empty: + break; + } + Space--; + } + Space--; Space--; // end root signature header } diff --git a/llvm/lib/Target/DirectX/DXILRootSignature.h b/llvm/lib/Target/DirectX/DXILRootSignature.h index 8c25b2eb3fadf..10f9b62e65916 100644 --- a/llvm/lib/Target/DirectX/DXILRootSignature.h +++ b/llvm/lib/Target/DirectX/DXILRootSignature.h @@ -13,6 +13,7 @@ #include "llvm/ADT/DenseMap.h" #include "llvm/Analysis/DXILMetadataAnalysis.h" +#include "llvm/BinaryFormat/DXContainer.h" #include "llvm/IR/DiagnosticInfo.h" #include "llvm/IR/Metadata.h" #include "llvm/IR/Module.h" @@ -24,7 +25,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-Constants-Error-invalid-metadata.ll b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Constants-Error-invalid-metadata.ll new file mode 100644 index 0000000000000..6272d86835da3 --- /dev/null +++ b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Constants-Error-invalid-metadata.ll @@ -0,0 +1,17 @@ +; RUN: not opt -passes='print<dxil-root-signature>' %s -S -o - 2>&1 | FileCheck %s + +; CHECK: error: Invalid format for Root constants element +; 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 = !{ !"RootConstants", i32 0, i32 1, i32 2 } diff --git a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Constants-Error-invalid-shader-visibility.ll b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Constants-Error-invalid-shader-visibility.ll new file mode 100644 index 0000000000000..13a42b583dd9c --- /dev/null +++ b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Constants-Error-invalid-shader-visibility.ll @@ -0,0 +1,17 @@ +; RUN: not opt -passes='print<dxil-root-signature>' %s -S -o - 2>&1 | FileCheck %s + +; CHECK: error: Invalid shader visibility flag value in root constant. +; 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 = !{ !"RootConstants", i32 666, i32 1, i32 2, i32 3 } diff --git a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Constants.ll b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Constants.ll new file mode 100644 index 0000000000000..d60d3e85122a7 --- /dev/null +++ b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Constants.ll @@ -0,0 +1,33 @@ +; 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 } ; list of root signature elements +!4 = !{ !"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: 44 +; 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 >From 627cdcd086fe760470d447bc4323aaa4f2f9e29a Mon Sep 17 00:00:00 2001 From: joaosaffran <joao.saff...@microsoft.com> Date: Thu, 20 Feb 2025 00:53:33 +0000 Subject: [PATCH 3/4] clean up --- llvm/lib/Target/DirectX/DXILRootSignature.h | 1 - 1 file changed, 1 deletion(-) diff --git a/llvm/lib/Target/DirectX/DXILRootSignature.h b/llvm/lib/Target/DirectX/DXILRootSignature.h index 10f9b62e65916..93ec614f1ab85 100644 --- a/llvm/lib/Target/DirectX/DXILRootSignature.h +++ b/llvm/lib/Target/DirectX/DXILRootSignature.h @@ -13,7 +13,6 @@ #include "llvm/ADT/DenseMap.h" #include "llvm/Analysis/DXILMetadataAnalysis.h" -#include "llvm/BinaryFormat/DXContainer.h" #include "llvm/IR/DiagnosticInfo.h" #include "llvm/IR/Metadata.h" #include "llvm/IR/Module.h" >From e702752285147177cd4ef69056f5f324f0630890 Mon Sep 17 00:00:00 2001 From: joaosaffran <joao.saff...@microsoft.com> Date: Thu, 20 Feb 2025 01:13:33 +0000 Subject: [PATCH 4/4] change test --- llvm/lib/Target/DirectX/DXILRootSignature.cpp | 22 +++++++------- .../ContainerData/RootSignature-Constants.ll | 30 ++++++++++--------- 2 files changed, 27 insertions(+), 25 deletions(-) diff --git a/llvm/lib/Target/DirectX/DXILRootSignature.cpp b/llvm/lib/Target/DirectX/DXILRootSignature.cpp index 388a3f5e8af0b..e31d82adf2b1e 100644 --- a/llvm/lib/Target/DirectX/DXILRootSignature.cpp +++ b/llvm/lib/Target/DirectX/DXILRootSignature.cpp @@ -248,23 +248,23 @@ PreservedAnalyses RootSignatureAnalysisPrinter::run(Module &M, OS << indent(Space) << "- Parameters: \n"; Space++; - for (const auto &Param : RS.Parameters) { - OS << indent(Space) << "Type: " << &Param.ParameterType << " \n"; - OS << indent(Space) << "ShaderVisibility: " << &Param.ShaderVisibility - << " \n"; + for (const auto &P : RS.Parameters) { + OS << indent(Space) << "Type: " << (uint32_t)P.ParameterType << " \n"; + OS << indent(Space) + << "ShaderVisibility: " << (uint32_t)P.ShaderVisibility << " \n"; Space++; - switch (Param.ParameterType) { + switch (P.ParameterType) { case dxbc::RootParameterType::Constants32Bit: { OS << indent(Space) << "- Constants: \n"; Space++; - OS << indent(Space) - << "RegisterSpace: " << &Param.Constants.RegisterSpace << " \n"; - OS << indent(Space) - << "ShaderRegister: " << &Param.Constants.ShaderRegister << " \n"; - OS << indent(Space) - << "Num32BitValues: " << &Param.Constants.Num32BitValues << " \n"; + OS << indent(Space) << "RegisterSpace: " << P.Constants.RegisterSpace + << " \n"; + OS << indent(Space) << "ShaderRegister: " << P.Constants.ShaderRegister + << " \n"; + OS << indent(Space) << "Num32BitValues: " << P.Constants.Num32BitValues + << " \n"; Space--; } break; case dxbc::RootParameterType::Empty: diff --git a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Constants.ll b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Constants.ll index d60d3e85122a7..54956edd580a6 100644 --- a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Constants.ll +++ b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Constants.ll @@ -1,5 +1,5 @@ ; RUN: opt %s -dxil-embed -dxil-globals -S -o - | FileCheck %s -; RUN: llc %s --filetype=obj -o - | obj2yaml | FileCheck %s --check-prefix=DXC +; RUN: opt -passes='print<dxil-root-signature>' %s -S -o - 2>&1 | FileCheck %s --check-prefix=DXC target triple = "dxil-unknown-shadermodel6.0-compute" @@ -18,16 +18,18 @@ attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" } !4 = !{ !"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: 44 -; 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: Root Signature Definitions +; DXC-NEXT: Definition for 'main': +; DXC-NEXT: Flags: 0x000000: +; DXC-NEXT: Version: 2: +; DXC-NEXT: NumParameters: 1: +; DXC-NEXT: RootParametersOffset: 20: +; DXC-NEXT: NumStaticSamplers: 0: +; DXC-NEXT: StaticSamplersOffset: 28: +; DXC-NEXT: - Parameters: +; DXC-NEXT: Type: 1 +; DXC-NEXT: ShaderVisibility: 0 +; DXC-NEXT: - Constants: +; DXC-NEXT: RegisterSpace: 2 +; DXC-NEXT: ShaderRegister: 1 +; DXC-NEXT: Num32BitValues: 3 _______________________________________________ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits