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 01/20] 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 02/20] 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 03/20] 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 04/20] 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 

>From 767b7d02bf71e6e0137e2b5f9f9b8d8b799ac81f Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saff...@microsoft.com>
Date: Sat, 22 Feb 2025 06:19:15 +0000
Subject: [PATCH 05/20] first working version

---
 .../llvm/MC/DXContainerRootSignature.h        |  5 +-
 llvm/lib/MC/DXContainerRootSignature.cpp      | 90 +++++++++++++------
 llvm/lib/Object/DXContainer.cpp               | 10 ++-
 llvm/lib/ObjectYAML/DXContainerEmitter.cpp    |  4 +-
 .../lib/Target/DirectX/DXContainerGlobals.cpp |  5 +-
 .../ContainerData/RootSignature-Flags.ll      |  2 +-
 .../DXContainer/RootSignature-Flags.yaml      |  2 +-
 .../RootSignature-MultipleParameters.yaml     |  2 +-
 .../ObjectYAML/DXContainerYAMLTest.cpp        |  8 +-
 9 files changed, 85 insertions(+), 43 deletions(-)

diff --git a/llvm/include/llvm/MC/DXContainerRootSignature.h 
b/llvm/include/llvm/MC/DXContainerRootSignature.h
index b31b0da352038..cae4f79aef56f 100644
--- a/llvm/include/llvm/MC/DXContainerRootSignature.h
+++ b/llvm/include/llvm/MC/DXContainerRootSignature.h
@@ -7,8 +7,7 @@
 
//===----------------------------------------------------------------------===//
 
 #include "llvm/BinaryFormat/DXContainer.h"
-#include <cstdint>
-#include <limits>
+#include "llvm/Support/raw_ostream.h"
 
 namespace llvm {
 
@@ -19,7 +18,7 @@ struct RootSignatureDesc {
   dxbc::RootSignatureHeader Header;
   SmallVector<dxbc::RootParameter> Parameters;
 
-  void write(raw_ostream &OS) const;
+  Error write(raw_ostream &OS) const;
 };
 } // namespace mcdxbc
 } // namespace llvm
diff --git a/llvm/lib/MC/DXContainerRootSignature.cpp 
b/llvm/lib/MC/DXContainerRootSignature.cpp
index 35a4ef322d01e..9a279ab722877 100644
--- a/llvm/lib/MC/DXContainerRootSignature.cpp
+++ b/llvm/lib/MC/DXContainerRootSignature.cpp
@@ -7,53 +7,89 @@
 
//===----------------------------------------------------------------------===//
 
 #include "llvm/MC/DXContainerRootSignature.h"
-#include "llvm/Support/EndianStream.h"
+#include "llvm/Support/BinaryStreamWriter.h"
+#include <vector>
 
 using namespace llvm;
 using namespace llvm::mcdxbc;
 
