[llvm-branch-commits] [llvm] [HLSL] Adding support for Root Constants in LLVM Metadata (PR #135085)

via llvm-branch-commits llvm-branch-commits at lists.llvm.org
Wed Apr 16 16:26:50 PDT 2025


https://github.com/joaosaffran updated https://github.com/llvm/llvm-project/pull/135085

>From 9b59d0108f6b23c039e2c417247216862073cd4b Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Wed, 9 Apr 2025 21:05:58 +0000
Subject: [PATCH 01/13] adding support for root constants in metadata
 generation

---
 llvm/lib/Target/DirectX/DXILRootSignature.cpp | 120 +++++++++++++++++-
 llvm/lib/Target/DirectX/DXILRootSignature.h   |   6 +-
 .../RootSignature-Flags-Validation-Error.ll   |   7 +-
 .../RootSignature-RootConstants.ll            |  34 +++++
 ...ature-ShaderVisibility-Validation-Error.ll |  20 +++
 5 files changed, 182 insertions(+), 5 deletions(-)
 create mode 100644 llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootConstants.ll
 create mode 100644 llvm/test/CodeGen/DirectX/ContainerData/RootSignature-ShaderVisibility-Validation-Error.ll

diff --git a/llvm/lib/Target/DirectX/DXILRootSignature.cpp b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
index 412ab7765a7ae..7686918b0fc75 100644
--- a/llvm/lib/Target/DirectX/DXILRootSignature.cpp
+++ b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
@@ -40,6 +40,13 @@ static bool reportError(LLVMContext *Ctx, Twine Message,
   return true;
 }
 
+static bool reportValueError(LLVMContext *Ctx, Twine ParamName, uint32_t Value,
+                             DiagnosticSeverity Severity = DS_Error) {
+  Ctx->diagnose(DiagnosticInfoGeneric(
+      "Invalid value for " + ParamName + ": " + Twine(Value), Severity));
+  return true;
+}
+
 static bool parseRootFlags(LLVMContext *Ctx, mcdxbc::RootSignatureDesc &RSD,
                            MDNode *RootFlagNode) {
 
@@ -52,6 +59,45 @@ static bool parseRootFlags(LLVMContext *Ctx, mcdxbc::RootSignatureDesc &RSD,
   return false;
 }
 
+static bool extractMdValue(uint32_t &Value, MDNode *Node, unsigned int OpId) {
+
+  auto *CI = mdconst::extract<ConstantInt>(Node->getOperand(OpId));
+  if (CI == nullptr)
+    return true;
+
+  Value = CI->getZExtValue();
+  return false;
+}
+
+static bool parseRootConstants(LLVMContext *Ctx, mcdxbc::RootSignatureDesc &RSD,
+                               MDNode *RootFlagNode) {
+
+  if (RootFlagNode->getNumOperands() != 5)
+    return reportError(Ctx, "Invalid format for RootConstants Element");
+
+  mcdxbc::RootParameter NewParameter;
+  NewParameter.Header.ParameterType = dxbc::RootParameterType::Constants32Bit;
+
+  uint32_t SV;
+  if (extractMdValue(SV, RootFlagNode, 1))
+    return reportError(Ctx, "Invalid value for ShaderVisibility");
+
+  NewParameter.Header.ShaderVisibility = (dxbc::ShaderVisibility)SV;
+
+  if (extractMdValue(NewParameter.Constants.ShaderRegister, RootFlagNode, 2))
+    return reportError(Ctx, "Invalid value for ShaderRegister");
+
+  if (extractMdValue(NewParameter.Constants.RegisterSpace, RootFlagNode, 3))
+    return reportError(Ctx, "Invalid value for RegisterSpace");
+
+  if (extractMdValue(NewParameter.Constants.Num32BitValues, RootFlagNode, 4))
+    return reportError(Ctx, "Invalid value for Num32BitValues");
+
+  RSD.Parameters.push_back(NewParameter);
+
+  return false;
+}
+
 static bool parseRootSignatureElement(LLVMContext *Ctx,
                                       mcdxbc::RootSignatureDesc &RSD,
                                       MDNode *Element) {
@@ -62,12 +108,16 @@ static bool parseRootSignatureElement(LLVMContext *Ctx,
   RootSignatureElementKind ElementKind =
       StringSwitch<RootSignatureElementKind>(ElementText->getString())
           .Case("RootFlags", RootSignatureElementKind::RootFlags)
+          .Case("RootConstants", RootSignatureElementKind::RootConstants)
           .Default(RootSignatureElementKind::Error);
 
   switch (ElementKind) {
 
   case RootSignatureElementKind::RootFlags:
     return parseRootFlags(Ctx, RSD, Element);
+  case RootSignatureElementKind::RootConstants:
+    return parseRootConstants(Ctx, RSD, Element);
+    break;
   case RootSignatureElementKind::Error:
     return reportError(Ctx, "Invalid Root Signature Element: " +
                                 ElementText->getString());
@@ -94,10 +144,56 @@ static bool parse(LLVMContext *Ctx, mcdxbc::RootSignatureDesc &RSD,
 
 static bool verifyRootFlag(uint32_t Flags) { return (Flags & ~0xfff) == 0; }
 
+static bool verifyShaderVisibility(dxbc::ShaderVisibility Flags) {
+  switch (Flags) {
+
+  case dxbc::ShaderVisibility::All:
+  case dxbc::ShaderVisibility::Vertex:
+  case dxbc::ShaderVisibility::Hull:
+  case dxbc::ShaderVisibility::Domain:
+  case dxbc::ShaderVisibility::Geometry:
+  case dxbc::ShaderVisibility::Pixel:
+  case dxbc::ShaderVisibility::Amplification:
+  case dxbc::ShaderVisibility::Mesh:
+    return true;
+  }
+
+  return false;
+}
+
+static bool verifyParameterType(dxbc::RootParameterType Flags) {
+  switch (Flags) {
+  case dxbc::RootParameterType::Constants32Bit:
+    return true;
+  }
+
+  return false;
+}
+
+static bool verifyVersion(uint32_t Version) {
+  return (Version == 1 || Version == 2);
+}
+
 static bool validate(LLVMContext *Ctx, const mcdxbc::RootSignatureDesc &RSD) {
+
+  if (!verifyVersion(RSD.Header.Version)) {
+    return reportValueError(Ctx, "Version", RSD.Header.Version);
+  }
+
   if (!verifyRootFlag(RSD.Header.Flags)) {
-    return reportError(Ctx, "Invalid Root Signature flag value");
+    return reportValueError(Ctx, "RootFlags", RSD.Header.Flags);
+  }
+
+  for (const auto &P : RSD.Parameters) {
+    if (!verifyShaderVisibility(P.Header.ShaderVisibility))
+      return reportValueError(Ctx, "ShaderVisibility",
+                              (uint32_t)P.Header.ShaderVisibility);
+
+    if (!verifyParameterType(P.Header.ParameterType))
+      return reportValueError(Ctx, "ParameterType",
+                              (uint32_t)P.Header.ParameterType);
   }
+
   return false;
 }
 
@@ -211,6 +307,28 @@ PreservedAnalyses RootSignatureAnalysisPrinter::run(Module &M,
     OS << indent(Space) << "NumStaticSamplers: " << 0 << ":\n";
     OS << indent(Space) << "StaticSamplersOffset: "
        << sizeof(RS.Header) + RS.Parameters.size_in_bytes() << ":\n";
+
+    Space++;
+    for (auto const &P : RS.Parameters) {
+      OS << indent(Space) << "Parameter Type: " << &P.Header.ParameterType
+         << ":\n";
+      OS << indent(Space) << "Shader Visibility: " << &P.Header.ShaderVisibility
+         << ":\n";
+      OS << indent(Space) << "Parameter Offset: " << &P.Header.ParameterOffset
+         << ":\n";
+      switch (P.Header.ParameterType) {
+      case dxbc::RootParameterType::Constants32Bit:
+        OS << indent(Space) << "Register Space: " << &P.Constants.RegisterSpace
+           << ":\n";
+        OS << indent(Space)
+           << "Shader Register: " << &P.Constants.ShaderRegister << ":\n";
+        OS << indent(Space)
+           << "Num 32 Bit Values: " << &P.Constants.Num32BitValues << ":\n";
+        break;
+      }
+    }
+    Space--;
+
     Space--;
     // end root signature header
   }
diff --git a/llvm/lib/Target/DirectX/DXILRootSignature.h b/llvm/lib/Target/DirectX/DXILRootSignature.h
index 8c25b2eb3fadf..93ec614f1ab85 100644
--- a/llvm/lib/Target/DirectX/DXILRootSignature.h
+++ b/llvm/lib/Target/DirectX/DXILRootSignature.h
@@ -24,7 +24,11 @@
 namespace llvm {
 namespace dxil {
 
-enum class RootSignatureElementKind { Error = 0, RootFlags = 1 };
+enum class RootSignatureElementKind {
+  Error = 0,
+  RootFlags = 1,
+  RootConstants = 2
+};
 class RootSignatureAnalysis : public AnalysisInfoMixin<RootSignatureAnalysis> {
   friend AnalysisInfoMixin<RootSignatureAnalysis>;
   static AnalysisKey Key;
diff --git a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Flags-Validation-Error.ll b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Flags-Validation-Error.ll
index fe93c9993c1c3..3af9a524e77f4 100644
--- a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Flags-Validation-Error.ll
+++ b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Flags-Validation-Error.ll
@@ -1,6 +1,6 @@
 ; RUN: not opt -passes='print<dxil-root-signature>' %s -S -o - 2>&1 | FileCheck %s
 
-; CHECK: error: Invalid Root Signature flag value
+; CHECK: error: Invalid value for ShaderVisibility: 255
 ; CHECK-NOT: Root Signature Definitions
 
 target triple = "dxil-unknown-shadermodel6.0-compute"
@@ -16,5 +16,6 @@ attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" }
 
 !dx.rootsignatures = !{!2} ; list of function/root signature pairs
 !2 = !{ ptr @main, !3 } ; function, root signature
-!3 = !{ !4 } ; list of root signature elements
-!4 = !{ !"RootFlags", i32 2147487744 } ; 1 = allow_input_assembler_input_layout
+!3 = !{ !4, !5 } ; list of root signature elements
+!4 = !{ !"RootFlags", i32 1 } ; 1 = allow_input_assembler_input_layout
+!5 = !{ !"RootConstants", i32 255, i32 1, i32 2, i32 3 }
diff --git a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootConstants.ll b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootConstants.ll
new file mode 100644
index 0000000000000..d0520632df2a2
--- /dev/null
+++ b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootConstants.ll
@@ -0,0 +1,34 @@
+; RUN: opt %s -dxil-embed -dxil-globals -S -o - | FileCheck %s
+; RUN: llc %s --filetype=obj -o - | obj2yaml | FileCheck %s --check-prefix=DXC
+
+target triple = "dxil-unknown-shadermodel6.0-compute"
+
+; CHECK: @dx.rts0 = private constant [48 x i8]  c"{{.*}}", section "RTS0", align 4
+
+define void @main() #0 {
+entry:
+  ret void
+}
+attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" }
+
+
+!dx.rootsignatures = !{!2} ; list of function/root signature pairs
+!2 = !{ ptr @main, !3 } ; function, root signature
+!3 = !{ !4, !5 } ; list of root signature elements
+!4 = !{ !"RootFlags", i32 1 } ; 1 = allow_input_assembler_input_layout
+!5 = !{ !"RootConstants", i32 0, i32 1, i32 2, i32 3 }
+
+; DXC:  - Name:            RTS0
+; DXC-NEXT:    Size:            48
+; DXC-NEXT:    RootSignature:
+; DXC-NEXT:      Version:         2
+; DXC-NEXT:      NumStaticSamplers: 0
+; DXC-NEXT:      StaticSamplersOffset: 0
+; DXC-NEXT:      Parameters:
+; DXC-NEXT:        - ParameterType:   Constants32Bit
+; DXC-NEXT:          ShaderVisibility: All
+; DXC-NEXT:          Constants:
+; DXC-NEXT:            Num32BitValues:  3
+; DXC-NEXT:            RegisterSpace:   2
+; DXC-NEXT:            ShaderRegister:  1
+; DXC-NEXT:      AllowInputAssemblerInputLayout: true
diff --git a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-ShaderVisibility-Validation-Error.ll b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-ShaderVisibility-Validation-Error.ll
new file mode 100644
index 0000000000000..4b8e6abacd7ad
--- /dev/null
+++ b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-ShaderVisibility-Validation-Error.ll
@@ -0,0 +1,20 @@
+; RUN: not opt -passes='print<dxil-root-signature>' %s -S -o - 2>&1 | FileCheck %s
+
+; CHECK: error: Invalid value for RootFlags: 2147487744
+; CHECK-NOT: Root Signature Definitions
+
+target triple = "dxil-unknown-shadermodel6.0-compute"
+
+
+define void @main() #0 {
+entry:
+  ret void
+}
+
+attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" }
+
+
+!dx.rootsignatures = !{!2} ; list of function/root signature pairs
+!2 = !{ ptr @main, !3 } ; function, root signature
+!3 = !{ !4 } ; list of root signature elements
+!4 = !{ !"RootFlags", i32 2147487744 } ; 1 = allow_input_assembler_input_layout

>From efc5e52bb8843a025f49e41b322682753c061c3f Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Wed, 9 Apr 2025 21:19:25 +0000
Subject: [PATCH 02/13] add test

---
 llvm/lib/Target/DirectX/DXILRootSignature.cpp | 33 +++++++++----------
 .../ContainerData/RootSignature-Parameters.ll | 30 +++++++++++++++++
 2 files changed, 46 insertions(+), 17 deletions(-)
 create mode 100644 llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Parameters.ll

diff --git a/llvm/lib/Target/DirectX/DXILRootSignature.cpp b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
index 7686918b0fc75..7f30cef239696 100644
--- a/llvm/lib/Target/DirectX/DXILRootSignature.cpp
+++ b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
@@ -299,31 +299,30 @@ PreservedAnalyses RootSignatureAnalysisPrinter::run(Module &M,
 
     // start root signature header
     Space++;
-    OS << indent(Space) << "Flags: " << format_hex(RS.Header.Flags, 8) << ":\n";
-    OS << indent(Space) << "Version: " << RS.Header.Version << ":\n";
-    OS << indent(Space) << "NumParameters: " << RS.Parameters.size() << ":\n";
+    OS << indent(Space) << "Flags: " << format_hex(RS.Header.Flags, 8) << "\n";
+    OS << indent(Space) << "Version: " << RS.Header.Version << "\n";
+    OS << indent(Space) << "NumParameters: " << RS.Parameters.size() << "\n";
     OS << indent(Space) << "RootParametersOffset: " << sizeof(RS.Header)
-       << ":\n";
-    OS << indent(Space) << "NumStaticSamplers: " << 0 << ":\n";
+       << "\n";
+    OS << indent(Space) << "NumStaticSamplers: " << 0 << "\n";
     OS << indent(Space) << "StaticSamplersOffset: "
-       << sizeof(RS.Header) + RS.Parameters.size_in_bytes() << ":\n";
+       << sizeof(RS.Header) + RS.Parameters.size_in_bytes() << "\n";
 
     Space++;
     for (auto const &P : RS.Parameters) {
-      OS << indent(Space) << "Parameter Type: " << &P.Header.ParameterType
-         << ":\n";
-      OS << indent(Space) << "Shader Visibility: " << &P.Header.ShaderVisibility
-         << ":\n";
-      OS << indent(Space) << "Parameter Offset: " << &P.Header.ParameterOffset
-         << ":\n";
+      OS << indent(Space)
+         << "Parameter Type: " << (uint32_t)P.Header.ParameterType << "\n";
+      OS << indent(Space)
+         << "Shader Visibility: " << (uint32_t)P.Header.ShaderVisibility
+         << "\n";
       switch (P.Header.ParameterType) {
       case dxbc::RootParameterType::Constants32Bit:
-        OS << indent(Space) << "Register Space: " << &P.Constants.RegisterSpace
-           << ":\n";
+        OS << indent(Space) << "Register Space: " << P.Constants.RegisterSpace
+           << "\n";
+        OS << indent(Space) << "Shader Register: " << P.Constants.ShaderRegister
+           << "\n";
         OS << indent(Space)
-           << "Shader Register: " << &P.Constants.ShaderRegister << ":\n";
-        OS << indent(Space)
-           << "Num 32 Bit Values: " << &P.Constants.Num32BitValues << ":\n";
+           << "Num 32 Bit Values: " << P.Constants.Num32BitValues << "\n";
         break;
       }
     }
diff --git a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Parameters.ll b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Parameters.ll
new file mode 100644
index 0000000000000..9a2f7d840a236
--- /dev/null
+++ b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Parameters.ll
@@ -0,0 +1,30 @@
+; RUN: opt -passes='print<dxil-root-signature>' %s -S -o - 2>&1 | FileCheck %s
+
+target triple = "dxil-unknown-shadermodel6.0-compute"
+
+
+define void @main() #0 {
+entry:
+  ret void
+}
+
+attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" }
+
+!dx.rootsignatures = !{!2} ; list of function/root signature pairs
+!2 = !{ ptr @main, !3 } ; function, root signature
+!3 = !{ !4, !5 } ; list of root signature elements
+!4 = !{ !"RootFlags", i32 1 } ; 1 = allow_input_assembler_input_layout
+!5 = !{ !"RootConstants", i32 0, i32 1, i32 2, i32 3 }
+
+; CHECK-LABEL: Definition for 'main':
+; CHECK-NEXT: Flags: 0x000001
+; CHECK-NEXT: Version: 2
+; CHECK-NEXT: NumParameters: 1
+; CHECK-NEXT: RootParametersOffset: 24
+; CHECK-NEXT: NumStaticSamplers: 0
+; CHECK-NEXT: StaticSamplersOffset: 48
+; CHECK-NEXT:  Parameter Type: 1
+; CHECK-NEXT:  Shader Visibility: 0
+; CHECK-NEXT:  Register Space: 2
+; CHECK-NEXT:  Shader Register: 1
+; CHECK-NEXT:  Num 32 Bit Values: 3

>From c4b78d88b89818fe1f4cae553dcfdf7cad00ccf3 Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Mon, 14 Apr 2025 19:02:15 +0000
Subject: [PATCH 03/13] address comments

---
 llvm/lib/Target/DirectX/DXILRootSignature.cpp | 39 ++++++++++---------
 ...re-RootConstants-Invalid-Num32BitValues.ll | 18 +++++++++
 ...ure-RootConstants-Invalid-RegisterSpace.ll | 18 +++++++++
 ...re-RootConstants-Invalid-ShaderRegister.ll | 18 +++++++++
 .../RootSignature-RootConstants.ll            |  4 +-
 5 files changed, 76 insertions(+), 21 deletions(-)
 create mode 100644 llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootConstants-Invalid-Num32BitValues.ll
 create mode 100644 llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootConstants-Invalid-RegisterSpace.ll
 create mode 100644 llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootConstants-Invalid-ShaderRegister.ll

diff --git a/llvm/lib/Target/DirectX/DXILRootSignature.cpp b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
index 6793be3e83acf..607b025d3653d 100644
--- a/llvm/lib/Target/DirectX/DXILRootSignature.cpp
+++ b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
@@ -47,50 +47,53 @@ static bool reportValueError(LLVMContext *Ctx, Twine ParamName, uint32_t Value,
   return true;
 }
 
+static bool extractMdIntValue(uint32_t &Value, MDNode *Node,
+                              unsigned int OpId) {
+  auto *CI = mdconst::dyn_extract<ConstantInt>(Node->getOperand(OpId).get());
+  if (CI == nullptr)
+    return true;
+
+  Value = CI->getZExtValue();
+  return false;
+}
+
 static bool parseRootFlags(LLVMContext *Ctx, mcdxbc::RootSignatureDesc &RSD,
                            MDNode *RootFlagNode) {
 
   if (RootFlagNode->getNumOperands() != 2)
     return reportError(Ctx, "Invalid format for RootFlag Element");
 
-  auto *Flag = mdconst::extract<ConstantInt>(RootFlagNode->getOperand(1));
-  RSD.Flags = Flag->getZExtValue();
+  if (extractMdIntValue(RSD.Flags, RootFlagNode, 1))
+    return reportError(Ctx, "Invalid value for RootFlag");
 
   return false;
 }
 
-static bool extractMdValue(uint32_t &Value, MDNode *Node, unsigned int OpId) {
-
-  auto *CI = mdconst::extract<ConstantInt>(Node->getOperand(OpId));
-  if (CI == nullptr)
-    return true;
-
-  Value = CI->getZExtValue();
-  return false;
-}
-
 static bool parseRootConstants(LLVMContext *Ctx, mcdxbc::RootSignatureDesc &RSD,
-                               MDNode *RootFlagNode) {
+                               MDNode *RootConstantNode) {
 
-  if (RootFlagNode->getNumOperands() != 5)
+  if (RootConstantNode->getNumOperands() != 5)
     return reportError(Ctx, "Invalid format for RootConstants Element");
 
   mcdxbc::RootParameter NewParameter;
   NewParameter.Header.ParameterType = dxbc::RootParameterType::Constants32Bit;
 
   uint32_t SV;
-  if (extractMdValue(SV, RootFlagNode, 1))
+  if (extractMdIntValue(SV, RootConstantNode, 1))
     return reportError(Ctx, "Invalid value for ShaderVisibility");
 
   NewParameter.Header.ShaderVisibility = (dxbc::ShaderVisibility)SV;
 
-  if (extractMdValue(NewParameter.Constants.ShaderRegister, RootFlagNode, 2))
+  if (extractMdIntValue(NewParameter.Constants.ShaderRegister, RootConstantNode,
+                        2))
     return reportError(Ctx, "Invalid value for ShaderRegister");
 
-  if (extractMdValue(NewParameter.Constants.RegisterSpace, RootFlagNode, 3))
+  if (extractMdIntValue(NewParameter.Constants.RegisterSpace, RootConstantNode,
+                        3))
     return reportError(Ctx, "Invalid value for RegisterSpace");
 
-  if (extractMdValue(NewParameter.Constants.Num32BitValues, RootFlagNode, 4))
+  if (extractMdIntValue(NewParameter.Constants.Num32BitValues, RootConstantNode,
+                        4))
     return reportError(Ctx, "Invalid value for Num32BitValues");
 
   RSD.Parameters.push_back(NewParameter);
diff --git a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootConstants-Invalid-Num32BitValues.ll b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootConstants-Invalid-Num32BitValues.ll
new file mode 100644
index 0000000000000..b06678519eef7
--- /dev/null
+++ b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootConstants-Invalid-Num32BitValues.ll
@@ -0,0 +1,18 @@
+; RUN: not opt -passes='print<dxil-root-signature>' %s -S -o - 2>&1 | FileCheck %s
+
+target triple = "dxil-unknown-shadermodel6.0-compute"
+
+; CHECK: error: Invalid value for Num32BitValues
+; CHECK-NOT: Root Signature Definitions
+
+define void @main() #0 {
+entry:
+  ret void
+}
+attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" }
+
+
+!dx.rootsignatures = !{!2} ; list of function/root signature pairs
+!2 = !{ ptr @main, !3 } ; function, root signature
+!3 = !{ !5 } ; list of root signature elements
+!5 = !{ !"RootConstants", i32 0, i32 1, i32 2, !"Invalid" }
diff --git a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootConstants-Invalid-RegisterSpace.ll b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootConstants-Invalid-RegisterSpace.ll
new file mode 100644
index 0000000000000..1087b414942e2
--- /dev/null
+++ b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootConstants-Invalid-RegisterSpace.ll
@@ -0,0 +1,18 @@
+; RUN: not opt -passes='print<dxil-root-signature>' %s -S -o - 2>&1 | FileCheck %s
+
+target triple = "dxil-unknown-shadermodel6.0-compute"
+
+; CHECK: error: Invalid value for RegisterSpace
+; CHECK-NOT: Root Signature Definitions
+
+define void @main() #0 {
+entry:
+  ret void
+}
+attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" }
+
+
+!dx.rootsignatures = !{!2} ; list of function/root signature pairs
+!2 = !{ ptr @main, !3 } ; function, root signature
+!3 = !{ !5 } ; list of root signature elements
+!5 = !{ !"RootConstants", i32 0, i32 1, !"Invalid", i32 3 }
diff --git a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootConstants-Invalid-ShaderRegister.ll b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootConstants-Invalid-ShaderRegister.ll
new file mode 100644
index 0000000000000..53fd924e8f46e
--- /dev/null
+++ b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootConstants-Invalid-ShaderRegister.ll
@@ -0,0 +1,18 @@
+; RUN: not opt -passes='print<dxil-root-signature>' %s -S -o - 2>&1 | FileCheck %s
+
+target triple = "dxil-unknown-shadermodel6.0-compute"
+
+; CHECK: error: Invalid value for ShaderRegister
+; CHECK-NOT: Root Signature Definitions
+
+define void @main() #0 {
+entry:
+  ret void
+}
+attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" }
+
+
+!dx.rootsignatures = !{!2} ; list of function/root signature pairs
+!2 = !{ ptr @main, !3 } ; function, root signature
+!3 = !{ !5 } ; list of root signature elements
+!5 = !{ !"RootConstants", i32 0, !"Invalid", i32 2, i32 3 }
diff --git a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootConstants.ll b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootConstants.ll
index 5812106e651f4..71511ff523340 100644
--- a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootConstants.ll
+++ b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootConstants.ll
@@ -14,8 +14,7 @@ attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" }
 
 !dx.rootsignatures = !{!2} ; list of function/root signature pairs
 !2 = !{ ptr @main, !3 } ; function, root signature
-!3 = !{ !4, !5 } ; list of root signature elements
-!4 = !{ !"RootFlags", i32 1 } ; 1 = allow_input_assembler_input_layout
+!3 = !{ !5 } ; list of root signature elements
 !5 = !{ !"RootConstants", i32 0, i32 1, i32 2, i32 3 }
 
 ; DXC:  - Name:            RTS0
@@ -33,4 +32,3 @@ attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" }
 ; DXC-NEXT:            Num32BitValues:  3
 ; DXC-NEXT:            RegisterSpace:   2
 ; DXC-NEXT:            ShaderRegister:  1
-; DXC-NEXT:      AllowInputAssemblerInputLayout: true

>From 8bdc206ee809bf40dead3e3aaa4b6e7750e152e9 Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Mon, 14 Apr 2025 19:53:16 +0000
Subject: [PATCH 04/13] address comments

---
 llvm/lib/Target/DirectX/DXILRootSignature.cpp                | 5 ++---
 ...Error.ll => RootSignature-Parameters-Validation-Error.ll} | 3 +--
 ... => RootSignature-RootFlags-VisibilityValidationError.ll} | 0
 3 files changed, 3 insertions(+), 5 deletions(-)
 rename llvm/test/CodeGen/DirectX/ContainerData/{RootSignature-Flags-Validation-Error.ll => RootSignature-Parameters-Validation-Error.ll} (81%)
 rename llvm/test/CodeGen/DirectX/ContainerData/{RootSignature-ShaderVisibility-Validation-Error.ll => RootSignature-RootFlags-VisibilityValidationError.ll} (100%)

diff --git a/llvm/lib/Target/DirectX/DXILRootSignature.cpp b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
index 607b025d3653d..0605c565ba6b1 100644
--- a/llvm/lib/Target/DirectX/DXILRootSignature.cpp
+++ b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
@@ -192,9 +192,8 @@ static bool validate(LLVMContext *Ctx, const mcdxbc::RootSignatureDesc &RSD) {
       return reportValueError(Ctx, "ShaderVisibility",
                               (uint32_t)P.Header.ShaderVisibility);
 
-    if (!verifyParameterType(P.Header.ParameterType))
-      return reportValueError(Ctx, "ParameterType",
-                              (uint32_t)P.Header.ParameterType);
+    assert(verifyParameterType(P.Header.ParameterType) &&
+           "Invalid value for ParameterType");
   }
 
   return false;
diff --git a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Flags-Validation-Error.ll b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Parameters-Validation-Error.ll
similarity index 81%
rename from llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Flags-Validation-Error.ll
rename to llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Parameters-Validation-Error.ll
index 3af9a524e77f4..2b4a075281f80 100644
--- a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Flags-Validation-Error.ll
+++ b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Parameters-Validation-Error.ll
@@ -16,6 +16,5 @@ attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" }
 
 !dx.rootsignatures = !{!2} ; list of function/root signature pairs
 !2 = !{ ptr @main, !3 } ; function, root signature
-!3 = !{ !4, !5 } ; list of root signature elements
-!4 = !{ !"RootFlags", i32 1 } ; 1 = allow_input_assembler_input_layout
+!3 = !{ !5 } ; list of root signature elements
 !5 = !{ !"RootConstants", i32 255, i32 1, i32 2, i32 3 }
diff --git a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-ShaderVisibility-Validation-Error.ll b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootFlags-VisibilityValidationError.ll
similarity index 100%
rename from llvm/test/CodeGen/DirectX/ContainerData/RootSignature-ShaderVisibility-Validation-Error.ll
rename to llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootFlags-VisibilityValidationError.ll

>From 1e5eee549ea70efe181b635c84e278415b1e9e2b Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Mon, 14 Apr 2025 20:48:00 +0000
Subject: [PATCH 05/13] addressing pr comments

---
 llvm/lib/Object/DXContainer.cpp | 2 --
 1 file changed, 2 deletions(-)

diff --git a/llvm/lib/Object/DXContainer.cpp b/llvm/lib/Object/DXContainer.cpp
index 77303edce1a41..95f6788e75aa6 100644
--- a/llvm/lib/Object/DXContainer.cpp
+++ b/llvm/lib/Object/DXContainer.cpp
@@ -272,8 +272,6 @@ Error DirectX::RootSignature::parse() {
   Flags = support::endian::read<uint32_t, llvm::endianness::little>(Current);
   Current += sizeof(uint32_t);
 
-  assert(Current == PartData.begin() + RootParametersOffset);
-
   ParametersHeaders.Data = PartData.substr(
       RootParametersOffset, NumParameters * sizeof(dxbc::RootParameterHeader));
 

>From a968d81f3e212ed1621095c6886dec27eb06d1e6 Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Mon, 14 Apr 2025 20:52:22 +0000
Subject: [PATCH 06/13] Revert "addressing pr comments"

This reverts commit 1e5eee549ea70efe181b635c84e278415b1e9e2b.
---
 llvm/lib/Object/DXContainer.cpp | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/llvm/lib/Object/DXContainer.cpp b/llvm/lib/Object/DXContainer.cpp
index 95f6788e75aa6..77303edce1a41 100644
--- a/llvm/lib/Object/DXContainer.cpp
+++ b/llvm/lib/Object/DXContainer.cpp
@@ -272,6 +272,8 @@ Error DirectX::RootSignature::parse() {
   Flags = support::endian::read<uint32_t, llvm::endianness::little>(Current);
   Current += sizeof(uint32_t);
 
+  assert(Current == PartData.begin() + RootParametersOffset);
+
   ParametersHeaders.Data = PartData.substr(
       RootParametersOffset, NumParameters * sizeof(dxbc::RootParameterHeader));
 

>From 8511fa99d3ec267ae1d53dd1b5a4d8357de84fc9 Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Mon, 14 Apr 2025 20:53:05 +0000
Subject: [PATCH 07/13] address comments

---
 llvm/lib/Object/DXContainer.cpp | 2 --
 1 file changed, 2 deletions(-)

diff --git a/llvm/lib/Object/DXContainer.cpp b/llvm/lib/Object/DXContainer.cpp
index 77303edce1a41..95f6788e75aa6 100644
--- a/llvm/lib/Object/DXContainer.cpp
+++ b/llvm/lib/Object/DXContainer.cpp
@@ -272,8 +272,6 @@ Error DirectX::RootSignature::parse() {
   Flags = support::endian::read<uint32_t, llvm::endianness::little>(Current);
   Current += sizeof(uint32_t);
 
-  assert(Current == PartData.begin() + RootParametersOffset);
-
   ParametersHeaders.Data = PartData.substr(
       RootParametersOffset, NumParameters * sizeof(dxbc::RootParameterHeader));
 

>From 330369abd95a28411fb238d41adaf5ea1c5ab97d Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Tue, 15 Apr 2025 01:11:12 +0000
Subject: [PATCH 08/13] changing back enums to enum class

---
 llvm/include/llvm/BinaryFormat/DXContainer.h | 4 ++--
 llvm/include/llvm/Object/DXContainer.h       | 8 ++++++--
 llvm/lib/MC/DXContainerRootSignature.cpp     | 4 ++--
 llvm/lib/ObjectYAML/DXContainerEmitter.cpp   | 3 ++-
 llvm/lib/ObjectYAML/DXContainerYAML.cpp      | 4 +++-
 5 files changed, 15 insertions(+), 8 deletions(-)

diff --git a/llvm/include/llvm/BinaryFormat/DXContainer.h b/llvm/include/llvm/BinaryFormat/DXContainer.h
index 56df554b56e2e..819e7d3f4d571 100644
--- a/llvm/include/llvm/BinaryFormat/DXContainer.h
+++ b/llvm/include/llvm/BinaryFormat/DXContainer.h
@@ -159,7 +159,7 @@ enum class RootElementFlag : uint32_t {
 };
 
 #define ROOT_PARAMETER(Val, Enum) Enum = Val,
-enum RootParameterType : uint32_t {
+enum class RootParameterType : uint32_t {
 #include "DXContainerConstants.def"
 };
 
@@ -176,7 +176,7 @@ inline bool isValidParameterType(uint32_t V) {
 }
 
 #define SHADER_VISIBILITY(Val, Enum) Enum = Val,
-enum ShaderVisibility : uint32_t {
+enum class ShaderVisibility : uint32_t {
 #include "DXContainerConstants.def"
 };
 
diff --git a/llvm/include/llvm/Object/DXContainer.h b/llvm/include/llvm/Object/DXContainer.h
index 561e4c1d1c634..e666a3df95ba6 100644
--- a/llvm/include/llvm/Object/DXContainer.h
+++ b/llvm/include/llvm/Object/DXContainer.h
@@ -139,7 +139,8 @@ struct RootParameterView {
 
 struct RootConstantView : RootParameterView {
   static bool classof(const RootParameterView *V) {
-    return V->Header.ParameterType == dxbc::RootParameterType::Constants32Bit;
+    return V->Header.ParameterType ==
+           (uint32_t)dxbc::RootParameterType::Constants32Bit;
   }
 
   llvm::Expected<dxbc::RootConstants> read() {
@@ -183,7 +184,10 @@ class RootSignature {
   getParameter(const dxbc::RootParameterHeader &Header) const {
     size_t DataSize;
 
-    switch (Header.ParameterType) {
+    if (!dxbc::isValidParameterType(Header.ParameterType))
+      return parseFailed("invalid parameter type");
+
+    switch (static_cast<dxbc::RootParameterType>(Header.ParameterType)) {
     case dxbc::RootParameterType::Constants32Bit:
       DataSize = sizeof(dxbc::RootConstants);
       break;
diff --git a/llvm/lib/MC/DXContainerRootSignature.cpp b/llvm/lib/MC/DXContainerRootSignature.cpp
index 63de60acc9bc2..fc85f275297fe 100644
--- a/llvm/lib/MC/DXContainerRootSignature.cpp
+++ b/llvm/lib/MC/DXContainerRootSignature.cpp
@@ -34,7 +34,7 @@ size_t RootSignatureDesc::getSize() const {
 
   for (const auto &P : Parameters) {
     switch (P.Header.ParameterType) {
-    case dxbc::RootParameterType::Constants32Bit:
+    case static_cast<uint32_t>(dxbc::RootParameterType::Constants32Bit):
       Size += sizeof(dxbc::RootConstants);
       break;
     }
@@ -75,7 +75,7 @@ void RootSignatureDesc::write(raw_ostream &OS) const {
     const auto &P = Parameters[I];
 
     switch (P.Header.ParameterType) {
-    case dxbc::RootParameterType::Constants32Bit:
+    case static_cast<uint32_t>(dxbc::RootParameterType::Constants32Bit):
       support::endian::write(BOS, P.Constants.ShaderRegister,
                              llvm::endianness::little);
       support::endian::write(BOS, P.Constants.RegisterSpace,
diff --git a/llvm/lib/ObjectYAML/DXContainerEmitter.cpp b/llvm/lib/ObjectYAML/DXContainerEmitter.cpp
index 1342629df84f3..f1fe224e240b7 100644
--- a/llvm/lib/ObjectYAML/DXContainerEmitter.cpp
+++ b/llvm/lib/ObjectYAML/DXContainerEmitter.cpp
@@ -19,6 +19,7 @@
 #include "llvm/Support/Errc.h"
 #include "llvm/Support/Error.h"
 #include "llvm/Support/raw_ostream.h"
+#include <cstdint>
 
 using namespace llvm;
 
@@ -276,7 +277,7 @@ void DXContainerWriter::writeParts(raw_ostream &OS) {
 
         switch (Param.Type) {
 
-        case dxbc::RootParameterType::Constants32Bit:
+        case static_cast<uint32_t>(dxbc::RootParameterType::Constants32Bit):
           NewParam.Constants.Num32BitValues = Param.Constants.Num32BitValues;
           NewParam.Constants.RegisterSpace = Param.Constants.RegisterSpace;
           NewParam.Constants.ShaderRegister = Param.Constants.ShaderRegister;
diff --git a/llvm/lib/ObjectYAML/DXContainerYAML.cpp b/llvm/lib/ObjectYAML/DXContainerYAML.cpp
index d94347a946123..f892e687e101b 100644
--- a/llvm/lib/ObjectYAML/DXContainerYAML.cpp
+++ b/llvm/lib/ObjectYAML/DXContainerYAML.cpp
@@ -16,6 +16,7 @@
 #include "llvm/BinaryFormat/DXContainer.h"
 #include "llvm/Support/Error.h"
 #include "llvm/Support/ScopedPrinter.h"
+#include <cstdint>
 #include <system_error>
 
 namespace llvm {
@@ -279,8 +280,9 @@ void MappingTraits<llvm::DXContainerYAML::RootParameterYamlDesc>::mapping(
     IO &IO, llvm::DXContainerYAML::RootParameterYamlDesc &P) {
   IO.mapRequired("ParameterType", P.Type);
   IO.mapRequired("ShaderVisibility", P.Visibility);
+
   switch (P.Type) {
-  case dxbc::RootParameterType::Constants32Bit:
+  case static_cast<uint32_t>(dxbc::RootParameterType::Constants32Bit):
     IO.mapRequired("Constants", P.Constants);
     break;
   }

>From d747bcc6d7c3681a52528f2809aeb4258d721a5d Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Wed, 16 Apr 2025 16:46:16 +0000
Subject: [PATCH 09/13] addressing PR comments and adding more tests

---
 llvm/include/llvm/Object/DXContainer.h        |  7 +--
 llvm/lib/MC/DXContainerRootSignature.cpp      | 10 ++--
 llvm/lib/ObjectYAML/DXContainerEmitter.cpp    |  3 +-
 llvm/lib/ObjectYAML/DXContainerYAML.cpp       |  8 +--
 llvm/unittests/Object/DXContainerTest.cpp     | 38 +++++++++++++-
 .../ObjectYAML/DXContainerYAMLTest.cpp        | 52 +++++++++++++++++++
 6 files changed, 104 insertions(+), 14 deletions(-)

diff --git a/llvm/include/llvm/Object/DXContainer.h b/llvm/include/llvm/Object/DXContainer.h
index e666a3df95ba6..e8287ce078365 100644
--- a/llvm/include/llvm/Object/DXContainer.h
+++ b/llvm/include/llvm/Object/DXContainer.h
@@ -23,6 +23,7 @@
 #include "llvm/Support/MemoryBufferRef.h"
 #include "llvm/TargetParser/Triple.h"
 #include <array>
+#include <cstddef>
 #include <variant>
 
 namespace llvm {
@@ -192,9 +193,9 @@ class RootSignature {
       DataSize = sizeof(dxbc::RootConstants);
       break;
     }
-    auto EndOfSectionByte = getNumStaticSamplers() == 0
-                                ? PartData.size()
-                                : getStaticSamplersOffset();
+    size_t EndOfSectionByte = getNumStaticSamplers() == 0
+                                  ? PartData.size()
+                                  : getStaticSamplersOffset();
 
     if (Header.ParameterOffset + DataSize > EndOfSectionByte)
       return parseFailed("Reading structure out of file bounds");
diff --git a/llvm/lib/MC/DXContainerRootSignature.cpp b/llvm/lib/MC/DXContainerRootSignature.cpp
index fc85f275297fe..619c3ec337d4c 100644
--- a/llvm/lib/MC/DXContainerRootSignature.cpp
+++ b/llvm/lib/MC/DXContainerRootSignature.cpp
@@ -32,9 +32,9 @@ size_t RootSignatureDesc::getSize() const {
   size_t Size = sizeof(dxbc::RootSignatureHeader) +
                 Parameters.size() * sizeof(dxbc::RootParameterHeader);
 
-  for (const auto &P : Parameters) {
+  for (const mcdxbc::RootParameter &P : Parameters) {
     switch (P.Header.ParameterType) {
-    case static_cast<uint32_t>(dxbc::RootParameterType::Constants32Bit):
+    case llvm::to_underlying(dxbc::RootParameterType::Constants32Bit):
       Size += sizeof(dxbc::RootConstants);
       break;
     }
@@ -60,7 +60,7 @@ void RootSignatureDesc::write(raw_ostream &OS) const {
   support::endian::write(BOS, Flags, llvm::endianness::little);
 
   SmallVector<uint32_t> ParamsOffsets;
-  for (const auto &P : Parameters) {
+  for (const mcdxbc::RootParameter &P : Parameters) {
     support::endian::write(BOS, P.Header.ParameterType,
                            llvm::endianness::little);
     support::endian::write(BOS, P.Header.ShaderVisibility,
@@ -72,10 +72,10 @@ void RootSignatureDesc::write(raw_ostream &OS) const {
   assert(NumParameters == ParamsOffsets.size());
   for (size_t I = 0; I < NumParameters; ++I) {
     rewriteOffsetToCurrentByte(BOS, ParamsOffsets[I]);
-    const auto &P = Parameters[I];
+    const mcdxbc::RootParameter &P = Parameters[I];
 
     switch (P.Header.ParameterType) {
-    case static_cast<uint32_t>(dxbc::RootParameterType::Constants32Bit):
+    case llvm::to_underlying(dxbc::RootParameterType::Constants32Bit):
       support::endian::write(BOS, P.Constants.ShaderRegister,
                              llvm::endianness::little);
       support::endian::write(BOS, P.Constants.RegisterSpace,
diff --git a/llvm/lib/ObjectYAML/DXContainerEmitter.cpp b/llvm/lib/ObjectYAML/DXContainerEmitter.cpp
index f1fe224e240b7..dee30b77d888d 100644
--- a/llvm/lib/ObjectYAML/DXContainerEmitter.cpp
+++ b/llvm/lib/ObjectYAML/DXContainerEmitter.cpp
@@ -276,8 +276,7 @@ void DXContainerWriter::writeParts(raw_ostream &OS) {
             Param.Type, Param.Visibility, Param.Offset};
 
         switch (Param.Type) {
-
-        case static_cast<uint32_t>(dxbc::RootParameterType::Constants32Bit):
+        case llvm::to_underlying(dxbc::RootParameterType::Constants32Bit):
           NewParam.Constants.Num32BitValues = Param.Constants.Num32BitValues;
           NewParam.Constants.RegisterSpace = Param.Constants.RegisterSpace;
           NewParam.Constants.ShaderRegister = Param.Constants.ShaderRegister;
diff --git a/llvm/lib/ObjectYAML/DXContainerYAML.cpp b/llvm/lib/ObjectYAML/DXContainerYAML.cpp
index f892e687e101b..fa8551c0ca5a1 100644
--- a/llvm/lib/ObjectYAML/DXContainerYAML.cpp
+++ b/llvm/lib/ObjectYAML/DXContainerYAML.cpp
@@ -12,6 +12,7 @@
 //===----------------------------------------------------------------------===//
 
 #include "llvm/ObjectYAML/DXContainerYAML.h"
+#include "llvm/ADT/STLForwardCompat.h"
 #include "llvm/ADT/ScopeExit.h"
 #include "llvm/BinaryFormat/DXContainer.h"
 #include "llvm/Support/Error.h"
@@ -45,7 +46,7 @@ DXContainerYAML::RootSignatureYamlDesc::create(
   RootSigDesc.RootParametersOffset = Data.getRootParametersOffset();
 
   uint32_t Flags = Data.getFlags();
-  for (const auto &PH : Data.param_headers()) {
+  for (const dxbc::RootParameterHeader &PH : Data.param_headers()) {
 
     RootParameterYamlDesc NewP;
     NewP.Offset = PH.ParameterOffset;
@@ -84,7 +85,8 @@ DXContainerYAML::RootSignatureYamlDesc::create(
     RootSigDesc.Parameters.push_back(NewP);
   }
 #define ROOT_ELEMENT_FLAG(Num, Val)                                            \
-  RootSigDesc.Val = (Flags & (uint32_t)dxbc::RootElementFlag::Val) > 0;
+  RootSigDesc.Val =                                                            \
+      (Flags & llvm::to_underlying(dxbc::RootElementFlag::Val)) > 0;
 #include "llvm/BinaryFormat/DXContainerConstants.def"
   return RootSigDesc;
 }
@@ -282,7 +284,7 @@ void MappingTraits<llvm::DXContainerYAML::RootParameterYamlDesc>::mapping(
   IO.mapRequired("ShaderVisibility", P.Visibility);
 
   switch (P.Type) {
-  case static_cast<uint32_t>(dxbc::RootParameterType::Constants32Bit):
+  case llvm::to_underlying(dxbc::RootParameterType::Constants32Bit):
     IO.mapRequired("Constants", P.Constants);
     break;
   }
diff --git a/llvm/unittests/Object/DXContainerTest.cpp b/llvm/unittests/Object/DXContainerTest.cpp
index bf32c07951520..7c721f38c6301 100644
--- a/llvm/unittests/Object/DXContainerTest.cpp
+++ b/llvm/unittests/Object/DXContainerTest.cpp
@@ -822,6 +822,43 @@ TEST(DXCFile, MalformedSignature) {
   }
 }
 
+TEST(RootSignature, MalformedData) {
+  {
+    // RootParametersOffset is 255.
+    uint8_t Buffer[] = {
+        0x44, 0x58, 0x42, 0x43, 0x32, 0x9a, 0x53, 0xd8, 0xec, 0xbe, 0x35, 0x6f,
+        0x05, 0x39, 0xe1, 0xfe, 0x31, 0x20, 0xf0, 0xc1, 0x01, 0x00, 0x00, 0x00,
+        0x85, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00,
+        0x52, 0x54, 0x53, 0x30, 0x59, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
+        0x01, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x2c, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
+        0x02, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00,
+        0x0e, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00};
+    DXContainer C =
+        llvm::cantFail(DXContainer::create(getMemoryBuffer<133>(Buffer)));
+
+    auto MaybeRS = C.getRootSignature();
+    ASSERT_TRUE(MaybeRS.has_value());
+    const auto &RS = MaybeRS.value();
+    ASSERT_EQ(RS.getVersion(), 2u);
+    ASSERT_EQ(RS.getNumParameters(), 1u);
+    ASSERT_EQ(RS.getRootParametersOffset(), 255u);
+    ASSERT_EQ(RS.getNumStaticSamplers(), 0u);
+    ASSERT_EQ(RS.getStaticSamplersOffset(), 44u);
+    ASSERT_EQ(RS.getFlags(), 17u);
+
+    // Since the offset is wrong, the data becomes invalid.
+    auto RootParam = *RS.param_headers().begin();
+    auto ParamView = RS.getParameter(RootParam);
+    ASSERT_THAT_ERROR(ParamView.takeError(),
+                      FailedWithMessage("invalid parameter type"));
+  }
+}
+
 TEST(RootSignature, ParseRootFlags) {
   {
     uint8_t Buffer[] = {
@@ -844,7 +881,6 @@ TEST(RootSignature, ParseRootFlags) {
     ASSERT_EQ(RS->getStaticSamplersOffset(), 0u);
     ASSERT_EQ(RS->getFlags(), 0x01u);
   }
-
   {
     // this parameter has the root signature definition missing some values.
     uint8_t Buffer[] = {
diff --git a/llvm/unittests/ObjectYAML/DXContainerYAMLTest.cpp b/llvm/unittests/ObjectYAML/DXContainerYAMLTest.cpp
index 99ca161883498..3a40fc457d2dc 100644
--- a/llvm/unittests/ObjectYAML/DXContainerYAMLTest.cpp
+++ b/llvm/unittests/ObjectYAML/DXContainerYAMLTest.cpp
@@ -148,6 +148,58 @@ TEST(RootSignature, ParseRootFlags) {
   EXPECT_TRUE(memcmp(Buffer, Storage.data(), 68u) == 0);
 }
 
+TEST(RootSignature, MalformedData) {
+  SmallString<128> Storage;
+
+  // First read a fully explicit yaml with all sizes and offsets provided
+  ASSERT_TRUE(convert(Storage, R"(--- !dxcontainer
+  Header:
+      Hash:            [ 0x32, 0x9A, 0x53, 0xD8, 0xEC, 0xBE, 0x35, 0x6F, 0x5, 
+                        0x39, 0xE1, 0xFE, 0x31, 0x20, 0xF0, 0xC1 ]
+      Version:
+        Major:           1
+        Minor:           0
+      FileSize:        133
+      PartCount:       1
+      PartOffsets:     [ 36 ]
+  Parts:
+    - Name:            RTS0
+      Size:            89
+      RootSignature:
+        Version: 2
+        NumRootParameters: 1
+        RootParametersOffset: 255
+        NumStaticSamplers: 0
+        StaticSamplersOffset: 56
+        Parameters:
+          - ParameterType: 1
+            ShaderVisibility: 2
+            Constants:
+              Num32BitValues: 16
+              ShaderRegister: 15
+              RegisterSpace: 14
+        AllowInputAssemblerInputLayout: true
+        DenyGeometryShaderRootAccess: true
+    )"));
+
+  uint8_t Buffer[] = {
+      0x44, 0x58, 0x42, 0x43, 0x32, 0x9a, 0x53, 0xd8, 0xec, 0xbe, 0x35, 0x6f,
+      0x05, 0x39, 0xe1, 0xfe, 0x31, 0x20, 0xf0, 0xc1, 0x01, 0x00, 0x00, 0x00,
+      0x85, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00,
+      0x52, 0x54, 0x53, 0x30, 0x59, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
+      0x01, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+      0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
+      0x02, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00,
+      0x0e, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+      0x00};
+
+  EXPECT_EQ(Storage.size(), 133u);
+  EXPECT_TRUE(memcmp(Buffer, Storage.data(), 133u) == 0);
+}
+
 TEST(RootSignature, ParseRootConstants) {
   SmallString<128> Storage;
 

>From 6cef56775f0f19203a936cbdc4c8e58eb7c2828c Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Wed, 16 Apr 2025 18:36:50 +0000
Subject: [PATCH 10/13] adding tests and fixing code

---
 .../llvm/MC/DXContainerRootSignature.h        |  3 ++
 llvm/lib/MC/DXContainerRootSignature.cpp      |  7 ++--
 llvm/lib/ObjectYAML/DXContainerEmitter.cpp    |  4 +++
 .../ContainerData/RootSignature-Flags.ll      |  2 +-
 .../DXContainer/RootSignature-Flags.yaml      |  6 ++--
 .../RootSignature-MultipleParameters.yaml     |  4 +--
 llvm/unittests/Object/DXContainerTest.cpp     | 33 ++++++++++++++-----
 .../ObjectYAML/DXContainerYAMLTest.cpp        | 12 +++----
 8 files changed, 45 insertions(+), 26 deletions(-)

diff --git a/llvm/include/llvm/MC/DXContainerRootSignature.h b/llvm/include/llvm/MC/DXContainerRootSignature.h
index d0f5e2af861d8..fee799249b255 100644
--- a/llvm/include/llvm/MC/DXContainerRootSignature.h
+++ b/llvm/include/llvm/MC/DXContainerRootSignature.h
@@ -25,6 +25,9 @@ struct RootSignatureDesc {
 
   uint32_t Version = 2U;
   uint32_t Flags = 0U;
+  uint32_t RootParameterOffset = 0U;
+  uint32_t StaticSamplersOffset = 0u;
+  uint32_t NumStaticSamplers = 0u;
   SmallVector<mcdxbc::RootParameter> Parameters;
 
   void write(raw_ostream &OS) const;
diff --git a/llvm/lib/MC/DXContainerRootSignature.cpp b/llvm/lib/MC/DXContainerRootSignature.cpp
index 619c3ec337d4c..c2731d95c955e 100644
--- a/llvm/lib/MC/DXContainerRootSignature.cpp
+++ b/llvm/lib/MC/DXContainerRootSignature.cpp
@@ -48,15 +48,12 @@ void RootSignatureDesc::write(raw_ostream &OS) const {
   BOS.reserveExtraSpace(getSize());
 
   const uint32_t NumParameters = Parameters.size();
-  const uint32_t StaticSamplerOffset = 0u;
-  const uint32_t NumStaticSamplers = 0u;
 
   support::endian::write(BOS, Version, llvm::endianness::little);
   support::endian::write(BOS, NumParameters, llvm::endianness::little);
-  support::endian::write(BOS, (uint32_t)sizeof(dxbc::RootSignatureHeader),
-                         llvm::endianness::little);
-  support::endian::write(BOS, StaticSamplerOffset, llvm::endianness::little);
+  support::endian::write(BOS, RootParameterOffset, llvm::endianness::little);
   support::endian::write(BOS, NumStaticSamplers, llvm::endianness::little);
+  support::endian::write(BOS, StaticSamplersOffset, llvm::endianness::little);
   support::endian::write(BOS, Flags, llvm::endianness::little);
 
   SmallVector<uint32_t> ParamsOffsets;
diff --git a/llvm/lib/ObjectYAML/DXContainerEmitter.cpp b/llvm/lib/ObjectYAML/DXContainerEmitter.cpp
index dee30b77d888d..0c5f562990bdb 100644
--- a/llvm/lib/ObjectYAML/DXContainerEmitter.cpp
+++ b/llvm/lib/ObjectYAML/DXContainerEmitter.cpp
@@ -270,6 +270,10 @@ void DXContainerWriter::writeParts(raw_ostream &OS) {
       mcdxbc::RootSignatureDesc RS;
       RS.Flags = P.RootSignature->getEncodedFlags();
       RS.Version = P.RootSignature->Version;
+      RS.RootParameterOffset = P.RootSignature->RootParametersOffset;
+      RS.NumStaticSamplers = P.RootSignature->NumStaticSamplers;
+      RS.StaticSamplersOffset = P.RootSignature->StaticSamplersOffset;
+
       for (const auto &Param : P.RootSignature->Parameters) {
         mcdxbc::RootParameter NewParam;
         NewParam.Header = dxbc::RootParameterHeader{
diff --git a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Flags.ll b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Flags.ll
index e81679732a5d8..ef2b97860bfae 100644
--- a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Flags.ll
+++ b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Flags.ll
@@ -23,7 +23,7 @@ attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" }
 ; DXC-NEXT:    RootSignature:
 ; DXC-NEXT:      Version:         2
 ; DXC-NEXT:      NumRootParameters: 0
-; DXC-NEXT:      RootParametersOffset: 24
+; DXC-NEXT:      RootParametersOffset: 0
 ; DXC-NEXT:      NumStaticSamplers: 0
 ; DXC-NEXT:      StaticSamplersOffset: 0
 ; DXC-NEXT:      Parameters: []
diff --git a/llvm/test/ObjectYAML/DXContainer/RootSignature-Flags.yaml b/llvm/test/ObjectYAML/DXContainer/RootSignature-Flags.yaml
index 831664de2c9d9..2caae2afc2204 100644
--- a/llvm/test/ObjectYAML/DXContainer/RootSignature-Flags.yaml
+++ b/llvm/test/ObjectYAML/DXContainer/RootSignature-Flags.yaml
@@ -16,8 +16,8 @@ Parts:
       Version: 2
       NumRootParameters: 0
       RootParametersOffset: 24
-      NumStaticSamplers: 4
-      StaticSamplersOffset: 5
+      NumStaticSamplers: 0
+      StaticSamplersOffset: 12
       Parameters: []
       AllowInputAssemblerInputLayout: true
       DenyGeometryShaderRootAccess: true
@@ -29,7 +29,7 @@ Parts:
 # CHECK-NEXT:      NumRootParameters: 0
 # CHECK-NEXT:      RootParametersOffset: 24
 # CHECK-NEXT:      NumStaticSamplers: 0
-# CHECK-NEXT:      StaticSamplersOffset: 0
+# CHECK-NEXT:      StaticSamplersOffset: 12
 # CHECK-NEXT:      Parameters: []
 # CHECK-NEXT:      AllowInputAssemblerInputLayout: true
 # CHECK-NEXT:      DenyGeometryShaderRootAccess: true
diff --git a/llvm/test/ObjectYAML/DXContainer/RootSignature-MultipleParameters.yaml b/llvm/test/ObjectYAML/DXContainer/RootSignature-MultipleParameters.yaml
index d6316765e42fb..4342e57f43785 100644
--- a/llvm/test/ObjectYAML/DXContainer/RootSignature-MultipleParameters.yaml
+++ b/llvm/test/ObjectYAML/DXContainer/RootSignature-MultipleParameters.yaml
@@ -17,7 +17,7 @@ Parts:
       NumRootParameters: 2
       RootParametersOffset: 24
       NumStaticSamplers: 0
-      StaticSamplersOffset: 64
+      StaticSamplersOffset: 12
       Parameters:         
       - ParameterType: 1 # Constants32Bit
         ShaderVisibility: 2 # Hull
@@ -41,7 +41,7 @@ Parts:
 # CHECK-NEXT:      NumRootParameters: 2
 # CHECK-NEXT:      RootParametersOffset: 24
 # CHECK-NEXT:      NumStaticSamplers: 0
-# CHECK-NEXT:      StaticSamplersOffset: 0
+# CHECK-NEXT:      StaticSamplersOffset: 12
 # CHECK-NEXT:      Parameters:
 # CHECK-NEXT:        - ParameterType:   1
 # CHECK-NEXT:          ShaderVisibility: 2
diff --git a/llvm/unittests/Object/DXContainerTest.cpp b/llvm/unittests/Object/DXContainerTest.cpp
index 7c721f38c6301..e86310ae2e5d5 100644
--- a/llvm/unittests/Object/DXContainerTest.cpp
+++ b/llvm/unittests/Object/DXContainerTest.cpp
@@ -11,6 +11,7 @@
 #include "llvm/BinaryFormat/Magic.h"
 #include "llvm/ObjectYAML/DXContainerYAML.h"
 #include "llvm/ObjectYAML/yaml2obj.h"
+#include "llvm/Support/Error.h"
 #include "llvm/Support/MemoryBufferRef.h"
 #include "llvm/Testing/Support/Error.h"
 #include "gtest/gtest.h"
@@ -824,38 +825,52 @@ TEST(DXCFile, MalformedSignature) {
 
 TEST(RootSignature, MalformedData) {
   {
-    // RootParametersOffset is 255.
+    // Root Parameters offset has changed to 36, additional padding was added,
+    // as well as fixing the parameter offset.
     uint8_t Buffer[] = {
         0x44, 0x58, 0x42, 0x43, 0x32, 0x9a, 0x53, 0xd8, 0xec, 0xbe, 0x35, 0x6f,
         0x05, 0x39, 0xe1, 0xfe, 0x31, 0x20, 0xf0, 0xc1, 0x01, 0x00, 0x00, 0x00,
         0x85, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00,
         0x52, 0x54, 0x53, 0x30, 0x59, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
-        0x01, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x2c, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
-        0x02, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00,
+        0x01, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x2c, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
+        0x02, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00,
         0x0e, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
         0x00};
+
     DXContainer C =
-        llvm::cantFail(DXContainer::create(getMemoryBuffer<133>(Buffer)));
+        llvm::cantFail(DXContainer::create(getMemoryBuffer<144>(Buffer)));
 
     auto MaybeRS = C.getRootSignature();
     ASSERT_TRUE(MaybeRS.has_value());
     const auto &RS = MaybeRS.value();
     ASSERT_EQ(RS.getVersion(), 2u);
     ASSERT_EQ(RS.getNumParameters(), 1u);
-    ASSERT_EQ(RS.getRootParametersOffset(), 255u);
+    ASSERT_EQ(RS.getRootParametersOffset(), 36u);
     ASSERT_EQ(RS.getNumStaticSamplers(), 0u);
     ASSERT_EQ(RS.getStaticSamplersOffset(), 44u);
     ASSERT_EQ(RS.getFlags(), 17u);
 
-    // Since the offset is wrong, the data becomes invalid.
     auto RootParam = *RS.param_headers().begin();
+    ASSERT_EQ((unsigned)RootParam.ParameterType, 1u);
+    ASSERT_EQ((unsigned)RootParam.ShaderVisibility, 2u);
     auto ParamView = RS.getParameter(RootParam);
-    ASSERT_THAT_ERROR(ParamView.takeError(),
-                      FailedWithMessage("invalid parameter type"));
+    ASSERT_THAT_ERROR(ParamView.takeError(), Succeeded());
+
+    DirectX::RootConstantView *RootConstantsView =
+        dyn_cast<DirectX::RootConstantView>(&*ParamView);
+    ASSERT_TRUE(RootConstantsView != nullptr);
+    auto Constants = RootConstantsView->read();
+
+    ASSERT_THAT_ERROR(Constants.takeError(), Succeeded());
+
+    ASSERT_EQ(Constants->ShaderRegister, 15u);
+    ASSERT_EQ(Constants->RegisterSpace, 14u);
+    ASSERT_EQ(Constants->Num32BitValues, 16u);
   }
 }
 
diff --git a/llvm/unittests/ObjectYAML/DXContainerYAMLTest.cpp b/llvm/unittests/ObjectYAML/DXContainerYAMLTest.cpp
index 3a40fc457d2dc..61390049bc0df 100644
--- a/llvm/unittests/ObjectYAML/DXContainerYAMLTest.cpp
+++ b/llvm/unittests/ObjectYAML/DXContainerYAMLTest.cpp
@@ -148,7 +148,7 @@ TEST(RootSignature, ParseRootFlags) {
   EXPECT_TRUE(memcmp(Buffer, Storage.data(), 68u) == 0);
 }
 
-TEST(RootSignature, MalformedData) {
+TEST(RootSignature, HeaderData) {
   SmallString<128> Storage;
 
   // First read a fully explicit yaml with all sizes and offsets provided
@@ -170,7 +170,7 @@ TEST(RootSignature, MalformedData) {
         NumRootParameters: 1
         RootParametersOffset: 255
         NumStaticSamplers: 0
-        StaticSamplersOffset: 56
+        StaticSamplersOffset: 0
         Parameters:
           - ParameterType: 1
             ShaderVisibility: 2
@@ -187,7 +187,7 @@ TEST(RootSignature, MalformedData) {
       0x05, 0x39, 0xe1, 0xfe, 0x31, 0x20, 0xf0, 0xc1, 0x01, 0x00, 0x00, 0x00,
       0x85, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00,
       0x52, 0x54, 0x53, 0x30, 0x59, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
-      0x01, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+      0x01, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
       0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
       0x02, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00,
       0x0e, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
@@ -220,9 +220,9 @@ TEST(RootSignature, ParseRootConstants) {
       RootSignature:
         Version: 2
         NumRootParameters: 1
-        RootParametersOffset: 24
+        RootParametersOffset: 36
         NumStaticSamplers: 0
-        StaticSamplersOffset: 56
+        StaticSamplersOffset: 0
         Parameters:
           - ParameterType: 1
             ShaderVisibility: 2
@@ -239,7 +239,7 @@ TEST(RootSignature, ParseRootConstants) {
       0x05, 0x39, 0xe1, 0xfe, 0x31, 0x20, 0xf0, 0xc1, 0x01, 0x00, 0x00, 0x00,
       0x85, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00,
       0x52, 0x54, 0x53, 0x30, 0x59, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
-      0x01, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+      0x01, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
       0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
       0x02, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00,
       0x0e, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,

>From 246d5d3de84d819126b38688c145c78c02958ad4 Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Wed, 16 Apr 2025 20:50:37 +0000
Subject: [PATCH 11/13] addressing comments

---
 llvm/test/ObjectYAML/DXContainer/RootSignature-Flags.yaml     | 4 ++--
 .../DXContainer/RootSignature-MultipleParameters.yaml         | 4 ++--
 llvm/unittests/Object/DXContainerTest.cpp                     | 2 +-
 3 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/llvm/test/ObjectYAML/DXContainer/RootSignature-Flags.yaml b/llvm/test/ObjectYAML/DXContainer/RootSignature-Flags.yaml
index 2caae2afc2204..74816d403183a 100644
--- a/llvm/test/ObjectYAML/DXContainer/RootSignature-Flags.yaml
+++ b/llvm/test/ObjectYAML/DXContainer/RootSignature-Flags.yaml
@@ -17,7 +17,7 @@ Parts:
       NumRootParameters: 0
       RootParametersOffset: 24
       NumStaticSamplers: 0
-      StaticSamplersOffset: 12
+      StaticSamplersOffset: 60
       Parameters: []
       AllowInputAssemblerInputLayout: true
       DenyGeometryShaderRootAccess: true
@@ -29,7 +29,7 @@ Parts:
 # CHECK-NEXT:      NumRootParameters: 0
 # CHECK-NEXT:      RootParametersOffset: 24
 # CHECK-NEXT:      NumStaticSamplers: 0
-# CHECK-NEXT:      StaticSamplersOffset: 12
+# CHECK-NEXT:      StaticSamplersOffset: 60
 # CHECK-NEXT:      Parameters: []
 # CHECK-NEXT:      AllowInputAssemblerInputLayout: true
 # CHECK-NEXT:      DenyGeometryShaderRootAccess: true
diff --git a/llvm/test/ObjectYAML/DXContainer/RootSignature-MultipleParameters.yaml b/llvm/test/ObjectYAML/DXContainer/RootSignature-MultipleParameters.yaml
index 4342e57f43785..f366d71714359 100644
--- a/llvm/test/ObjectYAML/DXContainer/RootSignature-MultipleParameters.yaml
+++ b/llvm/test/ObjectYAML/DXContainer/RootSignature-MultipleParameters.yaml
@@ -17,7 +17,7 @@ Parts:
       NumRootParameters: 2
       RootParametersOffset: 24
       NumStaticSamplers: 0
-      StaticSamplersOffset: 12
+      StaticSamplersOffset: 60
       Parameters:         
       - ParameterType: 1 # Constants32Bit
         ShaderVisibility: 2 # Hull
@@ -41,7 +41,7 @@ Parts:
 # CHECK-NEXT:      NumRootParameters: 2
 # CHECK-NEXT:      RootParametersOffset: 24
 # CHECK-NEXT:      NumStaticSamplers: 0
-# CHECK-NEXT:      StaticSamplersOffset: 12
+# CHECK-NEXT:      StaticSamplersOffset: 60
 # CHECK-NEXT:      Parameters:
 # CHECK-NEXT:        - ParameterType:   1
 # CHECK-NEXT:          ShaderVisibility: 2
diff --git a/llvm/unittests/Object/DXContainerTest.cpp b/llvm/unittests/Object/DXContainerTest.cpp
index e86310ae2e5d5..62ef8e385373f 100644
--- a/llvm/unittests/Object/DXContainerTest.cpp
+++ b/llvm/unittests/Object/DXContainerTest.cpp
@@ -823,7 +823,7 @@ TEST(DXCFile, MalformedSignature) {
   }
 }
 
-TEST(RootSignature, MalformedData) {
+TEST(RootSignature, RootParameters) {
   {
     // Root Parameters offset has changed to 36, additional padding was added,
     // as well as fixing the parameter offset.

>From bb6c0cfe35a0c1eb30cf9675fef3b05220051e3a Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Wed, 16 Apr 2025 22:24:54 +0000
Subject: [PATCH 12/13] clean up

---
 llvm/lib/ObjectYAML/DXContainerEmitter.cpp | 1 -
 1 file changed, 1 deletion(-)

diff --git a/llvm/lib/ObjectYAML/DXContainerEmitter.cpp b/llvm/lib/ObjectYAML/DXContainerEmitter.cpp
index 0c5f562990bdb..86e24eae4abc6 100644
--- a/llvm/lib/ObjectYAML/DXContainerEmitter.cpp
+++ b/llvm/lib/ObjectYAML/DXContainerEmitter.cpp
@@ -19,7 +19,6 @@
 #include "llvm/Support/Errc.h"
 #include "llvm/Support/Error.h"
 #include "llvm/Support/raw_ostream.h"
-#include <cstdint>
 
 using namespace llvm;
 

>From 7aed7d1f48ca09b6fa7844ef6cffab5a57b058d9 Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Wed, 16 Apr 2025 23:26:34 +0000
Subject: [PATCH 13/13] fixing bugs

---
 .../llvm/MC/DXContainerRootSignature.h        |  2 +-
 llvm/lib/Target/DirectX/DXILRootSignature.cpp | 29 ++++++++++---------
 .../ContainerData/RootSignature-Flags.ll      |  2 +-
 ...re-RootConstants-Invalid-Num32BitValues.ll |  4 +--
 4 files changed, 18 insertions(+), 19 deletions(-)

diff --git a/llvm/include/llvm/MC/DXContainerRootSignature.h b/llvm/include/llvm/MC/DXContainerRootSignature.h
index fee799249b255..6d3329a2c6ce9 100644
--- a/llvm/include/llvm/MC/DXContainerRootSignature.h
+++ b/llvm/include/llvm/MC/DXContainerRootSignature.h
@@ -25,7 +25,7 @@ struct RootSignatureDesc {
 
   uint32_t Version = 2U;
   uint32_t Flags = 0U;
-  uint32_t RootParameterOffset = 0U;
+  uint32_t RootParameterOffset = 24U;
   uint32_t StaticSamplersOffset = 0u;
   uint32_t NumStaticSamplers = 0u;
   SmallVector<mcdxbc::RootParameter> Parameters;
diff --git a/llvm/lib/Target/DirectX/DXILRootSignature.cpp b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
index 0605c565ba6b1..5e615461df4f3 100644
--- a/llvm/lib/Target/DirectX/DXILRootSignature.cpp
+++ b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
@@ -76,13 +76,14 @@ static bool parseRootConstants(LLVMContext *Ctx, mcdxbc::RootSignatureDesc &RSD,
     return reportError(Ctx, "Invalid format for RootConstants Element");
 
   mcdxbc::RootParameter NewParameter;
-  NewParameter.Header.ParameterType = dxbc::RootParameterType::Constants32Bit;
+  NewParameter.Header.ParameterType =
+      llvm::to_underlying(dxbc::RootParameterType::Constants32Bit);
 
   uint32_t SV;
   if (extractMdIntValue(SV, RootConstantNode, 1))
     return reportError(Ctx, "Invalid value for ShaderVisibility");
 
-  NewParameter.Header.ShaderVisibility = (dxbc::ShaderVisibility)SV;
+  NewParameter.Header.ShaderVisibility = SV;
 
   if (extractMdIntValue(NewParameter.Constants.ShaderRegister, RootConstantNode,
                         2))
@@ -150,23 +151,23 @@ static bool verifyRootFlag(uint32_t Flags) { return (Flags & ~0xfff) == 0; }
 static bool verifyShaderVisibility(uint32_t Flags) {
   switch (Flags) {
 
-  case dxbc::ShaderVisibility::All:
-  case dxbc::ShaderVisibility::Vertex:
-  case dxbc::ShaderVisibility::Hull:
-  case dxbc::ShaderVisibility::Domain:
-  case dxbc::ShaderVisibility::Geometry:
-  case dxbc::ShaderVisibility::Pixel:
-  case dxbc::ShaderVisibility::Amplification:
-  case dxbc::ShaderVisibility::Mesh:
+  case llvm::to_underlying(dxbc::ShaderVisibility::All):
+  case llvm::to_underlying(dxbc::ShaderVisibility::Vertex):
+  case llvm::to_underlying(dxbc::ShaderVisibility::Hull):
+  case llvm::to_underlying(dxbc::ShaderVisibility::Domain):
+  case llvm::to_underlying(dxbc::ShaderVisibility::Geometry):
+  case llvm::to_underlying(dxbc::ShaderVisibility::Pixel):
+  case llvm::to_underlying(dxbc::ShaderVisibility::Amplification):
+  case llvm::to_underlying(dxbc::ShaderVisibility::Mesh):
     return true;
   }
 
   return false;
 }
 
-static bool verifyParameterType(uint32_t Flags) {
-  switch (Flags) {
-  case dxbc::RootParameterType::Constants32Bit:
+static bool verifyParameterType(uint32_t Type) {
+  switch (Type) {
+  case llvm::to_underlying(dxbc::RootParameterType::Constants32Bit):
     return true;
   }
 
@@ -320,7 +321,7 @@ PreservedAnalyses RootSignatureAnalysisPrinter::run(Module &M,
          << "Shader Visibility: " << (uint32_t)P.Header.ShaderVisibility
          << "\n";
       switch (P.Header.ParameterType) {
-      case dxbc::RootParameterType::Constants32Bit:
+      case llvm::to_underlying(dxbc::RootParameterType::Constants32Bit):
         OS << indent(Space) << "Register Space: " << P.Constants.RegisterSpace
            << "\n";
         OS << indent(Space) << "Shader Register: " << P.Constants.ShaderRegister
diff --git a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Flags.ll b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Flags.ll
index ef2b97860bfae..e81679732a5d8 100644
--- a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Flags.ll
+++ b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Flags.ll
@@ -23,7 +23,7 @@ attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" }
 ; DXC-NEXT:    RootSignature:
 ; DXC-NEXT:      Version:         2
 ; DXC-NEXT:      NumRootParameters: 0
-; DXC-NEXT:      RootParametersOffset: 0
+; DXC-NEXT:      RootParametersOffset: 24
 ; DXC-NEXT:      NumStaticSamplers: 0
 ; DXC-NEXT:      StaticSamplersOffset: 0
 ; DXC-NEXT:      Parameters: []
diff --git a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootConstants-Invalid-Num32BitValues.ll b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootConstants-Invalid-Num32BitValues.ll
index b06678519eef7..552c128e5ab57 100644
--- a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootConstants-Invalid-Num32BitValues.ll
+++ b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootConstants-Invalid-Num32BitValues.ll
@@ -5,12 +5,10 @@ target triple = "dxil-unknown-shadermodel6.0-compute"
 ; CHECK: error: Invalid value for Num32BitValues
 ; CHECK-NOT: Root Signature Definitions
 
-define void @main() #0 {
+define void @main() {
 entry:
   ret void
 }
-attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" }
-
 
 !dx.rootsignatures = !{!2} ; list of function/root signature pairs
 !2 = !{ ptr @main, !3 } ; function, root signature



More information about the llvm-branch-commits mailing list