[llvm] 3a3b214 - [DirectX] Making sure we always parse, validate and verify Flags (#162171)

via llvm-commits llvm-commits at lists.llvm.org
Wed Oct 8 13:18:22 PDT 2025


Author: joaosaffran
Date: 2025-10-08T16:18:18-04:00
New Revision: 3a3b21461fef83afdc1812fe4ced4815cb70ef34

URL: https://github.com/llvm/llvm-project/commit/3a3b21461fef83afdc1812fe4ced4815cb70ef34
DIFF: https://github.com/llvm/llvm-project/commit/3a3b21461fef83afdc1812fe4ced4815cb70ef34.diff

LOG: [DirectX] Making sure we always parse, validate and verify Flags (#162171)

This PR makes a few changes to make sure that Root Signature Flags are
always parsed validated and verified, this includes if you use a version
that doesn't support flags. The logic already existed, this PR just
makes sure it is always executed.

Closes: [#161579](https://github.com/llvm/llvm-project/issues/161579)

---------

Co-authored-by: joaosaffran <joao.saffran at microsoft.com>

Added: 
    llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootDescriptor-Invalid-Flags_V1.ll
    llvm/test/CodeGen/DirectX/ContainerData/RootSignature-StaticSamplers-Invalid-Flag_V1.ll

Modified: 
    llvm/lib/Frontend/HLSL/RootSignatureMetadata.cpp
    llvm/lib/Frontend/HLSL/RootSignatureValidations.cpp

Removed: 
    


################################################################################
diff  --git a/llvm/lib/Frontend/HLSL/RootSignatureMetadata.cpp b/llvm/lib/Frontend/HLSL/RootSignatureMetadata.cpp
index 63189f458d12c..132a280c659a1 100644
--- a/llvm/lib/Frontend/HLSL/RootSignatureMetadata.cpp
+++ b/llvm/lib/Frontend/HLSL/RootSignatureMetadata.cpp
@@ -337,12 +337,6 @@ Error MetadataParser::parseRootDescriptors(
   else
     return makeRSError("Invalid value for RegisterSpace");
 
-  if (RSD.Version == 1) {
-    RSD.ParametersContainer.addParameter(Type, *Visibility, Descriptor);
-    return Error::success();
-  }
-  assert(RSD.Version > 1);
-
   if (std::optional<uint32_t> Val = extractMdIntValue(RootDescriptorNode, 4))
     Descriptor.Flags = *Val;
   else
@@ -523,12 +517,6 @@ Error MetadataParser::parseStaticSampler(mcdxbc::RootSignatureDesc &RSD,
     return Error(std::move(E));
   Sampler.ShaderVisibility = *Visibility;
 
-  if (RSD.Version < 3) {
-    RSD.StaticSamplers.push_back(Sampler);
-    return Error::success();
-  }
-  assert(RSD.Version >= 3);
-
   if (std::optional<uint32_t> Val = extractMdIntValue(StaticSamplerNode, 14))
     Sampler.Flags = *Val;
   else
@@ -673,17 +661,15 @@ Error MetadataParser::validateRootSignature(
             makeRSError(formatv("Invalid value for RegisterSpace: {0}",
                                 Descriptor.RegisterSpace)));
 
-      if (RSD.Version > 1) {
-        bool IsValidFlag =
-            dxbc::isValidRootDesciptorFlags(Descriptor.Flags) &&
-            hlsl::rootsig::verifyRootDescriptorFlag(
-                RSD.Version, dxbc::RootDescriptorFlags(Descriptor.Flags));
-        if (!IsValidFlag)
-          DeferredErrs = joinErrors(
-              std::move(DeferredErrs),
-              makeRSError(formatv("Invalid value for RootDescriptorFlag: {0}",
-                                  Descriptor.Flags)));
-      }
+      bool IsValidFlag =
+          dxbc::isValidRootDesciptorFlags(Descriptor.Flags) &&
+          hlsl::rootsig::verifyRootDescriptorFlag(
+              RSD.Version, dxbc::RootDescriptorFlags(Descriptor.Flags));
+      if (!IsValidFlag)
+        DeferredErrs = joinErrors(
+            std::move(DeferredErrs),
+            makeRSError(formatv("Invalid value for RootDescriptorFlag: {0}",
+                                Descriptor.Flags)));
       break;
     }
     case dxbc::RootParameterType::DescriptorTable: {

diff  --git a/llvm/lib/Frontend/HLSL/RootSignatureValidations.cpp b/llvm/lib/Frontend/HLSL/RootSignatureValidations.cpp
index 30408dfda940d..1735751de96a6 100644
--- a/llvm/lib/Frontend/HLSL/RootSignatureValidations.cpp
+++ b/llvm/lib/Frontend/HLSL/RootSignatureValidations.cpp
@@ -41,8 +41,6 @@ bool verifyRootDescriptorFlag(uint32_t Version,
   if (Version == 1)
     return Flags == FlagT::DataVolatile;
 
-  assert((Version <= 3) && "Provided invalid root signature version");
-
   // The data-specific flags are mutually exclusive.
   FlagT DataFlags = FlagT::DataVolatile | FlagT::DataStatic |
                     FlagT::DataStaticWhileSetAtExecute;
@@ -118,8 +116,6 @@ bool verifyStaticSamplerFlags(uint32_t Version,
   if (Version <= 2)
     return Flags == dxbc::StaticSamplerFlags::None;
 
-  assert(Version == 3 && "Provided invalid root signature version");
-
   dxbc::StaticSamplerFlags Mask =
       dxbc::StaticSamplerFlags::NonNormalizedCoordinates |
       dxbc::StaticSamplerFlags::UintBorderColor |

diff  --git a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootDescriptor-Invalid-Flags_V1.ll b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootDescriptor-Invalid-Flags_V1.ll
new file mode 100644
index 0000000000000..610ce4f4617d0
--- /dev/null
+++ b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootDescriptor-Invalid-Flags_V1.ll
@@ -0,0 +1,18 @@
+; RUN: not opt -passes='print<dxil-root-signature>' %s -S -o - 2>&1 | FileCheck %s
+; On Version 1, the only valid flag is DataVolatile (2).
+target triple = "dxil-unknown-shadermodel6.0-compute"
+
+
+; CHECK: error: Invalid value for RootDescriptorFlag: 4
+; CHECK-NOT: Root Signature Definitions
+define void @main() #0 {
+entry:
+  ret void
+}
+attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" }
+
+
+!dx.rootsignatures = !{!2} ; list of function/root signature pairs
+!2 = !{ ptr @main, !3, i32 1 } ; function, root signature
+!3 = !{ !5 } ; list of root signature elements
+!5 = !{ !"RootCBV", i32 0, i32 1, i32 2, i32 4  }

diff  --git a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-StaticSamplers-Invalid-Flag_V1.ll b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-StaticSamplers-Invalid-Flag_V1.ll
new file mode 100644
index 0000000000000..76b60b82db852
--- /dev/null
+++ b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-StaticSamplers-Invalid-Flag_V1.ll
@@ -0,0 +1,19 @@
+; 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 Static Sampler Flag: 1 
+; 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, i32 1 } ; function, root signature
+!3 = !{ !5 } ; list of root signature elements
+!5 = !{ !"StaticSampler", i32 4, i32 2, i32 3, i32 5, float 0x3FF6CCCCC0000000, i32 9, i32 3, i32 2, float -1.280000e+02, float 1.280000e+02, i32 42, i32 0, i32 0, i32 1 }


        


More information about the llvm-commits mailing list