-void RootSignatureDesc::write(raw_ostream &OS) const {
-  // Root signature header in dxcontainer has 6 uint_32t values.
-  const uint32_t HeaderSize = 24;
-  const uint32_t ParameterByteSize = Parameters.size_in_bytes();
-  const uint32_t NumParametes = Parameters.size();
+Error RootSignatureDesc::write(raw_ostream &OS) const {
+  // Header Size + accounting for parameter offset + parameters size
+  std::vector<uint8_t> Buffer(24 + (Parameters.size() * 4) +
+                              Parameters.size_in_bytes());
+  BinaryStreamWriter Writer(Buffer, llvm::endianness::little);
+
+  SmallVector<uint64_t> OffsetsToReplace;
+  SmallVector<uint32_t> ValuesToReplaceOffsetsWith;
+  const uint32_t Dummy = std::numeric_limits<uint32_t>::max();
+
+  const uint32_t NumParameters = Parameters.size();
   const uint32_t Zero = 0;
 
-  // Writing header information
-  support::endian::write(OS, Header.Version, llvm::endianness::little);
-  support::endian::write(OS, NumParametes, llvm::endianness::little);
-  support::endian::write(OS, HeaderSize, llvm::endianness::little);
+  if (Error Err = Writer.writeInteger(Header.Version))
+    return Err;
+
+  if (Error Err = Writer.writeInteger(NumParameters))
+    return Err;
+
+  OffsetsToReplace.push_back(Writer.getOffset());
+  if (Error Err = Writer.writeInteger(Dummy))
+    return Err;
 
   // Static samplers still not implemented
-  support::endian::write(OS, Zero, llvm::endianness::little);
-  support::endian::write(OS, ParameterByteSize + HeaderSize,
-                         llvm::endianness::little);
+  if (Error Err = Writer.writeInteger(Zero))
+    return Err;
+
+  if (Error Err = Writer.writeInteger(Zero))
+    return Err;
+
+  if (Error Err = Writer.writeInteger(Header.Flags))
+    return Err;
 
-  support::endian::write(OS, Header.Flags, llvm::endianness::little);
+  ValuesToReplaceOffsetsWith.push_back(Writer.getOffset());
 
-  uint32_t ParamsOffset =
-      HeaderSize + (3 * sizeof(uint32_t) * Parameters.size());
   for (const dxbc::RootParameter &P : Parameters) {
-    support::endian::write(OS, P.ParameterType, llvm::endianness::little);
-    support::endian::write(OS, P.ShaderVisibility, llvm::endianness::little);
-    support::endian::write(OS, ParamsOffset, llvm::endianness::little);
+    if (Error Err = Writer.writeEnum(P.ParameterType))
+      return Err;
+    if (Error Err = Writer.writeEnum(P.ShaderVisibility))
+      return Err;
 
-    // Size of root parameter, removing the ParameterType and ShaderVisibility.
-    ParamsOffset += sizeof(dxbc::RootParameter) - 2 * sizeof(uint32_t);
+    OffsetsToReplace.push_back(Writer.getOffset());
+    if (Error Err = Writer.writeInteger(Dummy))
+      return Err;
   }
 
   for (const dxbc::RootParameter &P : Parameters) {
+    ValuesToReplaceOffsetsWith.push_back(Writer.getOffset());
     switch (P.ParameterType) {
     case dxbc::RootParameterType::Constants32Bit: {
-      support::endian::write(OS, P.Constants.ShaderRegister,
-                             llvm::endianness::little);
-      support::endian::write(OS, P.Constants.RegisterSpace,
-                             llvm::endianness::little);
-      support::endian::write(OS, P.Constants.Num32BitValues,
-                             llvm::endianness::little);
+      if (Error Err = Writer.writeInteger(P.Constants.ShaderRegister))
+        return Err;
+      if (Error Err = Writer.writeInteger(P.Constants.RegisterSpace))
+        return Err;
+      if (Error Err = Writer.writeInteger(P.Constants.Num32BitValues))
+        return Err;
     } break;
     case dxbc::RootParameterType::Empty:
       llvm_unreachable("Invalid RootParameterType");
     }
   }
+
+  assert(ValuesToReplaceOffsetsWith.size() == OffsetsToReplace.size() &&
+         "Offset missing value to replace with.");
+
+  for (size_t It = 0; It < ValuesToReplaceOffsetsWith.size(); It++) {
+    uint32_t Position = OffsetsToReplace[It];
+    uint32_t Value = ValuesToReplaceOffsetsWith[It];
+
+    Writer.setOffset(Position);
+    if (Error Err = Writer.writeInteger(Value))
+      return Err;
+  }
+
+  llvm::ArrayRef<char> BufferRef(reinterpret_cast<char *>(Buffer.data()),
+                                 Buffer.size());
+  OS.write(BufferRef.data(), BufferRef.size());
+
+  return Error::success();
 }
diff --git a/llvm/lib/Object/DXContainer.cpp b/llvm/lib/Object/DXContainer.cpp
index 010f70a952ebf..35261b661cf2f 100644
--- a/llvm/lib/Object/DXContainer.cpp
+++ b/llvm/lib/Object/DXContainer.cpp
@@ -296,16 +296,18 @@ Error DirectX::RootSignature::parse(StringRef Data) {
     NewParam.ParameterType =
         support::endian::read<dxbc::RootParameterType,
                               llvm::endianness::little>(Current);
-    if 
(!dxbc::RootSignatureValidations::isValidParameterType(NewParam.ParameterType))
+    if (!dxbc::RootSignatureValidations::isValidParameterType(
+            NewParam.ParameterType))
       return validationFailed("unsupported parameter type value read: " +
                               llvm::Twine((uint32_t)NewParam.ParameterType));
 
     Current += sizeof(dxbc::RootParameterType);
 
     NewParam.ShaderVisibility =
-        support::endian::read<dxbc::ShaderVisibility,
-                              llvm::endianness::little>(Current);
-    if 
(!dxbc::RootSignatureValidations::isValidShaderVisibility(NewParam.ShaderVisibility))
+        support::endian::read<dxbc::ShaderVisibility, 
llvm::endianness::little>(
+            Current);
+    if (!dxbc::RootSignatureValidations::isValidShaderVisibility(
+            NewParam.ShaderVisibility))
       return validationFailed("unsupported shader visility flag value read: " +
                               
llvm::Twine((uint32_t)NewParam.ShaderVisibility));
 
diff --git a/llvm/lib/ObjectYAML/DXContainerEmitter.cpp 
b/llvm/lib/ObjectYAML/DXContainerEmitter.cpp
index 87ba16fd40ba9..a5831a69f9bca 100644
--- a/llvm/lib/ObjectYAML/DXContainerEmitter.cpp
+++ b/llvm/lib/ObjectYAML/DXContainerEmitter.cpp
@@ -271,7 +271,9 @@ void DXContainerWriter::writeParts(raw_ostream &OS) {
       RS.Header.Version = P.RootSignature->Version;
       RS.Parameters = std::move(P.RootSignature->Parameters);
 
-      RS.write(OS);
+      if (Error Err = RS.write(OS))
+        handleAllErrors(std::move(Err));
+
       break;
     }
     uint64_t BytesWritten = OS.tell() - DataStart;
diff --git a/llvm/lib/Target/DirectX/DXContainerGlobals.cpp 
b/llvm/lib/Target/DirectX/DXContainerGlobals.cpp
index 5508af40663b1..5801046f83674 100644
--- a/llvm/lib/Target/DirectX/DXContainerGlobals.cpp
+++ b/llvm/lib/Target/DirectX/DXContainerGlobals.cpp
@@ -25,10 +25,12 @@
 #include "llvm/InitializePasses.h"
 #include "llvm/MC/DXContainerPSVInfo.h"
 #include "llvm/Pass.h"
+#include "llvm/Support/Error.h"
 #include "llvm/Support/MD5.h"
 #include "llvm/TargetParser/Triple.h"
 #include "llvm/Transforms/Utils/ModuleUtils.h"
 #include <optional>
+#include <utility>
 
 using namespace llvm;
 using namespace llvm::dxil;
@@ -173,7 +175,8 @@ void DXContainerGlobals::addRootSignature(Module &M,
   SmallString<256> Data;
   raw_svector_ostream OS(Data);
 
-  RS.write(OS);
+  if (Error Err = RS.write(OS))
+    handleAllErrors(std::move(Err));
 
   Constant *Constant =
       ConstantDataArray::getString(M.getContext(), Data, /*AddNull*/ false);
diff --git a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Flags.ll 
b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Flags.ll
index 035ea373d30ea..1ca6ebb7ddab8 100644
--- a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Flags.ll
+++ b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Flags.ll
@@ -23,6 +23,6 @@ attributes #0 = { "hlsl.numthreads"="1,1,1" 
"hlsl.shader"="compute" }
 ; DXC-NEXT:    RootSignature:
 ; DXC-NEXT:      Version:         2
 ; DXC-NEXT:      NumStaticSamplers: 0
-; DXC-NEXT:      StaticSamplersOffset: 24
+; DXC-NEXT:      StaticSamplersOffset: 0
 ; DXC-NEXT:      Parameters: []
 ; DXC-NEXT:      AllowInputAssemblerInputLayout: true
diff --git a/llvm/test/ObjectYAML/DXContainer/RootSignature-Flags.yaml 
b/llvm/test/ObjectYAML/DXContainer/RootSignature-Flags.yaml
index 1b73b830f015f..0d7902afdaa66 100644
--- a/llvm/test/ObjectYAML/DXContainer/RootSignature-Flags.yaml
+++ b/llvm/test/ObjectYAML/DXContainer/RootSignature-Flags.yaml
@@ -25,7 +25,7 @@ Parts:
 # CHECK-NEXT:    RootSignature:
 # CHECK-NEXT:      Version: 2
 # CHECK-NEXT:      NumStaticSamplers: 0
-# CHECK-NEXT:      StaticSamplersOffset: 24
+# CHECK-NEXT:      StaticSamplersOffset: 0
 # 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 bccfacb72819b..8d5ab5c1b0b23 100644
--- a/llvm/test/ObjectYAML/DXContainer/RootSignature-MultipleParameters.yaml
+++ b/llvm/test/ObjectYAML/DXContainer/RootSignature-MultipleParameters.yaml
@@ -37,7 +37,7 @@ Parts:
 # CHECK-NEXT:    RootSignature:
 # CHECK-NEXT:      Version:         2
 # CHECK-NEXT:      NumStaticSamplers: 0
-# CHECK-NEXT:      StaticSamplersOffset: 64
+# CHECK-NEXT:      StaticSamplersOffset: 0
 # CHECK-NEXT:      Parameters:
 # CHECK-NEXT:        - ParameterType:   Constants32Bit
 # CHECK-NEXT:          ShaderVisibility: Hull
diff --git a/llvm/unittests/ObjectYAML/DXContainerYAMLTest.cpp 
b/llvm/unittests/ObjectYAML/DXContainerYAMLTest.cpp
index b5fb8d143c0b9..fed941f685272 100644
--- a/llvm/unittests/ObjectYAML/DXContainerYAMLTest.cpp
+++ b/llvm/unittests/ObjectYAML/DXContainerYAMLTest.cpp
@@ -134,12 +134,12 @@ TEST(RootSignature, ParseRootFlags) {
     )"));
 
   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,
+      0x44, 0x58, 0x42, 0x43, 0x32, 0x9a, 0x53, 0xd8, 0xec, 0xbe, 0x35, 0x6f,
+      0x05, 0x39, 0xe1, 0xfe, 0x31, 0x20, 0xf0, 0xc1, 0x01, 0x00, 0x00, 0x00,
       0x44, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00,
       0x52, 0x54, 0x53, 0x30, 0x18, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
       0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-      0x18, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
+      0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
   };
 
   EXPECT_EQ(Storage.size(), 68u);
@@ -184,7 +184,7 @@ TEST(RootSignature, ParseRootConstants) {
       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,
-      0x2c, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x01, 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,

>From d39172781e9f7e882de78d2e24a7bd1bd8c48688 Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saff...@microsoft.com>
Date: Mon, 24 Feb 2025 20:57:23 +0000
Subject: [PATCH 06/20] moving the offset logic to it's own class

---
 .../llvm/MC/DXContainerRootSignature.h        | 24 ++++++
 llvm/lib/MC/DXContainerRootSignature.cpp      | 83 +++++++++++++------
 2 files changed, 81 insertions(+), 26 deletions(-)

diff --git a/llvm/include/llvm/MC/DXContainerRootSignature.h 
b/llvm/include/llvm/MC/DXContainerRootSignature.h
index cae4f79aef56f..ca958c0780cdd 100644
--- a/llvm/include/llvm/MC/DXContainerRootSignature.h
+++ b/llvm/include/llvm/MC/DXContainerRootSignature.h
@@ -7,18 +7,42 @@
 
//===----------------------------------------------------------------------===//
 
 #include "llvm/BinaryFormat/DXContainer.h"
+#include "llvm/Support/BinaryStreamWriter.h"
 #include "llvm/Support/raw_ostream.h"
+#include <map>
+#include <string>
 
 namespace llvm {
 
 class raw_ostream;
 
 namespace mcdxbc {
+
+class StreamOffsetHelper {
+private:
+  std::map<std::string, std::pair<uint32_t, uint32_t>> OffsetsMaping;
+  BinaryStreamWriter &Stream;
+
+public:
+  explicit StreamOffsetHelper(BinaryStreamWriter &Stream) : Stream(Stream) {}
+
+  Error addOffset(std::string Key);
+
+  void addRewriteValue(std::string Key);
+
+  Error rewrite();
+};
+
 struct RootSignatureDesc {
   dxbc::RootSignatureHeader Header;
   SmallVector<dxbc::RootParameter> Parameters;
 
   Error write(raw_ostream &OS) const;
+
+  uint32_t getSizeInBytes() const {
+    // Header Size + accounting for parameter offset + parameters size
+    return 24 + (Parameters.size() * 4) + Parameters.size_in_bytes();
+  }
 };
 } // namespace mcdxbc
 } // namespace llvm
diff --git a/llvm/lib/MC/DXContainerRootSignature.cpp 
b/llvm/lib/MC/DXContainerRootSignature.cpp
index 9a279ab722877..828785980c15d 100644
--- a/llvm/lib/MC/DXContainerRootSignature.cpp
+++ b/llvm/lib/MC/DXContainerRootSignature.cpp
@@ -7,21 +7,55 @@
 
//===----------------------------------------------------------------------===//
 
 #include "llvm/MC/DXContainerRootSignature.h"
+#include "llvm/ADT/Twine.h"
 #include "llvm/Support/BinaryStreamWriter.h"
-#include <vector>
 
 using namespace llvm;
 using namespace llvm::mcdxbc;
 
+Error StreamOffsetHelper::addOffset(std::string Key) {
+  const uint32_t DummyValue = std::numeric_limits<uint32_t>::max();
+
+  uint32_t Offset = Stream.getOffset();
+  auto Value = std::make_pair(Offset, DummyValue);
+
+  OffsetsMaping.insert_or_assign(Key, Value);
+
+  if (Error Err = Stream.writeInteger(DummyValue))
+    return Err;
+
+  return Error::success();
+}
+
+void StreamOffsetHelper::addRewriteValue(std::string Key) {
+  auto It = OffsetsMaping.find(Key);
+  assert(It != OffsetsMaping.end() && "Offset address was not found.");
+  auto [Offset, _] = It->second;
+
+  uint32_t Value = Stream.getOffset();
+
+  std::pair<uint32_t, uint32_t> NewValue = std::make_pair(Offset, Value);
+  OffsetsMaping.insert_or_assign(Key, NewValue);
+}
+
+Error StreamOffsetHelper::rewrite() {
+  for (auto &[Key, RewriteInfo] : OffsetsMaping) {
+    auto [Position, Value] = RewriteInfo;
+    assert(Value != std::numeric_limits<uint32_t>::max());
+
+    Stream.setOffset(Position);
+    if (Error Err = Stream.writeInteger(Value))
+      return Err;
+  }
+
+  return Error::success();
+}
+
 Error RootSignatureDesc::write(raw_ostream &OS) const {
-  // Header Size + accounting for parameter offset + parameters size
-  std::vector<uint8_t> Buffer(24 + (Parameters.size() * 4) +
-                              Parameters.size_in_bytes());
+  std::vector<uint8_t> Buffer(getSizeInBytes());
   BinaryStreamWriter Writer(Buffer, llvm::endianness::little);
 
-  SmallVector<uint64_t> OffsetsToReplace;
-  SmallVector<uint32_t> ValuesToReplaceOffsetsWith;
-  const uint32_t Dummy = std::numeric_limits<uint32_t>::max();
+  StreamOffsetHelper OffsetMap(Writer);
 
   const uint32_t NumParameters = Parameters.size();
   const uint32_t Zero = 0;
@@ -32,8 +66,7 @@ Error RootSignatureDesc::write(raw_ostream &OS) const {
   if (Error Err = Writer.writeInteger(NumParameters))
     return Err;
 
-  OffsetsToReplace.push_back(Writer.getOffset());
-  if (Error Err = Writer.writeInteger(Dummy))
+  if (Error Err = OffsetMap.addOffset("header"))
     return Err;
 
   // Static samplers still not implemented
@@ -46,21 +79,28 @@ Error RootSignatureDesc::write(raw_ostream &OS) const {
   if (Error Err = Writer.writeInteger(Header.Flags))
     return Err;
 
-  ValuesToReplaceOffsetsWith.push_back(Writer.getOffset());
+  OffsetMap.addRewriteValue("header");
+
+  for (size_t It = 0; It < Parameters.size(); It++) {
+    const auto &P = Parameters[It];
 
-  for (const dxbc::RootParameter &P : Parameters) {
     if (Error Err = Writer.writeEnum(P.ParameterType))
       return Err;
+
     if (Error Err = Writer.writeEnum(P.ShaderVisibility))
       return Err;
 
-    OffsetsToReplace.push_back(Writer.getOffset());
-    if (Error Err = Writer.writeInteger(Dummy))
+    std::string Key = ("parameters" + Twine(It)).str();
+    if (Error Err = OffsetMap.addOffset(Key))
       return Err;
   }
 
-  for (const dxbc::RootParameter &P : Parameters) {
-    ValuesToReplaceOffsetsWith.push_back(Writer.getOffset());
+  for (size_t It = 0; It < Parameters.size(); It++) {
+    const auto &P = Parameters[It];
+
+    std::string Key = ("parameters" + Twine(It)).str();
+    OffsetMap.addRewriteValue(Key);
+
     switch (P.ParameterType) {
     case dxbc::RootParameterType::Constants32Bit: {
       if (Error Err = Writer.writeInteger(P.Constants.ShaderRegister))
@@ -75,17 +115,8 @@ Error RootSignatureDesc::write(raw_ostream &OS) const {
     }
   }
 
-  assert(ValuesToReplaceOffsetsWith.size() == OffsetsToReplace.size() &&
-         "Offset missing value to replace with.");
-
-  for (size_t It = 0; It < ValuesToReplaceOffsetsWith.size(); It++) {
-    uint32_t Position = OffsetsToReplace[It];
-    uint32_t Value = ValuesToReplaceOffsetsWith[It];
-
-    Writer.setOffset(Position);
-    if (Error Err = Writer.writeInteger(Value))
-      return Err;
-  }
+  if (Error Err = OffsetMap.rewrite())
+    return Err;
 
   llvm::ArrayRef<char> BufferRef(reinterpret_cast<char *>(Buffer.data()),
                                  Buffer.size());

>From 68c7513d27ee9d5ada3851230b4dcd9611e88f02 Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saff...@microsoft.com>
Date: Mon, 24 Feb 2025 22:39:34 +0000
Subject: [PATCH 07/20] refactoring to remove use of map and string

---
 .../llvm/MC/DXContainerRootSignature.h        | 18 +----
 llvm/lib/MC/DXContainerRootSignature.cpp      | 65 ++++++++-----------
 2 files changed, 28 insertions(+), 55 deletions(-)

diff --git a/llvm/include/llvm/MC/DXContainerRootSignature.h 
b/llvm/include/llvm/MC/DXContainerRootSignature.h
index ca958c0780cdd..911ff53c15fae 100644
--- a/llvm/include/llvm/MC/DXContainerRootSignature.h
+++ b/llvm/include/llvm/MC/DXContainerRootSignature.h
@@ -6,11 +6,10 @@
 //
 
//===----------------------------------------------------------------------===//
 
+#include "llvm/ADT/IndexedMap.h"
 #include "llvm/BinaryFormat/DXContainer.h"
 #include "llvm/Support/BinaryStreamWriter.h"
 #include "llvm/Support/raw_ostream.h"
-#include <map>
-#include <string>
 
 namespace llvm {
 
@@ -18,21 +17,6 @@ class raw_ostream;
 
 namespace mcdxbc {
 
-class StreamOffsetHelper {
-private:
-  std::map<std::string, std::pair<uint32_t, uint32_t>> OffsetsMaping;
-  BinaryStreamWriter &Stream;
-
-public:
-  explicit StreamOffsetHelper(BinaryStreamWriter &Stream) : Stream(Stream) {}
-
-  Error addOffset(std::string Key);
-
-  void addRewriteValue(std::string Key);
-
-  Error rewrite();
-};
-
 struct RootSignatureDesc {
   dxbc::RootSignatureHeader Header;
   SmallVector<dxbc::RootParameter> Parameters;
diff --git a/llvm/lib/MC/DXContainerRootSignature.cpp 
b/llvm/lib/MC/DXContainerRootSignature.cpp
index 828785980c15d..abcaa66aff380 100644
--- a/llvm/lib/MC/DXContainerRootSignature.cpp
+++ b/llvm/lib/MC/DXContainerRootSignature.cpp
@@ -7,19 +7,19 @@
 
//===----------------------------------------------------------------------===//
 
 #include "llvm/MC/DXContainerRootSignature.h"
+#include "llvm/ADT/SmallVector.h"
 #include "llvm/ADT/Twine.h"
 #include "llvm/Support/BinaryStreamWriter.h"
+#include <cstdint>
+#include <sys/types.h>
 
 using namespace llvm;
 using namespace llvm::mcdxbc;
 
-Error StreamOffsetHelper::addOffset(std::string Key) {
+Error setRewrite(BinaryStreamWriter &Stream, uint32_t &Offset) {
   const uint32_t DummyValue = std::numeric_limits<uint32_t>::max();
 
-  uint32_t Offset = Stream.getOffset();
-  auto Value = std::make_pair(Offset, DummyValue);
-
-  OffsetsMaping.insert_or_assign(Key, Value);
+  Offset = Stream.getOffset();
 
   if (Error Err = Stream.writeInteger(DummyValue))
     return Err;
@@ -27,26 +27,13 @@ Error StreamOffsetHelper::addOffset(std::string Key) {
   return Error::success();
 }
 
-void StreamOffsetHelper::addRewriteValue(std::string Key) {
-  auto It = OffsetsMaping.find(Key);
-  assert(It != OffsetsMaping.end() && "Offset address was not found.");
-  auto [Offset, _] = It->second;
-
-  uint32_t Value = Stream.getOffset();
-
-  std::pair<uint32_t, uint32_t> NewValue = std::make_pair(Offset, Value);
-  OffsetsMaping.insert_or_assign(Key, NewValue);
-}
-
-Error StreamOffsetHelper::rewrite() {
-  for (auto &[Key, RewriteInfo] : OffsetsMaping) {
-    auto [Position, Value] = RewriteInfo;
-    assert(Value != std::numeric_limits<uint32_t>::max());
+Error rewriteOffset(BinaryStreamWriter &Stream, uint32_t Offset) {
+  uint64_t Value = Stream.getOffset();
+  Stream.setOffset(Offset);
+  if (Error Err = Stream.writeInteger((uint32_t)Value))
+    return Err;
 
-    Stream.setOffset(Position);
-    if (Error Err = Stream.writeInteger(Value))
-      return Err;
-  }
+  Stream.setOffset(Value);
 
   return Error::success();
 }
@@ -55,8 +42,6 @@ Error RootSignatureDesc::write(raw_ostream &OS) const {
   std::vector<uint8_t> Buffer(getSizeInBytes());
   BinaryStreamWriter Writer(Buffer, llvm::endianness::little);
 
-  StreamOffsetHelper OffsetMap(Writer);
-
   const uint32_t NumParameters = Parameters.size();
   const uint32_t Zero = 0;
 
@@ -66,7 +51,8 @@ Error RootSignatureDesc::write(raw_ostream &OS) const {
   if (Error Err = Writer.writeInteger(NumParameters))
     return Err;
 
-  if (Error Err = OffsetMap.addOffset("header"))
+  uint32_t HeaderPoint;
+  if (Error Err = setRewrite(Writer, HeaderPoint))
     return Err;
 
   // Static samplers still not implemented
@@ -79,10 +65,11 @@ Error RootSignatureDesc::write(raw_ostream &OS) const {
   if (Error Err = Writer.writeInteger(Header.Flags))
     return Err;
 
-  OffsetMap.addRewriteValue("header");
+  if (Error Err = rewriteOffset(Writer, HeaderPoint))
+    return Err;
 
-  for (size_t It = 0; It < Parameters.size(); It++) {
-    const auto &P = Parameters[It];
+  SmallVector<uint32_t> ParamsOffset;
+  for (const auto &P : Parameters) {
 
     if (Error Err = Writer.writeEnum(P.ParameterType))
       return Err;
@@ -90,16 +77,19 @@ Error RootSignatureDesc::write(raw_ostream &OS) const {
     if (Error Err = Writer.writeEnum(P.ShaderVisibility))
       return Err;
 
-    std::string Key = ("parameters" + Twine(It)).str();
-    if (Error Err = OffsetMap.addOffset(Key))
+    uint32_t Offset;
+    if (Error Err = setRewrite(Writer, Offset))
       return Err;
+    ParamsOffset.push_back(Offset);
   }
 
-  for (size_t It = 0; It < Parameters.size(); It++) {
-    const auto &P = Parameters[It];
+  size_t It = 0;
+  for (const auto &P : Parameters) {
 
-    std::string Key = ("parameters" + Twine(It)).str();
-    OffsetMap.addRewriteValue(Key);
+    auto Offset = ParamsOffset[It];
+    if (Error Err = rewriteOffset(Writer, Offset))
+      return Err;
+    It++;
 
     switch (P.ParameterType) {
     case dxbc::RootParameterType::Constants32Bit: {
@@ -115,8 +105,7 @@ Error RootSignatureDesc::write(raw_ostream &OS) const {
     }
   }
 
-  if (Error Err = OffsetMap.rewrite())
-    return Err;
+  assert(It == NumParameters);
 
   llvm::ArrayRef<char> BufferRef(reinterpret_cast<char *>(Buffer.data()),
                                  Buffer.size());

>From 23069ab6def6089a74ce50f3d1b42c896b13f623 Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saff...@microsoft.com>
Date: Tue, 25 Feb 2025 04:25:33 +0000
Subject: [PATCH 08/20] addressing comments

---
 llvm/lib/MC/DXContainerRootSignature.cpp | 13 +++++--------
 1 file changed, 5 insertions(+), 8 deletions(-)

diff --git a/llvm/lib/MC/DXContainerRootSignature.cpp 
b/llvm/lib/MC/DXContainerRootSignature.cpp
index abcaa66aff380..5cdd7726e6e3f 100644
--- a/llvm/lib/MC/DXContainerRootSignature.cpp
+++ b/llvm/lib/MC/DXContainerRootSignature.cpp
@@ -83,13 +83,12 @@ Error RootSignatureDesc::write(raw_ostream &OS) const {
     ParamsOffset.push_back(Offset);
   }
 
-  size_t It = 0;
-  for (const auto &P : Parameters) {
-
-    auto Offset = ParamsOffset[It];
-    if (Error Err = rewriteOffset(Writer, Offset))
+  assert(NumParameters == ParamsOffset.size());
+  for (size_t I = 0; I < NumParameters; ++I) {
+    if (Error Err = rewriteOffset(Writer, ParamsOffset[I]))
       return Err;
-    It++;
+
+    const auto &P = Parameters[I];
 
     switch (P.ParameterType) {
     case dxbc::RootParameterType::Constants32Bit: {
@@ -105,8 +104,6 @@ Error RootSignatureDesc::write(raw_ostream &OS) const {
     }
   }
 
-  assert(It == NumParameters);
-
   llvm::ArrayRef<char> BufferRef(reinterpret_cast<char *>(Buffer.data()),
                                  Buffer.size());
   OS.write(BufferRef.data(), BufferRef.size());

>From d14471b11c7eaaa12870982229cc804946cc59fb Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saff...@microsoft.com>
Date: Tue, 25 Feb 2025 18:52:33 +0000
Subject: [PATCH 09/20] using buffer_ostream

---
 .../llvm/MC/DXContainerRootSignature.h        |  2 -
 llvm/lib/MC/DXContainerRootSignature.cpp      | 90 ++++++-------------
 2 files changed, 29 insertions(+), 63 deletions(-)

diff --git a/llvm/include/llvm/MC/DXContainerRootSignature.h 
b/llvm/include/llvm/MC/DXContainerRootSignature.h
index 911ff53c15fae..9e8c7ee54c148 100644
--- a/llvm/include/llvm/MC/DXContainerRootSignature.h
+++ b/llvm/include/llvm/MC/DXContainerRootSignature.h
@@ -6,9 +6,7 @@
 //
 
//===----------------------------------------------------------------------===//
 
-#include "llvm/ADT/IndexedMap.h"
 #include "llvm/BinaryFormat/DXContainer.h"
-#include "llvm/Support/BinaryStreamWriter.h"
 #include "llvm/Support/raw_ostream.h"
 
 namespace llvm {
diff --git a/llvm/lib/MC/DXContainerRootSignature.cpp 
b/llvm/lib/MC/DXContainerRootSignature.cpp
index 5cdd7726e6e3f..d66b9f7776a71 100644
--- a/llvm/lib/MC/DXContainerRootSignature.cpp
+++ b/llvm/lib/MC/DXContainerRootSignature.cpp
@@ -9,104 +9,72 @@
 #include "llvm/MC/DXContainerRootSignature.h"
 #include "llvm/ADT/SmallVector.h"
 #include "llvm/ADT/Twine.h"
-#include "llvm/Support/BinaryStreamWriter.h"
+#include "llvm/Support/EndianStream.h"
+#include "llvm/Support/Error.h"
 #include <cstdint>
-#include <sys/types.h>
 
 using namespace llvm;
 using namespace llvm::mcdxbc;
 
-Error setRewrite(BinaryStreamWriter &Stream, uint32_t &Offset) {
+void setRewrite(raw_ostream &Stream, uint32_t &Offset) {
   const uint32_t DummyValue = std::numeric_limits<uint32_t>::max();
-
-  Offset = Stream.getOffset();
-
-  if (Error Err = Stream.writeInteger(DummyValue))
-    return Err;
-
-  return Error::success();
+  Offset = Stream.tell();
+  support::endian::write(Stream, DummyValue, llvm::endianness::little);
 }
 
-Error rewriteOffset(BinaryStreamWriter &Stream, uint32_t Offset) {
-  uint64_t Value = Stream.getOffset();
-  Stream.setOffset(Offset);
-  if (Error Err = Stream.writeInteger((uint32_t)Value))
-    return Err;
-
-  Stream.setOffset(Value);
-
-  return Error::success();
+void rewriteOffset(buffer_ostream &Stream, uint32_t Offset) {
+  uint32_t Value = Stream.tell();
+  auto *InsertPoint = &Stream.buffer()[Offset];
+  support::endian::write(InsertPoint, Value, llvm::endianness::little);
 }
 
 Error RootSignatureDesc::write(raw_ostream &OS) const {
-  std::vector<uint8_t> Buffer(getSizeInBytes());
-  BinaryStreamWriter Writer(Buffer, llvm::endianness::little);
-
+  buffer_ostream Writer(OS);
   const uint32_t NumParameters = Parameters.size();
   const uint32_t Zero = 0;
 
-  if (Error Err = Writer.writeInteger(Header.Version))
-    return Err;
-
-  if (Error Err = Writer.writeInteger(NumParameters))
-    return Err;
+  support::endian::write(Writer, Header.Version, llvm::endianness::little);
+  support::endian::write(Writer, NumParameters, llvm::endianness::little);
 
   uint32_t HeaderPoint;
-  if (Error Err = setRewrite(Writer, HeaderPoint))
-    return Err;
-
-  // Static samplers still not implemented
-  if (Error Err = Writer.writeInteger(Zero))
-    return Err;
+  setRewrite(Writer, HeaderPoint);
 
-  if (Error Err = Writer.writeInteger(Zero))
-    return Err;
+  support::endian::write(Writer, Zero, llvm::endianness::little);
+  support::endian::write(Writer, Zero, llvm::endianness::little);
+  support::endian::write(Writer, Header.Flags, llvm::endianness::little);
 
-  if (Error Err = Writer.writeInteger(Header.Flags))
-    return Err;
-
-  if (Error Err = rewriteOffset(Writer, HeaderPoint))
-    return Err;
+  rewriteOffset(Writer, HeaderPoint);
 
   SmallVector<uint32_t> ParamsOffset;
   for (const auto &P : Parameters) {
-
-    if (Error Err = Writer.writeEnum(P.ParameterType))
-      return Err;
-
-    if (Error Err = Writer.writeEnum(P.ShaderVisibility))
-      return Err;
+    support::endian::write(Writer, P.ParameterType, llvm::endianness::little);
+    support::endian::write(Writer, P.ShaderVisibility,
+                           llvm::endianness::little);
 
     uint32_t Offset;
-    if (Error Err = setRewrite(Writer, Offset))
-      return Err;
+    setRewrite(Writer, Offset);
+
     ParamsOffset.push_back(Offset);
   }
 
   assert(NumParameters == ParamsOffset.size());
   for (size_t I = 0; I < NumParameters; ++I) {
-    if (Error Err = rewriteOffset(Writer, ParamsOffset[I]))
-      return Err;
-
+    rewriteOffset(Writer, ParamsOffset[I]);
     const auto &P = Parameters[I];
 
     switch (P.ParameterType) {
     case dxbc::RootParameterType::Constants32Bit: {
-      if (Error Err = Writer.writeInteger(P.Constants.ShaderRegister))
-        return Err;
-      if (Error Err = Writer.writeInteger(P.Constants.RegisterSpace))
-        return Err;
-      if (Error Err = Writer.writeInteger(P.Constants.Num32BitValues))
-        return Err;
+      support::endian::write(Writer, P.Constants.ShaderRegister,
+                             llvm::endianness::little);
+      support::endian::write(Writer, P.Constants.RegisterSpace,
+                             llvm::endianness::little);
+      support::endian::write(Writer, P.Constants.Num32BitValues,
+                             llvm::endianness::little);
     } break;
     case dxbc::RootParameterType::Empty:
       llvm_unreachable("Invalid RootParameterType");
     }
   }
 
-  llvm::ArrayRef<char> BufferRef(reinterpret_cast<char *>(Buffer.data()),
-                                 Buffer.size());
-  OS.write(BufferRef.data(), BufferRef.size());
-
   return Error::success();
 }

>From 216341ca3457f9da59cecc6f400e75f88ce51e90 Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saff...@microsoft.com>
Date: Tue, 25 Feb 2025 18:54:26 +0000
Subject: [PATCH 10/20] remove getsize

---
 llvm/include/llvm/MC/DXContainerRootSignature.h | 5 -----
 1 file changed, 5 deletions(-)

diff --git a/llvm/include/llvm/MC/DXContainerRootSignature.h 
b/llvm/include/llvm/MC/DXContainerRootSignature.h
index 9e8c7ee54c148..d2dfb77087212 100644
--- a/llvm/include/llvm/MC/DXContainerRootSignature.h
+++ b/llvm/include/llvm/MC/DXContainerRootSignature.h
@@ -20,11 +20,6 @@ struct RootSignatureDesc {
   SmallVector<dxbc::RootParameter> Parameters;
 
   Error write(raw_ostream &OS) const;
-
-  uint32_t getSizeInBytes() const {
-    // Header Size + accounting for parameter offset + parameters size
-    return 24 + (Parameters.size() * 4) + Parameters.size_in_bytes();
-  }
 };
 } // namespace mcdxbc
 } // namespace llvm

>From 85f012c3e9f05f91386d4c4731cbe98fadeabe3c Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saff...@microsoft.com>
Date: Tue, 25 Feb 2025 19:16:56 +0000
Subject: [PATCH 11/20] clean up

---
 llvm/include/llvm/MC/DXContainerRootSignature.h | 4 +---
 llvm/lib/MC/DXContainerRootSignature.cpp        | 8 +-------
 llvm/lib/ObjectYAML/DXContainerEmitter.cpp      | 3 +--
 llvm/lib/Target/DirectX/DXContainerGlobals.cpp  | 5 +----
 4 files changed, 4 insertions(+), 16 deletions(-)

diff --git a/llvm/include/llvm/MC/DXContainerRootSignature.h 
b/llvm/include/llvm/MC/DXContainerRootSignature.h
index d2dfb77087212..89e8a6c6c1834 100644
--- a/llvm/include/llvm/MC/DXContainerRootSignature.h
+++ b/llvm/include/llvm/MC/DXContainerRootSignature.h
@@ -7,19 +7,17 @@
 
//===----------------------------------------------------------------------===//
 
 #include "llvm/BinaryFormat/DXContainer.h"
-#include "llvm/Support/raw_ostream.h"
 
 namespace llvm {
 
 class raw_ostream;
 
 namespace mcdxbc {
-
 struct RootSignatureDesc {
   dxbc::RootSignatureHeader Header;
   SmallVector<dxbc::RootParameter> Parameters;
 
-  Error write(raw_ostream &OS) const;
+  void write(raw_ostream &OS) const;
 };
 } // namespace mcdxbc
 } // namespace llvm
diff --git a/llvm/lib/MC/DXContainerRootSignature.cpp 
b/llvm/lib/MC/DXContainerRootSignature.cpp
index d66b9f7776a71..1a08d92c72cab 100644
--- a/llvm/lib/MC/DXContainerRootSignature.cpp
+++ b/llvm/lib/MC/DXContainerRootSignature.cpp
@@ -7,11 +7,7 @@
 
//===----------------------------------------------------------------------===//
 
 #include "llvm/MC/DXContainerRootSignature.h"
-#include "llvm/ADT/SmallVector.h"
-#include "llvm/ADT/Twine.h"
 #include "llvm/Support/EndianStream.h"
-#include "llvm/Support/Error.h"
-#include <cstdint>
 
 using namespace llvm;
 using namespace llvm::mcdxbc;
@@ -28,7 +24,7 @@ void rewriteOffset(buffer_ostream &Stream, uint32_t Offset) {
   support::endian::write(InsertPoint, Value, llvm::endianness::little);
 }
 
-Error RootSignatureDesc::write(raw_ostream &OS) const {
+void RootSignatureDesc::write(raw_ostream &OS) const {
   buffer_ostream Writer(OS);
   const uint32_t NumParameters = Parameters.size();
   const uint32_t Zero = 0;
@@ -75,6 +71,4 @@ Error RootSignatureDesc::write(raw_ostream &OS) const {
       llvm_unreachable("Invalid RootParameterType");
     }
   }
-
-  return Error::success();
 }
diff --git a/llvm/lib/ObjectYAML/DXContainerEmitter.cpp 
b/llvm/lib/ObjectYAML/DXContainerEmitter.cpp
index a5831a69f9bca..4f275fb58adc1 100644
--- a/llvm/lib/ObjectYAML/DXContainerEmitter.cpp
+++ b/llvm/lib/ObjectYAML/DXContainerEmitter.cpp
@@ -271,8 +271,7 @@ void DXContainerWriter::writeParts(raw_ostream &OS) {
       RS.Header.Version = P.RootSignature->Version;
       RS.Parameters = std::move(P.RootSignature->Parameters);
 
-      if (Error Err = RS.write(OS))
-        handleAllErrors(std::move(Err));
+      RS.write(OS);
 
       break;
     }
diff --git a/llvm/lib/Target/DirectX/DXContainerGlobals.cpp 
b/llvm/lib/Target/DirectX/DXContainerGlobals.cpp
index 5801046f83674..5508af40663b1 100644
--- a/llvm/lib/Target/DirectX/DXContainerGlobals.cpp
+++ b/llvm/lib/Target/DirectX/DXContainerGlobals.cpp
@@ -25,12 +25,10 @@
 #include "llvm/InitializePasses.h"
 #include "llvm/MC/DXContainerPSVInfo.h"
 #include "llvm/Pass.h"
-#include "llvm/Support/Error.h"
 #include "llvm/Support/MD5.h"
 #include "llvm/TargetParser/Triple.h"
 #include "llvm/Transforms/Utils/ModuleUtils.h"
 #include <optional>
-#include <utility>
 
 using namespace llvm;
 using namespace llvm::dxil;
@@ -175,8 +173,7 @@ void DXContainerGlobals::addRootSignature(Module &M,
   SmallString<256> Data;
   raw_svector_ostream OS(Data);
 
-  if (Error Err = RS.write(OS))
-    handleAllErrors(std::move(Err));
+  RS.write(OS);
 
   Constant *Constant =
       ConstantDataArray::getString(M.getContext(), Data, /*AddNull*/ false);

>From 1e2bcf54b775f792fdf61818698a15932601b7cf Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saff...@microsoft.com>
Date: Tue, 25 Feb 2025 19:17:51 +0000
Subject: [PATCH 12/20] clean up

---
 llvm/include/llvm/MC/DXContainerRootSignature.h | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/llvm/include/llvm/MC/DXContainerRootSignature.h 
b/llvm/include/llvm/MC/DXContainerRootSignature.h
index 89e8a6c6c1834..b31b0da352038 100644
--- a/llvm/include/llvm/MC/DXContainerRootSignature.h
+++ b/llvm/include/llvm/MC/DXContainerRootSignature.h
@@ -7,6 +7,8 @@
 
//===----------------------------------------------------------------------===//
 
 #include "llvm/BinaryFormat/DXContainer.h"
+#include <cstdint>
+#include <limits>
 
 namespace llvm {
 

>From 0e277d96f18808648a299195f436fc0216c4e155 Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saff...@microsoft.com>
Date: Tue, 25 Feb 2025 19:19:51 +0000
Subject: [PATCH 13/20] clean up

---
 llvm/lib/Object/DXContainer.cpp            | 10 ++++------
 llvm/lib/ObjectYAML/DXContainerEmitter.cpp |  1 -
 2 files changed, 4 insertions(+), 7 deletions(-)

diff --git a/llvm/lib/Object/DXContainer.cpp b/llvm/lib/Object/DXContainer.cpp
index 35261b661cf2f..8d955d01ce202 100644
--- a/llvm/lib/Object/DXContainer.cpp
+++ b/llvm/lib/Object/DXContainer.cpp
@@ -296,18 +296,16 @@ Error DirectX::RootSignature::parse(StringRef Data) {
     NewParam.ParameterType =
         support::endian::read<dxbc::RootParameterType,
                               llvm::endianness::little>(Current);
-    if (!dxbc::RootSignatureValidations::isValidParameterType(
-            NewParam.ParameterType))
+    if 
(!dxbc::RootSignatureValidations::isValidParameterType(NewParam.ParameterType))
       return validationFailed("unsupported parameter type value read: " +
                               llvm::Twine((uint32_t)NewParam.ParameterType));
 
     Current += sizeof(dxbc::RootParameterType);
 
     NewParam.ShaderVisibility =
-        support::endian::read<dxbc::ShaderVisibility, 
llvm::endianness::little>(
-            Current);
-    if (!dxbc::RootSignatureValidations::isValidShaderVisibility(
-            NewParam.ShaderVisibility))
+        support::endian::read<dxbc::ShaderVisibility, 
+                              llvm::endianness::little>(Current);
+    if 
(!dxbc::RootSignatureValidations::isValidShaderVisibility(NewParam.ShaderVisibility))
       return validationFailed("unsupported shader visility flag value read: " +
                               
llvm::Twine((uint32_t)NewParam.ShaderVisibility));
 
diff --git a/llvm/lib/ObjectYAML/DXContainerEmitter.cpp 
b/llvm/lib/ObjectYAML/DXContainerEmitter.cpp
index 4f275fb58adc1..87ba16fd40ba9 100644
--- a/llvm/lib/ObjectYAML/DXContainerEmitter.cpp
+++ b/llvm/lib/ObjectYAML/DXContainerEmitter.cpp
@@ -272,7 +272,6 @@ void DXContainerWriter::writeParts(raw_ostream &OS) {
       RS.Parameters = std::move(P.RootSignature->Parameters);
 
       RS.write(OS);
-
       break;
     }
     uint64_t BytesWritten = OS.tell() - DataStart;

>From 5cd0044cf3ae363b9adb129029b2d1d728e111ce Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saff...@microsoft.com>
Date: Tue, 25 Feb 2025 19:20:35 +0000
Subject: [PATCH 14/20] clean up

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

diff --git a/llvm/lib/Object/DXContainer.cpp b/llvm/lib/Object/DXContainer.cpp
index 8d955d01ce202..010f70a952ebf 100644
--- a/llvm/lib/Object/DXContainer.cpp
+++ b/llvm/lib/Object/DXContainer.cpp
@@ -303,7 +303,7 @@ Error DirectX::RootSignature::parse(StringRef Data) {
     Current += sizeof(dxbc::RootParameterType);
 
     NewParam.ShaderVisibility =
-        support::endian::read<dxbc::ShaderVisibility, 
+        support::endian::read<dxbc::ShaderVisibility,
                               llvm::endianness::little>(Current);
     if 
(!dxbc::RootSignatureValidations::isValidShaderVisibility(NewParam.ShaderVisibility))
       return validationFailed("unsupported shader visility flag value read: " +

>From 7a7c34d5976359975d44aed6495b34bfb0beb244 Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saff...@microsoft.com>
Date: Tue, 25 Feb 2025 22:35:38 +0000
Subject: [PATCH 15/20] addressing pr comments

---
 llvm/lib/MC/DXContainerRootSignature.cpp | 54 ++++++++++++------------
 llvm/lib/Object/DXContainer.cpp          | 10 +++--
 2 files changed, 32 insertions(+), 32 deletions(-)

diff --git a/llvm/lib/MC/DXContainerRootSignature.cpp 
b/llvm/lib/MC/DXContainerRootSignature.cpp
index 1a08d92c72cab..d90ee510fddf3 100644
--- a/llvm/lib/MC/DXContainerRootSignature.cpp
+++ b/llvm/lib/MC/DXContainerRootSignature.cpp
@@ -8,63 +8,61 @@
 
 #include "llvm/MC/DXContainerRootSignature.h"
 #include "llvm/Support/EndianStream.h"
+#include <cstdint>
 
 using namespace llvm;
 using namespace llvm::mcdxbc;
 
-void setRewrite(raw_ostream &Stream, uint32_t &Offset) {
+static uint32_t writePlaceholder(raw_ostream &Stream) {
   const uint32_t DummyValue = std::numeric_limits<uint32_t>::max();
-  Offset = Stream.tell();
+  uint32_t Offset = Stream.tell();
   support::endian::write(Stream, DummyValue, llvm::endianness::little);
+  return Offset;
 }
 
-void rewriteOffset(buffer_ostream &Stream, uint32_t Offset) {
-  uint32_t Value = Stream.tell();
-  auto *InsertPoint = &Stream.buffer()[Offset];
-  support::endian::write(InsertPoint, Value, llvm::endianness::little);
+static void rewriteOffset(buffer_ostream &Stream, uint32_t Offset) {
+  uint32_t Value =
+      support::endian::byte_swap<uint32_t, llvm::endianness::little>(
+          Stream.tell());
+  Stream.pwrite(reinterpret_cast<const char *>(&Value), sizeof(Value), Offset);
 }
 
 void RootSignatureDesc::write(raw_ostream &OS) const {
-  buffer_ostream Writer(OS);
+  buffer_ostream BOS(OS);
   const uint32_t NumParameters = Parameters.size();
   const uint32_t Zero = 0;
 
-  support::endian::write(Writer, Header.Version, llvm::endianness::little);
-  support::endian::write(Writer, NumParameters, llvm::endianness::little);
+  support::endian::write(BOS, Header.Version, llvm::endianness::little);
+  support::endian::write(BOS, NumParameters, llvm::endianness::little);
 
-  uint32_t HeaderPoint;
-  setRewrite(Writer, HeaderPoint);
+  uint32_t HeaderPoint = writePlaceholder(BOS);
 
-  support::endian::write(Writer, Zero, llvm::endianness::little);
-  support::endian::write(Writer, Zero, llvm::endianness::little);
-  support::endian::write(Writer, Header.Flags, llvm::endianness::little);
+  support::endian::write(BOS, Zero, llvm::endianness::little);
+  support::endian::write(BOS, Zero, llvm::endianness::little);
+  support::endian::write(BOS, Header.Flags, llvm::endianness::little);
 
-  rewriteOffset(Writer, HeaderPoint);
+  rewriteOffset(BOS, HeaderPoint);
 
-  SmallVector<uint32_t> ParamsOffset;
+  SmallVector<uint32_t> ParamsOffsets;
   for (const auto &P : Parameters) {
-    support::endian::write(Writer, P.ParameterType, llvm::endianness::little);
-    support::endian::write(Writer, P.ShaderVisibility,
-                           llvm::endianness::little);
+    support::endian::write(BOS, P.ParameterType, llvm::endianness::little);
+    support::endian::write(BOS, P.ShaderVisibility, llvm::endianness::little);
 
-    uint32_t Offset;
-    setRewrite(Writer, Offset);
-
-    ParamsOffset.push_back(Offset);
+    ParamsOffsets.push_back(writePlaceholder(BOS));
   }
 
-  assert(NumParameters == ParamsOffset.size());
+  assert(NumParameters == ParamsOffsets.size());
   for (size_t I = 0; I < NumParameters; ++I) {
-    rewriteOffset(Writer, ParamsOffset[I]);
+    rewriteOffset(BOS, ParamsOffsets[I]);
     const auto &P = Parameters[I];
 
     switch (P.ParameterType) {
     case dxbc::RootParameterType::Constants32Bit: {
-      support::endian::write(Writer, P.Constants.ShaderRegister,
+      support::endian::write(BOS, P.Constants.ShaderRegister,
                              llvm::endianness::little);
-      support::endian::write(Writer, P.Constants.RegisterSpace,
+      support::endian::write(BOS, P.Constants.RegisterSpace,
                              llvm::endianness::little);
-      support::endian::write(Writer, P.Constants.Num32BitValues,
+      support::endian::write(BOS, P.Constants.Num32BitValues,
                              llvm::endianness::little);
     } break;
     case dxbc::RootParameterType::Empty:
diff --git a/llvm/lib/Object/DXContainer.cpp b/llvm/lib/Object/DXContainer.cpp
index 010f70a952ebf..35261b661cf2f 100644
--- a/llvm/lib/Object/DXContainer.cpp
+++ b/llvm/lib/Object/DXContainer.cpp
@@ -296,16 +296,18 @@ Error DirectX::RootSignature::parse(StringRef Data) {
     NewParam.ParameterType =
         support::endian::read<dxbc::RootParameterType,
                               llvm::endianness::little>(Current);
-    if 
(!dxbc::RootSignatureValidations::isValidParameterType(NewParam.ParameterType))
+    if (!dxbc::RootSignatureValidations::isValidParameterType(
+            NewParam.ParameterType))
       return validationFailed("unsupported parameter type value read: " +
                               llvm::Twine((uint32_t)NewParam.ParameterType));
 
     Current += sizeof(dxbc::RootParameterType);
 
     NewParam.ShaderVisibility =
-        support::endian::read<dxbc::ShaderVisibility,
-                              llvm::endianness::little>(Current);
-    if 
(!dxbc::RootSignatureValidations::isValidShaderVisibility(NewParam.ShaderVisibility))
+        support::endian::read<dxbc::ShaderVisibility, 
llvm::endianness::little>(
+            Current);
+    if (!dxbc::RootSignatureValidations::isValidShaderVisibility(
+            NewParam.ShaderVisibility))
       return validationFailed("unsupported shader visility flag value read: " +
                               
llvm::Twine((uint32_t)NewParam.ShaderVisibility));
 

>From d3fafab79d4964ea366af87cbb4c644594f09f93 Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saff...@microsoft.com>
Date: Tue, 25 Feb 2025 22:40:05 +0000
Subject: [PATCH 16/20] clean up

---
 llvm/lib/MC/DXContainerRootSignature.cpp | 1 -
 1 file changed, 1 deletion(-)

diff --git a/llvm/lib/MC/DXContainerRootSignature.cpp 
b/llvm/lib/MC/DXContainerRootSignature.cpp
index d90ee510fddf3..1db8f55a31658 100644
--- a/llvm/lib/MC/DXContainerRootSignature.cpp
+++ b/llvm/lib/MC/DXContainerRootSignature.cpp
@@ -8,7 +8,6 @@
 
 #include "llvm/MC/DXContainerRootSignature.h"
 #include "llvm/Support/EndianStream.h"
-#include <cstdint>
 
 using namespace llvm;
 using namespace llvm::mcdxbc;

>From 74856401627958970d033598e49b3eef59f40cc0 Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saff...@microsoft.com>
Date: Wed, 26 Feb 2025 00:55:19 +0000
Subject: [PATCH 17/20] clean up

---
 llvm/include/llvm/BinaryFormat/DXContainer.h | 10 +++++-----
 llvm/unittests/Object/DXContainerTest.cpp    | 12 ++++++------
 2 files changed, 11 insertions(+), 11 deletions(-)

diff --git a/llvm/include/llvm/BinaryFormat/DXContainer.h 
b/llvm/include/llvm/BinaryFormat/DXContainer.h
index 5db665f77160c..af65587630105 100644
--- a/llvm/include/llvm/BinaryFormat/DXContainer.h
+++ b/llvm/include/llvm/BinaryFormat/DXContainer.h
@@ -561,9 +561,9 @@ static_assert(sizeof(ProgramSignatureElement) == 32,
               "ProgramSignatureElement is misaligned");
 
 struct RootConstants {
-  uint32_t ShaderRegister = 0;
-  uint32_t RegisterSpace = 0;
-  uint32_t Num32BitValues = 0;
+  uint32_t ShaderRegister;
+  uint32_t RegisterSpace;
+  uint32_t Num32BitValues;
 
   void swapBytes() {
     sys::swapByteOrder(ShaderRegister);
@@ -599,8 +599,8 @@ struct RootParameter {
 };
 
 struct RootSignatureHeader {
-  uint32_t Version = 2;
-  uint32_t Flags = 0;
+  uint32_t Version;
+  uint32_t Flags;
 
   void swapBytes() {
     sys::swapByteOrder(Version);
diff --git a/llvm/unittests/Object/DXContainerTest.cpp 
b/llvm/unittests/Object/DXContainerTest.cpp
index d4981293b029d..8199397854384 100644
--- a/llvm/unittests/Object/DXContainerTest.cpp
+++ b/llvm/unittests/Object/DXContainerTest.cpp
@@ -837,12 +837,12 @@ TEST(RootSignature, ParseRootFlags) {
 
     const auto &RS = C.getRootSignature();
     ASSERT_TRUE(RS.has_value());
-    ASSERT_EQ(RS->getVersion(), 2);
-    ASSERT_EQ(RS->getNumParameters(), 0);
-    ASSERT_EQ(RS->getRootParametersOffset(), 0);
-    ASSERT_EQ(RS->getNumStaticSamplers(), 0);
-    ASSERT_EQ(RS->getStaticSamplersOffset(), 0);
-    ASSERT_EQ(RS->getFlags(), 0x01);
+    ASSERT_EQ(RS->getVersion(), 2u);
+    ASSERT_EQ(RS->getNumParameters(), 0u);
+    ASSERT_EQ(RS->getRootParametersOffset(), 0u);
+    ASSERT_EQ(RS->getNumStaticSamplers(), 0u);
+    ASSERT_EQ(RS->getStaticSamplersOffset(), 0u);
+    ASSERT_EQ(RS->getFlags(), 0x01u);
   }
 
   {

>From 17abc8297e956c97585e5e96738f7221e4a33b36 Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saff...@microsoft.com>
Date: Wed, 26 Feb 2025 01:08:59 +0000
Subject: [PATCH 18/20] moving initializer arround

---
 llvm/include/llvm/MC/DXContainerRootSignature.h |  2 ++
 llvm/include/llvm/Object/DXContainer.h          | 12 ++++++------
 2 files changed, 8 insertions(+), 6 deletions(-)

diff --git a/llvm/include/llvm/MC/DXContainerRootSignature.h 
b/llvm/include/llvm/MC/DXContainerRootSignature.h
index b31b0da352038..02da4eeae3df2 100644
--- a/llvm/include/llvm/MC/DXContainerRootSignature.h
+++ b/llvm/include/llvm/MC/DXContainerRootSignature.h
@@ -16,8 +16,10 @@ class raw_ostream;
 
 namespace mcdxbc {
 struct RootSignatureDesc {
+
   dxbc::RootSignatureHeader Header;
   SmallVector<dxbc::RootParameter> Parameters;
+  RootSignatureDesc() { Header = dxbc::RootSignatureHeader{2, 0}; }
 
   void write(raw_ostream &OS) const;
 };
diff --git a/llvm/include/llvm/Object/DXContainer.h 
b/llvm/include/llvm/Object/DXContainer.h
index ddcc025c15460..96aa19141bc4b 100644
--- a/llvm/include/llvm/Object/DXContainer.h
+++ b/llvm/include/llvm/Object/DXContainer.h
@@ -119,12 +119,12 @@ namespace DirectX {
 
 class RootSignature {
 private:
-  uint32_t Version;
-  uint32_t NumParameters;
-  uint32_t RootParametersOffset;
-  uint32_t NumStaticSamplers;
-  uint32_t StaticSamplersOffset;
-  uint32_t Flags;
+  uint32_t Version = 2;
+  uint32_t NumParameters = 0;
+  uint32_t RootParametersOffset = 0;
+  uint32_t NumStaticSamplers = 0;
+  uint32_t StaticSamplersOffset = 0;
+  uint32_t Flags = 0;
 
   SmallVector<dxbc::RootParameter> Parameters;
 

>From 4b177e262e8ed4496c08006905b40771f4b83cf3 Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saff...@microsoft.com>
Date: Wed, 26 Feb 2025 19:44:56 +0000
Subject: [PATCH 19/20] addressing pr comments

---
 llvm/include/llvm/BinaryFormat/DXContainer.h    | 7 +------
 llvm/include/llvm/MC/DXContainerRootSignature.h | 2 +-
 llvm/include/llvm/Object/DXContainer.h          | 4 +++-
 llvm/lib/Object/DXContainer.cpp                 | 4 ++--
 4 files changed, 7 insertions(+), 10 deletions(-)

diff --git a/llvm/include/llvm/BinaryFormat/DXContainer.h 
b/llvm/include/llvm/BinaryFormat/DXContainer.h
index af65587630105..2f6b248055826 100644
--- a/llvm/include/llvm/BinaryFormat/DXContainer.h
+++ b/llvm/include/llvm/BinaryFormat/DXContainer.h
@@ -579,13 +579,7 @@ struct RootParameter {
   };
   dxbc::ShaderVisibility ShaderVisibility;
 
-  RootParameter() {
-    ParameterType = dxbc::RootParameterType::Empty;
-    ShaderVisibility = dxbc::ShaderVisibility::Empty;
-  }
-
   void swapBytes() {
-    sys::swapByteOrder(ParameterType);
     sys::swapByteOrder(ShaderVisibility);
     switch (ParameterType) {
     case RootParameterType::Constants32Bit:
@@ -595,6 +589,7 @@ struct RootParameter {
       llvm_unreachable("invalid value for ParameterType");
       break;
     }
+    sys::swapByteOrder(ParameterType);
   }
 };
 
diff --git a/llvm/include/llvm/MC/DXContainerRootSignature.h 
b/llvm/include/llvm/MC/DXContainerRootSignature.h
index 02da4eeae3df2..ffd1c034768de 100644
--- a/llvm/include/llvm/MC/DXContainerRootSignature.h
+++ b/llvm/include/llvm/MC/DXContainerRootSignature.h
@@ -19,7 +19,7 @@ struct RootSignatureDesc {
 
   dxbc::RootSignatureHeader Header;
   SmallVector<dxbc::RootParameter> Parameters;
-  RootSignatureDesc() { Header = dxbc::RootSignatureHeader{2, 0}; }
+  RootSignatureDesc() : Header(dxbc::RootSignatureHeader{2, 0}) {}
 
   void write(raw_ostream &OS) const;
 };
diff --git a/llvm/include/llvm/Object/DXContainer.h 
b/llvm/include/llvm/Object/DXContainer.h
index 96aa19141bc4b..631744bd4fd94 100644
--- a/llvm/include/llvm/Object/DXContainer.h
+++ b/llvm/include/llvm/Object/DXContainer.h
@@ -137,7 +137,9 @@ class RootSignature {
   uint32_t getRootParametersOffset() const { return RootParametersOffset; }
   uint32_t getNumStaticSamplers() const { return NumStaticSamplers; }
   uint32_t getStaticSamplersOffset() const { return StaticSamplersOffset; }
-  SmallVector<dxbc::RootParameter> getParameters() const { return Parameters; }
+  const SmallVector<dxbc::RootParameter> &getParameters() const {
+    return Parameters;
+  }
   uint32_t getFlags() const { return Flags; }
 };
 
diff --git a/llvm/lib/Object/DXContainer.cpp b/llvm/lib/Object/DXContainer.cpp
index 35261b661cf2f..1a0463e8ac850 100644
--- a/llvm/lib/Object/DXContainer.cpp
+++ b/llvm/lib/Object/DXContainer.cpp
@@ -319,10 +319,10 @@ Error DirectX::RootSignature::parse(StringRef Data) {
 
     switch (NewParam.ParameterType) {
 
-    case dxbc::RootParameterType::Constants32Bit: {
+    case dxbc::RootParameterType::Constants32Bit:
       if (Error Err = readStruct(Data, Begin + Offset, NewParam.Constants))
         return Err;
-    } break;
+      break;
     case dxbc::RootParameterType::Empty:
       // unreachable  because it was validated and assigned before this point.
       llvm_unreachable("Invalid value for RootParameterType");

>From d39e0a46765f3f07731453b3a20aa9a8cc9db2bf Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saff...@microsoft.com>
Date: Wed, 26 Feb 2025 21:32:54 +0000
Subject: [PATCH 20/20] merge and fix

---
 llvm/lib/Target/DirectX/DXILRootSignature.cpp | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/llvm/lib/Target/DirectX/DXILRootSignature.cpp 
b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
index e31d82adf2b1e..c9ba09ea8db4a 100644
--- a/llvm/lib/Target/DirectX/DXILRootSignature.cpp
+++ b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
@@ -50,8 +50,8 @@ static bool parseRootConstants(LLVMContext *Ctx, 
mcdxbc::RootSignatureDesc &RSD,
 
   auto *ShaderVisibility =
       mdconst::extract<ConstantInt>(RootConstNode->getOperand(1));
-  dxbc::ShaderVisibilityFlag SvFlag =
-      (dxbc::ShaderVisibilityFlag)ShaderVisibility->getZExtValue();
+  dxbc::ShaderVisibility SvFlag =
+      (dxbc::ShaderVisibility)ShaderVisibility->getZExtValue();
   if (!dxbc::RootSignatureValidations::isValidShaderVisibility(SvFlag))
     return reportError(
         Ctx, "Invalid shader visibility flag value in root constant.");

_______________________________________________
llvm-branch-commits mailing list
llvm-branch-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits

Reply via email to