[llvm] [DXIL] Add support for root signature flag element in DXContainer (PR #123147)

via llvm-commits llvm-commits at lists.llvm.org
Wed Feb 12 15:28:01 PST 2025


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

>From 8adb678cbb5effc1a578a41a9490fdbc9e22cd0a Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Mon, 13 Jan 2025 21:57:03 +0000
Subject: [PATCH 01/64] adding rootsignature to obj2yaml

---
 llvm/include/llvm/BinaryFormat/DXContainer.h  |  9 +++++++
 .../BinaryFormat/DXContainerConstants.def     |  1 +
 llvm/include/llvm/Object/DXContainer.h        |  7 +++++
 .../include/llvm/ObjectYAML/DXContainerYAML.h | 16 +++++++++++
 llvm/lib/Object/DXContainer.cpp               | 14 ++++++++++
 llvm/lib/ObjectYAML/DXContainerEmitter.cpp    |  8 ++++++
 llvm/lib/ObjectYAML/DXContainerYAML.cpp       | 11 ++++++++
 .../RootSignatures/FlagsElement.ll            | 27 +++++++++++++++++++
 llvm/tools/obj2yaml/dxcontainer2yaml.cpp      |  8 ++++++
 9 files changed, 101 insertions(+)
 create mode 100644 llvm/test/CodeGen/DirectX/ContainerData/RootSignatures/FlagsElement.ll

diff --git a/llvm/include/llvm/BinaryFormat/DXContainer.h b/llvm/include/llvm/BinaryFormat/DXContainer.h
index 21e28d546286e..3907d88df43b0 100644
--- a/llvm/include/llvm/BinaryFormat/DXContainer.h
+++ b/llvm/include/llvm/BinaryFormat/DXContainer.h
@@ -63,6 +63,15 @@ struct ShaderHash {
   void swapBytes() { sys::swapByteOrder(Flags); }
 };
 
+struct RootSignatureDesc {
+  uint32_t Version;
+  uint32_t Flags;
+  void swapBytes() { 
+    sys::swapByteOrder(Version);
+    sys::swapByteOrder(Flags); 
+  }
+};
+
 struct ContainerVersion {
   uint16_t Major;
   uint16_t Minor;
diff --git a/llvm/include/llvm/BinaryFormat/DXContainerConstants.def b/llvm/include/llvm/BinaryFormat/DXContainerConstants.def
index 1aacbb2f65b27..38b69228cd397 100644
--- a/llvm/include/llvm/BinaryFormat/DXContainerConstants.def
+++ b/llvm/include/llvm/BinaryFormat/DXContainerConstants.def
@@ -4,6 +4,7 @@ CONTAINER_PART(DXIL)
 CONTAINER_PART(SFI0)
 CONTAINER_PART(HASH)
 CONTAINER_PART(PSV0)
+CONTAINER_PART(RTS0)
 CONTAINER_PART(ISG1)
 CONTAINER_PART(OSG1)
 CONTAINER_PART(PSG1)
diff --git a/llvm/include/llvm/Object/DXContainer.h b/llvm/include/llvm/Object/DXContainer.h
index 19c83ba6c6e85..9159b9083b618 100644
--- a/llvm/include/llvm/Object/DXContainer.h
+++ b/llvm/include/llvm/Object/DXContainer.h
@@ -287,6 +287,7 @@ class DXContainer {
   std::optional<uint64_t> ShaderFeatureFlags;
   std::optional<dxbc::ShaderHash> Hash;
   std::optional<DirectX::PSVRuntimeInfo> PSVInfo;
+  std::optional<dxbc::RootSignatureDesc> RootSignature;
   DirectX::Signature InputSignature;
   DirectX::Signature OutputSignature;
   DirectX::Signature PatchConstantSignature;
@@ -296,6 +297,7 @@ class DXContainer {
   Error parseDXILHeader(StringRef Part);
   Error parseShaderFeatureFlags(StringRef Part);
   Error parseHash(StringRef Part);
+  Error parseRootSignature(StringRef Part);
   Error parsePSVInfo(StringRef Part);
   Error parseSignature(StringRef Part, DirectX::Signature &Array);
   friend class PartIterator;
@@ -382,6 +384,11 @@ class DXContainer {
 
   std::optional<dxbc::ShaderHash> getShaderHash() const { return Hash; }
 
+  std::optional<dxbc::RootSignatureDesc>
+  getRootSignature() const {
+    return RootSignature;
+  }
+
   const std::optional<DirectX::PSVRuntimeInfo> &getPSVInfo() const {
     return PSVInfo;
   };
diff --git a/llvm/include/llvm/ObjectYAML/DXContainerYAML.h b/llvm/include/llvm/ObjectYAML/DXContainerYAML.h
index 66ad057ab0e30..c4bf6bc4920cf 100644
--- a/llvm/include/llvm/ObjectYAML/DXContainerYAML.h
+++ b/llvm/include/llvm/ObjectYAML/DXContainerYAML.h
@@ -72,6 +72,16 @@ struct ShaderHash {
   std::vector<llvm::yaml::Hex8> Digest;
 };
 
+
+
+struct RootSignatureDesc {
+  RootSignatureDesc() = default;
+  RootSignatureDesc(const dxbc::RootSignatureDesc &Data);
+
+  uint32_t Version;
+  uint32_t Flags;
+};
+
 using ResourceFlags = dxbc::PSV::ResourceFlags;
 using ResourceBindInfo = dxbc::PSV::v2::ResourceBindInfo;
 
@@ -159,6 +169,7 @@ struct Part {
   std::optional<ShaderHash> Hash;
   std::optional<PSVInfo> Info;
   std::optional<DXContainerYAML::Signature> Signature;
+  std::optional<DXContainerYAML::RootSignatureDesc> RootSignature;
 };
 
 struct Object {
@@ -241,6 +252,11 @@ template <> struct MappingTraits<DXContainerYAML::Signature> {
   static void mapping(IO &IO, llvm::DXContainerYAML::Signature &El);
 };
 
+template <> struct MappingTraits<DXContainerYAML::RootSignatureDesc> {
+  static void mapping(IO &IO,
+                      DXContainerYAML::RootSignatureDesc &RootSignature);
+};
+
 } // namespace yaml
 
 } // namespace llvm
diff --git a/llvm/lib/Object/DXContainer.cpp b/llvm/lib/Object/DXContainer.cpp
index 3b1a6203a1f8f..e6577192a92c7 100644
--- a/llvm/lib/Object/DXContainer.cpp
+++ b/llvm/lib/Object/DXContainer.cpp
@@ -10,6 +10,7 @@
 #include "llvm/BinaryFormat/DXContainer.h"
 #include "llvm/Object/Error.h"
 #include "llvm/Support/Alignment.h"
+#include "llvm/Support/ErrorHandling.h"
 #include "llvm/Support/FormatVariadic.h"
 
 using namespace llvm;
@@ -92,6 +93,14 @@ Error DXContainer::parseHash(StringRef Part) {
   return Error::success();
 }
 
+Error DXContainer::parseRootSignature(StringRef Part) {
+  dxbc::RootSignatureDesc Desc;
+  if (Error Err = readStruct(Part, Part.begin(), Desc))
+    return Err;
+  RootSignature = Desc;
+  return Error::success();
+}
+
 Error DXContainer::parsePSVInfo(StringRef Part) {
   if (PSVInfo)
     return parseFailed("More than one PSV0 part is present in the file");
@@ -192,6 +201,11 @@ Error DXContainer::parsePartOffsets() {
         return Err;
       break;
     case dxbc::PartType::Unknown:
+      break;
+    case dxbc::PartType::RTS0:
+      if (Error Err = parseRootSignature(PartData))
+        return Err;
+
       break;
     }
   }
diff --git a/llvm/lib/ObjectYAML/DXContainerEmitter.cpp b/llvm/lib/ObjectYAML/DXContainerEmitter.cpp
index 175f1a12f9314..22ac2b223ea53 100644
--- a/llvm/lib/ObjectYAML/DXContainerEmitter.cpp
+++ b/llvm/lib/ObjectYAML/DXContainerEmitter.cpp
@@ -261,6 +261,14 @@ void DXContainerWriter::writeParts(raw_ostream &OS) {
     }
     case dxbc::PartType::Unknown:
       break; // Skip any handling for unrecognized parts.
+    case dxbc::PartType::RTS0:
+      if (!P.RootSignature.has_value())
+        continue;
+     dxbc::RootSignatureDesc RS = {P.RootSignature->Version, P.RootSignature->Flags};
+      if (sys::IsBigEndianHost)
+        RS.swapBytes();
+      OS.write(reinterpret_cast<char *>(&RS), sizeof(dxbc::RootSignatureDesc));
+      break;
     }
     uint64_t BytesWritten = OS.tell() - DataStart;
     RollingOffset += BytesWritten;
diff --git a/llvm/lib/ObjectYAML/DXContainerYAML.cpp b/llvm/lib/ObjectYAML/DXContainerYAML.cpp
index 5dee1221b27c0..7bfd77acaecfb 100644
--- a/llvm/lib/ObjectYAML/DXContainerYAML.cpp
+++ b/llvm/lib/ObjectYAML/DXContainerYAML.cpp
@@ -45,6 +45,10 @@ DXContainerYAML::ShaderHash::ShaderHash(const dxbc::ShaderHash &Data)
   memcpy(Digest.data(), &Data.Digest[0], 16);
 }
 
+DXContainerYAML::RootSignatureDesc::RootSignatureDesc(const dxbc::RootSignatureDesc &Data)
+    : Version(Data.Version), Flags(Data.Flags) {
+}
+
 DXContainerYAML::PSVInfo::PSVInfo() : Version(0) {
   memset(&Info, 0, sizeof(Info));
 }
@@ -188,6 +192,12 @@ void MappingTraits<DXContainerYAML::Signature>::mapping(
   IO.mapRequired("Parameters", S.Parameters);
 }
 
+void MappingTraits<DXContainerYAML::RootSignatureDesc>::mapping(
+    IO &IO, DXContainerYAML::RootSignatureDesc &S) {
+  IO.mapRequired("Version", S.Version);
+  IO.mapRequired("Flags", S.Flags);
+}
+
 void MappingTraits<DXContainerYAML::Part>::mapping(IO &IO,
                                                    DXContainerYAML::Part &P) {
   IO.mapRequired("Name", P.Name);
@@ -197,6 +207,7 @@ void MappingTraits<DXContainerYAML::Part>::mapping(IO &IO,
   IO.mapOptional("Hash", P.Hash);
   IO.mapOptional("PSVInfo", P.Info);
   IO.mapOptional("Signature", P.Signature);
+  IO.mapOptional("RootSignature", P.RootSignature);
 }
 
 void MappingTraits<DXContainerYAML::Object>::mapping(
diff --git a/llvm/test/CodeGen/DirectX/ContainerData/RootSignatures/FlagsElement.ll b/llvm/test/CodeGen/DirectX/ContainerData/RootSignatures/FlagsElement.ll
new file mode 100644
index 0000000000000..402f03a4dd589
--- /dev/null
+++ b/llvm/test/CodeGen/DirectX/ContainerData/RootSignatures/FlagsElement.ll
@@ -0,0 +1,27 @@
+; 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 [8 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 = !{ !"RootFlags", i32 1 } ; 1 = allow_input_assembler_input_layout
+
+
+; DXC:       - Name:            RTS0
+; DXC-NEXT:    Size:            8
+; DXC-NEXT:    RootSignature:
+; DXC-NEXT:      Version:       1.0
+; DXC-NEXT:      Flags:         AllowInputAssemblerInputLayout
diff --git a/llvm/tools/obj2yaml/dxcontainer2yaml.cpp b/llvm/tools/obj2yaml/dxcontainer2yaml.cpp
index 06966b1883586..90ee47cd46994 100644
--- a/llvm/tools/obj2yaml/dxcontainer2yaml.cpp
+++ b/llvm/tools/obj2yaml/dxcontainer2yaml.cpp
@@ -7,9 +7,11 @@
 //===----------------------------------------------------------------------===//
 
 #include "obj2yaml.h"
+#include "llvm/BinaryFormat/DXContainer.h"
 #include "llvm/Object/DXContainer.h"
 #include "llvm/ObjectYAML/DXContainerYAML.h"
 #include "llvm/Support/Error.h"
+#include "llvm/Support/ErrorHandling.h"
 
 #include <algorithm>
 
@@ -153,6 +155,12 @@ dumpDXContainer(MemoryBufferRef Source) {
       break;
     case dxbc::PartType::Unknown:
       break;
+    case dxbc::PartType::RTS0:
+      std::optional<dxbc::RootSignatureDesc> RS = Container.getRootSignature();
+      if (RS && RS.has_value())
+        NewPart.RootSignature = DXContainerYAML::RootSignatureDesc(*RS);
+      break;
+      break;
     }
   }
 

>From ba78f21112999d704bef4e0605a51de8f2add813 Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Mon, 13 Jan 2025 22:31:14 +0000
Subject: [PATCH 02/64] adding test

---
 .../RootSignature-FlagsRootElement.yaml       | 242 ++++++++++++++++++
 1 file changed, 242 insertions(+)
 create mode 100644 llvm/test/ObjectYAML/DXContainer/RootSignature-FlagsRootElement.yaml

diff --git a/llvm/test/ObjectYAML/DXContainer/RootSignature-FlagsRootElement.yaml b/llvm/test/ObjectYAML/DXContainer/RootSignature-FlagsRootElement.yaml
new file mode 100644
index 0000000000000..5435c432a073e
--- /dev/null
+++ b/llvm/test/ObjectYAML/DXContainer/RootSignature-FlagsRootElement.yaml
@@ -0,0 +1,242 @@
+# RUN: yaml2obj %s | obj2yaml | FileCheck %s
+--- !dxcontainer
+Header:
+  Hash:            [ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 
+                     0x0, 0x0, 0x0, 0x0, 0x0, 0x0 ]
+  Version:
+    Major:           1
+    Minor:           0
+  FileSize:        1672
+  PartCount:       7
+  PartOffsets:     [ 60, 1496, 1512, 1540, 1556, 1572, 1588 ]
+Parts:
+  - Name:            DXIL
+    Size:            1428
+    Program:
+      MajorVersion:    6
+      MinorVersion:    0
+      ShaderKind:      5
+      Size:            357
+      DXILMajorVersion: 1
+      DXILMinorVersion: 0
+      DXILSize:        1404
+      DXIL:            [ 0x42, 0x43, 0xC0, 0xDE, 0x21, 0xC, 0x0, 0x0, 0x5C, 
+                         0x1, 0x0, 0x0, 0xB, 0x82, 0x20, 0x0, 0x2, 0x0, 
+                         0x0, 0x0, 0x13, 0x0, 0x0, 0x0, 0x7, 0x81, 0x23, 
+                         0x91, 0x41, 0xC8, 0x4, 0x49, 0x6, 0x10, 0x32, 
+                         0x39, 0x92, 0x1, 0x84, 0xC, 0x25, 0x5, 0x8, 0x19, 
+                         0x1E, 0x4, 0x8B, 0x62, 0x80, 0x10, 0x45, 0x2, 
+                         0x42, 0x92, 0xB, 0x42, 0x84, 0x10, 0x32, 0x14, 
+                         0x38, 0x8, 0x18, 0x4B, 0xA, 0x32, 0x42, 0x88, 
+                         0x48, 0x90, 0x14, 0x20, 0x43, 0x46, 0x88, 0xA5, 
+                         0x0, 0x19, 0x32, 0x42, 0xE4, 0x48, 0xE, 0x90, 
+                         0x11, 0x22, 0xC4, 0x50, 0x41, 0x51, 0x81, 0x8C, 
+                         0xE1, 0x83, 0xE5, 0x8A, 0x4, 0x21, 0x46, 0x6, 
+                         0x89, 0x20, 0x0, 0x0, 0x11, 0x0, 0x0, 0x0, 0x32, 
+                         0x22, 0x8, 0x9, 0x20, 0x64, 0x85, 0x4, 0x13, 0x22, 
+                         0xA4, 0x84, 0x4, 0x13, 0x22, 0xE3, 0x84, 0xA1, 
+                         0x90, 0x14, 0x12, 0x4C, 0x88, 0x8C, 0xB, 0x84, 
+                         0x84, 0x4C, 0x10, 0x20, 0x73, 0x4, 0x8, 0xC1, 
+                         0x65, 0xC3, 0x85, 0x2C, 0xE8, 0x3, 0x40, 0x14, 
+                         0x91, 0x4E, 0xD1, 0x4A, 0x48, 0x44, 0x54, 0x11, 
+                         0xC3, 0x9, 0x30, 0xC4, 0x18, 0x1, 0x30, 0x2, 0x50, 
+                         0x82, 0x21, 0x1A, 0x8, 0x98, 0x23, 0x0, 0x3, 0x0, 
+                         0x13, 0x14, 0x72, 0xC0, 0x87, 0x74, 0x60, 0x87, 
+                         0x36, 0x68, 0x87, 0x79, 0x68, 0x3, 0x72, 0xC0, 
+                         0x87, 0xD, 0xAE, 0x50, 0xE, 0x6D, 0xD0, 0xE, 0x7A, 
+                         0x50, 0xE, 0x6D, 0x0, 0xF, 0x7A, 0x30, 0x7, 0x72, 
+                         0xA0, 0x7, 0x73, 0x20, 0x7, 0x6D, 0x90, 0xE, 0x71, 
+                         0xA0, 0x7, 0x73, 0x20, 0x7, 0x6D, 0x90, 0xE, 0x78, 
+                         0xA0, 0x7, 0x78, 0xD0, 0x6, 0xE9, 0x10, 0x7, 0x76, 
+                         0xA0, 0x7, 0x71, 0x60, 0x7, 0x6D, 0x90, 0xE, 0x73, 
+                         0x20, 0x7, 0x7A, 0x30, 0x7, 0x72, 0xD0, 0x6, 0xE9, 
+                         0x60, 0x7, 0x74, 0xA0, 0x7, 0x76, 0x40, 0x7, 0x6D, 
+                         0x60, 0xE, 0x71, 0x60, 0x7, 0x7A, 0x10, 0x7, 0x76, 
+                         0xD0, 0x6, 0xE6, 0x30, 0x7, 0x72, 0xA0, 0x7, 0x73, 
+                         0x20, 0x7, 0x6D, 0x60, 0xE, 0x76, 0x40, 0x7, 0x7A, 
+                         0x60, 0x7, 0x74, 0xD0, 0x6, 0xEE, 0x80, 0x7, 0x7A, 
+                         0x10, 0x7, 0x76, 0xA0, 0x7, 0x73, 0x20, 0x7, 0x7A, 
+                         0x60, 0x7, 0x74, 0x30, 0xE4, 0x21, 0x0, 0x0, 0x0, 
+                         0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, 0xB, 
+                         0x4, 0x6, 0x0, 0x0, 0x0, 0x32, 0x1E, 0x98, 0xC, 
+                         0x19, 0x11, 0x4C, 0x90, 0x8C, 0x9, 0x26, 0x47, 
+                         0xC6, 0x4, 0x43, 0xBA, 0x12, 0x28, 0x86, 0x11, 
+                         0x80, 0x42, 0x0, 0x0, 0x79, 0x18, 0x0, 0x0, 0xCB, 
+                         0x0, 0x0, 0x0, 0x33, 0x8, 0x80, 0x1C, 0xC4, 0xE1, 
+                         0x1C, 0x66, 0x14, 0x1, 0x3D, 0x88, 0x43, 0x38, 
+                         0x84, 0xC3, 0x8C, 0x42, 0x80, 0x7, 0x79, 0x78, 
+                         0x7, 0x73, 0x98, 0x71, 0xC, 0xE6, 0x0, 0xF, 0xED, 
+                         0x10, 0xE, 0xF4, 0x80, 0xE, 0x33, 0xC, 0x42, 0x1E, 
+                         0xC2, 0xC1, 0x1D, 0xCE, 0xA1, 0x1C, 0x66, 0x30, 
+                         0x5, 0x3D, 0x88, 0x43, 0x38, 0x84, 0x83, 0x1B, 
+                         0xCC, 0x3, 0x3D, 0xC8, 0x43, 0x3D, 0x8C, 0x3, 
+                         0x3D, 0xCC, 0x78, 0x8C, 0x74, 0x70, 0x7, 0x7B, 
+                         0x8, 0x7, 0x79, 0x48, 0x87, 0x70, 0x70, 0x7, 0x7A, 
+                         0x70, 0x3, 0x76, 0x78, 0x87, 0x70, 0x20, 0x87, 
+                         0x19, 0xCC, 0x11, 0xE, 0xEC, 0x90, 0xE, 0xE1, 
+                         0x30, 0xF, 0x6E, 0x30, 0xF, 0xE3, 0xF0, 0xE, 0xF0, 
+                         0x50, 0xE, 0x33, 0x10, 0xC4, 0x1D, 0xDE, 0x21, 
+                         0x1C, 0xD8, 0x21, 0x1D, 0xC2, 0x61, 0x1E, 0x66, 
+                         0x30, 0x89, 0x3B, 0xBC, 0x83, 0x3B, 0xD0, 0x43, 
+                         0x39, 0xB4, 0x3, 0x3C, 0xBC, 0x83, 0x3C, 0x84, 
+                         0x3, 0x3B, 0xCC, 0xF0, 0x14, 0x76, 0x60, 0x7, 
+                         0x7B, 0x68, 0x7, 0x37, 0x68, 0x87, 0x72, 0x68, 
+                         0x7, 0x37, 0x80, 0x87, 0x70, 0x90, 0x87, 0x70, 
+                         0x60, 0x7, 0x76, 0x28, 0x7, 0x76, 0xF8, 0x5, 0x76, 
+                         0x78, 0x87, 0x77, 0x80, 0x87, 0x5F, 0x8, 0x87, 
+                         0x71, 0x18, 0x87, 0x72, 0x98, 0x87, 0x79, 0x98, 
+                         0x81, 0x2C, 0xEE, 0xF0, 0xE, 0xEE, 0xE0, 0xE, 
+                         0xF5, 0xC0, 0xE, 0xEC, 0x30, 0x3, 0x62, 0xC8, 
+                         0xA1, 0x1C, 0xE4, 0xA1, 0x1C, 0xCC, 0xA1, 0x1C, 
+                         0xE4, 0xA1, 0x1C, 0xDC, 0x61, 0x1C, 0xCA, 0x21, 
+                         0x1C, 0xC4, 0x81, 0x1D, 0xCA, 0x61, 0x6, 0xD6, 
+                         0x90, 0x43, 0x39, 0xC8, 0x43, 0x39, 0x98, 0x43, 
+                         0x39, 0xC8, 0x43, 0x39, 0xB8, 0xC3, 0x38, 0x94, 
+                         0x43, 0x38, 0x88, 0x3, 0x3B, 0x94, 0xC3, 0x2F, 
+                         0xBC, 0x83, 0x3C, 0xFC, 0x82, 0x3B, 0xD4, 0x3, 
+                         0x3B, 0xB0, 0xC3, 0xC, 0xC7, 0x69, 0x87, 0x70, 
+                         0x58, 0x87, 0x72, 0x70, 0x83, 0x74, 0x68, 0x7, 
+                         0x78, 0x60, 0x87, 0x74, 0x18, 0x87, 0x74, 0xA0, 
+                         0x87, 0x19, 0xCE, 0x53, 0xF, 0xEE, 0x0, 0xF, 0xF2, 
+                         0x50, 0xE, 0xE4, 0x90, 0xE, 0xE3, 0x40, 0xF, 0xE1, 
+                         0x20, 0xE, 0xEC, 0x50, 0xE, 0x33, 0x20, 0x28, 
+                         0x1D, 0xDC, 0xC1, 0x1E, 0xC2, 0x41, 0x1E, 0xD2, 
+                         0x21, 0x1C, 0xDC, 0x81, 0x1E, 0xDC, 0xE0, 0x1C, 
+                         0xE4, 0xE1, 0x1D, 0xEA, 0x1, 0x1E, 0x66, 0x18, 
+                         0x51, 0x38, 0xB0, 0x43, 0x3A, 0x9C, 0x83, 0x3B, 
+                         0xCC, 0x50, 0x24, 0x76, 0x60, 0x7, 0x7B, 0x68, 
+                         0x7, 0x37, 0x60, 0x87, 0x77, 0x78, 0x7, 0x78, 
+                         0x98, 0x51, 0x4C, 0xF4, 0x90, 0xF, 0xF0, 0x50, 
+                         0xE, 0x33, 0x1E, 0x6A, 0x1E, 0xCA, 0x61, 0x1C, 
+                         0xE8, 0x21, 0x1D, 0xDE, 0xC1, 0x1D, 0x7E, 0x1, 
+                         0x1E, 0xE4, 0xA1, 0x1C, 0xCC, 0x21, 0x1D, 0xF0, 
+                         0x61, 0x6, 0x54, 0x85, 0x83, 0x38, 0xCC, 0xC3, 
+                         0x3B, 0xB0, 0x43, 0x3D, 0xD0, 0x43, 0x39, 0xFC, 
+                         0xC2, 0x3C, 0xE4, 0x43, 0x3B, 0x88, 0xC3, 0x3B, 
+                         0xB0, 0xC3, 0x8C, 0xC5, 0xA, 0x87, 0x79, 0x98, 
+                         0x87, 0x77, 0x18, 0x87, 0x74, 0x8, 0x7, 0x7A, 
+                         0x28, 0x7, 0x72, 0x98, 0x81, 0x5C, 0xE3, 0x10, 
+                         0xE, 0xEC, 0xC0, 0xE, 0xE5, 0x50, 0xE, 0xF3, 0x30, 
+                         0x23, 0xC1, 0xD2, 0x41, 0x1E, 0xE4, 0xE1, 0x17, 
+                         0xD8, 0xE1, 0x1D, 0xDE, 0x1, 0x1E, 0x66, 0x48, 
+                         0x19, 0x3B, 0xB0, 0x83, 0x3D, 0xB4, 0x83, 0x1B, 
+                         0x84, 0xC3, 0x38, 0x8C, 0x43, 0x39, 0xCC, 0xC3, 
+                         0x3C, 0xB8, 0xC1, 0x39, 0xC8, 0xC3, 0x3B, 0xD4, 
+                         0x3, 0x3C, 0xCC, 0x48, 0xB4, 0x71, 0x8, 0x7, 0x76, 
+                         0x60, 0x7, 0x71, 0x8, 0x87, 0x71, 0x58, 0x87, 
+                         0x19, 0xDB, 0xC6, 0xE, 0xEC, 0x60, 0xF, 0xED, 
+                         0xE0, 0x6, 0xF0, 0x20, 0xF, 0xE5, 0x30, 0xF, 0xE5, 
+                         0x20, 0xF, 0xF6, 0x50, 0xE, 0x6E, 0x10, 0xE, 0xE3, 
+                         0x30, 0xE, 0xE5, 0x30, 0xF, 0xF3, 0xE0, 0x6, 0xE9, 
+                         0xE0, 0xE, 0xE4, 0x50, 0xE, 0xF8, 0x30, 0x23, 
+                         0xE2, 0xEC, 0x61, 0x1C, 0xC2, 0x81, 0x1D, 0xD8, 
+                         0xE1, 0x17, 0xEC, 0x21, 0x1D, 0xE6, 0x21, 0x1D, 
+                         0xC4, 0x21, 0x1D, 0xD8, 0x21, 0x1D, 0xE8, 0x21, 
+                         0x1F, 0x66, 0x20, 0x9D, 0x3B, 0xBC, 0x43, 0x3D, 
+                         0xB8, 0x3, 0x39, 0x94, 0x83, 0x39, 0xCC, 0x58, 
+                         0xBC, 0x70, 0x70, 0x7, 0x77, 0x78, 0x7, 0x7A, 
+                         0x8, 0x7, 0x7A, 0x48, 0x87, 0x77, 0x70, 0x87, 
+                         0x19, 0xCB, 0xE7, 0xE, 0xEF, 0x30, 0xF, 0xE1, 
+                         0xE0, 0xE, 0xE9, 0x40, 0xF, 0xE9, 0xA0, 0xF, 0xE5, 
+                         0x30, 0xC3, 0x1, 0x3, 0x73, 0xA8, 0x7, 0x77, 0x18, 
+                         0x87, 0x5F, 0x98, 0x87, 0x70, 0x70, 0x87, 0x74, 
+                         0xA0, 0x87, 0x74, 0xD0, 0x87, 0x72, 0x98, 0x81, 
+                         0x84, 0x41, 0x39, 0xE0, 0xC3, 0x38, 0xB0, 0x43, 
+                         0x3D, 0x90, 0x43, 0x39, 0xCC, 0x40, 0xC4, 0xA0, 
+                         0x1D, 0xCA, 0xA1, 0x1D, 0xE0, 0x41, 0x1E, 0xDE, 
+                         0xC1, 0x1C, 0x66, 0x24, 0x63, 0x30, 0xE, 0xE1, 
+                         0xC0, 0xE, 0xEC, 0x30, 0xF, 0xE9, 0x40, 0xF, 0xE5, 
+                         0x30, 0x43, 0x21, 0x83, 0x75, 0x18, 0x7, 0x73, 
+                         0x48, 0x87, 0x5F, 0xA0, 0x87, 0x7C, 0x80, 0x87, 
+                         0x72, 0x98, 0xB1, 0x94, 0x1, 0x3C, 0x8C, 0xC3, 
+                         0x3C, 0x94, 0xC3, 0x38, 0xD0, 0x43, 0x3A, 0xBC, 
+                         0x83, 0x3B, 0xCC, 0xC3, 0x8C, 0xC5, 0xC, 0x48, 
+                         0x21, 0x15, 0x42, 0x61, 0x1E, 0xE6, 0x21, 0x1D, 
+                         0xCE, 0xC1, 0x1D, 0x52, 0x81, 0x14, 0x66, 0x4C, 
+                         0x67, 0x30, 0xE, 0xEF, 0x20, 0xF, 0xEF, 0xE0, 
+                         0x6, 0xEF, 0x50, 0xF, 0xF4, 0x30, 0xF, 0xE9, 0x40, 
+                         0xE, 0xE5, 0xE0, 0x6, 0xE6, 0x20, 0xF, 0xE1, 0xD0, 
+                         0xE, 0xE5, 0x30, 0xA3, 0x40, 0x83, 0x76, 0x68, 
+                         0x7, 0x79, 0x8, 0x87, 0x19, 0x52, 0x1A, 0xB8, 
+                         0xC3, 0x3B, 0x84, 0x3, 0x3B, 0xA4, 0x43, 0x38, 
+                         0xCC, 0x83, 0x1B, 0x84, 0x3, 0x39, 0x90, 0x83, 
+                         0x3C, 0xCC, 0x3, 0x3C, 0x84, 0xC3, 0x38, 0x94, 
+                         0x3, 0x0, 0x0, 0x0, 0x0, 0x79, 0x28, 0x0, 0x0, 
+                         0x2A, 0x0, 0x0, 0x0, 0xC2, 0x3C, 0x90, 0x40, 0x86, 
+                         0x10, 0x19, 0x32, 0xE2, 0x64, 0x90, 0x40, 0x46, 
+                         0x2, 0x19, 0x23, 0x23, 0x46, 0x2, 0x13, 0x24, 
+                         0xC6, 0x0, 0x13, 0x74, 0x12, 0xA9, 0xB7, 0x37, 
+                         0x3A, 0x23, 0xB6, 0xB0, 0xB3, 0xB9, 0x23, 0x8C, 
+                         0xCD, 0x1D, 0xA2, 0x2D, 0x2C, 0xCD, 0x6D, 0x8, 
+                         0x42, 0x1, 0xC, 0x41, 0x38, 0x82, 0x21, 0x8, 0x87, 
+                         0x30, 0x4, 0xE1, 0x18, 0x86, 0x20, 0x1C, 0xC4, 
+                         0x18, 0x84, 0xA0, 0x18, 0x43, 0x90, 0x8C, 0x41, 
+                         0x20, 0x94, 0x31, 0xC, 0x82, 0x71, 0x8C, 0x41, 
+                         0x28, 0x8E, 0x31, 0xC, 0x45, 0x51, 0x8C, 0x41, 
+                         0x40, 0x9C, 0x31, 0x14, 0xC4, 0x0, 0x0, 0x8F, 
+                         0x89, 0xC8, 0xF0, 0x5C, 0xE4, 0xDE, 0xDE, 0xE8, 
+                         0xE6, 0xD2, 0xCE, 0xDC, 0xC2, 0xE8, 0xEA, 0xE4, 
+                         0xCA, 0xE6, 0x86, 0x12, 0x28, 0xC6, 0x21, 0xC3, 
+                         0x73, 0x99, 0x43, 0xB, 0x23, 0x2B, 0x93, 0x6B, 
+                         0x7A, 0x23, 0x2B, 0x63, 0x1B, 0x4A, 0xB0, 0x18, 
+                         0x85, 0xC, 0xCF, 0xC5, 0xAE, 0x4C, 0x6E, 0x2E, 
+                         0xED, 0xCD, 0x6D, 0x28, 0x1, 0x63, 0x1C, 0x32, 
+                         0x3C, 0x97, 0x32, 0x37, 0x3A, 0xB9, 0x3C, 0xA8, 
+                         0xB7, 0x34, 0x37, 0xBA, 0xB9, 0xA1, 0x4, 0xF, 
+                         0x0, 0x0, 0x71, 0x20, 0x0, 0x0, 0x2, 0x0, 0x0, 
+                         0x0, 0x6, 0x40, 0x30, 0x0, 0xD2, 0x0, 0x0, 0x0, 
+                         0x61, 0x20, 0x0, 0x0, 0x6, 0x0, 0x0, 0x0, 0x13, 
+                         0x4, 0x1, 0x86, 0x3, 0x1, 0x0, 0x0, 0x2, 0x0, 
+                         0x0, 0x0, 0x7, 0x50, 0x10, 0xCD, 0x14, 0x61, 0x0, 
+                         0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 ]
+  - Name:            SFI0
+    Size:            8
+  - Name:            HASH
+    Size:            20
+    Hash:
+      IncludesSource:  false
+      Digest:          [ 0xCE, 0xA, 0x5B, 0x9C, 0xBF, 0x9A, 0xBB, 0x5, 
+                         0x19, 0xC5, 0x96, 0x78, 0x49, 0x89, 0x5C, 0x6B ]
+  - Name:            ISG1
+    Size:            8
+    Signature:
+      Parameters:      []
+  - Name:            OSG1
+    Size:            8
+    Signature:
+      Parameters:      []
+  - Name:            RTS0
+    Size:            8
+    RootSignature:
+      Version:         1
+      Flags:           8
+  - Name:            PSV0
+    Size:            76
+    PSVInfo:
+      Version:         3
+      ShaderStage:     5
+      MinimumWaveLaneCount: 0
+      MaximumWaveLaneCount: 4294967295
+      UsesViewID:      0
+      SigInputVectors: 0
+      SigOutputVectors: [ 0, 0, 0, 0 ]
+      NumThreadsX:     1
+      NumThreadsY:     1
+      NumThreadsZ:     1
+      EntryName:       main
+      ResourceStride:  24
+      Resources:       []
+      SigInputElements: []
+      SigOutputElements: []
+      SigPatchOrPrimElements: []
+      InputOutputMap:
+        - [  ]
+        - [  ]
+        - [  ]
+        - [  ]
+
+# CHECK:  - Name:            RTS0
+# CHECK-NEXT:    Size:            8
+# CHECK-NEXT:    RootSignature:
+# CHECK-NEXT:      Version:         1
+# CHECK-NEXT:      Flags:           8

>From 0a54559969f272f574ca1be557157c8c9f5f1c06 Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Mon, 13 Jan 2025 22:35:01 +0000
Subject: [PATCH 03/64] removing old test

---
 .../RootSignatures/FlagsElement.ll            | 27 -------------------
 1 file changed, 27 deletions(-)
 delete mode 100644 llvm/test/CodeGen/DirectX/ContainerData/RootSignatures/FlagsElement.ll

diff --git a/llvm/test/CodeGen/DirectX/ContainerData/RootSignatures/FlagsElement.ll b/llvm/test/CodeGen/DirectX/ContainerData/RootSignatures/FlagsElement.ll
deleted file mode 100644
index 402f03a4dd589..0000000000000
--- a/llvm/test/CodeGen/DirectX/ContainerData/RootSignatures/FlagsElement.ll
+++ /dev/null
@@ -1,27 +0,0 @@
-; 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 [8 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 = !{ !"RootFlags", i32 1 } ; 1 = allow_input_assembler_input_layout
-
-
-; DXC:       - Name:            RTS0
-; DXC-NEXT:    Size:            8
-; DXC-NEXT:    RootSignature:
-; DXC-NEXT:      Version:       1.0
-; DXC-NEXT:      Flags:         AllowInputAssemblerInputLayout

>From 557075fd17edfd8bfb40266bd70299cb27ee9632 Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Mon, 13 Jan 2025 22:43:27 +0000
Subject: [PATCH 04/64] remove useless includes

---
 llvm/lib/Object/DXContainer.cpp          | 1 -
 llvm/tools/obj2yaml/dxcontainer2yaml.cpp | 2 --
 2 files changed, 3 deletions(-)

diff --git a/llvm/lib/Object/DXContainer.cpp b/llvm/lib/Object/DXContainer.cpp
index e6577192a92c7..4ffa00f70bdb7 100644
--- a/llvm/lib/Object/DXContainer.cpp
+++ b/llvm/lib/Object/DXContainer.cpp
@@ -10,7 +10,6 @@
 #include "llvm/BinaryFormat/DXContainer.h"
 #include "llvm/Object/Error.h"
 #include "llvm/Support/Alignment.h"
-#include "llvm/Support/ErrorHandling.h"
 #include "llvm/Support/FormatVariadic.h"
 
 using namespace llvm;
diff --git a/llvm/tools/obj2yaml/dxcontainer2yaml.cpp b/llvm/tools/obj2yaml/dxcontainer2yaml.cpp
index 90ee47cd46994..6ae0a0859b48e 100644
--- a/llvm/tools/obj2yaml/dxcontainer2yaml.cpp
+++ b/llvm/tools/obj2yaml/dxcontainer2yaml.cpp
@@ -7,11 +7,9 @@
 //===----------------------------------------------------------------------===//
 
 #include "obj2yaml.h"
-#include "llvm/BinaryFormat/DXContainer.h"
 #include "llvm/Object/DXContainer.h"
 #include "llvm/ObjectYAML/DXContainerYAML.h"
 #include "llvm/Support/Error.h"
-#include "llvm/Support/ErrorHandling.h"
 
 #include <algorithm>
 

>From e0d3dcd9d60a9955bb1cb0fd23dbd78bf0deddd3 Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Tue, 14 Jan 2025 23:42:24 +0000
Subject: [PATCH 05/64] addressing comments

---
 llvm/include/llvm/BinaryFormat/DXContainer.h  |   5 +
 .../BinaryFormat/DXContainerConstants.def     |  19 ++
 .../include/llvm/ObjectYAML/DXContainerYAML.h |   5 +-
 llvm/lib/Object/DXContainer.cpp               |   3 +
 llvm/lib/ObjectYAML/DXContainerEmitter.cpp    |   5 +-
 llvm/lib/ObjectYAML/DXContainerYAML.cpp       |  26 +-
 .../RootSignature-FlagsRootElement.yaml       | 259 ++----------------
 7 files changed, 85 insertions(+), 237 deletions(-)

diff --git a/llvm/include/llvm/BinaryFormat/DXContainer.h b/llvm/include/llvm/BinaryFormat/DXContainer.h
index 3907d88df43b0..0ada212511937 100644
--- a/llvm/include/llvm/BinaryFormat/DXContainer.h
+++ b/llvm/include/llvm/BinaryFormat/DXContainer.h
@@ -161,6 +161,11 @@ enum class FeatureFlags : uint64_t {
 static_assert((uint64_t)FeatureFlags::NextUnusedBit <= 1ull << 63,
               "Shader flag bits exceed enum size.");
 
+#define ROOT_ELEMENT_FLAG(Num, Val) Val = 1ull << Num,
+enum class RootElementFlag : uint32_t {
+#include "DXContainerConstants.def"
+};
+
 PartType parsePartType(StringRef S);
 
 struct VertexPSVInfo {
diff --git a/llvm/include/llvm/BinaryFormat/DXContainerConstants.def b/llvm/include/llvm/BinaryFormat/DXContainerConstants.def
index 38b69228cd397..b351b9a01773c 100644
--- a/llvm/include/llvm/BinaryFormat/DXContainerConstants.def
+++ b/llvm/include/llvm/BinaryFormat/DXContainerConstants.def
@@ -53,6 +53,25 @@ SHADER_FEATURE_FLAG(31, 36, NextUnusedBit, "Next reserved shader flag bit (not a
 #undef SHADER_FEATURE_FLAG
 #endif // SHADER_FEATURE_FLAG
 
+#ifdef ROOT_ELEMENT_FLAG
+
+
+ROOT_ELEMENT_FLAG(0, AllowInputAssemblerInputLayout)
+ROOT_ELEMENT_FLAG(1, DenyVertexShaderRootAccess)
+ROOT_ELEMENT_FLAG(2, DenyHullShaderRootAccess)
+ROOT_ELEMENT_FLAG(3, DenyDomainShaderRootAccess)
+ROOT_ELEMENT_FLAG(4, DenyGeometryShaderRootAccess)
+ROOT_ELEMENT_FLAG(5, DenyPixelShaderRootAccess)
+ROOT_ELEMENT_FLAG(6, AllowStreamOutput)
+ROOT_ELEMENT_FLAG(7, LocalRootSignature)
+ROOT_ELEMENT_FLAG(8, DenyAmplificationShaderRootAccess)
+ROOT_ELEMENT_FLAG(9, DenyMeshShaderRootAccess)
+ROOT_ELEMENT_FLAG(10, CBVSRVUAVHeapDirectlyIndexed)
+ROOT_ELEMENT_FLAG(11, SamplerHeapDirectlyIndexed)
+#undef ROOT_ELEMENT_FLAG
+#endif // ROOT_ELEMENT_FLAG
+
+
 #ifdef DXIL_MODULE_FLAG
 
 // Only save DXIL module flags which not map to feature flags here.
diff --git a/llvm/include/llvm/ObjectYAML/DXContainerYAML.h b/llvm/include/llvm/ObjectYAML/DXContainerYAML.h
index c4bf6bc4920cf..9b25c5c33e7ef 100644
--- a/llvm/include/llvm/ObjectYAML/DXContainerYAML.h
+++ b/llvm/include/llvm/ObjectYAML/DXContainerYAML.h
@@ -73,13 +73,14 @@ struct ShaderHash {
 };
 
 
-
+#define ROOT_ELEMENT_FLAG(Num, Val) bool Val = false;
 struct RootSignatureDesc {
   RootSignatureDesc() = default;
   RootSignatureDesc(const dxbc::RootSignatureDesc &Data);
 
+  uint32_t getEncodedFlags();
   uint32_t Version;
-  uint32_t Flags;
+#include "llvm/BinaryFormat/DXContainerConstants.def"
 };
 
 using ResourceFlags = dxbc::PSV::ResourceFlags;
diff --git a/llvm/lib/Object/DXContainer.cpp b/llvm/lib/Object/DXContainer.cpp
index 4ffa00f70bdb7..92956c580f9b2 100644
--- a/llvm/lib/Object/DXContainer.cpp
+++ b/llvm/lib/Object/DXContainer.cpp
@@ -8,6 +8,7 @@
 
 #include "llvm/Object/DXContainer.h"
 #include "llvm/BinaryFormat/DXContainer.h"
+#include "llvm/MC/DXContainerRootSignature.h"
 #include "llvm/Object/Error.h"
 #include "llvm/Support/Alignment.h"
 #include "llvm/Support/FormatVariadic.h"
@@ -93,6 +94,8 @@ Error DXContainer::parseHash(StringRef Part) {
 }
 
 Error DXContainer::parseRootSignature(StringRef Part) {
+  if (RootSignature)
+    return parseFailed("More than one RTS0 part is present in the file");
   dxbc::RootSignatureDesc Desc;
   if (Error Err = readStruct(Part, Part.begin(), Desc))
     return Err;
diff --git a/llvm/lib/ObjectYAML/DXContainerEmitter.cpp b/llvm/lib/ObjectYAML/DXContainerEmitter.cpp
index 22ac2b223ea53..e5561fe44375d 100644
--- a/llvm/lib/ObjectYAML/DXContainerEmitter.cpp
+++ b/llvm/lib/ObjectYAML/DXContainerEmitter.cpp
@@ -264,7 +264,10 @@ void DXContainerWriter::writeParts(raw_ostream &OS) {
     case dxbc::PartType::RTS0:
       if (!P.RootSignature.has_value())
         continue;
-     dxbc::RootSignatureDesc RS = {P.RootSignature->Version, P.RootSignature->Flags};
+      uint32_t Flags = P.RootSignature->getEncodedFlags();
+      if (sys::IsBigEndianHost)
+        sys::swapByteOrder(Flags);
+     dxbc::RootSignatureDesc RS = {P.RootSignature->Version, Flags};
       if (sys::IsBigEndianHost)
         RS.swapBytes();
       OS.write(reinterpret_cast<char *>(&RS), sizeof(dxbc::RootSignatureDesc));
diff --git a/llvm/lib/ObjectYAML/DXContainerYAML.cpp b/llvm/lib/ObjectYAML/DXContainerYAML.cpp
index 7bfd77acaecfb..d226a5b2e5942 100644
--- a/llvm/lib/ObjectYAML/DXContainerYAML.cpp
+++ b/llvm/lib/ObjectYAML/DXContainerYAML.cpp
@@ -15,6 +15,7 @@
 #include "llvm/ADT/ScopeExit.h"
 #include "llvm/BinaryFormat/DXContainer.h"
 #include "llvm/Support/ScopedPrinter.h"
+#include <cstdint>
 
 namespace llvm {
 
@@ -29,6 +30,23 @@ DXContainerYAML::ShaderFeatureFlags::ShaderFeatureFlags(uint64_t FlagData) {
 #include "llvm/BinaryFormat/DXContainerConstants.def"
 }
 
+
+DXContainerYAML::RootSignatureDesc::RootSignatureDesc(const dxbc::RootSignatureDesc &Data): Version(Data.Version) {
+#define ROOT_ELEMENT_FLAG(Num, Val)                      \
+  Val = (Data.Flags & (uint32_t)dxbc::RootElementFlag::Val) > 0;
+#include "llvm/BinaryFormat/DXContainerConstants.def"
+}
+
+
+uint32_t DXContainerYAML::RootSignatureDesc::getEncodedFlags() {
+  uint64_t Flag = 0;
+#define ROOT_ELEMENT_FLAG(Num, Val)                      \
+  if (Val)                                                                     \
+    Flag |= (uint32_t)dxbc::RootElementFlag::Val;
+#include "llvm/BinaryFormat/DXContainerConstants.def"
+  return Flag;
+}
+
 uint64_t DXContainerYAML::ShaderFeatureFlags::getEncodedFlags() {
   uint64_t Flag = 0;
 #define SHADER_FEATURE_FLAG(Num, DxilModuleNum, Val, Str)                      \
@@ -45,10 +63,6 @@ DXContainerYAML::ShaderHash::ShaderHash(const dxbc::ShaderHash &Data)
   memcpy(Digest.data(), &Data.Digest[0], 16);
 }
 
-DXContainerYAML::RootSignatureDesc::RootSignatureDesc(const dxbc::RootSignatureDesc &Data)
-    : Version(Data.Version), Flags(Data.Flags) {
-}
-
 DXContainerYAML::PSVInfo::PSVInfo() : Version(0) {
   memset(&Info, 0, sizeof(Info));
 }
@@ -195,7 +209,9 @@ void MappingTraits<DXContainerYAML::Signature>::mapping(
 void MappingTraits<DXContainerYAML::RootSignatureDesc>::mapping(
     IO &IO, DXContainerYAML::RootSignatureDesc &S) {
   IO.mapRequired("Version", S.Version);
-  IO.mapRequired("Flags", S.Flags);
+  #define ROOT_ELEMENT_FLAG(Num, Val)                      \
+    IO.mapRequired(#Val, S.Val);
+  #include "llvm/BinaryFormat/DXContainerConstants.def"
 }
 
 void MappingTraits<DXContainerYAML::Part>::mapping(IO &IO,
diff --git a/llvm/test/ObjectYAML/DXContainer/RootSignature-FlagsRootElement.yaml b/llvm/test/ObjectYAML/DXContainer/RootSignature-FlagsRootElement.yaml
index 5435c432a073e..2ed71091cacd4 100644
--- a/llvm/test/ObjectYAML/DXContainer/RootSignature-FlagsRootElement.yaml
+++ b/llvm/test/ObjectYAML/DXContainer/RootSignature-FlagsRootElement.yaml
@@ -6,237 +6,38 @@ Header:
   Version:
     Major:           1
     Minor:           0
-  FileSize:        1672
-  PartCount:       7
-  PartOffsets:     [ 60, 1496, 1512, 1540, 1556, 1572, 1588 ]
+  PartCount:       1
+  PartOffsets:     [ 60 ]
 Parts:
-  - Name:            DXIL
-    Size:            1428
-    Program:
-      MajorVersion:    6
-      MinorVersion:    0
-      ShaderKind:      5
-      Size:            357
-      DXILMajorVersion: 1
-      DXILMinorVersion: 0
-      DXILSize:        1404
-      DXIL:            [ 0x42, 0x43, 0xC0, 0xDE, 0x21, 0xC, 0x0, 0x0, 0x5C, 
-                         0x1, 0x0, 0x0, 0xB, 0x82, 0x20, 0x0, 0x2, 0x0, 
-                         0x0, 0x0, 0x13, 0x0, 0x0, 0x0, 0x7, 0x81, 0x23, 
-                         0x91, 0x41, 0xC8, 0x4, 0x49, 0x6, 0x10, 0x32, 
-                         0x39, 0x92, 0x1, 0x84, 0xC, 0x25, 0x5, 0x8, 0x19, 
-                         0x1E, 0x4, 0x8B, 0x62, 0x80, 0x10, 0x45, 0x2, 
-                         0x42, 0x92, 0xB, 0x42, 0x84, 0x10, 0x32, 0x14, 
-                         0x38, 0x8, 0x18, 0x4B, 0xA, 0x32, 0x42, 0x88, 
-                         0x48, 0x90, 0x14, 0x20, 0x43, 0x46, 0x88, 0xA5, 
-                         0x0, 0x19, 0x32, 0x42, 0xE4, 0x48, 0xE, 0x90, 
-                         0x11, 0x22, 0xC4, 0x50, 0x41, 0x51, 0x81, 0x8C, 
-                         0xE1, 0x83, 0xE5, 0x8A, 0x4, 0x21, 0x46, 0x6, 
-                         0x89, 0x20, 0x0, 0x0, 0x11, 0x0, 0x0, 0x0, 0x32, 
-                         0x22, 0x8, 0x9, 0x20, 0x64, 0x85, 0x4, 0x13, 0x22, 
-                         0xA4, 0x84, 0x4, 0x13, 0x22, 0xE3, 0x84, 0xA1, 
-                         0x90, 0x14, 0x12, 0x4C, 0x88, 0x8C, 0xB, 0x84, 
-                         0x84, 0x4C, 0x10, 0x20, 0x73, 0x4, 0x8, 0xC1, 
-                         0x65, 0xC3, 0x85, 0x2C, 0xE8, 0x3, 0x40, 0x14, 
-                         0x91, 0x4E, 0xD1, 0x4A, 0x48, 0x44, 0x54, 0x11, 
-                         0xC3, 0x9, 0x30, 0xC4, 0x18, 0x1, 0x30, 0x2, 0x50, 
-                         0x82, 0x21, 0x1A, 0x8, 0x98, 0x23, 0x0, 0x3, 0x0, 
-                         0x13, 0x14, 0x72, 0xC0, 0x87, 0x74, 0x60, 0x87, 
-                         0x36, 0x68, 0x87, 0x79, 0x68, 0x3, 0x72, 0xC0, 
-                         0x87, 0xD, 0xAE, 0x50, 0xE, 0x6D, 0xD0, 0xE, 0x7A, 
-                         0x50, 0xE, 0x6D, 0x0, 0xF, 0x7A, 0x30, 0x7, 0x72, 
-                         0xA0, 0x7, 0x73, 0x20, 0x7, 0x6D, 0x90, 0xE, 0x71, 
-                         0xA0, 0x7, 0x73, 0x20, 0x7, 0x6D, 0x90, 0xE, 0x78, 
-                         0xA0, 0x7, 0x78, 0xD0, 0x6, 0xE9, 0x10, 0x7, 0x76, 
-                         0xA0, 0x7, 0x71, 0x60, 0x7, 0x6D, 0x90, 0xE, 0x73, 
-                         0x20, 0x7, 0x7A, 0x30, 0x7, 0x72, 0xD0, 0x6, 0xE9, 
-                         0x60, 0x7, 0x74, 0xA0, 0x7, 0x76, 0x40, 0x7, 0x6D, 
-                         0x60, 0xE, 0x71, 0x60, 0x7, 0x7A, 0x10, 0x7, 0x76, 
-                         0xD0, 0x6, 0xE6, 0x30, 0x7, 0x72, 0xA0, 0x7, 0x73, 
-                         0x20, 0x7, 0x6D, 0x60, 0xE, 0x76, 0x40, 0x7, 0x7A, 
-                         0x60, 0x7, 0x74, 0xD0, 0x6, 0xEE, 0x80, 0x7, 0x7A, 
-                         0x10, 0x7, 0x76, 0xA0, 0x7, 0x73, 0x20, 0x7, 0x7A, 
-                         0x60, 0x7, 0x74, 0x30, 0xE4, 0x21, 0x0, 0x0, 0x0, 
-                         0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, 0xB, 
-                         0x4, 0x6, 0x0, 0x0, 0x0, 0x32, 0x1E, 0x98, 0xC, 
-                         0x19, 0x11, 0x4C, 0x90, 0x8C, 0x9, 0x26, 0x47, 
-                         0xC6, 0x4, 0x43, 0xBA, 0x12, 0x28, 0x86, 0x11, 
-                         0x80, 0x42, 0x0, 0x0, 0x79, 0x18, 0x0, 0x0, 0xCB, 
-                         0x0, 0x0, 0x0, 0x33, 0x8, 0x80, 0x1C, 0xC4, 0xE1, 
-                         0x1C, 0x66, 0x14, 0x1, 0x3D, 0x88, 0x43, 0x38, 
-                         0x84, 0xC3, 0x8C, 0x42, 0x80, 0x7, 0x79, 0x78, 
-                         0x7, 0x73, 0x98, 0x71, 0xC, 0xE6, 0x0, 0xF, 0xED, 
-                         0x10, 0xE, 0xF4, 0x80, 0xE, 0x33, 0xC, 0x42, 0x1E, 
-                         0xC2, 0xC1, 0x1D, 0xCE, 0xA1, 0x1C, 0x66, 0x30, 
-                         0x5, 0x3D, 0x88, 0x43, 0x38, 0x84, 0x83, 0x1B, 
-                         0xCC, 0x3, 0x3D, 0xC8, 0x43, 0x3D, 0x8C, 0x3, 
-                         0x3D, 0xCC, 0x78, 0x8C, 0x74, 0x70, 0x7, 0x7B, 
-                         0x8, 0x7, 0x79, 0x48, 0x87, 0x70, 0x70, 0x7, 0x7A, 
-                         0x70, 0x3, 0x76, 0x78, 0x87, 0x70, 0x20, 0x87, 
-                         0x19, 0xCC, 0x11, 0xE, 0xEC, 0x90, 0xE, 0xE1, 
-                         0x30, 0xF, 0x6E, 0x30, 0xF, 0xE3, 0xF0, 0xE, 0xF0, 
-                         0x50, 0xE, 0x33, 0x10, 0xC4, 0x1D, 0xDE, 0x21, 
-                         0x1C, 0xD8, 0x21, 0x1D, 0xC2, 0x61, 0x1E, 0x66, 
-                         0x30, 0x89, 0x3B, 0xBC, 0x83, 0x3B, 0xD0, 0x43, 
-                         0x39, 0xB4, 0x3, 0x3C, 0xBC, 0x83, 0x3C, 0x84, 
-                         0x3, 0x3B, 0xCC, 0xF0, 0x14, 0x76, 0x60, 0x7, 
-                         0x7B, 0x68, 0x7, 0x37, 0x68, 0x87, 0x72, 0x68, 
-                         0x7, 0x37, 0x80, 0x87, 0x70, 0x90, 0x87, 0x70, 
-                         0x60, 0x7, 0x76, 0x28, 0x7, 0x76, 0xF8, 0x5, 0x76, 
-                         0x78, 0x87, 0x77, 0x80, 0x87, 0x5F, 0x8, 0x87, 
-                         0x71, 0x18, 0x87, 0x72, 0x98, 0x87, 0x79, 0x98, 
-                         0x81, 0x2C, 0xEE, 0xF0, 0xE, 0xEE, 0xE0, 0xE, 
-                         0xF5, 0xC0, 0xE, 0xEC, 0x30, 0x3, 0x62, 0xC8, 
-                         0xA1, 0x1C, 0xE4, 0xA1, 0x1C, 0xCC, 0xA1, 0x1C, 
-                         0xE4, 0xA1, 0x1C, 0xDC, 0x61, 0x1C, 0xCA, 0x21, 
-                         0x1C, 0xC4, 0x81, 0x1D, 0xCA, 0x61, 0x6, 0xD6, 
-                         0x90, 0x43, 0x39, 0xC8, 0x43, 0x39, 0x98, 0x43, 
-                         0x39, 0xC8, 0x43, 0x39, 0xB8, 0xC3, 0x38, 0x94, 
-                         0x43, 0x38, 0x88, 0x3, 0x3B, 0x94, 0xC3, 0x2F, 
-                         0xBC, 0x83, 0x3C, 0xFC, 0x82, 0x3B, 0xD4, 0x3, 
-                         0x3B, 0xB0, 0xC3, 0xC, 0xC7, 0x69, 0x87, 0x70, 
-                         0x58, 0x87, 0x72, 0x70, 0x83, 0x74, 0x68, 0x7, 
-                         0x78, 0x60, 0x87, 0x74, 0x18, 0x87, 0x74, 0xA0, 
-                         0x87, 0x19, 0xCE, 0x53, 0xF, 0xEE, 0x0, 0xF, 0xF2, 
-                         0x50, 0xE, 0xE4, 0x90, 0xE, 0xE3, 0x40, 0xF, 0xE1, 
-                         0x20, 0xE, 0xEC, 0x50, 0xE, 0x33, 0x20, 0x28, 
-                         0x1D, 0xDC, 0xC1, 0x1E, 0xC2, 0x41, 0x1E, 0xD2, 
-                         0x21, 0x1C, 0xDC, 0x81, 0x1E, 0xDC, 0xE0, 0x1C, 
-                         0xE4, 0xE1, 0x1D, 0xEA, 0x1, 0x1E, 0x66, 0x18, 
-                         0x51, 0x38, 0xB0, 0x43, 0x3A, 0x9C, 0x83, 0x3B, 
-                         0xCC, 0x50, 0x24, 0x76, 0x60, 0x7, 0x7B, 0x68, 
-                         0x7, 0x37, 0x60, 0x87, 0x77, 0x78, 0x7, 0x78, 
-                         0x98, 0x51, 0x4C, 0xF4, 0x90, 0xF, 0xF0, 0x50, 
-                         0xE, 0x33, 0x1E, 0x6A, 0x1E, 0xCA, 0x61, 0x1C, 
-                         0xE8, 0x21, 0x1D, 0xDE, 0xC1, 0x1D, 0x7E, 0x1, 
-                         0x1E, 0xE4, 0xA1, 0x1C, 0xCC, 0x21, 0x1D, 0xF0, 
-                         0x61, 0x6, 0x54, 0x85, 0x83, 0x38, 0xCC, 0xC3, 
-                         0x3B, 0xB0, 0x43, 0x3D, 0xD0, 0x43, 0x39, 0xFC, 
-                         0xC2, 0x3C, 0xE4, 0x43, 0x3B, 0x88, 0xC3, 0x3B, 
-                         0xB0, 0xC3, 0x8C, 0xC5, 0xA, 0x87, 0x79, 0x98, 
-                         0x87, 0x77, 0x18, 0x87, 0x74, 0x8, 0x7, 0x7A, 
-                         0x28, 0x7, 0x72, 0x98, 0x81, 0x5C, 0xE3, 0x10, 
-                         0xE, 0xEC, 0xC0, 0xE, 0xE5, 0x50, 0xE, 0xF3, 0x30, 
-                         0x23, 0xC1, 0xD2, 0x41, 0x1E, 0xE4, 0xE1, 0x17, 
-                         0xD8, 0xE1, 0x1D, 0xDE, 0x1, 0x1E, 0x66, 0x48, 
-                         0x19, 0x3B, 0xB0, 0x83, 0x3D, 0xB4, 0x83, 0x1B, 
-                         0x84, 0xC3, 0x38, 0x8C, 0x43, 0x39, 0xCC, 0xC3, 
-                         0x3C, 0xB8, 0xC1, 0x39, 0xC8, 0xC3, 0x3B, 0xD4, 
-                         0x3, 0x3C, 0xCC, 0x48, 0xB4, 0x71, 0x8, 0x7, 0x76, 
-                         0x60, 0x7, 0x71, 0x8, 0x87, 0x71, 0x58, 0x87, 
-                         0x19, 0xDB, 0xC6, 0xE, 0xEC, 0x60, 0xF, 0xED, 
-                         0xE0, 0x6, 0xF0, 0x20, 0xF, 0xE5, 0x30, 0xF, 0xE5, 
-                         0x20, 0xF, 0xF6, 0x50, 0xE, 0x6E, 0x10, 0xE, 0xE3, 
-                         0x30, 0xE, 0xE5, 0x30, 0xF, 0xF3, 0xE0, 0x6, 0xE9, 
-                         0xE0, 0xE, 0xE4, 0x50, 0xE, 0xF8, 0x30, 0x23, 
-                         0xE2, 0xEC, 0x61, 0x1C, 0xC2, 0x81, 0x1D, 0xD8, 
-                         0xE1, 0x17, 0xEC, 0x21, 0x1D, 0xE6, 0x21, 0x1D, 
-                         0xC4, 0x21, 0x1D, 0xD8, 0x21, 0x1D, 0xE8, 0x21, 
-                         0x1F, 0x66, 0x20, 0x9D, 0x3B, 0xBC, 0x43, 0x3D, 
-                         0xB8, 0x3, 0x39, 0x94, 0x83, 0x39, 0xCC, 0x58, 
-                         0xBC, 0x70, 0x70, 0x7, 0x77, 0x78, 0x7, 0x7A, 
-                         0x8, 0x7, 0x7A, 0x48, 0x87, 0x77, 0x70, 0x87, 
-                         0x19, 0xCB, 0xE7, 0xE, 0xEF, 0x30, 0xF, 0xE1, 
-                         0xE0, 0xE, 0xE9, 0x40, 0xF, 0xE9, 0xA0, 0xF, 0xE5, 
-                         0x30, 0xC3, 0x1, 0x3, 0x73, 0xA8, 0x7, 0x77, 0x18, 
-                         0x87, 0x5F, 0x98, 0x87, 0x70, 0x70, 0x87, 0x74, 
-                         0xA0, 0x87, 0x74, 0xD0, 0x87, 0x72, 0x98, 0x81, 
-                         0x84, 0x41, 0x39, 0xE0, 0xC3, 0x38, 0xB0, 0x43, 
-                         0x3D, 0x90, 0x43, 0x39, 0xCC, 0x40, 0xC4, 0xA0, 
-                         0x1D, 0xCA, 0xA1, 0x1D, 0xE0, 0x41, 0x1E, 0xDE, 
-                         0xC1, 0x1C, 0x66, 0x24, 0x63, 0x30, 0xE, 0xE1, 
-                         0xC0, 0xE, 0xEC, 0x30, 0xF, 0xE9, 0x40, 0xF, 0xE5, 
-                         0x30, 0x43, 0x21, 0x83, 0x75, 0x18, 0x7, 0x73, 
-                         0x48, 0x87, 0x5F, 0xA0, 0x87, 0x7C, 0x80, 0x87, 
-                         0x72, 0x98, 0xB1, 0x94, 0x1, 0x3C, 0x8C, 0xC3, 
-                         0x3C, 0x94, 0xC3, 0x38, 0xD0, 0x43, 0x3A, 0xBC, 
-                         0x83, 0x3B, 0xCC, 0xC3, 0x8C, 0xC5, 0xC, 0x48, 
-                         0x21, 0x15, 0x42, 0x61, 0x1E, 0xE6, 0x21, 0x1D, 
-                         0xCE, 0xC1, 0x1D, 0x52, 0x81, 0x14, 0x66, 0x4C, 
-                         0x67, 0x30, 0xE, 0xEF, 0x20, 0xF, 0xEF, 0xE0, 
-                         0x6, 0xEF, 0x50, 0xF, 0xF4, 0x30, 0xF, 0xE9, 0x40, 
-                         0xE, 0xE5, 0xE0, 0x6, 0xE6, 0x20, 0xF, 0xE1, 0xD0, 
-                         0xE, 0xE5, 0x30, 0xA3, 0x40, 0x83, 0x76, 0x68, 
-                         0x7, 0x79, 0x8, 0x87, 0x19, 0x52, 0x1A, 0xB8, 
-                         0xC3, 0x3B, 0x84, 0x3, 0x3B, 0xA4, 0x43, 0x38, 
-                         0xCC, 0x83, 0x1B, 0x84, 0x3, 0x39, 0x90, 0x83, 
-                         0x3C, 0xCC, 0x3, 0x3C, 0x84, 0xC3, 0x38, 0x94, 
-                         0x3, 0x0, 0x0, 0x0, 0x0, 0x79, 0x28, 0x0, 0x0, 
-                         0x2A, 0x0, 0x0, 0x0, 0xC2, 0x3C, 0x90, 0x40, 0x86, 
-                         0x10, 0x19, 0x32, 0xE2, 0x64, 0x90, 0x40, 0x46, 
-                         0x2, 0x19, 0x23, 0x23, 0x46, 0x2, 0x13, 0x24, 
-                         0xC6, 0x0, 0x13, 0x74, 0x12, 0xA9, 0xB7, 0x37, 
-                         0x3A, 0x23, 0xB6, 0xB0, 0xB3, 0xB9, 0x23, 0x8C, 
-                         0xCD, 0x1D, 0xA2, 0x2D, 0x2C, 0xCD, 0x6D, 0x8, 
-                         0x42, 0x1, 0xC, 0x41, 0x38, 0x82, 0x21, 0x8, 0x87, 
-                         0x30, 0x4, 0xE1, 0x18, 0x86, 0x20, 0x1C, 0xC4, 
-                         0x18, 0x84, 0xA0, 0x18, 0x43, 0x90, 0x8C, 0x41, 
-                         0x20, 0x94, 0x31, 0xC, 0x82, 0x71, 0x8C, 0x41, 
-                         0x28, 0x8E, 0x31, 0xC, 0x45, 0x51, 0x8C, 0x41, 
-                         0x40, 0x9C, 0x31, 0x14, 0xC4, 0x0, 0x0, 0x8F, 
-                         0x89, 0xC8, 0xF0, 0x5C, 0xE4, 0xDE, 0xDE, 0xE8, 
-                         0xE6, 0xD2, 0xCE, 0xDC, 0xC2, 0xE8, 0xEA, 0xE4, 
-                         0xCA, 0xE6, 0x86, 0x12, 0x28, 0xC6, 0x21, 0xC3, 
-                         0x73, 0x99, 0x43, 0xB, 0x23, 0x2B, 0x93, 0x6B, 
-                         0x7A, 0x23, 0x2B, 0x63, 0x1B, 0x4A, 0xB0, 0x18, 
-                         0x85, 0xC, 0xCF, 0xC5, 0xAE, 0x4C, 0x6E, 0x2E, 
-                         0xED, 0xCD, 0x6D, 0x28, 0x1, 0x63, 0x1C, 0x32, 
-                         0x3C, 0x97, 0x32, 0x37, 0x3A, 0xB9, 0x3C, 0xA8, 
-                         0xB7, 0x34, 0x37, 0xBA, 0xB9, 0xA1, 0x4, 0xF, 
-                         0x0, 0x0, 0x71, 0x20, 0x0, 0x0, 0x2, 0x0, 0x0, 
-                         0x0, 0x6, 0x40, 0x30, 0x0, 0xD2, 0x0, 0x0, 0x0, 
-                         0x61, 0x20, 0x0, 0x0, 0x6, 0x0, 0x0, 0x0, 0x13, 
-                         0x4, 0x1, 0x86, 0x3, 0x1, 0x0, 0x0, 0x2, 0x0, 
-                         0x0, 0x0, 0x7, 0x50, 0x10, 0xCD, 0x14, 0x61, 0x0, 
-                         0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 ]
-  - Name:            SFI0
-    Size:            8
-  - Name:            HASH
-    Size:            20
-    Hash:
-      IncludesSource:  false
-      Digest:          [ 0xCE, 0xA, 0x5B, 0x9C, 0xBF, 0x9A, 0xBB, 0x5, 
-                         0x19, 0xC5, 0x96, 0x78, 0x49, 0x89, 0x5C, 0x6B ]
-  - Name:            ISG1
-    Size:            8
-    Signature:
-      Parameters:      []
-  - Name:            OSG1
-    Size:            8
-    Signature:
-      Parameters:      []
   - Name:            RTS0
     Size:            8
     RootSignature:
       Version:         1
-      Flags:           8
-  - Name:            PSV0
-    Size:            76
-    PSVInfo:
-      Version:         3
-      ShaderStage:     5
-      MinimumWaveLaneCount: 0
-      MaximumWaveLaneCount: 4294967295
-      UsesViewID:      0
-      SigInputVectors: 0
-      SigOutputVectors: [ 0, 0, 0, 0 ]
-      NumThreadsX:     1
-      NumThreadsY:     1
-      NumThreadsZ:     1
-      EntryName:       main
-      ResourceStride:  24
-      Resources:       []
-      SigInputElements: []
-      SigOutputElements: []
-      SigPatchOrPrimElements: []
-      InputOutputMap:
-        - [  ]
-        - [  ]
-        - [  ]
-        - [  ]
-
-# CHECK:  - Name:            RTS0
-# CHECK-NEXT:    Size:            8
-# CHECK-NEXT:    RootSignature:
-# CHECK-NEXT:      Version:         1
-# CHECK-NEXT:      Flags:           8
+      AllowInputAssemblerInputLayout: true
+      DenyVertexShaderRootAccess: false
+      DenyHullShaderRootAccess: false
+      DenyDomainShaderRootAccess: false
+      DenyGeometryShaderRootAccess: false
+      DenyPixelShaderRootAccess: false
+      AllowStreamOutput: false
+      LocalRootSignature: false
+      DenyAmplificationShaderRootAccess: false
+      DenyMeshShaderRootAccess: false
+      CBVSRVUAVHeapDirectlyIndexed: false
+      SamplerHeapDirectlyIndexed: false
+#CHECK:    - Name: RTS0
+#CHECK-NEXT: Size: 8
+#CHECK-NEXT: RootSignature:
+#CHECK-NEXT:   Version: 1
+#CHECK-NEXT:   AllowInputAssemblerInputLayout: true
+#CHECK-NEXT:   DenyVertexShaderRootAccess: false
+#CHECK-NEXT:   DenyHullShaderRootAccess: false
+#CHECK-NEXT:   DenyDomainShaderRootAccess: false
+#CHECK-NEXT:   DenyGeometryShaderRootAccess: false
+#CHECK-NEXT:   DenyPixelShaderRootAccess: false
+#CHECK-NEXT:   AllowStreamOutput: false
+#CHECK-NEXT:   LocalRootSignature: false
+#CHECK-NEXT:   DenyAmplificationShaderRootAccess: false
+#CHECK-NEXT:   DenyMeshShaderRootAccess: false
+#CHECK-NEXT:   CBVSRVUAVHeapDirectlyIndexed: false
+#CHECK-NEXT:   SamplerHeapDirectlyIndexed: false

>From 80587ddd3736472bfd3e089db35880762a2035b7 Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Tue, 14 Jan 2025 23:47:46 +0000
Subject: [PATCH 06/64] updating test

---
 .../ObjectYAML/DXContainer/RootSignature-FlagsRootElement.yaml   | 1 +
 1 file changed, 1 insertion(+)

diff --git a/llvm/test/ObjectYAML/DXContainer/RootSignature-FlagsRootElement.yaml b/llvm/test/ObjectYAML/DXContainer/RootSignature-FlagsRootElement.yaml
index 2ed71091cacd4..8ce18d8e1aa4c 100644
--- a/llvm/test/ObjectYAML/DXContainer/RootSignature-FlagsRootElement.yaml
+++ b/llvm/test/ObjectYAML/DXContainer/RootSignature-FlagsRootElement.yaml
@@ -25,6 +25,7 @@ Parts:
       DenyMeshShaderRootAccess: false
       CBVSRVUAVHeapDirectlyIndexed: false
       SamplerHeapDirectlyIndexed: false
+      
 #CHECK:    - Name: RTS0
 #CHECK-NEXT: Size: 8
 #CHECK-NEXT: RootSignature:

>From be3764d8748cf55c781cd3b98a5f616c9a09e5f0 Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Wed, 15 Jan 2025 00:42:39 +0000
Subject: [PATCH 07/64] removing useless header

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

diff --git a/llvm/lib/Object/DXContainer.cpp b/llvm/lib/Object/DXContainer.cpp
index 92956c580f9b2..b7eff25ed7b33 100644
--- a/llvm/lib/Object/DXContainer.cpp
+++ b/llvm/lib/Object/DXContainer.cpp
@@ -8,7 +8,6 @@
 
 #include "llvm/Object/DXContainer.h"
 #include "llvm/BinaryFormat/DXContainer.h"
-#include "llvm/MC/DXContainerRootSignature.h"
 #include "llvm/Object/Error.h"
 #include "llvm/Support/Alignment.h"
 #include "llvm/Support/FormatVariadic.h"

>From 7582ca61409969ae247c116374bacbbdb4909fca Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Wed, 15 Jan 2025 17:30:00 +0000
Subject: [PATCH 08/64] fix formating

---
 llvm/include/llvm/BinaryFormat/DXContainer.h   |  4 ++--
 llvm/include/llvm/Object/DXContainer.h         |  3 +--
 llvm/include/llvm/ObjectYAML/DXContainerYAML.h |  1 -
 llvm/lib/ObjectYAML/DXContainerEmitter.cpp     |  2 +-
 llvm/lib/ObjectYAML/DXContainerYAML.cpp        | 15 +++++++--------
 5 files changed, 11 insertions(+), 14 deletions(-)

diff --git a/llvm/include/llvm/BinaryFormat/DXContainer.h b/llvm/include/llvm/BinaryFormat/DXContainer.h
index 0ada212511937..74003387a249e 100644
--- a/llvm/include/llvm/BinaryFormat/DXContainer.h
+++ b/llvm/include/llvm/BinaryFormat/DXContainer.h
@@ -66,9 +66,9 @@ struct ShaderHash {
 struct RootSignatureDesc {
   uint32_t Version;
   uint32_t Flags;
-  void swapBytes() { 
+  void swapBytes() {
     sys::swapByteOrder(Version);
-    sys::swapByteOrder(Flags); 
+    sys::swapByteOrder(Flags);
   }
 };
 
diff --git a/llvm/include/llvm/Object/DXContainer.h b/llvm/include/llvm/Object/DXContainer.h
index 9159b9083b618..8574a04027ce4 100644
--- a/llvm/include/llvm/Object/DXContainer.h
+++ b/llvm/include/llvm/Object/DXContainer.h
@@ -384,8 +384,7 @@ class DXContainer {
 
   std::optional<dxbc::ShaderHash> getShaderHash() const { return Hash; }
 
-  std::optional<dxbc::RootSignatureDesc>
-  getRootSignature() const {
+  std::optional<dxbc::RootSignatureDesc> getRootSignature() const {
     return RootSignature;
   }
 
diff --git a/llvm/include/llvm/ObjectYAML/DXContainerYAML.h b/llvm/include/llvm/ObjectYAML/DXContainerYAML.h
index 9b25c5c33e7ef..bb232543cd3b0 100644
--- a/llvm/include/llvm/ObjectYAML/DXContainerYAML.h
+++ b/llvm/include/llvm/ObjectYAML/DXContainerYAML.h
@@ -72,7 +72,6 @@ struct ShaderHash {
   std::vector<llvm::yaml::Hex8> Digest;
 };
 
-
 #define ROOT_ELEMENT_FLAG(Num, Val) bool Val = false;
 struct RootSignatureDesc {
   RootSignatureDesc() = default;
diff --git a/llvm/lib/ObjectYAML/DXContainerEmitter.cpp b/llvm/lib/ObjectYAML/DXContainerEmitter.cpp
index e5561fe44375d..3ac539c8e0853 100644
--- a/llvm/lib/ObjectYAML/DXContainerEmitter.cpp
+++ b/llvm/lib/ObjectYAML/DXContainerEmitter.cpp
@@ -267,7 +267,7 @@ void DXContainerWriter::writeParts(raw_ostream &OS) {
       uint32_t Flags = P.RootSignature->getEncodedFlags();
       if (sys::IsBigEndianHost)
         sys::swapByteOrder(Flags);
-     dxbc::RootSignatureDesc RS = {P.RootSignature->Version, Flags};
+      dxbc::RootSignatureDesc RS = {P.RootSignature->Version, Flags};
       if (sys::IsBigEndianHost)
         RS.swapBytes();
       OS.write(reinterpret_cast<char *>(&RS), sizeof(dxbc::RootSignatureDesc));
diff --git a/llvm/lib/ObjectYAML/DXContainerYAML.cpp b/llvm/lib/ObjectYAML/DXContainerYAML.cpp
index d226a5b2e5942..80f4587a06ff5 100644
--- a/llvm/lib/ObjectYAML/DXContainerYAML.cpp
+++ b/llvm/lib/ObjectYAML/DXContainerYAML.cpp
@@ -30,17 +30,17 @@ DXContainerYAML::ShaderFeatureFlags::ShaderFeatureFlags(uint64_t FlagData) {
 #include "llvm/BinaryFormat/DXContainerConstants.def"
 }
 
-
-DXContainerYAML::RootSignatureDesc::RootSignatureDesc(const dxbc::RootSignatureDesc &Data): Version(Data.Version) {
-#define ROOT_ELEMENT_FLAG(Num, Val)                      \
+DXContainerYAML::RootSignatureDesc::RootSignatureDesc(
+    const dxbc::RootSignatureDesc &Data)
+    : Version(Data.Version) {
+#define ROOT_ELEMENT_FLAG(Num, Val)                                            \
   Val = (Data.Flags & (uint32_t)dxbc::RootElementFlag::Val) > 0;
 #include "llvm/BinaryFormat/DXContainerConstants.def"
 }
 
-
 uint32_t DXContainerYAML::RootSignatureDesc::getEncodedFlags() {
   uint64_t Flag = 0;
-#define ROOT_ELEMENT_FLAG(Num, Val)                      \
+#define ROOT_ELEMENT_FLAG(Num, Val)                                            \
   if (Val)                                                                     \
     Flag |= (uint32_t)dxbc::RootElementFlag::Val;
 #include "llvm/BinaryFormat/DXContainerConstants.def"
@@ -209,9 +209,8 @@ void MappingTraits<DXContainerYAML::Signature>::mapping(
 void MappingTraits<DXContainerYAML::RootSignatureDesc>::mapping(
     IO &IO, DXContainerYAML::RootSignatureDesc &S) {
   IO.mapRequired("Version", S.Version);
-  #define ROOT_ELEMENT_FLAG(Num, Val)                      \
-    IO.mapRequired(#Val, S.Val);
-  #include "llvm/BinaryFormat/DXContainerConstants.def"
+#define ROOT_ELEMENT_FLAG(Num, Val) IO.mapRequired(#Val, S.Val);
+#include "llvm/BinaryFormat/DXContainerConstants.def"
 }
 
 void MappingTraits<DXContainerYAML::Part>::mapping(IO &IO,

>From 6aaa0a5a0d8a9bf7bf6514ed4960ec9ef8bae9a4 Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Wed, 15 Jan 2025 18:21:06 +0000
Subject: [PATCH 09/64] renaming test

---
 ...otSignature-FlagsRootElement.yaml => RootSignature-Flags.yaml} | 0
 1 file changed, 0 insertions(+), 0 deletions(-)
 rename llvm/test/ObjectYAML/DXContainer/{RootSignature-FlagsRootElement.yaml => RootSignature-Flags.yaml} (100%)

diff --git a/llvm/test/ObjectYAML/DXContainer/RootSignature-FlagsRootElement.yaml b/llvm/test/ObjectYAML/DXContainer/RootSignature-Flags.yaml
similarity index 100%
rename from llvm/test/ObjectYAML/DXContainer/RootSignature-FlagsRootElement.yaml
rename to llvm/test/ObjectYAML/DXContainer/RootSignature-Flags.yaml

>From 916b2f17afef4e7b79818596551df44c75a55016 Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Thu, 16 Jan 2025 22:16:45 +0000
Subject: [PATCH 10/64] addressing pr comments

---
 llvm/include/llvm/BinaryFormat/DXContainer.h  |  2 +-
 .../BinaryFormat/DXContainerConstants.def     | 24 +++++++++----------
 .../include/llvm/ObjectYAML/DXContainerYAML.h |  2 +-
 llvm/lib/Object/DXContainer.cpp               |  1 -
 llvm/lib/ObjectYAML/DXContainerYAML.cpp       |  6 ++---
 llvm/tools/obj2yaml/dxcontainer2yaml.cpp      |  3 +--
 6 files changed, 18 insertions(+), 20 deletions(-)

diff --git a/llvm/include/llvm/BinaryFormat/DXContainer.h b/llvm/include/llvm/BinaryFormat/DXContainer.h
index 74003387a249e..605281df31ed4 100644
--- a/llvm/include/llvm/BinaryFormat/DXContainer.h
+++ b/llvm/include/llvm/BinaryFormat/DXContainer.h
@@ -161,7 +161,7 @@ enum class FeatureFlags : uint64_t {
 static_assert((uint64_t)FeatureFlags::NextUnusedBit <= 1ull << 63,
               "Shader flag bits exceed enum size.");
 
-#define ROOT_ELEMENT_FLAG(Num, Val) Val = 1ull << Num,
+#define ROOT_ELEMENT_FLAG(Num, Val, Str) Val = 1ull << Num,
 enum class RootElementFlag : uint32_t {
 #include "DXContainerConstants.def"
 };
diff --git a/llvm/include/llvm/BinaryFormat/DXContainerConstants.def b/llvm/include/llvm/BinaryFormat/DXContainerConstants.def
index b351b9a01773c..a382cd714ce7f 100644
--- a/llvm/include/llvm/BinaryFormat/DXContainerConstants.def
+++ b/llvm/include/llvm/BinaryFormat/DXContainerConstants.def
@@ -56,18 +56,18 @@ SHADER_FEATURE_FLAG(31, 36, NextUnusedBit, "Next reserved shader flag bit (not a
 #ifdef ROOT_ELEMENT_FLAG
 
 
-ROOT_ELEMENT_FLAG(0, AllowInputAssemblerInputLayout)
-ROOT_ELEMENT_FLAG(1, DenyVertexShaderRootAccess)
-ROOT_ELEMENT_FLAG(2, DenyHullShaderRootAccess)
-ROOT_ELEMENT_FLAG(3, DenyDomainShaderRootAccess)
-ROOT_ELEMENT_FLAG(4, DenyGeometryShaderRootAccess)
-ROOT_ELEMENT_FLAG(5, DenyPixelShaderRootAccess)
-ROOT_ELEMENT_FLAG(6, AllowStreamOutput)
-ROOT_ELEMENT_FLAG(7, LocalRootSignature)
-ROOT_ELEMENT_FLAG(8, DenyAmplificationShaderRootAccess)
-ROOT_ELEMENT_FLAG(9, DenyMeshShaderRootAccess)
-ROOT_ELEMENT_FLAG(10, CBVSRVUAVHeapDirectlyIndexed)
-ROOT_ELEMENT_FLAG(11, SamplerHeapDirectlyIndexed)
+ROOT_ELEMENT_FLAG(0, AllowInputAssemblerInputLayout, "")
+ROOT_ELEMENT_FLAG(1, DenyVertexShaderRootAccess, "")
+ROOT_ELEMENT_FLAG(2, DenyHullShaderRootAccess, "")
+ROOT_ELEMENT_FLAG(3, DenyDomainShaderRootAccess, "")
+ROOT_ELEMENT_FLAG(4, DenyGeometryShaderRootAccess, "")
+ROOT_ELEMENT_FLAG(5, DenyPixelShaderRootAccess, "")
+ROOT_ELEMENT_FLAG(6, AllowStreamOutput, "")
+ROOT_ELEMENT_FLAG(7, LocalRootSignature, "")
+ROOT_ELEMENT_FLAG(8, DenyAmplificationShaderRootAccess, "")
+ROOT_ELEMENT_FLAG(9, DenyMeshShaderRootAccess, "")
+ROOT_ELEMENT_FLAG(10, CBVSRVUAVHeapDirectlyIndexed, "")
+ROOT_ELEMENT_FLAG(11, SamplerHeapDirectlyIndexed, "")
 #undef ROOT_ELEMENT_FLAG
 #endif // ROOT_ELEMENT_FLAG
 
diff --git a/llvm/include/llvm/ObjectYAML/DXContainerYAML.h b/llvm/include/llvm/ObjectYAML/DXContainerYAML.h
index bb232543cd3b0..755c81541e5db 100644
--- a/llvm/include/llvm/ObjectYAML/DXContainerYAML.h
+++ b/llvm/include/llvm/ObjectYAML/DXContainerYAML.h
@@ -72,7 +72,7 @@ struct ShaderHash {
   std::vector<llvm::yaml::Hex8> Digest;
 };
 
-#define ROOT_ELEMENT_FLAG(Num, Val) bool Val = false;
+#define ROOT_ELEMENT_FLAG(Num, Val, Str) bool Val = false;
 struct RootSignatureDesc {
   RootSignatureDesc() = default;
   RootSignatureDesc(const dxbc::RootSignatureDesc &Data);
diff --git a/llvm/lib/Object/DXContainer.cpp b/llvm/lib/Object/DXContainer.cpp
index b7eff25ed7b33..160844f73669a 100644
--- a/llvm/lib/Object/DXContainer.cpp
+++ b/llvm/lib/Object/DXContainer.cpp
@@ -206,7 +206,6 @@ Error DXContainer::parsePartOffsets() {
     case dxbc::PartType::RTS0:
       if (Error Err = parseRootSignature(PartData))
         return Err;
-
       break;
     }
   }
diff --git a/llvm/lib/ObjectYAML/DXContainerYAML.cpp b/llvm/lib/ObjectYAML/DXContainerYAML.cpp
index 80f4587a06ff5..682216e5febec 100644
--- a/llvm/lib/ObjectYAML/DXContainerYAML.cpp
+++ b/llvm/lib/ObjectYAML/DXContainerYAML.cpp
@@ -33,14 +33,14 @@ DXContainerYAML::ShaderFeatureFlags::ShaderFeatureFlags(uint64_t FlagData) {
 DXContainerYAML::RootSignatureDesc::RootSignatureDesc(
     const dxbc::RootSignatureDesc &Data)
     : Version(Data.Version) {
-#define ROOT_ELEMENT_FLAG(Num, Val)                                            \
+#define ROOT_ELEMENT_FLAG(Num, Val, Str)                                            \
   Val = (Data.Flags & (uint32_t)dxbc::RootElementFlag::Val) > 0;
 #include "llvm/BinaryFormat/DXContainerConstants.def"
 }
 
 uint32_t DXContainerYAML::RootSignatureDesc::getEncodedFlags() {
   uint64_t Flag = 0;
-#define ROOT_ELEMENT_FLAG(Num, Val)                                            \
+#define ROOT_ELEMENT_FLAG(Num, Val, Str)                                            \
   if (Val)                                                                     \
     Flag |= (uint32_t)dxbc::RootElementFlag::Val;
 #include "llvm/BinaryFormat/DXContainerConstants.def"
@@ -209,7 +209,7 @@ void MappingTraits<DXContainerYAML::Signature>::mapping(
 void MappingTraits<DXContainerYAML::RootSignatureDesc>::mapping(
     IO &IO, DXContainerYAML::RootSignatureDesc &S) {
   IO.mapRequired("Version", S.Version);
-#define ROOT_ELEMENT_FLAG(Num, Val) IO.mapRequired(#Val, S.Val);
+#define ROOT_ELEMENT_FLAG(Num, Val, Str) IO.mapRequired(#Val, S.Val);
 #include "llvm/BinaryFormat/DXContainerConstants.def"
 }
 
diff --git a/llvm/tools/obj2yaml/dxcontainer2yaml.cpp b/llvm/tools/obj2yaml/dxcontainer2yaml.cpp
index 6ae0a0859b48e..9588a8277dad7 100644
--- a/llvm/tools/obj2yaml/dxcontainer2yaml.cpp
+++ b/llvm/tools/obj2yaml/dxcontainer2yaml.cpp
@@ -155,10 +155,9 @@ dumpDXContainer(MemoryBufferRef Source) {
       break;
     case dxbc::PartType::RTS0:
       std::optional<dxbc::RootSignatureDesc> RS = Container.getRootSignature();
-      if (RS && RS.has_value())
+      if (RS.has_value())
         NewPart.RootSignature = DXContainerYAML::RootSignatureDesc(*RS);
       break;
-      break;
     }
   }
 

>From d9bce0a1d80155b342726189e929dabb4ec3fb90 Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Thu, 16 Jan 2025 22:20:18 +0000
Subject: [PATCH 11/64] adding str to ROOT_ELEMENT_FLAG

---
 .../BinaryFormat/DXContainerConstants.def     | 24 +++++++++----------
 1 file changed, 12 insertions(+), 12 deletions(-)

diff --git a/llvm/include/llvm/BinaryFormat/DXContainerConstants.def b/llvm/include/llvm/BinaryFormat/DXContainerConstants.def
index a382cd714ce7f..300d0dd2797c9 100644
--- a/llvm/include/llvm/BinaryFormat/DXContainerConstants.def
+++ b/llvm/include/llvm/BinaryFormat/DXContainerConstants.def
@@ -56,18 +56,18 @@ SHADER_FEATURE_FLAG(31, 36, NextUnusedBit, "Next reserved shader flag bit (not a
 #ifdef ROOT_ELEMENT_FLAG
 
 
-ROOT_ELEMENT_FLAG(0, AllowInputAssemblerInputLayout, "")
-ROOT_ELEMENT_FLAG(1, DenyVertexShaderRootAccess, "")
-ROOT_ELEMENT_FLAG(2, DenyHullShaderRootAccess, "")
-ROOT_ELEMENT_FLAG(3, DenyDomainShaderRootAccess, "")
-ROOT_ELEMENT_FLAG(4, DenyGeometryShaderRootAccess, "")
-ROOT_ELEMENT_FLAG(5, DenyPixelShaderRootAccess, "")
-ROOT_ELEMENT_FLAG(6, AllowStreamOutput, "")
-ROOT_ELEMENT_FLAG(7, LocalRootSignature, "")
-ROOT_ELEMENT_FLAG(8, DenyAmplificationShaderRootAccess, "")
-ROOT_ELEMENT_FLAG(9, DenyMeshShaderRootAccess, "")
-ROOT_ELEMENT_FLAG(10, CBVSRVUAVHeapDirectlyIndexed, "")
-ROOT_ELEMENT_FLAG(11, SamplerHeapDirectlyIndexed, "")
+ROOT_ELEMENT_FLAG(0, AllowInputAssemblerInputLayout, "The app is opting in to using the Input Assembler")
+ROOT_ELEMENT_FLAG(1, DenyVertexShaderRootAccess, "Denies the vertex shader access to the root signature.")
+ROOT_ELEMENT_FLAG(2, DenyHullShaderRootAccess, "Denies the hull shader access to the root signature.")
+ROOT_ELEMENT_FLAG(3, DenyDomainShaderRootAccess, "Denies the domain shader access to the root signature.")
+ROOT_ELEMENT_FLAG(4, DenyGeometryShaderRootAccess, "Denies the geometry shader access to the root signature.")
+ROOT_ELEMENT_FLAG(5, DenyPixelShaderRootAccess, "Denies the pixel shader access to the root signature.")
+ROOT_ELEMENT_FLAG(6, AllowStreamOutput, "The app is opting in to using Stream Output.")
+ROOT_ELEMENT_FLAG(7, LocalRootSignature, "The root signature is to be used with raytracing shaders to define resource bindings sourced from shader records in shader tables.")
+ROOT_ELEMENT_FLAG(8, DenyAmplificationShaderRootAccess, "Denies the amplification shader access to the root signature.")
+ROOT_ELEMENT_FLAG(9, DenyMeshShaderRootAccess, "Denies the mesh shader access to the root signature.")
+ROOT_ELEMENT_FLAG(10, CBVSRVUAVHeapDirectlyIndexed, "The shaders are allowed to index the CBV/SRV/UAV descriptor heap directly, using the ResourceDescriptorHeap built-in variable.")
+ROOT_ELEMENT_FLAG(11, SamplerHeapDirectlyIndexed, "The shaders are allowed to index the sampler descriptor heap directly, using the SamplerDescriptorHeap built-in variable.")
 #undef ROOT_ELEMENT_FLAG
 #endif // ROOT_ELEMENT_FLAG
 

>From e7676ed42376dea921f74a0f9c5f3d422235a08f Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Fri, 17 Jan 2025 07:28:09 +0000
Subject: [PATCH 12/64] formating

---
 llvm/lib/ObjectYAML/DXContainerYAML.cpp | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/llvm/lib/ObjectYAML/DXContainerYAML.cpp b/llvm/lib/ObjectYAML/DXContainerYAML.cpp
index 682216e5febec..0351239cac2c1 100644
--- a/llvm/lib/ObjectYAML/DXContainerYAML.cpp
+++ b/llvm/lib/ObjectYAML/DXContainerYAML.cpp
@@ -33,14 +33,14 @@ DXContainerYAML::ShaderFeatureFlags::ShaderFeatureFlags(uint64_t FlagData) {
 DXContainerYAML::RootSignatureDesc::RootSignatureDesc(
     const dxbc::RootSignatureDesc &Data)
     : Version(Data.Version) {
-#define ROOT_ELEMENT_FLAG(Num, Val, Str)                                            \
+#define ROOT_ELEMENT_FLAG(Num, Val, Str)                                       \
   Val = (Data.Flags & (uint32_t)dxbc::RootElementFlag::Val) > 0;
 #include "llvm/BinaryFormat/DXContainerConstants.def"
 }
 
 uint32_t DXContainerYAML::RootSignatureDesc::getEncodedFlags() {
   uint64_t Flag = 0;
-#define ROOT_ELEMENT_FLAG(Num, Val, Str)                                            \
+#define ROOT_ELEMENT_FLAG(Num, Val, Str)                                       \
   if (Val)                                                                     \
     Flag |= (uint32_t)dxbc::RootElementFlag::Val;
 #include "llvm/BinaryFormat/DXContainerConstants.def"

>From a0cee57b8ea574a67704b3aa1a0b820c99820b57 Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Sat, 18 Jan 2025 00:03:15 +0000
Subject: [PATCH 13/64] refactoring to follow llvm standards

---
 .../llvm/MC/DXContainerRootSignature.h        | 27 +++++++++++++++++
 llvm/include/llvm/Object/DXContainer.h        | 23 +++++++++++++--
 .../include/llvm/ObjectYAML/DXContainerYAML.h |  3 +-
 llvm/lib/MC/CMakeLists.txt                    |  1 +
 llvm/lib/MC/DXContainerRootSignature.cpp      | 29 +++++++++++++++++++
 llvm/lib/Object/DXContainer.cpp               | 18 ++++++++++--
 llvm/lib/ObjectYAML/DXContainerEmitter.cpp    | 14 ++++-----
 llvm/lib/ObjectYAML/DXContainerYAML.cpp       |  8 +++--
 llvm/tools/obj2yaml/dxcontainer2yaml.cpp      |  2 +-
 9 files changed, 109 insertions(+), 16 deletions(-)
 create mode 100644 llvm/include/llvm/MC/DXContainerRootSignature.h
 create mode 100644 llvm/lib/MC/DXContainerRootSignature.cpp

diff --git a/llvm/include/llvm/MC/DXContainerRootSignature.h b/llvm/include/llvm/MC/DXContainerRootSignature.h
new file mode 100644
index 0000000000000..3926193697a49
--- /dev/null
+++ b/llvm/include/llvm/MC/DXContainerRootSignature.h
@@ -0,0 +1,27 @@
+//===- llvm/MC/DXContainerRootSignature.h - DXContainer RootSignature -*- C++
+//-------*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include <cstdint>
+#include <limits>
+
+namespace llvm {
+
+class raw_ostream;
+
+namespace mcdxbc {
+struct RootSignatureHeader {
+  uint32_t Version;
+  uint32_t Flags;
+
+  void swapBytes();
+  void write(raw_ostream &OS,
+             uint32_t Version = std::numeric_limits<uint32_t>::max());
+};
+} // namespace mcdxbc
+} // namespace llvm
diff --git a/llvm/include/llvm/Object/DXContainer.h b/llvm/include/llvm/Object/DXContainer.h
index 8574a04027ce4..0e93a0f1d9615 100644
--- a/llvm/include/llvm/Object/DXContainer.h
+++ b/llvm/include/llvm/Object/DXContainer.h
@@ -22,6 +22,8 @@
 #include "llvm/Support/MemoryBufferRef.h"
 #include "llvm/TargetParser/Triple.h"
 #include <array>
+#include <cstdint>
+#include <sys/types.h>
 #include <variant>
 
 namespace llvm {
@@ -116,6 +118,23 @@ template <typename T> struct ViewArray {
 };
 
 namespace DirectX {
+
+class RootSignature {
+private:
+  StringRef Data;
+  uint32_t Version;
+  uint32_t Flags;
+
+public:
+  RootSignature(StringRef Data) : Data(Data) {}
+
+  Error parse();
+
+  uint32_t getVersion() const { return Version; }
+
+  uint32_t getFlags() const { return Flags; }
+};
+
 class PSVRuntimeInfo {
 
   using ResourceArray = ViewArray<dxbc::PSV::v2::ResourceBindInfo>;
@@ -287,7 +306,7 @@ class DXContainer {
   std::optional<uint64_t> ShaderFeatureFlags;
   std::optional<dxbc::ShaderHash> Hash;
   std::optional<DirectX::PSVRuntimeInfo> PSVInfo;
-  std::optional<dxbc::RootSignatureDesc> RootSignature;
+  std::optional<DirectX::RootSignature> RootSignature;
   DirectX::Signature InputSignature;
   DirectX::Signature OutputSignature;
   DirectX::Signature PatchConstantSignature;
@@ -384,7 +403,7 @@ class DXContainer {
 
   std::optional<dxbc::ShaderHash> getShaderHash() const { return Hash; }
 
-  std::optional<dxbc::RootSignatureDesc> getRootSignature() const {
+  std::optional<DirectX::RootSignature> getRootSignature() const {
     return RootSignature;
   }
 
diff --git a/llvm/include/llvm/ObjectYAML/DXContainerYAML.h b/llvm/include/llvm/ObjectYAML/DXContainerYAML.h
index 755c81541e5db..eb514c1976759 100644
--- a/llvm/include/llvm/ObjectYAML/DXContainerYAML.h
+++ b/llvm/include/llvm/ObjectYAML/DXContainerYAML.h
@@ -17,6 +17,7 @@
 
 #include "llvm/ADT/StringRef.h"
 #include "llvm/BinaryFormat/DXContainer.h"
+#include "llvm/Object/DXContainer.h"
 #include "llvm/ObjectYAML/YAML.h"
 #include "llvm/Support/YAMLTraits.h"
 #include <array>
@@ -75,7 +76,7 @@ struct ShaderHash {
 #define ROOT_ELEMENT_FLAG(Num, Val, Str) bool Val = false;
 struct RootSignatureDesc {
   RootSignatureDesc() = default;
-  RootSignatureDesc(const dxbc::RootSignatureDesc &Data);
+  RootSignatureDesc(const object::DirectX::RootSignature &Data);
 
   uint32_t getEncodedFlags();
   uint32_t Version;
diff --git a/llvm/lib/MC/CMakeLists.txt b/llvm/lib/MC/CMakeLists.txt
index e1d19196c8766..f49f14c848b90 100644
--- a/llvm/lib/MC/CMakeLists.txt
+++ b/llvm/lib/MC/CMakeLists.txt
@@ -1,6 +1,7 @@
 add_llvm_component_library(LLVMMC
   ConstantPools.cpp
   DXContainerPSVInfo.cpp
+  DXContainerRootSignature.cpp
   ELFObjectWriter.cpp
   GOFFObjectWriter.cpp
   MCAsmBackend.cpp
diff --git a/llvm/lib/MC/DXContainerRootSignature.cpp b/llvm/lib/MC/DXContainerRootSignature.cpp
new file mode 100644
index 0000000000000..331d5131fce7b
--- /dev/null
+++ b/llvm/lib/MC/DXContainerRootSignature.cpp
@@ -0,0 +1,29 @@
+//===- llvm/MC/DXContainerRootSignature.cpp - DXContainer RootSignature -*- C++
+//-------*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "llvm/MC/DXContainerRootSignature.h"
+#include "llvm/Support/EndianStream.h"
+#include "llvm/Support/SwapByteOrder.h"
+#include <iterator>
+
+using namespace llvm;
+using namespace llvm::mcdxbc;
+
+void RootSignatureHeader::write(raw_ostream &OS, uint32_t Version) {
+
+  uint32_t SizeInfo = sizeof(this);
+  // support::endian::write(OS, SizeInfo, llvm::endianness::little);
+
+  if (sys::IsBigEndianHost) {
+    sys::swapByteOrder(Version);
+    sys::swapByteOrder(Flags);
+  }
+
+  OS.write(reinterpret_cast<const char *>(this), SizeInfo);
+}
diff --git a/llvm/lib/Object/DXContainer.cpp b/llvm/lib/Object/DXContainer.cpp
index 160844f73669a..3d67a7bc0a566 100644
--- a/llvm/lib/Object/DXContainer.cpp
+++ b/llvm/lib/Object/DXContainer.cpp
@@ -95,8 +95,8 @@ Error DXContainer::parseHash(StringRef Part) {
 Error DXContainer::parseRootSignature(StringRef Part) {
   if (RootSignature)
     return parseFailed("More than one RTS0 part is present in the file");
-  dxbc::RootSignatureDesc Desc;
-  if (Error Err = readStruct(Part, Part.begin(), Desc))
+  DirectX::RootSignature Desc(Part);
+  if (Error Err = Desc.parse())
     return Err;
   RootSignature = Desc;
   return Error::success();
@@ -242,6 +242,20 @@ void DXContainer::PartIterator::updateIteratorImpl(const uint32_t Offset) {
   IteratorState.Offset = Offset;
 }
 
+Error DirectX::RootSignature::parse() {
+  const char *Current = Data.begin();
+  dxbc::RootSignatureDesc Desc;
+  if (Error Err = readStruct(Data, Current, Desc))
+    return Err;
+
+  if (sys::IsBigEndianHost)
+    Desc.swapBytes();
+
+  Version = Desc.Version;
+  Flags = Desc.Flags;
+  return Error::success();
+}
+
 Error DirectX::PSVRuntimeInfo::parse(uint16_t ShaderKind) {
   Triple::EnvironmentType ShaderStage = dxbc::getShaderStage(ShaderKind);
 
diff --git a/llvm/lib/ObjectYAML/DXContainerEmitter.cpp b/llvm/lib/ObjectYAML/DXContainerEmitter.cpp
index 3ac539c8e0853..0504f6b88a7db 100644
--- a/llvm/lib/ObjectYAML/DXContainerEmitter.cpp
+++ b/llvm/lib/ObjectYAML/DXContainerEmitter.cpp
@@ -13,6 +13,7 @@
 
 #include "llvm/BinaryFormat/DXContainer.h"
 #include "llvm/MC/DXContainerPSVInfo.h"
+#include "llvm/MC/DXContainerRootSignature.h"
 #include "llvm/ObjectYAML/ObjectYAML.h"
 #include "llvm/ObjectYAML/yaml2obj.h"
 #include "llvm/Support/Errc.h"
@@ -264,13 +265,12 @@ void DXContainerWriter::writeParts(raw_ostream &OS) {
     case dxbc::PartType::RTS0:
       if (!P.RootSignature.has_value())
         continue;
-      uint32_t Flags = P.RootSignature->getEncodedFlags();
-      if (sys::IsBigEndianHost)
-        sys::swapByteOrder(Flags);
-      dxbc::RootSignatureDesc RS = {P.RootSignature->Version, Flags};
-      if (sys::IsBigEndianHost)
-        RS.swapBytes();
-      OS.write(reinterpret_cast<char *>(&RS), sizeof(dxbc::RootSignatureDesc));
+
+      mcdxbc::RootSignatureHeader Header;
+      Header.Version = P.RootSignature->Version;
+      Header.Flags = P.RootSignature->getEncodedFlags();
+
+      Header.write(OS);
       break;
     }
     uint64_t BytesWritten = OS.tell() - DataStart;
diff --git a/llvm/lib/ObjectYAML/DXContainerYAML.cpp b/llvm/lib/ObjectYAML/DXContainerYAML.cpp
index 0351239cac2c1..aeae3d9f3958a 100644
--- a/llvm/lib/ObjectYAML/DXContainerYAML.cpp
+++ b/llvm/lib/ObjectYAML/DXContainerYAML.cpp
@@ -14,6 +14,7 @@
 #include "llvm/ObjectYAML/DXContainerYAML.h"
 #include "llvm/ADT/ScopeExit.h"
 #include "llvm/BinaryFormat/DXContainer.h"
+#include "llvm/Object/DXContainer.h"
 #include "llvm/Support/ScopedPrinter.h"
 #include <cstdint>
 
@@ -31,10 +32,11 @@ DXContainerYAML::ShaderFeatureFlags::ShaderFeatureFlags(uint64_t FlagData) {
 }
 
 DXContainerYAML::RootSignatureDesc::RootSignatureDesc(
-    const dxbc::RootSignatureDesc &Data)
-    : Version(Data.Version) {
+    const object::DirectX::RootSignature &Data)
+    : Version(Data.getVersion()) {
+  uint32_t Flags = Data.getFlags();
 #define ROOT_ELEMENT_FLAG(Num, Val, Str)                                       \
-  Val = (Data.Flags & (uint32_t)dxbc::RootElementFlag::Val) > 0;
+  Val = (Flags & (uint32_t)dxbc::RootElementFlag::Val) > 0;
 #include "llvm/BinaryFormat/DXContainerConstants.def"
 }
 
diff --git a/llvm/tools/obj2yaml/dxcontainer2yaml.cpp b/llvm/tools/obj2yaml/dxcontainer2yaml.cpp
index 9588a8277dad7..54a912d9438af 100644
--- a/llvm/tools/obj2yaml/dxcontainer2yaml.cpp
+++ b/llvm/tools/obj2yaml/dxcontainer2yaml.cpp
@@ -154,7 +154,7 @@ dumpDXContainer(MemoryBufferRef Source) {
     case dxbc::PartType::Unknown:
       break;
     case dxbc::PartType::RTS0:
-      std::optional<dxbc::RootSignatureDesc> RS = Container.getRootSignature();
+      std::optional<DirectX::RootSignature> RS = Container.getRootSignature();
       if (RS.has_value())
         NewPart.RootSignature = DXContainerYAML::RootSignatureDesc(*RS);
       break;

>From 1e7a1fe405d911d478b8ecdb886a4db33b201500 Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Mon, 27 Jan 2025 21:13:51 +0000
Subject: [PATCH 14/64] addressing comments

---
 llvm/include/llvm/BinaryFormat/DXContainer.h  | 31 +++++++++++++++++++
 .../BinaryFormat/DXContainerConstants.def     | 25 ++++++++++++++-
 .../llvm/MC/DXContainerRootSignature.h        |  3 +-
 llvm/include/llvm/Object/DXContainer.h        |  3 ++
 .../include/llvm/ObjectYAML/DXContainerYAML.h |  5 +++
 llvm/lib/MC/DXContainerRootSignature.cpp      | 16 +++-------
 llvm/lib/Object/DXContainer.cpp               | 21 +++++++------
 llvm/lib/ObjectYAML/DXContainerYAML.cpp       |  5 +--
 .../DXContainer/RootSignature-Flags.yaml      | 26 ++--------------
 9 files changed, 86 insertions(+), 49 deletions(-)

diff --git a/llvm/include/llvm/BinaryFormat/DXContainer.h b/llvm/include/llvm/BinaryFormat/DXContainer.h
index 605281df31ed4..dbe1aee97b174 100644
--- a/llvm/include/llvm/BinaryFormat/DXContainer.h
+++ b/llvm/include/llvm/BinaryFormat/DXContainer.h
@@ -13,10 +13,12 @@
 #ifndef LLVM_BINARYFORMAT_DXCONTAINER_H
 #define LLVM_BINARYFORMAT_DXCONTAINER_H
 
+#include "llvm/ADT/SmallVector.h"
 #include "llvm/ADT/StringRef.h"
 #include "llvm/Support/SwapByteOrder.h"
 #include "llvm/TargetParser/Triple.h"
 
+#include <cstdint>
 #include <stdint.h>
 
 namespace llvm {
@@ -63,10 +65,39 @@ struct ShaderHash {
   void swapBytes() { sys::swapByteOrder(Flags); }
 };
 
+#define ROOT_PARAMETER(RootParameter) RootParameter,
+enum class RootParameterType {
+#include "DXContainerConstants.def"
+};
+
+#define SHADER_VISIBILITY(ShaderVisibility) ShaderVisibility,
+enum class ShaderVisibilityFlag {
+#include "DXContainerConstants.def"
+};
+
+struct RootConstants {
+  uint32_t ShaderRegister;
+  uint32_t RegisterSpace;
+  uint32_t Num32BitValues;
+};
+
+struct RootParameter {
+  RootParameterType ParameterType;
+  union {
+    RootConstants Constants;
+  };
+  ShaderVisibilityFlag ShaderVisibility;
+};
+
 struct RootSignatureDesc {
+  uint32_t Size;
   uint32_t Version;
   uint32_t Flags;
+  uint32_t NumParameters;
+  RootParameter *Parameters;
+
   void swapBytes() {
+    sys::swapByteOrder(Size);
     sys::swapByteOrder(Version);
     sys::swapByteOrder(Flags);
   }
diff --git a/llvm/include/llvm/BinaryFormat/DXContainerConstants.def b/llvm/include/llvm/BinaryFormat/DXContainerConstants.def
index 300d0dd2797c9..2134c2375f6d3 100644
--- a/llvm/include/llvm/BinaryFormat/DXContainerConstants.def
+++ b/llvm/include/llvm/BinaryFormat/DXContainerConstants.def
@@ -53,8 +53,31 @@ SHADER_FEATURE_FLAG(31, 36, NextUnusedBit, "Next reserved shader flag bit (not a
 #undef SHADER_FEATURE_FLAG
 #endif // SHADER_FEATURE_FLAG
 
-#ifdef ROOT_ELEMENT_FLAG
+#ifdef ROOT_PARAMETER
+
+ROOT_PARAMETER(DescriptorTable)
+ROOT_PARAMETER(Constants32Bit)
+ROOT_PARAMETER(CBV)
+ROOT_PARAMETER(SRV)
+ROOT_PARAMETER(UAV)
+#undef ROOT_PARAMETER
+#endif // ROOT_PARAMETER
+
+
+#ifdef SHADER_VISIBILITY
+
+SHADER_VISIBILITY(All)
+SHADER_VISIBILITY(Vertex)
+SHADER_VISIBILITY(Hull)
+SHADER_VISIBILITY(Domain)
+SHADER_VISIBILITY(Geometry)
+SHADER_VISIBILITY(Pixel)
+SHADER_VISIBILITY(Amplification)
+SHADER_VISIBILITY(Mesh)
+#undef SHADER_VISIBILITY
+#endif // SHADER_VISIBILITY
 
+#ifdef ROOT_ELEMENT_FLAG
 
 ROOT_ELEMENT_FLAG(0, AllowInputAssemblerInputLayout, "The app is opting in to using the Input Assembler")
 ROOT_ELEMENT_FLAG(1, DenyVertexShaderRootAccess, "Denies the vertex shader access to the root signature.")
diff --git a/llvm/include/llvm/MC/DXContainerRootSignature.h b/llvm/include/llvm/MC/DXContainerRootSignature.h
index 3926193697a49..d83ae28ffd692 100644
--- a/llvm/include/llvm/MC/DXContainerRootSignature.h
+++ b/llvm/include/llvm/MC/DXContainerRootSignature.h
@@ -20,8 +20,7 @@ struct RootSignatureHeader {
   uint32_t Flags;
 
   void swapBytes();
-  void write(raw_ostream &OS,
-             uint32_t Version = std::numeric_limits<uint32_t>::max());
+  void write(raw_ostream &OS);
 };
 } // namespace mcdxbc
 } // namespace llvm
diff --git a/llvm/include/llvm/Object/DXContainer.h b/llvm/include/llvm/Object/DXContainer.h
index 0e93a0f1d9615..07a3c872ac83d 100644
--- a/llvm/include/llvm/Object/DXContainer.h
+++ b/llvm/include/llvm/Object/DXContainer.h
@@ -122,6 +122,7 @@ namespace DirectX {
 class RootSignature {
 private:
   StringRef Data;
+  uint32_t Size;
   uint32_t Version;
   uint32_t Flags;
 
@@ -130,6 +131,8 @@ class RootSignature {
 
   Error parse();
 
+  uint32_t getSize() const { return Size; }
+
   uint32_t getVersion() const { return Version; }
 
   uint32_t getFlags() const { return Flags; }
diff --git a/llvm/include/llvm/ObjectYAML/DXContainerYAML.h b/llvm/include/llvm/ObjectYAML/DXContainerYAML.h
index eb514c1976759..e9b318faee295 100644
--- a/llvm/include/llvm/ObjectYAML/DXContainerYAML.h
+++ b/llvm/include/llvm/ObjectYAML/DXContainerYAML.h
@@ -15,6 +15,7 @@
 #ifndef LLVM_OBJECTYAML_DXCONTAINERYAML_H
 #define LLVM_OBJECTYAML_DXCONTAINERYAML_H
 
+#include "llvm/ADT/SmallVector.h"
 #include "llvm/ADT/StringRef.h"
 #include "llvm/BinaryFormat/DXContainer.h"
 #include "llvm/Object/DXContainer.h"
@@ -79,7 +80,11 @@ struct RootSignatureDesc {
   RootSignatureDesc(const object::DirectX::RootSignature &Data);
 
   uint32_t getEncodedFlags();
+  uint32_t Size;
   uint32_t Version;
+  uint32_t NumParameters;
+  SmallVector<dxbc::RootParameter> Parameters;
+
 #include "llvm/BinaryFormat/DXContainerConstants.def"
 };
 
diff --git a/llvm/lib/MC/DXContainerRootSignature.cpp b/llvm/lib/MC/DXContainerRootSignature.cpp
index 331d5131fce7b..0bb87c2cc3832 100644
--- a/llvm/lib/MC/DXContainerRootSignature.cpp
+++ b/llvm/lib/MC/DXContainerRootSignature.cpp
@@ -1,5 +1,4 @@
-//===- llvm/MC/DXContainerRootSignature.cpp - DXContainer RootSignature -*- C++
-//-------*-===//
+//===- llvm/MC/DXContainerRootSignature.cpp - RootSignature -*- C++ -*-=======//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
@@ -15,15 +14,10 @@
 using namespace llvm;
 using namespace llvm::mcdxbc;
 
-void RootSignatureHeader::write(raw_ostream &OS, uint32_t Version) {
+void RootSignatureHeader::write(raw_ostream &OS) {
 
   uint32_t SizeInfo = sizeof(this);
-  // support::endian::write(OS, SizeInfo, llvm::endianness::little);
-
-  if (sys::IsBigEndianHost) {
-    sys::swapByteOrder(Version);
-    sys::swapByteOrder(Flags);
-  }
-
-  OS.write(reinterpret_cast<const char *>(this), SizeInfo);
+  support::endian::write(OS, SizeInfo, llvm::endianness::little);
+  support::endian::write(OS, Version, llvm::endianness::little);
+  support::endian::write(OS, Flags, llvm::endianness::little);
 }
diff --git a/llvm/lib/Object/DXContainer.cpp b/llvm/lib/Object/DXContainer.cpp
index 3d67a7bc0a566..ffb0b6884831b 100644
--- a/llvm/lib/Object/DXContainer.cpp
+++ b/llvm/lib/Object/DXContainer.cpp
@@ -10,6 +10,7 @@
 #include "llvm/BinaryFormat/DXContainer.h"
 #include "llvm/Object/Error.h"
 #include "llvm/Support/Alignment.h"
+#include "llvm/Support/Endian.h"
 #include "llvm/Support/FormatVariadic.h"
 
 using namespace llvm;
@@ -95,10 +96,9 @@ Error DXContainer::parseHash(StringRef Part) {
 Error DXContainer::parseRootSignature(StringRef Part) {
   if (RootSignature)
     return parseFailed("More than one RTS0 part is present in the file");
-  DirectX::RootSignature Desc(Part);
-  if (Error Err = Desc.parse())
+  RootSignature = DirectX::RootSignature(Part);
+  if (Error Err = RootSignature->parse())
     return Err;
-  RootSignature = Desc;
   return Error::success();
 }
 
@@ -244,15 +244,16 @@ void DXContainer::PartIterator::updateIteratorImpl(const uint32_t Offset) {
 
 Error DirectX::RootSignature::parse() {
   const char *Current = Data.begin();
-  dxbc::RootSignatureDesc Desc;
-  if (Error Err = readStruct(Data, Current, Desc))
-    return Err;
 
-  if (sys::IsBigEndianHost)
-    Desc.swapBytes();
+  Size = support::endian::read<uint32_t, llvm::endianness::little>(Current);
+  Current += sizeof(uint32_t);
+
+  Version = support::endian::read<uint32_t, llvm::endianness::little>(Current);
+  Current += sizeof(uint32_t);
+
+  Flags = support::endian::read<uint32_t, llvm::endianness::little>(Current);
+  Current += sizeof(uint32_t);
 
-  Version = Desc.Version;
-  Flags = Desc.Flags;
   return Error::success();
 }
 
diff --git a/llvm/lib/ObjectYAML/DXContainerYAML.cpp b/llvm/lib/ObjectYAML/DXContainerYAML.cpp
index aeae3d9f3958a..f3febcb09400f 100644
--- a/llvm/lib/ObjectYAML/DXContainerYAML.cpp
+++ b/llvm/lib/ObjectYAML/DXContainerYAML.cpp
@@ -33,7 +33,7 @@ DXContainerYAML::ShaderFeatureFlags::ShaderFeatureFlags(uint64_t FlagData) {
 
 DXContainerYAML::RootSignatureDesc::RootSignatureDesc(
     const object::DirectX::RootSignature &Data)
-    : Version(Data.getVersion()) {
+    : Size(Data.getSize()), Version(Data.getVersion()) {
   uint32_t Flags = Data.getFlags();
 #define ROOT_ELEMENT_FLAG(Num, Val, Str)                                       \
   Val = (Flags & (uint32_t)dxbc::RootElementFlag::Val) > 0;
@@ -210,8 +210,9 @@ void MappingTraits<DXContainerYAML::Signature>::mapping(
 
 void MappingTraits<DXContainerYAML::RootSignatureDesc>::mapping(
     IO &IO, DXContainerYAML::RootSignatureDesc &S) {
+  IO.mapRequired("Size", S.Size);
   IO.mapRequired("Version", S.Version);
-#define ROOT_ELEMENT_FLAG(Num, Val, Str) IO.mapRequired(#Val, S.Val);
+#define ROOT_ELEMENT_FLAG(Num, Val, Str) IO.mapOptional(#Val, S.Val, false);
 #include "llvm/BinaryFormat/DXContainerConstants.def"
 }
 
diff --git a/llvm/test/ObjectYAML/DXContainer/RootSignature-Flags.yaml b/llvm/test/ObjectYAML/DXContainer/RootSignature-Flags.yaml
index 8ce18d8e1aa4c..6c0ccda2e4ca5 100644
--- a/llvm/test/ObjectYAML/DXContainer/RootSignature-Flags.yaml
+++ b/llvm/test/ObjectYAML/DXContainer/RootSignature-Flags.yaml
@@ -12,33 +12,13 @@ Parts:
   - Name:            RTS0
     Size:            8
     RootSignature:
+      Size: 8
       Version:         1
       AllowInputAssemblerInputLayout: true
-      DenyVertexShaderRootAccess: false
-      DenyHullShaderRootAccess: false
-      DenyDomainShaderRootAccess: false
-      DenyGeometryShaderRootAccess: false
-      DenyPixelShaderRootAccess: false
-      AllowStreamOutput: false
-      LocalRootSignature: false
-      DenyAmplificationShaderRootAccess: false
-      DenyMeshShaderRootAccess: false
-      CBVSRVUAVHeapDirectlyIndexed: false
-      SamplerHeapDirectlyIndexed: false
-      
+  
 #CHECK:    - Name: RTS0
 #CHECK-NEXT: Size: 8
 #CHECK-NEXT: RootSignature:
+#CHECK-NEXT:   Size: 8
 #CHECK-NEXT:   Version: 1
 #CHECK-NEXT:   AllowInputAssemblerInputLayout: true
-#CHECK-NEXT:   DenyVertexShaderRootAccess: false
-#CHECK-NEXT:   DenyHullShaderRootAccess: false
-#CHECK-NEXT:   DenyDomainShaderRootAccess: false
-#CHECK-NEXT:   DenyGeometryShaderRootAccess: false
-#CHECK-NEXT:   DenyPixelShaderRootAccess: false
-#CHECK-NEXT:   AllowStreamOutput: false
-#CHECK-NEXT:   LocalRootSignature: false
-#CHECK-NEXT:   DenyAmplificationShaderRootAccess: false
-#CHECK-NEXT:   DenyMeshShaderRootAccess: false
-#CHECK-NEXT:   CBVSRVUAVHeapDirectlyIndexed: false
-#CHECK-NEXT:   SamplerHeapDirectlyIndexed: false

>From 0ed658a364305f1e315fa9b0c4caf9bbf40f45d9 Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Mon, 27 Jan 2025 22:04:58 +0000
Subject: [PATCH 15/64] clean up

---
 llvm/include/llvm/BinaryFormat/DXContainer.h    | 2 --
 llvm/include/llvm/MC/DXContainerRootSignature.h | 3 +--
 llvm/include/llvm/Object/DXContainer.h          | 2 --
 llvm/include/llvm/ObjectYAML/DXContainerYAML.h  | 1 -
 llvm/lib/ObjectYAML/DXContainerYAML.cpp         | 1 -
 5 files changed, 1 insertion(+), 8 deletions(-)

diff --git a/llvm/include/llvm/BinaryFormat/DXContainer.h b/llvm/include/llvm/BinaryFormat/DXContainer.h
index dbe1aee97b174..9268c28dbc69d 100644
--- a/llvm/include/llvm/BinaryFormat/DXContainer.h
+++ b/llvm/include/llvm/BinaryFormat/DXContainer.h
@@ -13,12 +13,10 @@
 #ifndef LLVM_BINARYFORMAT_DXCONTAINER_H
 #define LLVM_BINARYFORMAT_DXCONTAINER_H
 
-#include "llvm/ADT/SmallVector.h"
 #include "llvm/ADT/StringRef.h"
 #include "llvm/Support/SwapByteOrder.h"
 #include "llvm/TargetParser/Triple.h"
 
-#include <cstdint>
 #include <stdint.h>
 
 namespace llvm {
diff --git a/llvm/include/llvm/MC/DXContainerRootSignature.h b/llvm/include/llvm/MC/DXContainerRootSignature.h
index d83ae28ffd692..23de2709088c6 100644
--- a/llvm/include/llvm/MC/DXContainerRootSignature.h
+++ b/llvm/include/llvm/MC/DXContainerRootSignature.h
@@ -1,5 +1,4 @@
-//===- llvm/MC/DXContainerRootSignature.h - DXContainer RootSignature -*- C++
-//-------*-===//
+//===- llvm/MC/DXContainerRootSignature.h - RootSignature -*- C++ -*- ========//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/llvm/include/llvm/Object/DXContainer.h b/llvm/include/llvm/Object/DXContainer.h
index 07a3c872ac83d..290fbd6999186 100644
--- a/llvm/include/llvm/Object/DXContainer.h
+++ b/llvm/include/llvm/Object/DXContainer.h
@@ -22,8 +22,6 @@
 #include "llvm/Support/MemoryBufferRef.h"
 #include "llvm/TargetParser/Triple.h"
 #include <array>
-#include <cstdint>
-#include <sys/types.h>
 #include <variant>
 
 namespace llvm {
diff --git a/llvm/include/llvm/ObjectYAML/DXContainerYAML.h b/llvm/include/llvm/ObjectYAML/DXContainerYAML.h
index e9b318faee295..6b01f105a544b 100644
--- a/llvm/include/llvm/ObjectYAML/DXContainerYAML.h
+++ b/llvm/include/llvm/ObjectYAML/DXContainerYAML.h
@@ -15,7 +15,6 @@
 #ifndef LLVM_OBJECTYAML_DXCONTAINERYAML_H
 #define LLVM_OBJECTYAML_DXCONTAINERYAML_H
 
-#include "llvm/ADT/SmallVector.h"
 #include "llvm/ADT/StringRef.h"
 #include "llvm/BinaryFormat/DXContainer.h"
 #include "llvm/Object/DXContainer.h"
diff --git a/llvm/lib/ObjectYAML/DXContainerYAML.cpp b/llvm/lib/ObjectYAML/DXContainerYAML.cpp
index f3febcb09400f..985546872a8b3 100644
--- a/llvm/lib/ObjectYAML/DXContainerYAML.cpp
+++ b/llvm/lib/ObjectYAML/DXContainerYAML.cpp
@@ -16,7 +16,6 @@
 #include "llvm/BinaryFormat/DXContainer.h"
 #include "llvm/Object/DXContainer.h"
 #include "llvm/Support/ScopedPrinter.h"
-#include <cstdint>
 
 namespace llvm {
 

>From 932062e69fd910b8432d49e11f614f2634f64e2f Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Thu, 30 Jan 2025 22:43:23 +0000
Subject: [PATCH 16/64] remove version

---
 llvm/include/llvm/MC/DXContainerRootSignature.h           | 1 -
 llvm/include/llvm/Object/DXContainer.h                    | 3 ---
 llvm/include/llvm/ObjectYAML/DXContainerYAML.h            | 1 -
 llvm/lib/MC/DXContainerRootSignature.cpp                  | 1 -
 llvm/lib/Object/DXContainer.cpp                           | 3 ---
 llvm/lib/ObjectYAML/DXContainerEmitter.cpp                | 1 -
 llvm/lib/ObjectYAML/DXContainerYAML.cpp                   | 3 +--
 llvm/test/ObjectYAML/DXContainer/RootSignature-Flags.yaml | 2 --
 8 files changed, 1 insertion(+), 14 deletions(-)

diff --git a/llvm/include/llvm/MC/DXContainerRootSignature.h b/llvm/include/llvm/MC/DXContainerRootSignature.h
index 23de2709088c6..20b4f5a4285f6 100644
--- a/llvm/include/llvm/MC/DXContainerRootSignature.h
+++ b/llvm/include/llvm/MC/DXContainerRootSignature.h
@@ -15,7 +15,6 @@ class raw_ostream;
 
 namespace mcdxbc {
 struct RootSignatureHeader {
-  uint32_t Version;
   uint32_t Flags;
 
   void swapBytes();
diff --git a/llvm/include/llvm/Object/DXContainer.h b/llvm/include/llvm/Object/DXContainer.h
index 290fbd6999186..5f7737d2fa41d 100644
--- a/llvm/include/llvm/Object/DXContainer.h
+++ b/llvm/include/llvm/Object/DXContainer.h
@@ -121,7 +121,6 @@ class RootSignature {
 private:
   StringRef Data;
   uint32_t Size;
-  uint32_t Version;
   uint32_t Flags;
 
 public:
@@ -131,8 +130,6 @@ class RootSignature {
 
   uint32_t getSize() const { return Size; }
 
-  uint32_t getVersion() const { return Version; }
-
   uint32_t getFlags() const { return Flags; }
 };
 
diff --git a/llvm/include/llvm/ObjectYAML/DXContainerYAML.h b/llvm/include/llvm/ObjectYAML/DXContainerYAML.h
index 6b01f105a544b..9b3259f3bf6c6 100644
--- a/llvm/include/llvm/ObjectYAML/DXContainerYAML.h
+++ b/llvm/include/llvm/ObjectYAML/DXContainerYAML.h
@@ -80,7 +80,6 @@ struct RootSignatureDesc {
 
   uint32_t getEncodedFlags();
   uint32_t Size;
-  uint32_t Version;
   uint32_t NumParameters;
   SmallVector<dxbc::RootParameter> Parameters;
 
diff --git a/llvm/lib/MC/DXContainerRootSignature.cpp b/llvm/lib/MC/DXContainerRootSignature.cpp
index 0bb87c2cc3832..4e085654a1e5e 100644
--- a/llvm/lib/MC/DXContainerRootSignature.cpp
+++ b/llvm/lib/MC/DXContainerRootSignature.cpp
@@ -18,6 +18,5 @@ void RootSignatureHeader::write(raw_ostream &OS) {
 
   uint32_t SizeInfo = sizeof(this);
   support::endian::write(OS, SizeInfo, llvm::endianness::little);
-  support::endian::write(OS, Version, llvm::endianness::little);
   support::endian::write(OS, Flags, llvm::endianness::little);
 }
diff --git a/llvm/lib/Object/DXContainer.cpp b/llvm/lib/Object/DXContainer.cpp
index ffb0b6884831b..6743911059cfd 100644
--- a/llvm/lib/Object/DXContainer.cpp
+++ b/llvm/lib/Object/DXContainer.cpp
@@ -248,9 +248,6 @@ Error DirectX::RootSignature::parse() {
   Size = support::endian::read<uint32_t, llvm::endianness::little>(Current);
   Current += sizeof(uint32_t);
 
-  Version = support::endian::read<uint32_t, llvm::endianness::little>(Current);
-  Current += sizeof(uint32_t);
-
   Flags = support::endian::read<uint32_t, llvm::endianness::little>(Current);
   Current += sizeof(uint32_t);
 
diff --git a/llvm/lib/ObjectYAML/DXContainerEmitter.cpp b/llvm/lib/ObjectYAML/DXContainerEmitter.cpp
index 0504f6b88a7db..ada7383ea3c6b 100644
--- a/llvm/lib/ObjectYAML/DXContainerEmitter.cpp
+++ b/llvm/lib/ObjectYAML/DXContainerEmitter.cpp
@@ -267,7 +267,6 @@ void DXContainerWriter::writeParts(raw_ostream &OS) {
         continue;
 
       mcdxbc::RootSignatureHeader Header;
-      Header.Version = P.RootSignature->Version;
       Header.Flags = P.RootSignature->getEncodedFlags();
 
       Header.write(OS);
diff --git a/llvm/lib/ObjectYAML/DXContainerYAML.cpp b/llvm/lib/ObjectYAML/DXContainerYAML.cpp
index 985546872a8b3..fd85d75dc32eb 100644
--- a/llvm/lib/ObjectYAML/DXContainerYAML.cpp
+++ b/llvm/lib/ObjectYAML/DXContainerYAML.cpp
@@ -32,7 +32,7 @@ DXContainerYAML::ShaderFeatureFlags::ShaderFeatureFlags(uint64_t FlagData) {
 
 DXContainerYAML::RootSignatureDesc::RootSignatureDesc(
     const object::DirectX::RootSignature &Data)
-    : Size(Data.getSize()), Version(Data.getVersion()) {
+    : Size(Data.getSize()) {
   uint32_t Flags = Data.getFlags();
 #define ROOT_ELEMENT_FLAG(Num, Val, Str)                                       \
   Val = (Flags & (uint32_t)dxbc::RootElementFlag::Val) > 0;
@@ -210,7 +210,6 @@ void MappingTraits<DXContainerYAML::Signature>::mapping(
 void MappingTraits<DXContainerYAML::RootSignatureDesc>::mapping(
     IO &IO, DXContainerYAML::RootSignatureDesc &S) {
   IO.mapRequired("Size", S.Size);
-  IO.mapRequired("Version", S.Version);
 #define ROOT_ELEMENT_FLAG(Num, Val, Str) IO.mapOptional(#Val, S.Val, false);
 #include "llvm/BinaryFormat/DXContainerConstants.def"
 }
diff --git a/llvm/test/ObjectYAML/DXContainer/RootSignature-Flags.yaml b/llvm/test/ObjectYAML/DXContainer/RootSignature-Flags.yaml
index 6c0ccda2e4ca5..6f10bd2f74b46 100644
--- a/llvm/test/ObjectYAML/DXContainer/RootSignature-Flags.yaml
+++ b/llvm/test/ObjectYAML/DXContainer/RootSignature-Flags.yaml
@@ -13,12 +13,10 @@ Parts:
     Size:            8
     RootSignature:
       Size: 8
-      Version:         1
       AllowInputAssemblerInputLayout: true
   
 #CHECK:    - Name: RTS0
 #CHECK-NEXT: Size: 8
 #CHECK-NEXT: RootSignature:
 #CHECK-NEXT:   Size: 8
-#CHECK-NEXT:   Version: 1
 #CHECK-NEXT:   AllowInputAssemblerInputLayout: true

>From 628937c1d268008ea8f7414e35f29171d207c5c9 Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Thu, 30 Jan 2025 22:53:12 +0000
Subject: [PATCH 17/64] fix pr

---
 llvm/include/llvm/BinaryFormat/DXContainer.h  | 28 -------------------
 .../include/llvm/ObjectYAML/DXContainerYAML.h |  2 --
 2 files changed, 30 deletions(-)

diff --git a/llvm/include/llvm/BinaryFormat/DXContainer.h b/llvm/include/llvm/BinaryFormat/DXContainer.h
index 9268c28dbc69d..71a6d15e46a81 100644
--- a/llvm/include/llvm/BinaryFormat/DXContainer.h
+++ b/llvm/include/llvm/BinaryFormat/DXContainer.h
@@ -63,40 +63,12 @@ struct ShaderHash {
   void swapBytes() { sys::swapByteOrder(Flags); }
 };
 
-#define ROOT_PARAMETER(RootParameter) RootParameter,
-enum class RootParameterType {
-#include "DXContainerConstants.def"
-};
-
-#define SHADER_VISIBILITY(ShaderVisibility) ShaderVisibility,
-enum class ShaderVisibilityFlag {
-#include "DXContainerConstants.def"
-};
-
-struct RootConstants {
-  uint32_t ShaderRegister;
-  uint32_t RegisterSpace;
-  uint32_t Num32BitValues;
-};
-
-struct RootParameter {
-  RootParameterType ParameterType;
-  union {
-    RootConstants Constants;
-  };
-  ShaderVisibilityFlag ShaderVisibility;
-};
-
 struct RootSignatureDesc {
   uint32_t Size;
-  uint32_t Version;
   uint32_t Flags;
-  uint32_t NumParameters;
-  RootParameter *Parameters;
 
   void swapBytes() {
     sys::swapByteOrder(Size);
-    sys::swapByteOrder(Version);
     sys::swapByteOrder(Flags);
   }
 };
diff --git a/llvm/include/llvm/ObjectYAML/DXContainerYAML.h b/llvm/include/llvm/ObjectYAML/DXContainerYAML.h
index 9b3259f3bf6c6..a82083fa18de6 100644
--- a/llvm/include/llvm/ObjectYAML/DXContainerYAML.h
+++ b/llvm/include/llvm/ObjectYAML/DXContainerYAML.h
@@ -80,8 +80,6 @@ struct RootSignatureDesc {
 
   uint32_t getEncodedFlags();
   uint32_t Size;
-  uint32_t NumParameters;
-  SmallVector<dxbc::RootParameter> Parameters;
 
 #include "llvm/BinaryFormat/DXContainerConstants.def"
 };

>From 1378c9fda2cbbd66267496b9ce8394cc29f9945c Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Fri, 31 Jan 2025 07:04:08 +0000
Subject: [PATCH 18/64] adding dxil-dis test

---
 .../DXContainer/RootSignature-Flags.yaml      | 194 +++++++++++++++++-
 1 file changed, 191 insertions(+), 3 deletions(-)

diff --git a/llvm/test/ObjectYAML/DXContainer/RootSignature-Flags.yaml b/llvm/test/ObjectYAML/DXContainer/RootSignature-Flags.yaml
index 6f10bd2f74b46..bcb04c2c9edd9 100644
--- a/llvm/test/ObjectYAML/DXContainer/RootSignature-Flags.yaml
+++ b/llvm/test/ObjectYAML/DXContainer/RootSignature-Flags.yaml
@@ -1,4 +1,6 @@
 # RUN: yaml2obj %s | obj2yaml | FileCheck %s
+# RUN: yaml2obj %s | dxil-dis | FileCheck %s --check-prefix=DXC
+
 --- !dxcontainer
 Header:
   Hash:            [ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 
@@ -6,17 +8,203 @@ Header:
   Version:
     Major:           1
     Minor:           0
-  PartCount:       1
-  PartOffsets:     [ 60 ]
+  PartCount:       2
+  PartOffsets:     [ 60, 1496 ]
 Parts:
+  - Name:            DXIL
+    Size:            1428
+    Program:
+      MajorVersion:    6
+      MinorVersion:    0
+      ShaderKind:      5
+      Size:            357
+      DXILMajorVersion: 1
+      DXILMinorVersion: 0
+      DXILSize:        1404
+      DXIL:            [ 0x42, 0x43, 0xC0, 0xDE, 0x21, 0xC, 0x0, 0x0, 0x5C, 
+                          0x1, 0x0, 0x0, 0xB, 0x82, 0x20, 0x0, 0x2, 0x0, 
+                          0x0, 0x0, 0x13, 0x0, 0x0, 0x0, 0x7, 0x81, 0x23, 
+                          0x91, 0x41, 0xC8, 0x4, 0x49, 0x6, 0x10, 0x32, 
+                          0x39, 0x92, 0x1, 0x84, 0xC, 0x25, 0x5, 0x8, 0x19, 
+                          0x1E, 0x4, 0x8B, 0x62, 0x80, 0x10, 0x45, 0x2, 
+                          0x42, 0x92, 0xB, 0x42, 0x84, 0x10, 0x32, 0x14, 
+                          0x38, 0x8, 0x18, 0x4B, 0xA, 0x32, 0x42, 0x88, 
+                          0x48, 0x90, 0x14, 0x20, 0x43, 0x46, 0x88, 0xA5, 
+                          0x0, 0x19, 0x32, 0x42, 0xE4, 0x48, 0xE, 0x90, 
+                          0x11, 0x22, 0xC4, 0x50, 0x41, 0x51, 0x81, 0x8C, 
+                          0xE1, 0x83, 0xE5, 0x8A, 0x4, 0x21, 0x46, 0x6, 
+                          0x89, 0x20, 0x0, 0x0, 0x11, 0x0, 0x0, 0x0, 0x32, 
+                          0x22, 0x8, 0x9, 0x20, 0x64, 0x85, 0x4, 0x13, 0x22, 
+                          0xA4, 0x84, 0x4, 0x13, 0x22, 0xE3, 0x84, 0xA1, 
+                          0x90, 0x14, 0x12, 0x4C, 0x88, 0x8C, 0xB, 0x84, 
+                          0x84, 0x4C, 0x10, 0x20, 0x73, 0x4, 0x8, 0xC1, 
+                          0x65, 0xC3, 0x85, 0x2C, 0xE8, 0x3, 0x40, 0x14, 
+                          0x91, 0x4E, 0xD1, 0x4A, 0x48, 0x44, 0x54, 0x11, 
+                          0xC3, 0x9, 0x30, 0xC4, 0x18, 0x1, 0x30, 0x2, 0x50, 
+                          0x82, 0x21, 0x1A, 0x8, 0x98, 0x23, 0x0, 0x3, 0x0, 
+                          0x13, 0x14, 0x72, 0xC0, 0x87, 0x74, 0x60, 0x87, 
+                          0x36, 0x68, 0x87, 0x79, 0x68, 0x3, 0x72, 0xC0, 
+                          0x87, 0xD, 0xAE, 0x50, 0xE, 0x6D, 0xD0, 0xE, 0x7A, 
+                          0x50, 0xE, 0x6D, 0x0, 0xF, 0x7A, 0x30, 0x7, 0x72, 
+                          0xA0, 0x7, 0x73, 0x20, 0x7, 0x6D, 0x90, 0xE, 0x71, 
+                          0xA0, 0x7, 0x73, 0x20, 0x7, 0x6D, 0x90, 0xE, 0x78, 
+                          0xA0, 0x7, 0x78, 0xD0, 0x6, 0xE9, 0x10, 0x7, 0x76, 
+                          0xA0, 0x7, 0x71, 0x60, 0x7, 0x6D, 0x90, 0xE, 0x73, 
+                          0x20, 0x7, 0x7A, 0x30, 0x7, 0x72, 0xD0, 0x6, 0xE9, 
+                          0x60, 0x7, 0x74, 0xA0, 0x7, 0x76, 0x40, 0x7, 0x6D, 
+                          0x60, 0xE, 0x71, 0x60, 0x7, 0x7A, 0x10, 0x7, 0x76, 
+                          0xD0, 0x6, 0xE6, 0x30, 0x7, 0x72, 0xA0, 0x7, 0x73, 
+                          0x20, 0x7, 0x6D, 0x60, 0xE, 0x76, 0x40, 0x7, 0x7A, 
+                          0x60, 0x7, 0x74, 0xD0, 0x6, 0xEE, 0x80, 0x7, 0x7A, 
+                          0x10, 0x7, 0x76, 0xA0, 0x7, 0x73, 0x20, 0x7, 0x7A, 
+                          0x60, 0x7, 0x74, 0x30, 0xE4, 0x21, 0x0, 0x0, 0x0, 
+                          0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, 0xB, 
+                          0x4, 0x6, 0x0, 0x0, 0x0, 0x32, 0x1E, 0x98, 0xC, 
+                          0x19, 0x11, 0x4C, 0x90, 0x8C, 0x9, 0x26, 0x47, 
+                          0xC6, 0x4, 0x43, 0xBA, 0x12, 0x28, 0x86, 0x11, 
+                          0x80, 0x42, 0x0, 0x0, 0x79, 0x18, 0x0, 0x0, 0xCB, 
+                          0x0, 0x0, 0x0, 0x33, 0x8, 0x80, 0x1C, 0xC4, 0xE1, 
+                          0x1C, 0x66, 0x14, 0x1, 0x3D, 0x88, 0x43, 0x38, 
+                          0x84, 0xC3, 0x8C, 0x42, 0x80, 0x7, 0x79, 0x78, 
+                          0x7, 0x73, 0x98, 0x71, 0xC, 0xE6, 0x0, 0xF, 0xED, 
+                          0x10, 0xE, 0xF4, 0x80, 0xE, 0x33, 0xC, 0x42, 0x1E, 
+                          0xC2, 0xC1, 0x1D, 0xCE, 0xA1, 0x1C, 0x66, 0x30, 
+                          0x5, 0x3D, 0x88, 0x43, 0x38, 0x84, 0x83, 0x1B, 
+                          0xCC, 0x3, 0x3D, 0xC8, 0x43, 0x3D, 0x8C, 0x3, 
+                          0x3D, 0xCC, 0x78, 0x8C, 0x74, 0x70, 0x7, 0x7B, 
+                          0x8, 0x7, 0x79, 0x48, 0x87, 0x70, 0x70, 0x7, 0x7A, 
+                          0x70, 0x3, 0x76, 0x78, 0x87, 0x70, 0x20, 0x87, 
+                          0x19, 0xCC, 0x11, 0xE, 0xEC, 0x90, 0xE, 0xE1, 
+                          0x30, 0xF, 0x6E, 0x30, 0xF, 0xE3, 0xF0, 0xE, 0xF0, 
+                          0x50, 0xE, 0x33, 0x10, 0xC4, 0x1D, 0xDE, 0x21, 
+                          0x1C, 0xD8, 0x21, 0x1D, 0xC2, 0x61, 0x1E, 0x66, 
+                          0x30, 0x89, 0x3B, 0xBC, 0x83, 0x3B, 0xD0, 0x43, 
+                          0x39, 0xB4, 0x3, 0x3C, 0xBC, 0x83, 0x3C, 0x84, 
+                          0x3, 0x3B, 0xCC, 0xF0, 0x14, 0x76, 0x60, 0x7, 
+                          0x7B, 0x68, 0x7, 0x37, 0x68, 0x87, 0x72, 0x68, 
+                          0x7, 0x37, 0x80, 0x87, 0x70, 0x90, 0x87, 0x70, 
+                          0x60, 0x7, 0x76, 0x28, 0x7, 0x76, 0xF8, 0x5, 0x76, 
+                          0x78, 0x87, 0x77, 0x80, 0x87, 0x5F, 0x8, 0x87, 
+                          0x71, 0x18, 0x87, 0x72, 0x98, 0x87, 0x79, 0x98, 
+                          0x81, 0x2C, 0xEE, 0xF0, 0xE, 0xEE, 0xE0, 0xE, 
+                          0xF5, 0xC0, 0xE, 0xEC, 0x30, 0x3, 0x62, 0xC8, 
+                          0xA1, 0x1C, 0xE4, 0xA1, 0x1C, 0xCC, 0xA1, 0x1C, 
+                          0xE4, 0xA1, 0x1C, 0xDC, 0x61, 0x1C, 0xCA, 0x21, 
+                          0x1C, 0xC4, 0x81, 0x1D, 0xCA, 0x61, 0x6, 0xD6, 
+                          0x90, 0x43, 0x39, 0xC8, 0x43, 0x39, 0x98, 0x43, 
+                          0x39, 0xC8, 0x43, 0x39, 0xB8, 0xC3, 0x38, 0x94, 
+                          0x43, 0x38, 0x88, 0x3, 0x3B, 0x94, 0xC3, 0x2F, 
+                          0xBC, 0x83, 0x3C, 0xFC, 0x82, 0x3B, 0xD4, 0x3, 
+                          0x3B, 0xB0, 0xC3, 0xC, 0xC7, 0x69, 0x87, 0x70, 
+                          0x58, 0x87, 0x72, 0x70, 0x83, 0x74, 0x68, 0x7, 
+                          0x78, 0x60, 0x87, 0x74, 0x18, 0x87, 0x74, 0xA0, 
+                          0x87, 0x19, 0xCE, 0x53, 0xF, 0xEE, 0x0, 0xF, 0xF2, 
+                          0x50, 0xE, 0xE4, 0x90, 0xE, 0xE3, 0x40, 0xF, 0xE1, 
+                          0x20, 0xE, 0xEC, 0x50, 0xE, 0x33, 0x20, 0x28, 
+                          0x1D, 0xDC, 0xC1, 0x1E, 0xC2, 0x41, 0x1E, 0xD2, 
+                          0x21, 0x1C, 0xDC, 0x81, 0x1E, 0xDC, 0xE0, 0x1C, 
+                          0xE4, 0xE1, 0x1D, 0xEA, 0x1, 0x1E, 0x66, 0x18, 
+                          0x51, 0x38, 0xB0, 0x43, 0x3A, 0x9C, 0x83, 0x3B, 
+                          0xCC, 0x50, 0x24, 0x76, 0x60, 0x7, 0x7B, 0x68, 
+                          0x7, 0x37, 0x60, 0x87, 0x77, 0x78, 0x7, 0x78, 
+                          0x98, 0x51, 0x4C, 0xF4, 0x90, 0xF, 0xF0, 0x50, 
+                          0xE, 0x33, 0x1E, 0x6A, 0x1E, 0xCA, 0x61, 0x1C, 
+                          0xE8, 0x21, 0x1D, 0xDE, 0xC1, 0x1D, 0x7E, 0x1, 
+                          0x1E, 0xE4, 0xA1, 0x1C, 0xCC, 0x21, 0x1D, 0xF0, 
+                          0x61, 0x6, 0x54, 0x85, 0x83, 0x38, 0xCC, 0xC3, 
+                          0x3B, 0xB0, 0x43, 0x3D, 0xD0, 0x43, 0x39, 0xFC, 
+                          0xC2, 0x3C, 0xE4, 0x43, 0x3B, 0x88, 0xC3, 0x3B, 
+                          0xB0, 0xC3, 0x8C, 0xC5, 0xA, 0x87, 0x79, 0x98, 
+                          0x87, 0x77, 0x18, 0x87, 0x74, 0x8, 0x7, 0x7A, 
+                          0x28, 0x7, 0x72, 0x98, 0x81, 0x5C, 0xE3, 0x10, 
+                          0xE, 0xEC, 0xC0, 0xE, 0xE5, 0x50, 0xE, 0xF3, 0x30, 
+                          0x23, 0xC1, 0xD2, 0x41, 0x1E, 0xE4, 0xE1, 0x17, 
+                          0xD8, 0xE1, 0x1D, 0xDE, 0x1, 0x1E, 0x66, 0x48, 
+                          0x19, 0x3B, 0xB0, 0x83, 0x3D, 0xB4, 0x83, 0x1B, 
+                          0x84, 0xC3, 0x38, 0x8C, 0x43, 0x39, 0xCC, 0xC3, 
+                          0x3C, 0xB8, 0xC1, 0x39, 0xC8, 0xC3, 0x3B, 0xD4, 
+                          0x3, 0x3C, 0xCC, 0x48, 0xB4, 0x71, 0x8, 0x7, 0x76, 
+                          0x60, 0x7, 0x71, 0x8, 0x87, 0x71, 0x58, 0x87, 
+                          0x19, 0xDB, 0xC6, 0xE, 0xEC, 0x60, 0xF, 0xED, 
+                          0xE0, 0x6, 0xF0, 0x20, 0xF, 0xE5, 0x30, 0xF, 0xE5, 
+                          0x20, 0xF, 0xF6, 0x50, 0xE, 0x6E, 0x10, 0xE, 0xE3, 
+                          0x30, 0xE, 0xE5, 0x30, 0xF, 0xF3, 0xE0, 0x6, 0xE9, 
+                          0xE0, 0xE, 0xE4, 0x50, 0xE, 0xF8, 0x30, 0x23, 
+                          0xE2, 0xEC, 0x61, 0x1C, 0xC2, 0x81, 0x1D, 0xD8, 
+                          0xE1, 0x17, 0xEC, 0x21, 0x1D, 0xE6, 0x21, 0x1D, 
+                          0xC4, 0x21, 0x1D, 0xD8, 0x21, 0x1D, 0xE8, 0x21, 
+                          0x1F, 0x66, 0x20, 0x9D, 0x3B, 0xBC, 0x43, 0x3D, 
+                          0xB8, 0x3, 0x39, 0x94, 0x83, 0x39, 0xCC, 0x58, 
+                          0xBC, 0x70, 0x70, 0x7, 0x77, 0x78, 0x7, 0x7A, 
+                          0x8, 0x7, 0x7A, 0x48, 0x87, 0x77, 0x70, 0x87, 
+                          0x19, 0xCB, 0xE7, 0xE, 0xEF, 0x30, 0xF, 0xE1, 
+                          0xE0, 0xE, 0xE9, 0x40, 0xF, 0xE9, 0xA0, 0xF, 0xE5, 
+                          0x30, 0xC3, 0x1, 0x3, 0x73, 0xA8, 0x7, 0x77, 0x18, 
+                          0x87, 0x5F, 0x98, 0x87, 0x70, 0x70, 0x87, 0x74, 
+                          0xA0, 0x87, 0x74, 0xD0, 0x87, 0x72, 0x98, 0x81, 
+                          0x84, 0x41, 0x39, 0xE0, 0xC3, 0x38, 0xB0, 0x43, 
+                          0x3D, 0x90, 0x43, 0x39, 0xCC, 0x40, 0xC4, 0xA0, 
+                          0x1D, 0xCA, 0xA1, 0x1D, 0xE0, 0x41, 0x1E, 0xDE, 
+                          0xC1, 0x1C, 0x66, 0x24, 0x63, 0x30, 0xE, 0xE1, 
+                          0xC0, 0xE, 0xEC, 0x30, 0xF, 0xE9, 0x40, 0xF, 0xE5, 
+                          0x30, 0x43, 0x21, 0x83, 0x75, 0x18, 0x7, 0x73, 
+                          0x48, 0x87, 0x5F, 0xA0, 0x87, 0x7C, 0x80, 0x87, 
+                          0x72, 0x98, 0xB1, 0x94, 0x1, 0x3C, 0x8C, 0xC3, 
+                          0x3C, 0x94, 0xC3, 0x38, 0xD0, 0x43, 0x3A, 0xBC, 
+                          0x83, 0x3B, 0xCC, 0xC3, 0x8C, 0xC5, 0xC, 0x48, 
+                          0x21, 0x15, 0x42, 0x61, 0x1E, 0xE6, 0x21, 0x1D, 
+                          0xCE, 0xC1, 0x1D, 0x52, 0x81, 0x14, 0x66, 0x4C, 
+                          0x67, 0x30, 0xE, 0xEF, 0x20, 0xF, 0xEF, 0xE0, 
+                          0x6, 0xEF, 0x50, 0xF, 0xF4, 0x30, 0xF, 0xE9, 0x40, 
+                          0xE, 0xE5, 0xE0, 0x6, 0xE6, 0x20, 0xF, 0xE1, 0xD0, 
+                          0xE, 0xE5, 0x30, 0xA3, 0x40, 0x83, 0x76, 0x68, 
+                          0x7, 0x79, 0x8, 0x87, 0x19, 0x52, 0x1A, 0xB8, 
+                          0xC3, 0x3B, 0x84, 0x3, 0x3B, 0xA4, 0x43, 0x38, 
+                          0xCC, 0x83, 0x1B, 0x84, 0x3, 0x39, 0x90, 0x83, 
+                          0x3C, 0xCC, 0x3, 0x3C, 0x84, 0xC3, 0x38, 0x94, 
+                          0x3, 0x0, 0x0, 0x0, 0x0, 0x79, 0x28, 0x0, 0x0, 
+                          0x2A, 0x0, 0x0, 0x0, 0xC2, 0x3C, 0x90, 0x40, 0x86, 
+                          0x10, 0x19, 0x32, 0xE2, 0x64, 0x90, 0x40, 0x46, 
+                          0x2, 0x19, 0x23, 0x23, 0x46, 0x2, 0x13, 0x24, 
+                          0xC6, 0x0, 0x13, 0x74, 0x12, 0xA9, 0xB7, 0x37, 
+                          0x3A, 0x23, 0xB6, 0xB0, 0xB3, 0xB9, 0x23, 0x8C, 
+                          0xCD, 0x1D, 0xA2, 0x2D, 0x2C, 0xCD, 0x6D, 0x8, 
+                          0x42, 0x1, 0xC, 0x41, 0x38, 0x82, 0x21, 0x8, 0x87, 
+                          0x30, 0x4, 0xE1, 0x18, 0x86, 0x20, 0x1C, 0xC4, 
+                          0x18, 0x84, 0xA0, 0x18, 0x43, 0x90, 0x8C, 0x41, 
+                          0x20, 0x94, 0x31, 0xC, 0x82, 0x71, 0x8C, 0x41, 
+                          0x28, 0x8E, 0x31, 0xC, 0x45, 0x51, 0x8C, 0x41, 
+                          0x40, 0x9C, 0x31, 0x14, 0xC4, 0x0, 0x0, 0x8F, 
+                          0x89, 0xC8, 0xF0, 0x5C, 0xE4, 0xDE, 0xDE, 0xE8, 
+                          0xE6, 0xD2, 0xCE, 0xDC, 0xC2, 0xE8, 0xEA, 0xE4, 
+                          0xCA, 0xE6, 0x86, 0x12, 0x28, 0xC6, 0x21, 0xC3, 
+                          0x73, 0x99, 0x43, 0xB, 0x23, 0x2B, 0x93, 0x6B, 
+                          0x7A, 0x23, 0x2B, 0x63, 0x1B, 0x4A, 0xB0, 0x18, 
+                          0x85, 0xC, 0xCF, 0xC5, 0xAE, 0x4C, 0x6E, 0x2E, 
+                          0xED, 0xCD, 0x6D, 0x28, 0x1, 0x63, 0x1C, 0x32, 
+                          0x3C, 0x97, 0x32, 0x37, 0x3A, 0xB9, 0x3C, 0xA8, 
+                          0xB7, 0x34, 0x37, 0xBA, 0xB9, 0xA1, 0x4, 0xF, 
+                          0x0, 0x0, 0x71, 0x20, 0x0, 0x0, 0x2, 0x0, 0x0, 
+                          0x0, 0x6, 0x40, 0x30, 0x0, 0xD2, 0x0, 0x0, 0x0, 
+                          0x61, 0x20, 0x0, 0x0, 0x6, 0x0, 0x0, 0x0, 0x13, 
+                          0x4, 0x1, 0x86, 0x3, 0x1, 0x0, 0x0, 0x2, 0x0, 
+                          0x0, 0x0, 0x7, 0x50, 0x10, 0xCD, 0x14, 0x61, 0x0, 
+                          0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 ]
   - Name:            RTS0
     Size:            8
     RootSignature:
       Size: 8
       AllowInputAssemblerInputLayout: true
-  
+
+
+
 #CHECK:    - Name: RTS0
 #CHECK-NEXT: Size: 8
 #CHECK-NEXT: RootSignature:
 #CHECK-NEXT:   Size: 8
 #CHECK-NEXT:   AllowInputAssemblerInputLayout: true
+
+# DXC: !dx.rootsignatures = !{[[RS:![0-9]+]]}
+# DXC: [[RS]] = !{void ()* @main, [[REL:![0-9]+]]}
+# DXC: [[REL]] = !{[[RF:![0-9]+]]}
+# DXC: [[RF]] = !{!"RootFlags", i32 1}

>From e3206c9daf0bb601cf03c490c23c483dd7a56e14 Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Fri, 31 Jan 2025 22:53:06 +0000
Subject: [PATCH 19/64] adding compatibility test

---
 .../DXContainer/RootSignature-Flags.yaml      | 191 +----------------
 llvm/test/tools/dxil-dis/lit.local.cfg        |   2 +-
 llvm/test/tools/dxil-dis/root-signature.yaml  | 201 ++++++++++++++++++
 3 files changed, 204 insertions(+), 190 deletions(-)
 create mode 100644 llvm/test/tools/dxil-dis/root-signature.yaml

diff --git a/llvm/test/ObjectYAML/DXContainer/RootSignature-Flags.yaml b/llvm/test/ObjectYAML/DXContainer/RootSignature-Flags.yaml
index bcb04c2c9edd9..e3ca7347d52c7 100644
--- a/llvm/test/ObjectYAML/DXContainer/RootSignature-Flags.yaml
+++ b/llvm/test/ObjectYAML/DXContainer/RootSignature-Flags.yaml
@@ -1,5 +1,4 @@
 # RUN: yaml2obj %s | obj2yaml | FileCheck %s
-# RUN: yaml2obj %s | dxil-dis | FileCheck %s --check-prefix=DXC
 
 --- !dxcontainer
 Header:
@@ -8,203 +7,17 @@ Header:
   Version:
     Major:           1
     Minor:           0
-  PartCount:       2
-  PartOffsets:     [ 60, 1496 ]
+  PartCount:       1
+  PartOffsets:     [ 60 ]
 Parts:
-  - Name:            DXIL
-    Size:            1428
-    Program:
-      MajorVersion:    6
-      MinorVersion:    0
-      ShaderKind:      5
-      Size:            357
-      DXILMajorVersion: 1
-      DXILMinorVersion: 0
-      DXILSize:        1404
-      DXIL:            [ 0x42, 0x43, 0xC0, 0xDE, 0x21, 0xC, 0x0, 0x0, 0x5C, 
-                          0x1, 0x0, 0x0, 0xB, 0x82, 0x20, 0x0, 0x2, 0x0, 
-                          0x0, 0x0, 0x13, 0x0, 0x0, 0x0, 0x7, 0x81, 0x23, 
-                          0x91, 0x41, 0xC8, 0x4, 0x49, 0x6, 0x10, 0x32, 
-                          0x39, 0x92, 0x1, 0x84, 0xC, 0x25, 0x5, 0x8, 0x19, 
-                          0x1E, 0x4, 0x8B, 0x62, 0x80, 0x10, 0x45, 0x2, 
-                          0x42, 0x92, 0xB, 0x42, 0x84, 0x10, 0x32, 0x14, 
-                          0x38, 0x8, 0x18, 0x4B, 0xA, 0x32, 0x42, 0x88, 
-                          0x48, 0x90, 0x14, 0x20, 0x43, 0x46, 0x88, 0xA5, 
-                          0x0, 0x19, 0x32, 0x42, 0xE4, 0x48, 0xE, 0x90, 
-                          0x11, 0x22, 0xC4, 0x50, 0x41, 0x51, 0x81, 0x8C, 
-                          0xE1, 0x83, 0xE5, 0x8A, 0x4, 0x21, 0x46, 0x6, 
-                          0x89, 0x20, 0x0, 0x0, 0x11, 0x0, 0x0, 0x0, 0x32, 
-                          0x22, 0x8, 0x9, 0x20, 0x64, 0x85, 0x4, 0x13, 0x22, 
-                          0xA4, 0x84, 0x4, 0x13, 0x22, 0xE3, 0x84, 0xA1, 
-                          0x90, 0x14, 0x12, 0x4C, 0x88, 0x8C, 0xB, 0x84, 
-                          0x84, 0x4C, 0x10, 0x20, 0x73, 0x4, 0x8, 0xC1, 
-                          0x65, 0xC3, 0x85, 0x2C, 0xE8, 0x3, 0x40, 0x14, 
-                          0x91, 0x4E, 0xD1, 0x4A, 0x48, 0x44, 0x54, 0x11, 
-                          0xC3, 0x9, 0x30, 0xC4, 0x18, 0x1, 0x30, 0x2, 0x50, 
-                          0x82, 0x21, 0x1A, 0x8, 0x98, 0x23, 0x0, 0x3, 0x0, 
-                          0x13, 0x14, 0x72, 0xC0, 0x87, 0x74, 0x60, 0x87, 
-                          0x36, 0x68, 0x87, 0x79, 0x68, 0x3, 0x72, 0xC0, 
-                          0x87, 0xD, 0xAE, 0x50, 0xE, 0x6D, 0xD0, 0xE, 0x7A, 
-                          0x50, 0xE, 0x6D, 0x0, 0xF, 0x7A, 0x30, 0x7, 0x72, 
-                          0xA0, 0x7, 0x73, 0x20, 0x7, 0x6D, 0x90, 0xE, 0x71, 
-                          0xA0, 0x7, 0x73, 0x20, 0x7, 0x6D, 0x90, 0xE, 0x78, 
-                          0xA0, 0x7, 0x78, 0xD0, 0x6, 0xE9, 0x10, 0x7, 0x76, 
-                          0xA0, 0x7, 0x71, 0x60, 0x7, 0x6D, 0x90, 0xE, 0x73, 
-                          0x20, 0x7, 0x7A, 0x30, 0x7, 0x72, 0xD0, 0x6, 0xE9, 
-                          0x60, 0x7, 0x74, 0xA0, 0x7, 0x76, 0x40, 0x7, 0x6D, 
-                          0x60, 0xE, 0x71, 0x60, 0x7, 0x7A, 0x10, 0x7, 0x76, 
-                          0xD0, 0x6, 0xE6, 0x30, 0x7, 0x72, 0xA0, 0x7, 0x73, 
-                          0x20, 0x7, 0x6D, 0x60, 0xE, 0x76, 0x40, 0x7, 0x7A, 
-                          0x60, 0x7, 0x74, 0xD0, 0x6, 0xEE, 0x80, 0x7, 0x7A, 
-                          0x10, 0x7, 0x76, 0xA0, 0x7, 0x73, 0x20, 0x7, 0x7A, 
-                          0x60, 0x7, 0x74, 0x30, 0xE4, 0x21, 0x0, 0x0, 0x0, 
-                          0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, 0xB, 
-                          0x4, 0x6, 0x0, 0x0, 0x0, 0x32, 0x1E, 0x98, 0xC, 
-                          0x19, 0x11, 0x4C, 0x90, 0x8C, 0x9, 0x26, 0x47, 
-                          0xC6, 0x4, 0x43, 0xBA, 0x12, 0x28, 0x86, 0x11, 
-                          0x80, 0x42, 0x0, 0x0, 0x79, 0x18, 0x0, 0x0, 0xCB, 
-                          0x0, 0x0, 0x0, 0x33, 0x8, 0x80, 0x1C, 0xC4, 0xE1, 
-                          0x1C, 0x66, 0x14, 0x1, 0x3D, 0x88, 0x43, 0x38, 
-                          0x84, 0xC3, 0x8C, 0x42, 0x80, 0x7, 0x79, 0x78, 
-                          0x7, 0x73, 0x98, 0x71, 0xC, 0xE6, 0x0, 0xF, 0xED, 
-                          0x10, 0xE, 0xF4, 0x80, 0xE, 0x33, 0xC, 0x42, 0x1E, 
-                          0xC2, 0xC1, 0x1D, 0xCE, 0xA1, 0x1C, 0x66, 0x30, 
-                          0x5, 0x3D, 0x88, 0x43, 0x38, 0x84, 0x83, 0x1B, 
-                          0xCC, 0x3, 0x3D, 0xC8, 0x43, 0x3D, 0x8C, 0x3, 
-                          0x3D, 0xCC, 0x78, 0x8C, 0x74, 0x70, 0x7, 0x7B, 
-                          0x8, 0x7, 0x79, 0x48, 0x87, 0x70, 0x70, 0x7, 0x7A, 
-                          0x70, 0x3, 0x76, 0x78, 0x87, 0x70, 0x20, 0x87, 
-                          0x19, 0xCC, 0x11, 0xE, 0xEC, 0x90, 0xE, 0xE1, 
-                          0x30, 0xF, 0x6E, 0x30, 0xF, 0xE3, 0xF0, 0xE, 0xF0, 
-                          0x50, 0xE, 0x33, 0x10, 0xC4, 0x1D, 0xDE, 0x21, 
-                          0x1C, 0xD8, 0x21, 0x1D, 0xC2, 0x61, 0x1E, 0x66, 
-                          0x30, 0x89, 0x3B, 0xBC, 0x83, 0x3B, 0xD0, 0x43, 
-                          0x39, 0xB4, 0x3, 0x3C, 0xBC, 0x83, 0x3C, 0x84, 
-                          0x3, 0x3B, 0xCC, 0xF0, 0x14, 0x76, 0x60, 0x7, 
-                          0x7B, 0x68, 0x7, 0x37, 0x68, 0x87, 0x72, 0x68, 
-                          0x7, 0x37, 0x80, 0x87, 0x70, 0x90, 0x87, 0x70, 
-                          0x60, 0x7, 0x76, 0x28, 0x7, 0x76, 0xF8, 0x5, 0x76, 
-                          0x78, 0x87, 0x77, 0x80, 0x87, 0x5F, 0x8, 0x87, 
-                          0x71, 0x18, 0x87, 0x72, 0x98, 0x87, 0x79, 0x98, 
-                          0x81, 0x2C, 0xEE, 0xF0, 0xE, 0xEE, 0xE0, 0xE, 
-                          0xF5, 0xC0, 0xE, 0xEC, 0x30, 0x3, 0x62, 0xC8, 
-                          0xA1, 0x1C, 0xE4, 0xA1, 0x1C, 0xCC, 0xA1, 0x1C, 
-                          0xE4, 0xA1, 0x1C, 0xDC, 0x61, 0x1C, 0xCA, 0x21, 
-                          0x1C, 0xC4, 0x81, 0x1D, 0xCA, 0x61, 0x6, 0xD6, 
-                          0x90, 0x43, 0x39, 0xC8, 0x43, 0x39, 0x98, 0x43, 
-                          0x39, 0xC8, 0x43, 0x39, 0xB8, 0xC3, 0x38, 0x94, 
-                          0x43, 0x38, 0x88, 0x3, 0x3B, 0x94, 0xC3, 0x2F, 
-                          0xBC, 0x83, 0x3C, 0xFC, 0x82, 0x3B, 0xD4, 0x3, 
-                          0x3B, 0xB0, 0xC3, 0xC, 0xC7, 0x69, 0x87, 0x70, 
-                          0x58, 0x87, 0x72, 0x70, 0x83, 0x74, 0x68, 0x7, 
-                          0x78, 0x60, 0x87, 0x74, 0x18, 0x87, 0x74, 0xA0, 
-                          0x87, 0x19, 0xCE, 0x53, 0xF, 0xEE, 0x0, 0xF, 0xF2, 
-                          0x50, 0xE, 0xE4, 0x90, 0xE, 0xE3, 0x40, 0xF, 0xE1, 
-                          0x20, 0xE, 0xEC, 0x50, 0xE, 0x33, 0x20, 0x28, 
-                          0x1D, 0xDC, 0xC1, 0x1E, 0xC2, 0x41, 0x1E, 0xD2, 
-                          0x21, 0x1C, 0xDC, 0x81, 0x1E, 0xDC, 0xE0, 0x1C, 
-                          0xE4, 0xE1, 0x1D, 0xEA, 0x1, 0x1E, 0x66, 0x18, 
-                          0x51, 0x38, 0xB0, 0x43, 0x3A, 0x9C, 0x83, 0x3B, 
-                          0xCC, 0x50, 0x24, 0x76, 0x60, 0x7, 0x7B, 0x68, 
-                          0x7, 0x37, 0x60, 0x87, 0x77, 0x78, 0x7, 0x78, 
-                          0x98, 0x51, 0x4C, 0xF4, 0x90, 0xF, 0xF0, 0x50, 
-                          0xE, 0x33, 0x1E, 0x6A, 0x1E, 0xCA, 0x61, 0x1C, 
-                          0xE8, 0x21, 0x1D, 0xDE, 0xC1, 0x1D, 0x7E, 0x1, 
-                          0x1E, 0xE4, 0xA1, 0x1C, 0xCC, 0x21, 0x1D, 0xF0, 
-                          0x61, 0x6, 0x54, 0x85, 0x83, 0x38, 0xCC, 0xC3, 
-                          0x3B, 0xB0, 0x43, 0x3D, 0xD0, 0x43, 0x39, 0xFC, 
-                          0xC2, 0x3C, 0xE4, 0x43, 0x3B, 0x88, 0xC3, 0x3B, 
-                          0xB0, 0xC3, 0x8C, 0xC5, 0xA, 0x87, 0x79, 0x98, 
-                          0x87, 0x77, 0x18, 0x87, 0x74, 0x8, 0x7, 0x7A, 
-                          0x28, 0x7, 0x72, 0x98, 0x81, 0x5C, 0xE3, 0x10, 
-                          0xE, 0xEC, 0xC0, 0xE, 0xE5, 0x50, 0xE, 0xF3, 0x30, 
-                          0x23, 0xC1, 0xD2, 0x41, 0x1E, 0xE4, 0xE1, 0x17, 
-                          0xD8, 0xE1, 0x1D, 0xDE, 0x1, 0x1E, 0x66, 0x48, 
-                          0x19, 0x3B, 0xB0, 0x83, 0x3D, 0xB4, 0x83, 0x1B, 
-                          0x84, 0xC3, 0x38, 0x8C, 0x43, 0x39, 0xCC, 0xC3, 
-                          0x3C, 0xB8, 0xC1, 0x39, 0xC8, 0xC3, 0x3B, 0xD4, 
-                          0x3, 0x3C, 0xCC, 0x48, 0xB4, 0x71, 0x8, 0x7, 0x76, 
-                          0x60, 0x7, 0x71, 0x8, 0x87, 0x71, 0x58, 0x87, 
-                          0x19, 0xDB, 0xC6, 0xE, 0xEC, 0x60, 0xF, 0xED, 
-                          0xE0, 0x6, 0xF0, 0x20, 0xF, 0xE5, 0x30, 0xF, 0xE5, 
-                          0x20, 0xF, 0xF6, 0x50, 0xE, 0x6E, 0x10, 0xE, 0xE3, 
-                          0x30, 0xE, 0xE5, 0x30, 0xF, 0xF3, 0xE0, 0x6, 0xE9, 
-                          0xE0, 0xE, 0xE4, 0x50, 0xE, 0xF8, 0x30, 0x23, 
-                          0xE2, 0xEC, 0x61, 0x1C, 0xC2, 0x81, 0x1D, 0xD8, 
-                          0xE1, 0x17, 0xEC, 0x21, 0x1D, 0xE6, 0x21, 0x1D, 
-                          0xC4, 0x21, 0x1D, 0xD8, 0x21, 0x1D, 0xE8, 0x21, 
-                          0x1F, 0x66, 0x20, 0x9D, 0x3B, 0xBC, 0x43, 0x3D, 
-                          0xB8, 0x3, 0x39, 0x94, 0x83, 0x39, 0xCC, 0x58, 
-                          0xBC, 0x70, 0x70, 0x7, 0x77, 0x78, 0x7, 0x7A, 
-                          0x8, 0x7, 0x7A, 0x48, 0x87, 0x77, 0x70, 0x87, 
-                          0x19, 0xCB, 0xE7, 0xE, 0xEF, 0x30, 0xF, 0xE1, 
-                          0xE0, 0xE, 0xE9, 0x40, 0xF, 0xE9, 0xA0, 0xF, 0xE5, 
-                          0x30, 0xC3, 0x1, 0x3, 0x73, 0xA8, 0x7, 0x77, 0x18, 
-                          0x87, 0x5F, 0x98, 0x87, 0x70, 0x70, 0x87, 0x74, 
-                          0xA0, 0x87, 0x74, 0xD0, 0x87, 0x72, 0x98, 0x81, 
-                          0x84, 0x41, 0x39, 0xE0, 0xC3, 0x38, 0xB0, 0x43, 
-                          0x3D, 0x90, 0x43, 0x39, 0xCC, 0x40, 0xC4, 0xA0, 
-                          0x1D, 0xCA, 0xA1, 0x1D, 0xE0, 0x41, 0x1E, 0xDE, 
-                          0xC1, 0x1C, 0x66, 0x24, 0x63, 0x30, 0xE, 0xE1, 
-                          0xC0, 0xE, 0xEC, 0x30, 0xF, 0xE9, 0x40, 0xF, 0xE5, 
-                          0x30, 0x43, 0x21, 0x83, 0x75, 0x18, 0x7, 0x73, 
-                          0x48, 0x87, 0x5F, 0xA0, 0x87, 0x7C, 0x80, 0x87, 
-                          0x72, 0x98, 0xB1, 0x94, 0x1, 0x3C, 0x8C, 0xC3, 
-                          0x3C, 0x94, 0xC3, 0x38, 0xD0, 0x43, 0x3A, 0xBC, 
-                          0x83, 0x3B, 0xCC, 0xC3, 0x8C, 0xC5, 0xC, 0x48, 
-                          0x21, 0x15, 0x42, 0x61, 0x1E, 0xE6, 0x21, 0x1D, 
-                          0xCE, 0xC1, 0x1D, 0x52, 0x81, 0x14, 0x66, 0x4C, 
-                          0x67, 0x30, 0xE, 0xEF, 0x20, 0xF, 0xEF, 0xE0, 
-                          0x6, 0xEF, 0x50, 0xF, 0xF4, 0x30, 0xF, 0xE9, 0x40, 
-                          0xE, 0xE5, 0xE0, 0x6, 0xE6, 0x20, 0xF, 0xE1, 0xD0, 
-                          0xE, 0xE5, 0x30, 0xA3, 0x40, 0x83, 0x76, 0x68, 
-                          0x7, 0x79, 0x8, 0x87, 0x19, 0x52, 0x1A, 0xB8, 
-                          0xC3, 0x3B, 0x84, 0x3, 0x3B, 0xA4, 0x43, 0x38, 
-                          0xCC, 0x83, 0x1B, 0x84, 0x3, 0x39, 0x90, 0x83, 
-                          0x3C, 0xCC, 0x3, 0x3C, 0x84, 0xC3, 0x38, 0x94, 
-                          0x3, 0x0, 0x0, 0x0, 0x0, 0x79, 0x28, 0x0, 0x0, 
-                          0x2A, 0x0, 0x0, 0x0, 0xC2, 0x3C, 0x90, 0x40, 0x86, 
-                          0x10, 0x19, 0x32, 0xE2, 0x64, 0x90, 0x40, 0x46, 
-                          0x2, 0x19, 0x23, 0x23, 0x46, 0x2, 0x13, 0x24, 
-                          0xC6, 0x0, 0x13, 0x74, 0x12, 0xA9, 0xB7, 0x37, 
-                          0x3A, 0x23, 0xB6, 0xB0, 0xB3, 0xB9, 0x23, 0x8C, 
-                          0xCD, 0x1D, 0xA2, 0x2D, 0x2C, 0xCD, 0x6D, 0x8, 
-                          0x42, 0x1, 0xC, 0x41, 0x38, 0x82, 0x21, 0x8, 0x87, 
-                          0x30, 0x4, 0xE1, 0x18, 0x86, 0x20, 0x1C, 0xC4, 
-                          0x18, 0x84, 0xA0, 0x18, 0x43, 0x90, 0x8C, 0x41, 
-                          0x20, 0x94, 0x31, 0xC, 0x82, 0x71, 0x8C, 0x41, 
-                          0x28, 0x8E, 0x31, 0xC, 0x45, 0x51, 0x8C, 0x41, 
-                          0x40, 0x9C, 0x31, 0x14, 0xC4, 0x0, 0x0, 0x8F, 
-                          0x89, 0xC8, 0xF0, 0x5C, 0xE4, 0xDE, 0xDE, 0xE8, 
-                          0xE6, 0xD2, 0xCE, 0xDC, 0xC2, 0xE8, 0xEA, 0xE4, 
-                          0xCA, 0xE6, 0x86, 0x12, 0x28, 0xC6, 0x21, 0xC3, 
-                          0x73, 0x99, 0x43, 0xB, 0x23, 0x2B, 0x93, 0x6B, 
-                          0x7A, 0x23, 0x2B, 0x63, 0x1B, 0x4A, 0xB0, 0x18, 
-                          0x85, 0xC, 0xCF, 0xC5, 0xAE, 0x4C, 0x6E, 0x2E, 
-                          0xED, 0xCD, 0x6D, 0x28, 0x1, 0x63, 0x1C, 0x32, 
-                          0x3C, 0x97, 0x32, 0x37, 0x3A, 0xB9, 0x3C, 0xA8, 
-                          0xB7, 0x34, 0x37, 0xBA, 0xB9, 0xA1, 0x4, 0xF, 
-                          0x0, 0x0, 0x71, 0x20, 0x0, 0x0, 0x2, 0x0, 0x0, 
-                          0x0, 0x6, 0x40, 0x30, 0x0, 0xD2, 0x0, 0x0, 0x0, 
-                          0x61, 0x20, 0x0, 0x0, 0x6, 0x0, 0x0, 0x0, 0x13, 
-                          0x4, 0x1, 0x86, 0x3, 0x1, 0x0, 0x0, 0x2, 0x0, 
-                          0x0, 0x0, 0x7, 0x50, 0x10, 0xCD, 0x14, 0x61, 0x0, 
-                          0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 ]
   - Name:            RTS0
     Size:            8
     RootSignature:
       Size: 8
       AllowInputAssemblerInputLayout: true
 
-
-
 #CHECK:    - Name: RTS0
 #CHECK-NEXT: Size: 8
 #CHECK-NEXT: RootSignature:
 #CHECK-NEXT:   Size: 8
 #CHECK-NEXT:   AllowInputAssemblerInputLayout: true
-
-# DXC: !dx.rootsignatures = !{[[RS:![0-9]+]]}
-# DXC: [[RS]] = !{void ()* @main, [[REL:![0-9]+]]}
-# DXC: [[REL]] = !{[[RF:![0-9]+]]}
-# DXC: [[RF]] = !{!"RootFlags", i32 1}
diff --git a/llvm/test/tools/dxil-dis/lit.local.cfg b/llvm/test/tools/dxil-dis/lit.local.cfg
index 7b6819e0b406a..8fe45f696bff9 100644
--- a/llvm/test/tools/dxil-dis/lit.local.cfg
+++ b/llvm/test/tools/dxil-dis/lit.local.cfg
@@ -1,3 +1,3 @@
 if not config.dxil_tests:
     config.unsupported = True
-config.suffixes = [".ll"]
+config.suffixes = [".ll", ".yaml"]
diff --git a/llvm/test/tools/dxil-dis/root-signature.yaml b/llvm/test/tools/dxil-dis/root-signature.yaml
new file mode 100644
index 0000000000000..2a11dd9b3fcee
--- /dev/null
+++ b/llvm/test/tools/dxil-dis/root-signature.yaml
@@ -0,0 +1,201 @@
+# RUN: yaml2obj %s | dxil-dis | FileCheck %s
+
+--- !dxcontainer
+Header:
+  Hash:            [ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 
+                     0x0, 0x0, 0x0, 0x0, 0x0, 0x0 ]
+  Version:
+    Major:           1
+    Minor:           0
+  PartCount:       2
+  PartOffsets:     [ 60, 1496 ]
+Parts:
+  - Name:            DXIL
+    Size:            1428
+    Program:
+      MajorVersion:    6
+      MinorVersion:    0
+      ShaderKind:      5
+      Size:            357
+      DXILMajorVersion: 1
+      DXILMinorVersion: 0
+      DXILSize:        1404
+      DXIL:            [ 0x42, 0x43, 0xC0, 0xDE, 0x21, 0xC, 0x0, 0x0, 0x5C, 
+                          0x1, 0x0, 0x0, 0xB, 0x82, 0x20, 0x0, 0x2, 0x0, 
+                          0x0, 0x0, 0x13, 0x0, 0x0, 0x0, 0x7, 0x81, 0x23, 
+                          0x91, 0x41, 0xC8, 0x4, 0x49, 0x6, 0x10, 0x32, 
+                          0x39, 0x92, 0x1, 0x84, 0xC, 0x25, 0x5, 0x8, 0x19, 
+                          0x1E, 0x4, 0x8B, 0x62, 0x80, 0x10, 0x45, 0x2, 
+                          0x42, 0x92, 0xB, 0x42, 0x84, 0x10, 0x32, 0x14, 
+                          0x38, 0x8, 0x18, 0x4B, 0xA, 0x32, 0x42, 0x88, 
+                          0x48, 0x90, 0x14, 0x20, 0x43, 0x46, 0x88, 0xA5, 
+                          0x0, 0x19, 0x32, 0x42, 0xE4, 0x48, 0xE, 0x90, 
+                          0x11, 0x22, 0xC4, 0x50, 0x41, 0x51, 0x81, 0x8C, 
+                          0xE1, 0x83, 0xE5, 0x8A, 0x4, 0x21, 0x46, 0x6, 
+                          0x89, 0x20, 0x0, 0x0, 0x11, 0x0, 0x0, 0x0, 0x32, 
+                          0x22, 0x8, 0x9, 0x20, 0x64, 0x85, 0x4, 0x13, 0x22, 
+                          0xA4, 0x84, 0x4, 0x13, 0x22, 0xE3, 0x84, 0xA1, 
+                          0x90, 0x14, 0x12, 0x4C, 0x88, 0x8C, 0xB, 0x84, 
+                          0x84, 0x4C, 0x10, 0x20, 0x73, 0x4, 0x8, 0xC1, 
+                          0x65, 0xC3, 0x85, 0x2C, 0xE8, 0x3, 0x40, 0x14, 
+                          0x91, 0x4E, 0xD1, 0x4A, 0x48, 0x44, 0x54, 0x11, 
+                          0xC3, 0x9, 0x30, 0xC4, 0x18, 0x1, 0x30, 0x2, 0x50, 
+                          0x82, 0x21, 0x1A, 0x8, 0x98, 0x23, 0x0, 0x3, 0x0, 
+                          0x13, 0x14, 0x72, 0xC0, 0x87, 0x74, 0x60, 0x87, 
+                          0x36, 0x68, 0x87, 0x79, 0x68, 0x3, 0x72, 0xC0, 
+                          0x87, 0xD, 0xAE, 0x50, 0xE, 0x6D, 0xD0, 0xE, 0x7A, 
+                          0x50, 0xE, 0x6D, 0x0, 0xF, 0x7A, 0x30, 0x7, 0x72, 
+                          0xA0, 0x7, 0x73, 0x20, 0x7, 0x6D, 0x90, 0xE, 0x71, 
+                          0xA0, 0x7, 0x73, 0x20, 0x7, 0x6D, 0x90, 0xE, 0x78, 
+                          0xA0, 0x7, 0x78, 0xD0, 0x6, 0xE9, 0x10, 0x7, 0x76, 
+                          0xA0, 0x7, 0x71, 0x60, 0x7, 0x6D, 0x90, 0xE, 0x73, 
+                          0x20, 0x7, 0x7A, 0x30, 0x7, 0x72, 0xD0, 0x6, 0xE9, 
+                          0x60, 0x7, 0x74, 0xA0, 0x7, 0x76, 0x40, 0x7, 0x6D, 
+                          0x60, 0xE, 0x71, 0x60, 0x7, 0x7A, 0x10, 0x7, 0x76, 
+                          0xD0, 0x6, 0xE6, 0x30, 0x7, 0x72, 0xA0, 0x7, 0x73, 
+                          0x20, 0x7, 0x6D, 0x60, 0xE, 0x76, 0x40, 0x7, 0x7A, 
+                          0x60, 0x7, 0x74, 0xD0, 0x6, 0xEE, 0x80, 0x7, 0x7A, 
+                          0x10, 0x7, 0x76, 0xA0, 0x7, 0x73, 0x20, 0x7, 0x7A, 
+                          0x60, 0x7, 0x74, 0x30, 0xE4, 0x21, 0x0, 0x0, 0x0, 
+                          0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, 0xB, 
+                          0x4, 0x6, 0x0, 0x0, 0x0, 0x32, 0x1E, 0x98, 0xC, 
+                          0x19, 0x11, 0x4C, 0x90, 0x8C, 0x9, 0x26, 0x47, 
+                          0xC6, 0x4, 0x43, 0xBA, 0x12, 0x28, 0x86, 0x11, 
+                          0x80, 0x42, 0x0, 0x0, 0x79, 0x18, 0x0, 0x0, 0xCB, 
+                          0x0, 0x0, 0x0, 0x33, 0x8, 0x80, 0x1C, 0xC4, 0xE1, 
+                          0x1C, 0x66, 0x14, 0x1, 0x3D, 0x88, 0x43, 0x38, 
+                          0x84, 0xC3, 0x8C, 0x42, 0x80, 0x7, 0x79, 0x78, 
+                          0x7, 0x73, 0x98, 0x71, 0xC, 0xE6, 0x0, 0xF, 0xED, 
+                          0x10, 0xE, 0xF4, 0x80, 0xE, 0x33, 0xC, 0x42, 0x1E, 
+                          0xC2, 0xC1, 0x1D, 0xCE, 0xA1, 0x1C, 0x66, 0x30, 
+                          0x5, 0x3D, 0x88, 0x43, 0x38, 0x84, 0x83, 0x1B, 
+                          0xCC, 0x3, 0x3D, 0xC8, 0x43, 0x3D, 0x8C, 0x3, 
+                          0x3D, 0xCC, 0x78, 0x8C, 0x74, 0x70, 0x7, 0x7B, 
+                          0x8, 0x7, 0x79, 0x48, 0x87, 0x70, 0x70, 0x7, 0x7A, 
+                          0x70, 0x3, 0x76, 0x78, 0x87, 0x70, 0x20, 0x87, 
+                          0x19, 0xCC, 0x11, 0xE, 0xEC, 0x90, 0xE, 0xE1, 
+                          0x30, 0xF, 0x6E, 0x30, 0xF, 0xE3, 0xF0, 0xE, 0xF0, 
+                          0x50, 0xE, 0x33, 0x10, 0xC4, 0x1D, 0xDE, 0x21, 
+                          0x1C, 0xD8, 0x21, 0x1D, 0xC2, 0x61, 0x1E, 0x66, 
+                          0x30, 0x89, 0x3B, 0xBC, 0x83, 0x3B, 0xD0, 0x43, 
+                          0x39, 0xB4, 0x3, 0x3C, 0xBC, 0x83, 0x3C, 0x84, 
+                          0x3, 0x3B, 0xCC, 0xF0, 0x14, 0x76, 0x60, 0x7, 
+                          0x7B, 0x68, 0x7, 0x37, 0x68, 0x87, 0x72, 0x68, 
+                          0x7, 0x37, 0x80, 0x87, 0x70, 0x90, 0x87, 0x70, 
+                          0x60, 0x7, 0x76, 0x28, 0x7, 0x76, 0xF8, 0x5, 0x76, 
+                          0x78, 0x87, 0x77, 0x80, 0x87, 0x5F, 0x8, 0x87, 
+                          0x71, 0x18, 0x87, 0x72, 0x98, 0x87, 0x79, 0x98, 
+                          0x81, 0x2C, 0xEE, 0xF0, 0xE, 0xEE, 0xE0, 0xE, 
+                          0xF5, 0xC0, 0xE, 0xEC, 0x30, 0x3, 0x62, 0xC8, 
+                          0xA1, 0x1C, 0xE4, 0xA1, 0x1C, 0xCC, 0xA1, 0x1C, 
+                          0xE4, 0xA1, 0x1C, 0xDC, 0x61, 0x1C, 0xCA, 0x21, 
+                          0x1C, 0xC4, 0x81, 0x1D, 0xCA, 0x61, 0x6, 0xD6, 
+                          0x90, 0x43, 0x39, 0xC8, 0x43, 0x39, 0x98, 0x43, 
+                          0x39, 0xC8, 0x43, 0x39, 0xB8, 0xC3, 0x38, 0x94, 
+                          0x43, 0x38, 0x88, 0x3, 0x3B, 0x94, 0xC3, 0x2F, 
+                          0xBC, 0x83, 0x3C, 0xFC, 0x82, 0x3B, 0xD4, 0x3, 
+                          0x3B, 0xB0, 0xC3, 0xC, 0xC7, 0x69, 0x87, 0x70, 
+                          0x58, 0x87, 0x72, 0x70, 0x83, 0x74, 0x68, 0x7, 
+                          0x78, 0x60, 0x87, 0x74, 0x18, 0x87, 0x74, 0xA0, 
+                          0x87, 0x19, 0xCE, 0x53, 0xF, 0xEE, 0x0, 0xF, 0xF2, 
+                          0x50, 0xE, 0xE4, 0x90, 0xE, 0xE3, 0x40, 0xF, 0xE1, 
+                          0x20, 0xE, 0xEC, 0x50, 0xE, 0x33, 0x20, 0x28, 
+                          0x1D, 0xDC, 0xC1, 0x1E, 0xC2, 0x41, 0x1E, 0xD2, 
+                          0x21, 0x1C, 0xDC, 0x81, 0x1E, 0xDC, 0xE0, 0x1C, 
+                          0xE4, 0xE1, 0x1D, 0xEA, 0x1, 0x1E, 0x66, 0x18, 
+                          0x51, 0x38, 0xB0, 0x43, 0x3A, 0x9C, 0x83, 0x3B, 
+                          0xCC, 0x50, 0x24, 0x76, 0x60, 0x7, 0x7B, 0x68, 
+                          0x7, 0x37, 0x60, 0x87, 0x77, 0x78, 0x7, 0x78, 
+                          0x98, 0x51, 0x4C, 0xF4, 0x90, 0xF, 0xF0, 0x50, 
+                          0xE, 0x33, 0x1E, 0x6A, 0x1E, 0xCA, 0x61, 0x1C, 
+                          0xE8, 0x21, 0x1D, 0xDE, 0xC1, 0x1D, 0x7E, 0x1, 
+                          0x1E, 0xE4, 0xA1, 0x1C, 0xCC, 0x21, 0x1D, 0xF0, 
+                          0x61, 0x6, 0x54, 0x85, 0x83, 0x38, 0xCC, 0xC3, 
+                          0x3B, 0xB0, 0x43, 0x3D, 0xD0, 0x43, 0x39, 0xFC, 
+                          0xC2, 0x3C, 0xE4, 0x43, 0x3B, 0x88, 0xC3, 0x3B, 
+                          0xB0, 0xC3, 0x8C, 0xC5, 0xA, 0x87, 0x79, 0x98, 
+                          0x87, 0x77, 0x18, 0x87, 0x74, 0x8, 0x7, 0x7A, 
+                          0x28, 0x7, 0x72, 0x98, 0x81, 0x5C, 0xE3, 0x10, 
+                          0xE, 0xEC, 0xC0, 0xE, 0xE5, 0x50, 0xE, 0xF3, 0x30, 
+                          0x23, 0xC1, 0xD2, 0x41, 0x1E, 0xE4, 0xE1, 0x17, 
+                          0xD8, 0xE1, 0x1D, 0xDE, 0x1, 0x1E, 0x66, 0x48, 
+                          0x19, 0x3B, 0xB0, 0x83, 0x3D, 0xB4, 0x83, 0x1B, 
+                          0x84, 0xC3, 0x38, 0x8C, 0x43, 0x39, 0xCC, 0xC3, 
+                          0x3C, 0xB8, 0xC1, 0x39, 0xC8, 0xC3, 0x3B, 0xD4, 
+                          0x3, 0x3C, 0xCC, 0x48, 0xB4, 0x71, 0x8, 0x7, 0x76, 
+                          0x60, 0x7, 0x71, 0x8, 0x87, 0x71, 0x58, 0x87, 
+                          0x19, 0xDB, 0xC6, 0xE, 0xEC, 0x60, 0xF, 0xED, 
+                          0xE0, 0x6, 0xF0, 0x20, 0xF, 0xE5, 0x30, 0xF, 0xE5, 
+                          0x20, 0xF, 0xF6, 0x50, 0xE, 0x6E, 0x10, 0xE, 0xE3, 
+                          0x30, 0xE, 0xE5, 0x30, 0xF, 0xF3, 0xE0, 0x6, 0xE9, 
+                          0xE0, 0xE, 0xE4, 0x50, 0xE, 0xF8, 0x30, 0x23, 
+                          0xE2, 0xEC, 0x61, 0x1C, 0xC2, 0x81, 0x1D, 0xD8, 
+                          0xE1, 0x17, 0xEC, 0x21, 0x1D, 0xE6, 0x21, 0x1D, 
+                          0xC4, 0x21, 0x1D, 0xD8, 0x21, 0x1D, 0xE8, 0x21, 
+                          0x1F, 0x66, 0x20, 0x9D, 0x3B, 0xBC, 0x43, 0x3D, 
+                          0xB8, 0x3, 0x39, 0x94, 0x83, 0x39, 0xCC, 0x58, 
+                          0xBC, 0x70, 0x70, 0x7, 0x77, 0x78, 0x7, 0x7A, 
+                          0x8, 0x7, 0x7A, 0x48, 0x87, 0x77, 0x70, 0x87, 
+                          0x19, 0xCB, 0xE7, 0xE, 0xEF, 0x30, 0xF, 0xE1, 
+                          0xE0, 0xE, 0xE9, 0x40, 0xF, 0xE9, 0xA0, 0xF, 0xE5, 
+                          0x30, 0xC3, 0x1, 0x3, 0x73, 0xA8, 0x7, 0x77, 0x18, 
+                          0x87, 0x5F, 0x98, 0x87, 0x70, 0x70, 0x87, 0x74, 
+                          0xA0, 0x87, 0x74, 0xD0, 0x87, 0x72, 0x98, 0x81, 
+                          0x84, 0x41, 0x39, 0xE0, 0xC3, 0x38, 0xB0, 0x43, 
+                          0x3D, 0x90, 0x43, 0x39, 0xCC, 0x40, 0xC4, 0xA0, 
+                          0x1D, 0xCA, 0xA1, 0x1D, 0xE0, 0x41, 0x1E, 0xDE, 
+                          0xC1, 0x1C, 0x66, 0x24, 0x63, 0x30, 0xE, 0xE1, 
+                          0xC0, 0xE, 0xEC, 0x30, 0xF, 0xE9, 0x40, 0xF, 0xE5, 
+                          0x30, 0x43, 0x21, 0x83, 0x75, 0x18, 0x7, 0x73, 
+                          0x48, 0x87, 0x5F, 0xA0, 0x87, 0x7C, 0x80, 0x87, 
+                          0x72, 0x98, 0xB1, 0x94, 0x1, 0x3C, 0x8C, 0xC3, 
+                          0x3C, 0x94, 0xC3, 0x38, 0xD0, 0x43, 0x3A, 0xBC, 
+                          0x83, 0x3B, 0xCC, 0xC3, 0x8C, 0xC5, 0xC, 0x48, 
+                          0x21, 0x15, 0x42, 0x61, 0x1E, 0xE6, 0x21, 0x1D, 
+                          0xCE, 0xC1, 0x1D, 0x52, 0x81, 0x14, 0x66, 0x4C, 
+                          0x67, 0x30, 0xE, 0xEF, 0x20, 0xF, 0xEF, 0xE0, 
+                          0x6, 0xEF, 0x50, 0xF, 0xF4, 0x30, 0xF, 0xE9, 0x40, 
+                          0xE, 0xE5, 0xE0, 0x6, 0xE6, 0x20, 0xF, 0xE1, 0xD0, 
+                          0xE, 0xE5, 0x30, 0xA3, 0x40, 0x83, 0x76, 0x68, 
+                          0x7, 0x79, 0x8, 0x87, 0x19, 0x52, 0x1A, 0xB8, 
+                          0xC3, 0x3B, 0x84, 0x3, 0x3B, 0xA4, 0x43, 0x38, 
+                          0xCC, 0x83, 0x1B, 0x84, 0x3, 0x39, 0x90, 0x83, 
+                          0x3C, 0xCC, 0x3, 0x3C, 0x84, 0xC3, 0x38, 0x94, 
+                          0x3, 0x0, 0x0, 0x0, 0x0, 0x79, 0x28, 0x0, 0x0, 
+                          0x2A, 0x0, 0x0, 0x0, 0xC2, 0x3C, 0x90, 0x40, 0x86, 
+                          0x10, 0x19, 0x32, 0xE2, 0x64, 0x90, 0x40, 0x46, 
+                          0x2, 0x19, 0x23, 0x23, 0x46, 0x2, 0x13, 0x24, 
+                          0xC6, 0x0, 0x13, 0x74, 0x12, 0xA9, 0xB7, 0x37, 
+                          0x3A, 0x23, 0xB6, 0xB0, 0xB3, 0xB9, 0x23, 0x8C, 
+                          0xCD, 0x1D, 0xA2, 0x2D, 0x2C, 0xCD, 0x6D, 0x8, 
+                          0x42, 0x1, 0xC, 0x41, 0x38, 0x82, 0x21, 0x8, 0x87, 
+                          0x30, 0x4, 0xE1, 0x18, 0x86, 0x20, 0x1C, 0xC4, 
+                          0x18, 0x84, 0xA0, 0x18, 0x43, 0x90, 0x8C, 0x41, 
+                          0x20, 0x94, 0x31, 0xC, 0x82, 0x71, 0x8C, 0x41, 
+                          0x28, 0x8E, 0x31, 0xC, 0x45, 0x51, 0x8C, 0x41, 
+                          0x40, 0x9C, 0x31, 0x14, 0xC4, 0x0, 0x0, 0x8F, 
+                          0x89, 0xC8, 0xF0, 0x5C, 0xE4, 0xDE, 0xDE, 0xE8, 
+                          0xE6, 0xD2, 0xCE, 0xDC, 0xC2, 0xE8, 0xEA, 0xE4, 
+                          0xCA, 0xE6, 0x86, 0x12, 0x28, 0xC6, 0x21, 0xC3, 
+                          0x73, 0x99, 0x43, 0xB, 0x23, 0x2B, 0x93, 0x6B, 
+                          0x7A, 0x23, 0x2B, 0x63, 0x1B, 0x4A, 0xB0, 0x18, 
+                          0x85, 0xC, 0xCF, 0xC5, 0xAE, 0x4C, 0x6E, 0x2E, 
+                          0xED, 0xCD, 0x6D, 0x28, 0x1, 0x63, 0x1C, 0x32, 
+                          0x3C, 0x97, 0x32, 0x37, 0x3A, 0xB9, 0x3C, 0xA8, 
+                          0xB7, 0x34, 0x37, 0xBA, 0xB9, 0xA1, 0x4, 0xF, 
+                          0x0, 0x0, 0x71, 0x20, 0x0, 0x0, 0x2, 0x0, 0x0, 
+                          0x0, 0x6, 0x40, 0x30, 0x0, 0xD2, 0x0, 0x0, 0x0, 
+                          0x61, 0x20, 0x0, 0x0, 0x6, 0x0, 0x0, 0x0, 0x13, 
+                          0x4, 0x1, 0x86, 0x3, 0x1, 0x0, 0x0, 0x2, 0x0, 
+                          0x0, 0x0, 0x7, 0x50, 0x10, 0xCD, 0x14, 0x61, 0x0, 
+                          0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 ]
+  - Name:            RTS0
+    Size:            8
+    RootSignature:
+      Size: 8
+      AllowInputAssemblerInputLayout: true
+
+# CHECK: !dx.rootsignatures = !{[[RS:![0-9]+]]}
+# CHECK: [[RS]] = !{void ()* @main, [[REL:![0-9]+]]}
+# CHECK: [[REL]] = !{[[RF:![0-9]+]]}
+# CHECK: [[RF]] = !{!"RootFlags", i32 1}

>From f93d42d1a38f86300b4ee3d2f33ed9ffeb470acc Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Mon, 3 Feb 2025 21:05:40 +0000
Subject: [PATCH 20/64] addressing test concerns

---
 .../llvm/MC/DXContainerRootSignature.h        |   8 +-
 llvm/include/llvm/Object/DXContainer.h        |  14 +-
 .../include/llvm/ObjectYAML/DXContainerYAML.h |   6 +-
 llvm/lib/MC/DXContainerRootSignature.cpp      |   9 +-
 llvm/lib/Object/DXContainer.cpp               |  18 +-
 llvm/lib/ObjectYAML/DXContainerYAML.cpp       |  11 +-
 .../DXContainer/RootSignature-Flags.yaml      |  22 +-
 llvm/test/tools/dxil-dis/root-signature.yaml  | 201 ------------------
 llvm/unittests/Object/DXContainerTest.cpp     |  22 ++
 .../ObjectYAML/DXContainerYAMLTest.cpp        |  40 ++++
 10 files changed, 129 insertions(+), 222 deletions(-)
 delete mode 100644 llvm/test/tools/dxil-dis/root-signature.yaml

diff --git a/llvm/include/llvm/MC/DXContainerRootSignature.h b/llvm/include/llvm/MC/DXContainerRootSignature.h
index 20b4f5a4285f6..e1a9be5fc52d8 100644
--- a/llvm/include/llvm/MC/DXContainerRootSignature.h
+++ b/llvm/include/llvm/MC/DXContainerRootSignature.h
@@ -15,9 +15,13 @@ class raw_ostream;
 
 namespace mcdxbc {
 struct RootSignatureHeader {
-  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;
 
-  void swapBytes();
   void write(raw_ostream &OS);
 };
 } // namespace mcdxbc
diff --git a/llvm/include/llvm/Object/DXContainer.h b/llvm/include/llvm/Object/DXContainer.h
index 5f7737d2fa41d..47128f94e0968 100644
--- a/llvm/include/llvm/Object/DXContainer.h
+++ b/llvm/include/llvm/Object/DXContainer.h
@@ -120,16 +120,22 @@ namespace DirectX {
 class RootSignature {
 private:
   StringRef Data;
-  uint32_t Size;
+  uint32_t Version;
+  uint32_t NumParameters;
+  uint32_t RootParametersOffset;
+  uint32_t NumStaticSamplers;
+  uint32_t StaticSamplersOffset;
   uint32_t Flags;
 
 public:
   RootSignature(StringRef Data) : Data(Data) {}
 
   Error parse();
-
-  uint32_t getSize() const { return Size; }
-
+  uint32_t getVersion() const { return Version; }
+  uint32_t getNumParameters() const { return NumParameters; }
+  uint32_t getRootParametersOffset() const { return RootParametersOffset; }
+  uint32_t getNumStaticSamplers() const { return NumStaticSamplers; }
+  uint32_t getStaticSamplersOffset() const { return StaticSamplersOffset; }
   uint32_t getFlags() const { return Flags; }
 };
 
diff --git a/llvm/include/llvm/ObjectYAML/DXContainerYAML.h b/llvm/include/llvm/ObjectYAML/DXContainerYAML.h
index a82083fa18de6..1f967114ea1eb 100644
--- a/llvm/include/llvm/ObjectYAML/DXContainerYAML.h
+++ b/llvm/include/llvm/ObjectYAML/DXContainerYAML.h
@@ -79,7 +79,11 @@ struct RootSignatureDesc {
   RootSignatureDesc(const object::DirectX::RootSignature &Data);
 
   uint32_t getEncodedFlags();
-  uint32_t Size;
+  uint32_t Version;
+  uint32_t NumParameters;
+  uint32_t RootParametersOffset;
+  uint32_t NumStaticSamplers;
+  uint32_t StaticSamplersOffset;
 
 #include "llvm/BinaryFormat/DXContainerConstants.def"
 };
diff --git a/llvm/lib/MC/DXContainerRootSignature.cpp b/llvm/lib/MC/DXContainerRootSignature.cpp
index 4e085654a1e5e..000d23f24d241 100644
--- a/llvm/lib/MC/DXContainerRootSignature.cpp
+++ b/llvm/lib/MC/DXContainerRootSignature.cpp
@@ -8,15 +8,16 @@
 
 #include "llvm/MC/DXContainerRootSignature.h"
 #include "llvm/Support/EndianStream.h"
-#include "llvm/Support/SwapByteOrder.h"
-#include <iterator>
 
 using namespace llvm;
 using namespace llvm::mcdxbc;
 
 void RootSignatureHeader::write(raw_ostream &OS) {
 
-  uint32_t SizeInfo = sizeof(this);
-  support::endian::write(OS, SizeInfo, llvm::endianness::little);
+  support::endian::write(OS, Version, llvm::endianness::little);
+  support::endian::write(OS, NumParameters, llvm::endianness::little);
+  support::endian::write(OS, RootParametersOffset, llvm::endianness::little);
+  support::endian::write(OS, NumStaticSamplers, llvm::endianness::little);
+  support::endian::write(OS, StaticSamplersOffset, llvm::endianness::little);
   support::endian::write(OS, Flags, llvm::endianness::little);
 }
diff --git a/llvm/lib/Object/DXContainer.cpp b/llvm/lib/Object/DXContainer.cpp
index 6743911059cfd..14179283f9807 100644
--- a/llvm/lib/Object/DXContainer.cpp
+++ b/llvm/lib/Object/DXContainer.cpp
@@ -245,7 +245,23 @@ void DXContainer::PartIterator::updateIteratorImpl(const uint32_t Offset) {
 Error DirectX::RootSignature::parse() {
   const char *Current = Data.begin();
 
-  Size = support::endian::read<uint32_t, llvm::endianness::little>(Current);
+  Version = support::endian::read<uint32_t, llvm::endianness::little>(Current);
+  Current += sizeof(uint32_t);
+
+  NumParameters =
+      support::endian::read<uint32_t, llvm::endianness::little>(Current);
+  Current += sizeof(uint32_t);
+
+  RootParametersOffset =
+      support::endian::read<uint32_t, llvm::endianness::little>(Current);
+  Current += sizeof(uint32_t);
+
+  NumStaticSamplers =
+      support::endian::read<uint32_t, llvm::endianness::little>(Current);
+  Current += sizeof(uint32_t);
+
+  StaticSamplersOffset =
+      support::endian::read<uint32_t, llvm::endianness::little>(Current);
   Current += sizeof(uint32_t);
 
   Flags = support::endian::read<uint32_t, llvm::endianness::little>(Current);
diff --git a/llvm/lib/ObjectYAML/DXContainerYAML.cpp b/llvm/lib/ObjectYAML/DXContainerYAML.cpp
index fd85d75dc32eb..522781c0d36ef 100644
--- a/llvm/lib/ObjectYAML/DXContainerYAML.cpp
+++ b/llvm/lib/ObjectYAML/DXContainerYAML.cpp
@@ -32,7 +32,10 @@ DXContainerYAML::ShaderFeatureFlags::ShaderFeatureFlags(uint64_t FlagData) {
 
 DXContainerYAML::RootSignatureDesc::RootSignatureDesc(
     const object::DirectX::RootSignature &Data)
-    : Size(Data.getSize()) {
+    : Version(Data.getVersion()), NumParameters(Data.getNumParameters()),
+      RootParametersOffset(Data.getRootParametersOffset()),
+      NumStaticSamplers(Data.getNumStaticSamplers()),
+      StaticSamplersOffset(Data.getStaticSamplersOffset()) {
   uint32_t Flags = Data.getFlags();
 #define ROOT_ELEMENT_FLAG(Num, Val, Str)                                       \
   Val = (Flags & (uint32_t)dxbc::RootElementFlag::Val) > 0;
@@ -209,7 +212,11 @@ void MappingTraits<DXContainerYAML::Signature>::mapping(
 
 void MappingTraits<DXContainerYAML::RootSignatureDesc>::mapping(
     IO &IO, DXContainerYAML::RootSignatureDesc &S) {
-  IO.mapRequired("Size", S.Size);
+  IO.mapRequired("Version", S.Version);
+  IO.mapRequired("NumParameters", S.NumParameters);
+  IO.mapRequired("RootParametersOffset", S.RootParametersOffset);
+  IO.mapRequired("NumStaticSamplers", S.NumStaticSamplers);
+  IO.mapRequired("StaticSamplersOffset", S.StaticSamplersOffset);
 #define ROOT_ELEMENT_FLAG(Num, Val, Str) IO.mapOptional(#Val, S.Val, false);
 #include "llvm/BinaryFormat/DXContainerConstants.def"
 }
diff --git a/llvm/test/ObjectYAML/DXContainer/RootSignature-Flags.yaml b/llvm/test/ObjectYAML/DXContainer/RootSignature-Flags.yaml
index e3ca7347d52c7..06814f660f283 100644
--- a/llvm/test/ObjectYAML/DXContainer/RootSignature-Flags.yaml
+++ b/llvm/test/ObjectYAML/DXContainer/RootSignature-Flags.yaml
@@ -11,13 +11,21 @@ Header:
   PartOffsets:     [ 60 ]
 Parts:
   - Name:            RTS0
-    Size:            8
+    Size:            24
     RootSignature:
-      Size: 8
+      Version: 2
+      NumParameters: 0
+      RootParametersOffset: 0
+      NumStaticSamplers: 0
+      StaticSamplersOffset: 0
       AllowInputAssemblerInputLayout: true
 
-#CHECK:    - Name: RTS0
-#CHECK-NEXT: Size: 8
-#CHECK-NEXT: RootSignature:
-#CHECK-NEXT:   Size: 8
-#CHECK-NEXT:   AllowInputAssemblerInputLayout: true
+# CHECK:  - Name:            RTS0
+# CHECK-NEXT:    Size:            24
+# CHECK-NEXT:    RootSignature:
+# CHECK-NEXT:      Version: 2
+# CHECK-NEXT:      NumParameters: 0
+# CHECK-NEXT:      RootParametersOffset: 0
+# CHECK-NEXT:      NumStaticSamplers: 0
+# CHECK-NEXT:      StaticSamplersOffset: 0
+# CHECK-NEXT:      AllowInputAssemblerInputLayout: true
diff --git a/llvm/test/tools/dxil-dis/root-signature.yaml b/llvm/test/tools/dxil-dis/root-signature.yaml
deleted file mode 100644
index 2a11dd9b3fcee..0000000000000
--- a/llvm/test/tools/dxil-dis/root-signature.yaml
+++ /dev/null
@@ -1,201 +0,0 @@
-# RUN: yaml2obj %s | dxil-dis | FileCheck %s
-
---- !dxcontainer
-Header:
-  Hash:            [ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 
-                     0x0, 0x0, 0x0, 0x0, 0x0, 0x0 ]
-  Version:
-    Major:           1
-    Minor:           0
-  PartCount:       2
-  PartOffsets:     [ 60, 1496 ]
-Parts:
-  - Name:            DXIL
-    Size:            1428
-    Program:
-      MajorVersion:    6
-      MinorVersion:    0
-      ShaderKind:      5
-      Size:            357
-      DXILMajorVersion: 1
-      DXILMinorVersion: 0
-      DXILSize:        1404
-      DXIL:            [ 0x42, 0x43, 0xC0, 0xDE, 0x21, 0xC, 0x0, 0x0, 0x5C, 
-                          0x1, 0x0, 0x0, 0xB, 0x82, 0x20, 0x0, 0x2, 0x0, 
-                          0x0, 0x0, 0x13, 0x0, 0x0, 0x0, 0x7, 0x81, 0x23, 
-                          0x91, 0x41, 0xC8, 0x4, 0x49, 0x6, 0x10, 0x32, 
-                          0x39, 0x92, 0x1, 0x84, 0xC, 0x25, 0x5, 0x8, 0x19, 
-                          0x1E, 0x4, 0x8B, 0x62, 0x80, 0x10, 0x45, 0x2, 
-                          0x42, 0x92, 0xB, 0x42, 0x84, 0x10, 0x32, 0x14, 
-                          0x38, 0x8, 0x18, 0x4B, 0xA, 0x32, 0x42, 0x88, 
-                          0x48, 0x90, 0x14, 0x20, 0x43, 0x46, 0x88, 0xA5, 
-                          0x0, 0x19, 0x32, 0x42, 0xE4, 0x48, 0xE, 0x90, 
-                          0x11, 0x22, 0xC4, 0x50, 0x41, 0x51, 0x81, 0x8C, 
-                          0xE1, 0x83, 0xE5, 0x8A, 0x4, 0x21, 0x46, 0x6, 
-                          0x89, 0x20, 0x0, 0x0, 0x11, 0x0, 0x0, 0x0, 0x32, 
-                          0x22, 0x8, 0x9, 0x20, 0x64, 0x85, 0x4, 0x13, 0x22, 
-                          0xA4, 0x84, 0x4, 0x13, 0x22, 0xE3, 0x84, 0xA1, 
-                          0x90, 0x14, 0x12, 0x4C, 0x88, 0x8C, 0xB, 0x84, 
-                          0x84, 0x4C, 0x10, 0x20, 0x73, 0x4, 0x8, 0xC1, 
-                          0x65, 0xC3, 0x85, 0x2C, 0xE8, 0x3, 0x40, 0x14, 
-                          0x91, 0x4E, 0xD1, 0x4A, 0x48, 0x44, 0x54, 0x11, 
-                          0xC3, 0x9, 0x30, 0xC4, 0x18, 0x1, 0x30, 0x2, 0x50, 
-                          0x82, 0x21, 0x1A, 0x8, 0x98, 0x23, 0x0, 0x3, 0x0, 
-                          0x13, 0x14, 0x72, 0xC0, 0x87, 0x74, 0x60, 0x87, 
-                          0x36, 0x68, 0x87, 0x79, 0x68, 0x3, 0x72, 0xC0, 
-                          0x87, 0xD, 0xAE, 0x50, 0xE, 0x6D, 0xD0, 0xE, 0x7A, 
-                          0x50, 0xE, 0x6D, 0x0, 0xF, 0x7A, 0x30, 0x7, 0x72, 
-                          0xA0, 0x7, 0x73, 0x20, 0x7, 0x6D, 0x90, 0xE, 0x71, 
-                          0xA0, 0x7, 0x73, 0x20, 0x7, 0x6D, 0x90, 0xE, 0x78, 
-                          0xA0, 0x7, 0x78, 0xD0, 0x6, 0xE9, 0x10, 0x7, 0x76, 
-                          0xA0, 0x7, 0x71, 0x60, 0x7, 0x6D, 0x90, 0xE, 0x73, 
-                          0x20, 0x7, 0x7A, 0x30, 0x7, 0x72, 0xD0, 0x6, 0xE9, 
-                          0x60, 0x7, 0x74, 0xA0, 0x7, 0x76, 0x40, 0x7, 0x6D, 
-                          0x60, 0xE, 0x71, 0x60, 0x7, 0x7A, 0x10, 0x7, 0x76, 
-                          0xD0, 0x6, 0xE6, 0x30, 0x7, 0x72, 0xA0, 0x7, 0x73, 
-                          0x20, 0x7, 0x6D, 0x60, 0xE, 0x76, 0x40, 0x7, 0x7A, 
-                          0x60, 0x7, 0x74, 0xD0, 0x6, 0xEE, 0x80, 0x7, 0x7A, 
-                          0x10, 0x7, 0x76, 0xA0, 0x7, 0x73, 0x20, 0x7, 0x7A, 
-                          0x60, 0x7, 0x74, 0x30, 0xE4, 0x21, 0x0, 0x0, 0x0, 
-                          0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, 0xB, 
-                          0x4, 0x6, 0x0, 0x0, 0x0, 0x32, 0x1E, 0x98, 0xC, 
-                          0x19, 0x11, 0x4C, 0x90, 0x8C, 0x9, 0x26, 0x47, 
-                          0xC6, 0x4, 0x43, 0xBA, 0x12, 0x28, 0x86, 0x11, 
-                          0x80, 0x42, 0x0, 0x0, 0x79, 0x18, 0x0, 0x0, 0xCB, 
-                          0x0, 0x0, 0x0, 0x33, 0x8, 0x80, 0x1C, 0xC4, 0xE1, 
-                          0x1C, 0x66, 0x14, 0x1, 0x3D, 0x88, 0x43, 0x38, 
-                          0x84, 0xC3, 0x8C, 0x42, 0x80, 0x7, 0x79, 0x78, 
-                          0x7, 0x73, 0x98, 0x71, 0xC, 0xE6, 0x0, 0xF, 0xED, 
-                          0x10, 0xE, 0xF4, 0x80, 0xE, 0x33, 0xC, 0x42, 0x1E, 
-                          0xC2, 0xC1, 0x1D, 0xCE, 0xA1, 0x1C, 0x66, 0x30, 
-                          0x5, 0x3D, 0x88, 0x43, 0x38, 0x84, 0x83, 0x1B, 
-                          0xCC, 0x3, 0x3D, 0xC8, 0x43, 0x3D, 0x8C, 0x3, 
-                          0x3D, 0xCC, 0x78, 0x8C, 0x74, 0x70, 0x7, 0x7B, 
-                          0x8, 0x7, 0x79, 0x48, 0x87, 0x70, 0x70, 0x7, 0x7A, 
-                          0x70, 0x3, 0x76, 0x78, 0x87, 0x70, 0x20, 0x87, 
-                          0x19, 0xCC, 0x11, 0xE, 0xEC, 0x90, 0xE, 0xE1, 
-                          0x30, 0xF, 0x6E, 0x30, 0xF, 0xE3, 0xF0, 0xE, 0xF0, 
-                          0x50, 0xE, 0x33, 0x10, 0xC4, 0x1D, 0xDE, 0x21, 
-                          0x1C, 0xD8, 0x21, 0x1D, 0xC2, 0x61, 0x1E, 0x66, 
-                          0x30, 0x89, 0x3B, 0xBC, 0x83, 0x3B, 0xD0, 0x43, 
-                          0x39, 0xB4, 0x3, 0x3C, 0xBC, 0x83, 0x3C, 0x84, 
-                          0x3, 0x3B, 0xCC, 0xF0, 0x14, 0x76, 0x60, 0x7, 
-                          0x7B, 0x68, 0x7, 0x37, 0x68, 0x87, 0x72, 0x68, 
-                          0x7, 0x37, 0x80, 0x87, 0x70, 0x90, 0x87, 0x70, 
-                          0x60, 0x7, 0x76, 0x28, 0x7, 0x76, 0xF8, 0x5, 0x76, 
-                          0x78, 0x87, 0x77, 0x80, 0x87, 0x5F, 0x8, 0x87, 
-                          0x71, 0x18, 0x87, 0x72, 0x98, 0x87, 0x79, 0x98, 
-                          0x81, 0x2C, 0xEE, 0xF0, 0xE, 0xEE, 0xE0, 0xE, 
-                          0xF5, 0xC0, 0xE, 0xEC, 0x30, 0x3, 0x62, 0xC8, 
-                          0xA1, 0x1C, 0xE4, 0xA1, 0x1C, 0xCC, 0xA1, 0x1C, 
-                          0xE4, 0xA1, 0x1C, 0xDC, 0x61, 0x1C, 0xCA, 0x21, 
-                          0x1C, 0xC4, 0x81, 0x1D, 0xCA, 0x61, 0x6, 0xD6, 
-                          0x90, 0x43, 0x39, 0xC8, 0x43, 0x39, 0x98, 0x43, 
-                          0x39, 0xC8, 0x43, 0x39, 0xB8, 0xC3, 0x38, 0x94, 
-                          0x43, 0x38, 0x88, 0x3, 0x3B, 0x94, 0xC3, 0x2F, 
-                          0xBC, 0x83, 0x3C, 0xFC, 0x82, 0x3B, 0xD4, 0x3, 
-                          0x3B, 0xB0, 0xC3, 0xC, 0xC7, 0x69, 0x87, 0x70, 
-                          0x58, 0x87, 0x72, 0x70, 0x83, 0x74, 0x68, 0x7, 
-                          0x78, 0x60, 0x87, 0x74, 0x18, 0x87, 0x74, 0xA0, 
-                          0x87, 0x19, 0xCE, 0x53, 0xF, 0xEE, 0x0, 0xF, 0xF2, 
-                          0x50, 0xE, 0xE4, 0x90, 0xE, 0xE3, 0x40, 0xF, 0xE1, 
-                          0x20, 0xE, 0xEC, 0x50, 0xE, 0x33, 0x20, 0x28, 
-                          0x1D, 0xDC, 0xC1, 0x1E, 0xC2, 0x41, 0x1E, 0xD2, 
-                          0x21, 0x1C, 0xDC, 0x81, 0x1E, 0xDC, 0xE0, 0x1C, 
-                          0xE4, 0xE1, 0x1D, 0xEA, 0x1, 0x1E, 0x66, 0x18, 
-                          0x51, 0x38, 0xB0, 0x43, 0x3A, 0x9C, 0x83, 0x3B, 
-                          0xCC, 0x50, 0x24, 0x76, 0x60, 0x7, 0x7B, 0x68, 
-                          0x7, 0x37, 0x60, 0x87, 0x77, 0x78, 0x7, 0x78, 
-                          0x98, 0x51, 0x4C, 0xF4, 0x90, 0xF, 0xF0, 0x50, 
-                          0xE, 0x33, 0x1E, 0x6A, 0x1E, 0xCA, 0x61, 0x1C, 
-                          0xE8, 0x21, 0x1D, 0xDE, 0xC1, 0x1D, 0x7E, 0x1, 
-                          0x1E, 0xE4, 0xA1, 0x1C, 0xCC, 0x21, 0x1D, 0xF0, 
-                          0x61, 0x6, 0x54, 0x85, 0x83, 0x38, 0xCC, 0xC3, 
-                          0x3B, 0xB0, 0x43, 0x3D, 0xD0, 0x43, 0x39, 0xFC, 
-                          0xC2, 0x3C, 0xE4, 0x43, 0x3B, 0x88, 0xC3, 0x3B, 
-                          0xB0, 0xC3, 0x8C, 0xC5, 0xA, 0x87, 0x79, 0x98, 
-                          0x87, 0x77, 0x18, 0x87, 0x74, 0x8, 0x7, 0x7A, 
-                          0x28, 0x7, 0x72, 0x98, 0x81, 0x5C, 0xE3, 0x10, 
-                          0xE, 0xEC, 0xC0, 0xE, 0xE5, 0x50, 0xE, 0xF3, 0x30, 
-                          0x23, 0xC1, 0xD2, 0x41, 0x1E, 0xE4, 0xE1, 0x17, 
-                          0xD8, 0xE1, 0x1D, 0xDE, 0x1, 0x1E, 0x66, 0x48, 
-                          0x19, 0x3B, 0xB0, 0x83, 0x3D, 0xB4, 0x83, 0x1B, 
-                          0x84, 0xC3, 0x38, 0x8C, 0x43, 0x39, 0xCC, 0xC3, 
-                          0x3C, 0xB8, 0xC1, 0x39, 0xC8, 0xC3, 0x3B, 0xD4, 
-                          0x3, 0x3C, 0xCC, 0x48, 0xB4, 0x71, 0x8, 0x7, 0x76, 
-                          0x60, 0x7, 0x71, 0x8, 0x87, 0x71, 0x58, 0x87, 
-                          0x19, 0xDB, 0xC6, 0xE, 0xEC, 0x60, 0xF, 0xED, 
-                          0xE0, 0x6, 0xF0, 0x20, 0xF, 0xE5, 0x30, 0xF, 0xE5, 
-                          0x20, 0xF, 0xF6, 0x50, 0xE, 0x6E, 0x10, 0xE, 0xE3, 
-                          0x30, 0xE, 0xE5, 0x30, 0xF, 0xF3, 0xE0, 0x6, 0xE9, 
-                          0xE0, 0xE, 0xE4, 0x50, 0xE, 0xF8, 0x30, 0x23, 
-                          0xE2, 0xEC, 0x61, 0x1C, 0xC2, 0x81, 0x1D, 0xD8, 
-                          0xE1, 0x17, 0xEC, 0x21, 0x1D, 0xE6, 0x21, 0x1D, 
-                          0xC4, 0x21, 0x1D, 0xD8, 0x21, 0x1D, 0xE8, 0x21, 
-                          0x1F, 0x66, 0x20, 0x9D, 0x3B, 0xBC, 0x43, 0x3D, 
-                          0xB8, 0x3, 0x39, 0x94, 0x83, 0x39, 0xCC, 0x58, 
-                          0xBC, 0x70, 0x70, 0x7, 0x77, 0x78, 0x7, 0x7A, 
-                          0x8, 0x7, 0x7A, 0x48, 0x87, 0x77, 0x70, 0x87, 
-                          0x19, 0xCB, 0xE7, 0xE, 0xEF, 0x30, 0xF, 0xE1, 
-                          0xE0, 0xE, 0xE9, 0x40, 0xF, 0xE9, 0xA0, 0xF, 0xE5, 
-                          0x30, 0xC3, 0x1, 0x3, 0x73, 0xA8, 0x7, 0x77, 0x18, 
-                          0x87, 0x5F, 0x98, 0x87, 0x70, 0x70, 0x87, 0x74, 
-                          0xA0, 0x87, 0x74, 0xD0, 0x87, 0x72, 0x98, 0x81, 
-                          0x84, 0x41, 0x39, 0xE0, 0xC3, 0x38, 0xB0, 0x43, 
-                          0x3D, 0x90, 0x43, 0x39, 0xCC, 0x40, 0xC4, 0xA0, 
-                          0x1D, 0xCA, 0xA1, 0x1D, 0xE0, 0x41, 0x1E, 0xDE, 
-                          0xC1, 0x1C, 0x66, 0x24, 0x63, 0x30, 0xE, 0xE1, 
-                          0xC0, 0xE, 0xEC, 0x30, 0xF, 0xE9, 0x40, 0xF, 0xE5, 
-                          0x30, 0x43, 0x21, 0x83, 0x75, 0x18, 0x7, 0x73, 
-                          0x48, 0x87, 0x5F, 0xA0, 0x87, 0x7C, 0x80, 0x87, 
-                          0x72, 0x98, 0xB1, 0x94, 0x1, 0x3C, 0x8C, 0xC3, 
-                          0x3C, 0x94, 0xC3, 0x38, 0xD0, 0x43, 0x3A, 0xBC, 
-                          0x83, 0x3B, 0xCC, 0xC3, 0x8C, 0xC5, 0xC, 0x48, 
-                          0x21, 0x15, 0x42, 0x61, 0x1E, 0xE6, 0x21, 0x1D, 
-                          0xCE, 0xC1, 0x1D, 0x52, 0x81, 0x14, 0x66, 0x4C, 
-                          0x67, 0x30, 0xE, 0xEF, 0x20, 0xF, 0xEF, 0xE0, 
-                          0x6, 0xEF, 0x50, 0xF, 0xF4, 0x30, 0xF, 0xE9, 0x40, 
-                          0xE, 0xE5, 0xE0, 0x6, 0xE6, 0x20, 0xF, 0xE1, 0xD0, 
-                          0xE, 0xE5, 0x30, 0xA3, 0x40, 0x83, 0x76, 0x68, 
-                          0x7, 0x79, 0x8, 0x87, 0x19, 0x52, 0x1A, 0xB8, 
-                          0xC3, 0x3B, 0x84, 0x3, 0x3B, 0xA4, 0x43, 0x38, 
-                          0xCC, 0x83, 0x1B, 0x84, 0x3, 0x39, 0x90, 0x83, 
-                          0x3C, 0xCC, 0x3, 0x3C, 0x84, 0xC3, 0x38, 0x94, 
-                          0x3, 0x0, 0x0, 0x0, 0x0, 0x79, 0x28, 0x0, 0x0, 
-                          0x2A, 0x0, 0x0, 0x0, 0xC2, 0x3C, 0x90, 0x40, 0x86, 
-                          0x10, 0x19, 0x32, 0xE2, 0x64, 0x90, 0x40, 0x46, 
-                          0x2, 0x19, 0x23, 0x23, 0x46, 0x2, 0x13, 0x24, 
-                          0xC6, 0x0, 0x13, 0x74, 0x12, 0xA9, 0xB7, 0x37, 
-                          0x3A, 0x23, 0xB6, 0xB0, 0xB3, 0xB9, 0x23, 0x8C, 
-                          0xCD, 0x1D, 0xA2, 0x2D, 0x2C, 0xCD, 0x6D, 0x8, 
-                          0x42, 0x1, 0xC, 0x41, 0x38, 0x82, 0x21, 0x8, 0x87, 
-                          0x30, 0x4, 0xE1, 0x18, 0x86, 0x20, 0x1C, 0xC4, 
-                          0x18, 0x84, 0xA0, 0x18, 0x43, 0x90, 0x8C, 0x41, 
-                          0x20, 0x94, 0x31, 0xC, 0x82, 0x71, 0x8C, 0x41, 
-                          0x28, 0x8E, 0x31, 0xC, 0x45, 0x51, 0x8C, 0x41, 
-                          0x40, 0x9C, 0x31, 0x14, 0xC4, 0x0, 0x0, 0x8F, 
-                          0x89, 0xC8, 0xF0, 0x5C, 0xE4, 0xDE, 0xDE, 0xE8, 
-                          0xE6, 0xD2, 0xCE, 0xDC, 0xC2, 0xE8, 0xEA, 0xE4, 
-                          0xCA, 0xE6, 0x86, 0x12, 0x28, 0xC6, 0x21, 0xC3, 
-                          0x73, 0x99, 0x43, 0xB, 0x23, 0x2B, 0x93, 0x6B, 
-                          0x7A, 0x23, 0x2B, 0x63, 0x1B, 0x4A, 0xB0, 0x18, 
-                          0x85, 0xC, 0xCF, 0xC5, 0xAE, 0x4C, 0x6E, 0x2E, 
-                          0xED, 0xCD, 0x6D, 0x28, 0x1, 0x63, 0x1C, 0x32, 
-                          0x3C, 0x97, 0x32, 0x37, 0x3A, 0xB9, 0x3C, 0xA8, 
-                          0xB7, 0x34, 0x37, 0xBA, 0xB9, 0xA1, 0x4, 0xF, 
-                          0x0, 0x0, 0x71, 0x20, 0x0, 0x0, 0x2, 0x0, 0x0, 
-                          0x0, 0x6, 0x40, 0x30, 0x0, 0xD2, 0x0, 0x0, 0x0, 
-                          0x61, 0x20, 0x0, 0x0, 0x6, 0x0, 0x0, 0x0, 0x13, 
-                          0x4, 0x1, 0x86, 0x3, 0x1, 0x0, 0x0, 0x2, 0x0, 
-                          0x0, 0x0, 0x7, 0x50, 0x10, 0xCD, 0x14, 0x61, 0x0, 
-                          0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 ]
-  - Name:            RTS0
-    Size:            8
-    RootSignature:
-      Size: 8
-      AllowInputAssemblerInputLayout: true
-
-# CHECK: !dx.rootsignatures = !{[[RS:![0-9]+]]}
-# CHECK: [[RS]] = !{void ()* @main, [[REL:![0-9]+]]}
-# CHECK: [[REL]] = !{[[RF:![0-9]+]]}
-# CHECK: [[RF]] = !{!"RootFlags", i32 1}
diff --git a/llvm/unittests/Object/DXContainerTest.cpp b/llvm/unittests/Object/DXContainerTest.cpp
index 5a2c852d6aef9..f80828f06bdd2 100644
--- a/llvm/unittests/Object/DXContainerTest.cpp
+++ b/llvm/unittests/Object/DXContainerTest.cpp
@@ -821,3 +821,25 @@ TEST(DXCFile, MalformedSignature) {
                           "the end of the part data"));
   }
 }
+
+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, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+      0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
+  };
+  DXContainer C =
+      llvm::cantFail(DXContainer::create(getMemoryBuffer<180>(Buffer)));
+
+  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);
+}
diff --git a/llvm/unittests/ObjectYAML/DXContainerYAMLTest.cpp b/llvm/unittests/ObjectYAML/DXContainerYAMLTest.cpp
index d4232295c8584..b18075bac96c7 100644
--- a/llvm/unittests/ObjectYAML/DXContainerYAMLTest.cpp
+++ b/llvm/unittests/ObjectYAML/DXContainerYAMLTest.cpp
@@ -15,6 +15,7 @@
 #include "llvm/Support/raw_ostream.h"
 #include "llvm/Testing/Support/Error.h"
 #include "gtest/gtest.h"
+#include <cstdint>
 
 using namespace llvm;
 using namespace llvm::object;
@@ -107,3 +108,42 @@ TEST(DXCFile, ParseEmptyParts) {
   EXPECT_EQ(Storage.size(), 116u);
   EXPECT_TRUE(memcmp(Buffer, Storage.data(), 116) == 0);
 }
+
+TEST(RootSignature, ParseRootFlags) {
+  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:        68
+    PartCount:       1
+    PartOffsets:     [ 36 ]
+  Parts:
+    - Name:            RTS0
+      Size:            24
+      RootSignature:
+        Version:         2
+        NumParameters:   0
+        RootParametersOffset: 24
+        NumStaticSamplers: 0
+        StaticSamplersOffset: 24
+        AllowInputAssemblerInputLayout: 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,
+      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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+      0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
+  };
+
+  EXPECT_EQ(Storage.size(), 68u);
+  EXPECT_TRUE(memcmp(Buffer, Storage.data(), 68u) == 0);
+}

>From 25e3f374698f06f2966aa433728e45c73c790034 Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Mon, 3 Feb 2025 21:11:48 +0000
Subject: [PATCH 21/64] clean up

---
 llvm/test/tools/dxil-dis/lit.local.cfg            | 2 +-
 llvm/unittests/ObjectYAML/DXContainerYAMLTest.cpp | 1 -
 2 files changed, 1 insertion(+), 2 deletions(-)

diff --git a/llvm/test/tools/dxil-dis/lit.local.cfg b/llvm/test/tools/dxil-dis/lit.local.cfg
index 8fe45f696bff9..7b6819e0b406a 100644
--- a/llvm/test/tools/dxil-dis/lit.local.cfg
+++ b/llvm/test/tools/dxil-dis/lit.local.cfg
@@ -1,3 +1,3 @@
 if not config.dxil_tests:
     config.unsupported = True
-config.suffixes = [".ll", ".yaml"]
+config.suffixes = [".ll"]
diff --git a/llvm/unittests/ObjectYAML/DXContainerYAMLTest.cpp b/llvm/unittests/ObjectYAML/DXContainerYAMLTest.cpp
index b18075bac96c7..eaa8049e8e7d9 100644
--- a/llvm/unittests/ObjectYAML/DXContainerYAMLTest.cpp
+++ b/llvm/unittests/ObjectYAML/DXContainerYAMLTest.cpp
@@ -15,7 +15,6 @@
 #include "llvm/Support/raw_ostream.h"
 #include "llvm/Testing/Support/Error.h"
 #include "gtest/gtest.h"
-#include <cstdint>
 
 using namespace llvm;
 using namespace llvm::object;

>From 751cbdcc76b5f6874f76765ef5ccdaaf7c58c449 Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Tue, 4 Feb 2025 07:20:03 +0000
Subject: [PATCH 22/64] addressing comments

---
 llvm/include/llvm/BinaryFormat/DXContainer.h  |  2 +-
 .../BinaryFormat/DXContainerConstants.def     | 48 +++++--------------
 .../include/llvm/ObjectYAML/DXContainerYAML.h |  5 +-
 llvm/lib/ObjectYAML/DXContainerEmitter.cpp    |  5 ++
 llvm/lib/ObjectYAML/DXContainerYAML.cpp       |  6 +--
 .../DXContainer/RootSignature-Flags.yaml      | 18 +++----
 .../ObjectYAML/DXContainerYAMLTest.cpp        |  4 +-
 7 files changed, 36 insertions(+), 52 deletions(-)

diff --git a/llvm/include/llvm/BinaryFormat/DXContainer.h b/llvm/include/llvm/BinaryFormat/DXContainer.h
index 71a6d15e46a81..b47cd2b5facd0 100644
--- a/llvm/include/llvm/BinaryFormat/DXContainer.h
+++ b/llvm/include/llvm/BinaryFormat/DXContainer.h
@@ -162,7 +162,7 @@ enum class FeatureFlags : uint64_t {
 static_assert((uint64_t)FeatureFlags::NextUnusedBit <= 1ull << 63,
               "Shader flag bits exceed enum size.");
 
-#define ROOT_ELEMENT_FLAG(Num, Val, Str) Val = 1ull << Num,
+#define ROOT_ELEMENT_FLAG(Num, Val) Val = 1ull << Num,
 enum class RootElementFlag : uint32_t {
 #include "DXContainerConstants.def"
 };
diff --git a/llvm/include/llvm/BinaryFormat/DXContainerConstants.def b/llvm/include/llvm/BinaryFormat/DXContainerConstants.def
index 2134c2375f6d3..e82c68bc0bda8 100644
--- a/llvm/include/llvm/BinaryFormat/DXContainerConstants.def
+++ b/llvm/include/llvm/BinaryFormat/DXContainerConstants.def
@@ -53,44 +53,20 @@ SHADER_FEATURE_FLAG(31, 36, NextUnusedBit, "Next reserved shader flag bit (not a
 #undef SHADER_FEATURE_FLAG
 #endif // SHADER_FEATURE_FLAG
 
-#ifdef ROOT_PARAMETER
-
-ROOT_PARAMETER(DescriptorTable)
-ROOT_PARAMETER(Constants32Bit)
-ROOT_PARAMETER(CBV)
-ROOT_PARAMETER(SRV)
-ROOT_PARAMETER(UAV)
-#undef ROOT_PARAMETER
-#endif // ROOT_PARAMETER
-
-
-#ifdef SHADER_VISIBILITY
-
-SHADER_VISIBILITY(All)
-SHADER_VISIBILITY(Vertex)
-SHADER_VISIBILITY(Hull)
-SHADER_VISIBILITY(Domain)
-SHADER_VISIBILITY(Geometry)
-SHADER_VISIBILITY(Pixel)
-SHADER_VISIBILITY(Amplification)
-SHADER_VISIBILITY(Mesh)
-#undef SHADER_VISIBILITY
-#endif // SHADER_VISIBILITY
-
 #ifdef ROOT_ELEMENT_FLAG
 
-ROOT_ELEMENT_FLAG(0, AllowInputAssemblerInputLayout, "The app is opting in to using the Input Assembler")
-ROOT_ELEMENT_FLAG(1, DenyVertexShaderRootAccess, "Denies the vertex shader access to the root signature.")
-ROOT_ELEMENT_FLAG(2, DenyHullShaderRootAccess, "Denies the hull shader access to the root signature.")
-ROOT_ELEMENT_FLAG(3, DenyDomainShaderRootAccess, "Denies the domain shader access to the root signature.")
-ROOT_ELEMENT_FLAG(4, DenyGeometryShaderRootAccess, "Denies the geometry shader access to the root signature.")
-ROOT_ELEMENT_FLAG(5, DenyPixelShaderRootAccess, "Denies the pixel shader access to the root signature.")
-ROOT_ELEMENT_FLAG(6, AllowStreamOutput, "The app is opting in to using Stream Output.")
-ROOT_ELEMENT_FLAG(7, LocalRootSignature, "The root signature is to be used with raytracing shaders to define resource bindings sourced from shader records in shader tables.")
-ROOT_ELEMENT_FLAG(8, DenyAmplificationShaderRootAccess, "Denies the amplification shader access to the root signature.")
-ROOT_ELEMENT_FLAG(9, DenyMeshShaderRootAccess, "Denies the mesh shader access to the root signature.")
-ROOT_ELEMENT_FLAG(10, CBVSRVUAVHeapDirectlyIndexed, "The shaders are allowed to index the CBV/SRV/UAV descriptor heap directly, using the ResourceDescriptorHeap built-in variable.")
-ROOT_ELEMENT_FLAG(11, SamplerHeapDirectlyIndexed, "The shaders are allowed to index the sampler descriptor heap directly, using the SamplerDescriptorHeap built-in variable.")
+ROOT_ELEMENT_FLAG(0, AllowInputAssemblerInputLayout)
+ROOT_ELEMENT_FLAG(1, DenyVertexShaderRootAccess)
+ROOT_ELEMENT_FLAG(2, DenyHullShaderRootAccess)
+ROOT_ELEMENT_FLAG(3, DenyDomainShaderRootAccess)
+ROOT_ELEMENT_FLAG(4, DenyGeometryShaderRootAccess)
+ROOT_ELEMENT_FLAG(5, DenyPixelShaderRootAccess)
+ROOT_ELEMENT_FLAG(6, AllowStreamOutput)
+ROOT_ELEMENT_FLAG(7, LocalRootSignature)
+ROOT_ELEMENT_FLAG(8, DenyAmplificationShaderRootAccess)
+ROOT_ELEMENT_FLAG(9, DenyMeshShaderRootAccess)
+ROOT_ELEMENT_FLAG(10, CBVSRVUAVHeapDirectlyIndexed)
+ROOT_ELEMENT_FLAG(11, SamplerHeapDirectlyIndexed)
 #undef ROOT_ELEMENT_FLAG
 #endif // ROOT_ELEMENT_FLAG
 
diff --git a/llvm/include/llvm/ObjectYAML/DXContainerYAML.h b/llvm/include/llvm/ObjectYAML/DXContainerYAML.h
index 1f967114ea1eb..0200f5cb196ff 100644
--- a/llvm/include/llvm/ObjectYAML/DXContainerYAML.h
+++ b/llvm/include/llvm/ObjectYAML/DXContainerYAML.h
@@ -73,18 +73,19 @@ struct ShaderHash {
   std::vector<llvm::yaml::Hex8> Digest;
 };
 
-#define ROOT_ELEMENT_FLAG(Num, Val, Str) bool Val = false;
+#define ROOT_ELEMENT_FLAG(Num, Val) bool Val = false;
 struct RootSignatureDesc {
   RootSignatureDesc() = default;
   RootSignatureDesc(const object::DirectX::RootSignature &Data);
 
-  uint32_t getEncodedFlags();
   uint32_t Version;
   uint32_t NumParameters;
   uint32_t RootParametersOffset;
   uint32_t NumStaticSamplers;
   uint32_t StaticSamplersOffset;
 
+  uint32_t getEncodedFlags();
+
 #include "llvm/BinaryFormat/DXContainerConstants.def"
 };
 
diff --git a/llvm/lib/ObjectYAML/DXContainerEmitter.cpp b/llvm/lib/ObjectYAML/DXContainerEmitter.cpp
index ada7383ea3c6b..b7d1c6558fa1f 100644
--- a/llvm/lib/ObjectYAML/DXContainerEmitter.cpp
+++ b/llvm/lib/ObjectYAML/DXContainerEmitter.cpp
@@ -268,6 +268,11 @@ void DXContainerWriter::writeParts(raw_ostream &OS) {
 
       mcdxbc::RootSignatureHeader Header;
       Header.Flags = P.RootSignature->getEncodedFlags();
+      Header.Version = P.RootSignature->Version;
+      Header.NumParameters = P.RootSignature->NumParameters;
+      Header.RootParametersOffset = P.RootSignature->RootParametersOffset;
+      Header.NumStaticSamplers = P.RootSignature->NumStaticSamplers;
+      Header.StaticSamplersOffset = P.RootSignature->StaticSamplersOffset;
 
       Header.write(OS);
       break;
diff --git a/llvm/lib/ObjectYAML/DXContainerYAML.cpp b/llvm/lib/ObjectYAML/DXContainerYAML.cpp
index 522781c0d36ef..fdf87b05d1f43 100644
--- a/llvm/lib/ObjectYAML/DXContainerYAML.cpp
+++ b/llvm/lib/ObjectYAML/DXContainerYAML.cpp
@@ -37,14 +37,14 @@ DXContainerYAML::RootSignatureDesc::RootSignatureDesc(
       NumStaticSamplers(Data.getNumStaticSamplers()),
       StaticSamplersOffset(Data.getStaticSamplersOffset()) {
   uint32_t Flags = Data.getFlags();
-#define ROOT_ELEMENT_FLAG(Num, Val, Str)                                       \
+#define ROOT_ELEMENT_FLAG(Num, Val)                                            \
   Val = (Flags & (uint32_t)dxbc::RootElementFlag::Val) > 0;
 #include "llvm/BinaryFormat/DXContainerConstants.def"
 }
 
 uint32_t DXContainerYAML::RootSignatureDesc::getEncodedFlags() {
   uint64_t Flag = 0;
-#define ROOT_ELEMENT_FLAG(Num, Val, Str)                                       \
+#define ROOT_ELEMENT_FLAG(Num, Val)                                            \
   if (Val)                                                                     \
     Flag |= (uint32_t)dxbc::RootElementFlag::Val;
 #include "llvm/BinaryFormat/DXContainerConstants.def"
@@ -217,7 +217,7 @@ void MappingTraits<DXContainerYAML::RootSignatureDesc>::mapping(
   IO.mapRequired("RootParametersOffset", S.RootParametersOffset);
   IO.mapRequired("NumStaticSamplers", S.NumStaticSamplers);
   IO.mapRequired("StaticSamplersOffset", S.StaticSamplersOffset);
-#define ROOT_ELEMENT_FLAG(Num, Val, Str) IO.mapOptional(#Val, S.Val, false);
+#define ROOT_ELEMENT_FLAG(Num, Val) IO.mapOptional(#Val, S.Val, false);
 #include "llvm/BinaryFormat/DXContainerConstants.def"
 }
 
diff --git a/llvm/test/ObjectYAML/DXContainer/RootSignature-Flags.yaml b/llvm/test/ObjectYAML/DXContainer/RootSignature-Flags.yaml
index 06814f660f283..b0a3e6945f454 100644
--- a/llvm/test/ObjectYAML/DXContainer/RootSignature-Flags.yaml
+++ b/llvm/test/ObjectYAML/DXContainer/RootSignature-Flags.yaml
@@ -14,18 +14,20 @@ Parts:
     Size:            24
     RootSignature:
       Version: 2
-      NumParameters: 0
-      RootParametersOffset: 0
-      NumStaticSamplers: 0
-      StaticSamplersOffset: 0
+      NumParameters: 1
+      RootParametersOffset: 3
+      NumStaticSamplers: 4
+      StaticSamplersOffset: 5
       AllowInputAssemblerInputLayout: true
+      DenyGeometryShaderRootAccess: true
 
 # CHECK:  - Name:            RTS0
 # CHECK-NEXT:    Size:            24
 # CHECK-NEXT:    RootSignature:
 # CHECK-NEXT:      Version: 2
-# CHECK-NEXT:      NumParameters: 0
-# CHECK-NEXT:      RootParametersOffset: 0
-# CHECK-NEXT:      NumStaticSamplers: 0
-# CHECK-NEXT:      StaticSamplersOffset: 0
+# CHECK-NEXT:      NumParameters: 1
+# CHECK-NEXT:      RootParametersOffset: 3
+# CHECK-NEXT:      NumStaticSamplers: 4
+# CHECK-NEXT:      StaticSamplersOffset: 5
 # CHECK-NEXT:      AllowInputAssemblerInputLayout: true
+# CHECK-NEXT:      DenyGeometryShaderRootAccess: true
diff --git a/llvm/unittests/ObjectYAML/DXContainerYAMLTest.cpp b/llvm/unittests/ObjectYAML/DXContainerYAMLTest.cpp
index eaa8049e8e7d9..b48cd9ce53987 100644
--- a/llvm/unittests/ObjectYAML/DXContainerYAMLTest.cpp
+++ b/llvm/unittests/ObjectYAML/DXContainerYAMLTest.cpp
@@ -128,9 +128,9 @@ TEST(RootSignature, ParseRootFlags) {
       RootSignature:
         Version:         2
         NumParameters:   0
-        RootParametersOffset: 24
+        RootParametersOffset: 0
         NumStaticSamplers: 0
-        StaticSamplersOffset: 24
+        StaticSamplersOffset: 0
         AllowInputAssemblerInputLayout: true
     )"));
 

>From 44532d6517e2664221104653482101f167aafd62 Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Tue, 4 Feb 2025 19:19:36 +0000
Subject: [PATCH 23/64] adding fail test

---
 llvm/include/llvm/Object/DXContainer.h    |  5 +--
 llvm/lib/Object/DXContainer.cpp           | 12 ++++--
 llvm/unittests/Object/DXContainerTest.cpp | 51 +++++++++++++++--------
 3 files changed, 44 insertions(+), 24 deletions(-)

diff --git a/llvm/include/llvm/Object/DXContainer.h b/llvm/include/llvm/Object/DXContainer.h
index 47128f94e0968..c3a2f756bd683 100644
--- a/llvm/include/llvm/Object/DXContainer.h
+++ b/llvm/include/llvm/Object/DXContainer.h
@@ -119,7 +119,6 @@ namespace DirectX {
 
 class RootSignature {
 private:
-  StringRef Data;
   uint32_t Version;
   uint32_t NumParameters;
   uint32_t RootParametersOffset;
@@ -128,9 +127,9 @@ class RootSignature {
   uint32_t Flags;
 
 public:
-  RootSignature(StringRef Data) : Data(Data) {}
+  RootSignature() {}
 
-  Error parse();
+  Error parse(StringRef Data);
   uint32_t getVersion() const { return Version; }
   uint32_t getNumParameters() const { return NumParameters; }
   uint32_t getRootParametersOffset() const { return RootParametersOffset; }
diff --git a/llvm/lib/Object/DXContainer.cpp b/llvm/lib/Object/DXContainer.cpp
index 14179283f9807..91391b5144290 100644
--- a/llvm/lib/Object/DXContainer.cpp
+++ b/llvm/lib/Object/DXContainer.cpp
@@ -7,6 +7,7 @@
 //===----------------------------------------------------------------------===//
 
 #include "llvm/Object/DXContainer.h"
+#include "llvm/ADT/StringRef.h"
 #include "llvm/BinaryFormat/DXContainer.h"
 #include "llvm/Object/Error.h"
 #include "llvm/Support/Alignment.h"
@@ -96,8 +97,8 @@ Error DXContainer::parseHash(StringRef Part) {
 Error DXContainer::parseRootSignature(StringRef Part) {
   if (RootSignature)
     return parseFailed("More than one RTS0 part is present in the file");
-  RootSignature = DirectX::RootSignature(Part);
-  if (Error Err = RootSignature->parse())
+  RootSignature = DirectX::RootSignature();
+  if (Error Err = RootSignature->parse(Part))
     return Err;
   return Error::success();
 }
@@ -242,9 +243,14 @@ void DXContainer::PartIterator::updateIteratorImpl(const uint32_t Offset) {
   IteratorState.Offset = Offset;
 }
 
-Error DirectX::RootSignature::parse() {
+Error DirectX::RootSignature::parse(StringRef Data) {
   const char *Current = Data.begin();
 
+  // Root Signature headers expects 6 integers to be present.
+  if (Data.size() < 6 * sizeof(uint32_t)) {
+    return parseFailed("Invalid data. Too small.");
+  }
+
   Version = support::endian::read<uint32_t, llvm::endianness::little>(Current);
   Current += sizeof(uint32_t);
 
diff --git a/llvm/unittests/Object/DXContainerTest.cpp b/llvm/unittests/Object/DXContainerTest.cpp
index f80828f06bdd2..bff58c036489f 100644
--- a/llvm/unittests/Object/DXContainerTest.cpp
+++ b/llvm/unittests/Object/DXContainerTest.cpp
@@ -823,23 +823,38 @@ TEST(DXCFile, MalformedSignature) {
 }
 
 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, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-      0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
-  };
-  DXContainer C =
-      llvm::cantFail(DXContainer::create(getMemoryBuffer<180>(Buffer)));
+  {
+    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, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
+    };
+    DXContainer C =
+        llvm::cantFail(DXContainer::create(getMemoryBuffer<180>(Buffer)));
+
+    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);
+  }
 
-  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);
+  {
+    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, 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, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    };
+    EXPECT_THAT_EXPECTED(DXContainer::create(getMemoryBuffer<44>(Buffer)),
+                         FailedWithMessage("Invalid data. Too small."));
+  }
 }

>From ca21878831fe70976e4eeeec60e7a5300c2e1235 Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Tue, 4 Feb 2025 19:26:29 +0000
Subject: [PATCH 24/64] adding comment

---
 llvm/include/llvm/BinaryFormat/DXContainerConstants.def | 2 ++
 llvm/unittests/Object/DXContainerTest.cpp               | 1 +
 2 files changed, 3 insertions(+)

diff --git a/llvm/include/llvm/BinaryFormat/DXContainerConstants.def b/llvm/include/llvm/BinaryFormat/DXContainerConstants.def
index e82c68bc0bda8..39a0e7a5c8493 100644
--- a/llvm/include/llvm/BinaryFormat/DXContainerConstants.def
+++ b/llvm/include/llvm/BinaryFormat/DXContainerConstants.def
@@ -53,6 +53,8 @@ SHADER_FEATURE_FLAG(31, 36, NextUnusedBit, "Next reserved shader flag bit (not a
 #undef SHADER_FEATURE_FLAG
 #endif // SHADER_FEATURE_FLAG
 
+
+// ROOT_ELEMENT_FLAG(bit offset for the flag, name).
 #ifdef ROOT_ELEMENT_FLAG
 
 ROOT_ELEMENT_FLAG(0, AllowInputAssemblerInputLayout)
diff --git a/llvm/unittests/Object/DXContainerTest.cpp b/llvm/unittests/Object/DXContainerTest.cpp
index bff58c036489f..8e20ae552c062 100644
--- a/llvm/unittests/Object/DXContainerTest.cpp
+++ b/llvm/unittests/Object/DXContainerTest.cpp
@@ -846,6 +846,7 @@ TEST(RootSignature, ParseRootFlags) {
   }
 
   {
+    // this parameter has the root signature definition missing some values.
     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,

>From 987901c6a74757e09345eeae172a1f4d23a39e0a Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Tue, 4 Feb 2025 23:24:59 +0000
Subject: [PATCH 25/64] adding few more tests

---
 llvm/include/llvm/BinaryFormat/DXContainer.h | 27 ++++++++++++------
 llvm/include/llvm/Object/DXContainer.h       |  1 +
 llvm/lib/Object/DXContainer.cpp              | 17 +++++++++--
 llvm/unittests/Object/DXContainerTest.cpp    | 30 ++++++++++++++++++--
 4 files changed, 62 insertions(+), 13 deletions(-)

diff --git a/llvm/include/llvm/BinaryFormat/DXContainer.h b/llvm/include/llvm/BinaryFormat/DXContainer.h
index b47cd2b5facd0..4f48d0c41cf76 100644
--- a/llvm/include/llvm/BinaryFormat/DXContainer.h
+++ b/llvm/include/llvm/BinaryFormat/DXContainer.h
@@ -14,9 +14,12 @@
 #define LLVM_BINARYFORMAT_DXCONTAINER_H
 
 #include "llvm/ADT/StringRef.h"
+#include "llvm/Object/Error.h"
+#include "llvm/Support/Error.h"
 #include "llvm/Support/SwapByteOrder.h"
 #include "llvm/TargetParser/Triple.h"
 
+#include <cstdint>
 #include <stdint.h>
 
 namespace llvm {
@@ -63,15 +66,6 @@ struct ShaderHash {
   void swapBytes() { sys::swapByteOrder(Flags); }
 };
 
-struct RootSignatureDesc {
-  uint32_t Size;
-  uint32_t Flags;
-
-  void swapBytes() {
-    sys::swapByteOrder(Size);
-    sys::swapByteOrder(Flags);
-  }
-};
 
 struct ContainerVersion {
   uint16_t Major;
@@ -556,6 +550,21 @@ struct ProgramSignatureElement {
 static_assert(sizeof(ProgramSignatureElement) == 32,
               "ProgramSignatureElement is misaligned");
 
+struct RootSignatureValidations {
+
+    static Expected<uint32_t> validateRootFlag(uint32_t Flags) {
+      if ((Flags & ~0x80000fff) != 0)
+        return llvm::make_error<object::GenericBinaryError>("Invalid flag");
+      return Flags;
+    }
+
+    static Expected<uint32_t> validateVersion(uint32_t Version) {
+      if (Version < 1 || Version > 2)
+        return llvm::make_error<object::GenericBinaryError>("Invalid Version");
+      return Version;
+    }
+};
+
 } // namespace dxbc
 } // namespace llvm
 
diff --git a/llvm/include/llvm/Object/DXContainer.h b/llvm/include/llvm/Object/DXContainer.h
index c3a2f756bd683..e90c6866400e0 100644
--- a/llvm/include/llvm/Object/DXContainer.h
+++ b/llvm/include/llvm/Object/DXContainer.h
@@ -18,6 +18,7 @@
 #include "llvm/ADT/SmallVector.h"
 #include "llvm/ADT/StringRef.h"
 #include "llvm/BinaryFormat/DXContainer.h"
+#include "llvm/Object/Error.h"
 #include "llvm/Support/Error.h"
 #include "llvm/Support/MemoryBufferRef.h"
 #include "llvm/TargetParser/Triple.h"
diff --git a/llvm/lib/Object/DXContainer.cpp b/llvm/lib/Object/DXContainer.cpp
index 91391b5144290..a9fbae8982024 100644
--- a/llvm/lib/Object/DXContainer.cpp
+++ b/llvm/lib/Object/DXContainer.cpp
@@ -12,7 +12,9 @@
 #include "llvm/Object/Error.h"
 #include "llvm/Support/Alignment.h"
 #include "llvm/Support/Endian.h"
+#include "llvm/Support/Error.h"
 #include "llvm/Support/FormatVariadic.h"
+#include <cstdint>
 
 using namespace llvm;
 using namespace llvm::object;
@@ -246,14 +248,20 @@ void DXContainer::PartIterator::updateIteratorImpl(const uint32_t Offset) {
 Error DirectX::RootSignature::parse(StringRef Data) {
   const char *Current = Data.begin();
 
+
   // Root Signature headers expects 6 integers to be present.
   if (Data.size() < 6 * sizeof(uint32_t)) {
     return parseFailed("Invalid data. Too small.");
   }
 
-  Version = support::endian::read<uint32_t, llvm::endianness::little>(Current);
+  uint32_t VValue = support::endian::read<uint32_t, llvm::endianness::little>(Current);
   Current += sizeof(uint32_t);
 
+  Expected<uint32_t> MaybeVersion = dxbc::RootSignatureValidations::validateVersion(VValue);
+  if(Error E = MaybeVersion.takeError())
+    return E;
+  Version = MaybeVersion.get();
+
   NumParameters =
       support::endian::read<uint32_t, llvm::endianness::little>(Current);
   Current += sizeof(uint32_t);
@@ -270,9 +278,14 @@ Error DirectX::RootSignature::parse(StringRef Data) {
       support::endian::read<uint32_t, llvm::endianness::little>(Current);
   Current += sizeof(uint32_t);
 
-  Flags = support::endian::read<uint32_t, llvm::endianness::little>(Current);
+  uint32_t FValue = support::endian::read<uint32_t, llvm::endianness::little>(Current);
   Current += sizeof(uint32_t);
 
+  Expected<uint32_t> MaybeFlag = dxbc::RootSignatureValidations::validateRootFlag(FValue);
+  if(Error E = MaybeFlag.takeError())
+    return E;
+  Flags = MaybeFlag.get();
+
   return Error::success();
 }
 
diff --git a/llvm/unittests/Object/DXContainerTest.cpp b/llvm/unittests/Object/DXContainerTest.cpp
index 8e20ae552c062..1433d5e7f2f08 100644
--- a/llvm/unittests/Object/DXContainerTest.cpp
+++ b/llvm/unittests/Object/DXContainerTest.cpp
@@ -833,7 +833,7 @@ TEST(RootSignature, ParseRootFlags) {
         0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
     };
     DXContainer C =
-        llvm::cantFail(DXContainer::create(getMemoryBuffer<180>(Buffer)));
+        llvm::cantFail(DXContainer::create(getMemoryBuffer<68>(Buffer)));
 
     const auto &RS = C.getRootSignature();
     ASSERT_TRUE(RS.has_value());
@@ -855,7 +855,33 @@ TEST(RootSignature, ParseRootFlags) {
         0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     };
-    EXPECT_THAT_EXPECTED(DXContainer::create(getMemoryBuffer<44>(Buffer)),
+    EXPECT_THAT_EXPECTED(DXContainer::create(getMemoryBuffer<64>(Buffer)),
                          FailedWithMessage("Invalid data. Too small."));
   }
+  {
+    // Version has been changed to an invalid number.
+    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, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00,
+        0x52, 0x54, 0x53, 0x30, 0x18, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
+    };
+        EXPECT_THAT_EXPECTED(DXContainer::create(getMemoryBuffer<68>(Buffer)),
+                         FailedWithMessage("Invalid Version"));
+  }
+  {
+    // Flag has been set to an invalid value
+    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, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0xFF,
+    };
+        EXPECT_THAT_EXPECTED(DXContainer::create(getMemoryBuffer<68>(Buffer)),
+                         FailedWithMessage("Invalid flag"));
+  }
 }

>From 0fbe900a6d0d431c9267513901c90cd778ac61ed Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Tue, 4 Feb 2025 23:29:02 +0000
Subject: [PATCH 26/64] format

---
 llvm/include/llvm/BinaryFormat/DXContainer.h | 21 ++++++++++----------
 llvm/lib/Object/DXContainer.cpp              | 17 +++++++++-------
 llvm/unittests/Object/DXContainerTest.cpp    |  4 ++--
 3 files changed, 22 insertions(+), 20 deletions(-)

diff --git a/llvm/include/llvm/BinaryFormat/DXContainer.h b/llvm/include/llvm/BinaryFormat/DXContainer.h
index 4f48d0c41cf76..0d5caabd3471e 100644
--- a/llvm/include/llvm/BinaryFormat/DXContainer.h
+++ b/llvm/include/llvm/BinaryFormat/DXContainer.h
@@ -66,7 +66,6 @@ struct ShaderHash {
   void swapBytes() { sys::swapByteOrder(Flags); }
 };
 
-
 struct ContainerVersion {
   uint16_t Major;
   uint16_t Minor;
@@ -552,17 +551,17 @@ static_assert(sizeof(ProgramSignatureElement) == 32,
 
 struct RootSignatureValidations {
 
-    static Expected<uint32_t> validateRootFlag(uint32_t Flags) {
-      if ((Flags & ~0x80000fff) != 0)
-        return llvm::make_error<object::GenericBinaryError>("Invalid flag");
-      return Flags;
-    }
+  static Expected<uint32_t> validateRootFlag(uint32_t Flags) {
+    if ((Flags & ~0x80000fff) != 0)
+      return llvm::make_error<object::GenericBinaryError>("Invalid flag");
+    return Flags;
+  }
 
-    static Expected<uint32_t> validateVersion(uint32_t Version) {
-      if (Version < 1 || Version > 2)
-        return llvm::make_error<object::GenericBinaryError>("Invalid Version");
-      return Version;
-    }
+  static Expected<uint32_t> validateVersion(uint32_t Version) {
+    if (Version < 1 || Version > 2)
+      return llvm::make_error<object::GenericBinaryError>("Invalid Version");
+    return Version;
+  }
 };
 
 } // namespace dxbc
diff --git a/llvm/lib/Object/DXContainer.cpp b/llvm/lib/Object/DXContainer.cpp
index a9fbae8982024..e4faed38c3e0a 100644
--- a/llvm/lib/Object/DXContainer.cpp
+++ b/llvm/lib/Object/DXContainer.cpp
@@ -248,17 +248,18 @@ void DXContainer::PartIterator::updateIteratorImpl(const uint32_t Offset) {
 Error DirectX::RootSignature::parse(StringRef Data) {
   const char *Current = Data.begin();
 
-
   // Root Signature headers expects 6 integers to be present.
   if (Data.size() < 6 * sizeof(uint32_t)) {
     return parseFailed("Invalid data. Too small.");
   }
 
-  uint32_t VValue = support::endian::read<uint32_t, llvm::endianness::little>(Current);
+  uint32_t VValue =
+      support::endian::read<uint32_t, llvm::endianness::little>(Current);
   Current += sizeof(uint32_t);
 
-  Expected<uint32_t> MaybeVersion = dxbc::RootSignatureValidations::validateVersion(VValue);
-  if(Error E = MaybeVersion.takeError())
+  Expected<uint32_t> MaybeVersion =
+      dxbc::RootSignatureValidations::validateVersion(VValue);
+  if (Error E = MaybeVersion.takeError())
     return E;
   Version = MaybeVersion.get();
 
@@ -278,11 +279,13 @@ Error DirectX::RootSignature::parse(StringRef Data) {
       support::endian::read<uint32_t, llvm::endianness::little>(Current);
   Current += sizeof(uint32_t);
 
-  uint32_t FValue = support::endian::read<uint32_t, llvm::endianness::little>(Current);
+  uint32_t FValue =
+      support::endian::read<uint32_t, llvm::endianness::little>(Current);
   Current += sizeof(uint32_t);
 
-  Expected<uint32_t> MaybeFlag = dxbc::RootSignatureValidations::validateRootFlag(FValue);
-  if(Error E = MaybeFlag.takeError())
+  Expected<uint32_t> MaybeFlag =
+      dxbc::RootSignatureValidations::validateRootFlag(FValue);
+  if (Error E = MaybeFlag.takeError())
     return E;
   Flags = MaybeFlag.get();
 
diff --git a/llvm/unittests/Object/DXContainerTest.cpp b/llvm/unittests/Object/DXContainerTest.cpp
index 1433d5e7f2f08..8489b05f8b331 100644
--- a/llvm/unittests/Object/DXContainerTest.cpp
+++ b/llvm/unittests/Object/DXContainerTest.cpp
@@ -868,7 +868,7 @@ TEST(RootSignature, ParseRootFlags) {
         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
         0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
     };
-        EXPECT_THAT_EXPECTED(DXContainer::create(getMemoryBuffer<68>(Buffer)),
+    EXPECT_THAT_EXPECTED(DXContainer::create(getMemoryBuffer<68>(Buffer)),
                          FailedWithMessage("Invalid Version"));
   }
   {
@@ -881,7 +881,7 @@ TEST(RootSignature, ParseRootFlags) {
         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
         0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0xFF,
     };
-        EXPECT_THAT_EXPECTED(DXContainer::create(getMemoryBuffer<68>(Buffer)),
+    EXPECT_THAT_EXPECTED(DXContainer::create(getMemoryBuffer<68>(Buffer)),
                          FailedWithMessage("Invalid flag"));
   }
 }

>From b771aeac329152334ec10a0435b4f3e448ef934e Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Wed, 5 Feb 2025 20:21:43 +0000
Subject: [PATCH 27/64] cleanup

---
 llvm/include/llvm/BinaryFormat/DXContainer.h | 7 +++----
 llvm/include/llvm/Object/DXContainer.h       | 1 -
 llvm/lib/Object/DXContainer.cpp              | 3 ---
 llvm/lib/ObjectYAML/DXContainerYAML.cpp      | 1 -
 4 files changed, 3 insertions(+), 9 deletions(-)

diff --git a/llvm/include/llvm/BinaryFormat/DXContainer.h b/llvm/include/llvm/BinaryFormat/DXContainer.h
index 0d5caabd3471e..c219aa819795e 100644
--- a/llvm/include/llvm/BinaryFormat/DXContainer.h
+++ b/llvm/include/llvm/BinaryFormat/DXContainer.h
@@ -14,12 +14,11 @@
 #define LLVM_BINARYFORMAT_DXCONTAINER_H
 
 #include "llvm/ADT/StringRef.h"
-#include "llvm/Object/Error.h"
+#include "llvm/Support/BinaryStreamError.h"
 #include "llvm/Support/Error.h"
 #include "llvm/Support/SwapByteOrder.h"
 #include "llvm/TargetParser/Triple.h"
 
-#include <cstdint>
 #include <stdint.h>
 
 namespace llvm {
@@ -553,13 +552,13 @@ struct RootSignatureValidations {
 
   static Expected<uint32_t> validateRootFlag(uint32_t Flags) {
     if ((Flags & ~0x80000fff) != 0)
-      return llvm::make_error<object::GenericBinaryError>("Invalid flag");
+      return llvm::make_error<BinaryStreamError>("Invalid flag");
     return Flags;
   }
 
   static Expected<uint32_t> validateVersion(uint32_t Version) {
     if (Version < 1 || Version > 2)
-      return llvm::make_error<object::GenericBinaryError>("Invalid Version");
+      return llvm::make_error<BinaryStreamError>("Invalid Version");
     return Version;
   }
 };
diff --git a/llvm/include/llvm/Object/DXContainer.h b/llvm/include/llvm/Object/DXContainer.h
index e90c6866400e0..c3a2f756bd683 100644
--- a/llvm/include/llvm/Object/DXContainer.h
+++ b/llvm/include/llvm/Object/DXContainer.h
@@ -18,7 +18,6 @@
 #include "llvm/ADT/SmallVector.h"
 #include "llvm/ADT/StringRef.h"
 #include "llvm/BinaryFormat/DXContainer.h"
-#include "llvm/Object/Error.h"
 #include "llvm/Support/Error.h"
 #include "llvm/Support/MemoryBufferRef.h"
 #include "llvm/TargetParser/Triple.h"
diff --git a/llvm/lib/Object/DXContainer.cpp b/llvm/lib/Object/DXContainer.cpp
index e4faed38c3e0a..4a5f581808045 100644
--- a/llvm/lib/Object/DXContainer.cpp
+++ b/llvm/lib/Object/DXContainer.cpp
@@ -7,14 +7,11 @@
 //===----------------------------------------------------------------------===//
 
 #include "llvm/Object/DXContainer.h"
-#include "llvm/ADT/StringRef.h"
 #include "llvm/BinaryFormat/DXContainer.h"
 #include "llvm/Object/Error.h"
 #include "llvm/Support/Alignment.h"
 #include "llvm/Support/Endian.h"
-#include "llvm/Support/Error.h"
 #include "llvm/Support/FormatVariadic.h"
-#include <cstdint>
 
 using namespace llvm;
 using namespace llvm::object;
diff --git a/llvm/lib/ObjectYAML/DXContainerYAML.cpp b/llvm/lib/ObjectYAML/DXContainerYAML.cpp
index fdf87b05d1f43..0869fd4fa9785 100644
--- a/llvm/lib/ObjectYAML/DXContainerYAML.cpp
+++ b/llvm/lib/ObjectYAML/DXContainerYAML.cpp
@@ -14,7 +14,6 @@
 #include "llvm/ObjectYAML/DXContainerYAML.h"
 #include "llvm/ADT/ScopeExit.h"
 #include "llvm/BinaryFormat/DXContainer.h"
-#include "llvm/Object/DXContainer.h"
 #include "llvm/Support/ScopedPrinter.h"
 
 namespace llvm {

>From aabdfe7d6c6b6e27e9c2150c10199baa6638b6df Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Wed, 15 Jan 2025 17:30:00 +0000
Subject: [PATCH 28/64] adding metadata extraction

---
 .../llvm/Analysis/DXILMetadataAnalysis.h      |  3 +
 llvm/lib/Analysis/DXILMetadataAnalysis.cpp    | 89 +++++++++++++++++++
 .../lib/Target/DirectX/DXContainerGlobals.cpp | 24 +++++
 3 files changed, 116 insertions(+)

diff --git a/llvm/include/llvm/Analysis/DXILMetadataAnalysis.h b/llvm/include/llvm/Analysis/DXILMetadataAnalysis.h
index cb535ac14f1c6..f420244ba111a 100644
--- a/llvm/include/llvm/Analysis/DXILMetadataAnalysis.h
+++ b/llvm/include/llvm/Analysis/DXILMetadataAnalysis.h
@@ -11,9 +11,11 @@
 
 #include "llvm/ADT/SmallVector.h"
 #include "llvm/IR/PassManager.h"
+#include "llvm/MC/DXContainerRootSignature.h"
 #include "llvm/Pass.h"
 #include "llvm/Support/VersionTuple.h"
 #include "llvm/TargetParser/Triple.h"
+#include <optional>
 
 namespace llvm {
 
@@ -37,6 +39,7 @@ struct ModuleMetadataInfo {
   Triple::EnvironmentType ShaderProfile{Triple::UnknownEnvironment};
   VersionTuple ValidatorVersion{};
   SmallVector<EntryProperties> EntryPropertyVec{};
+  std::optional<mcdxbc::RootSignatureDesc> RootSignatureDesc;
   void print(raw_ostream &OS) const;
 };
 
diff --git a/llvm/lib/Analysis/DXILMetadataAnalysis.cpp b/llvm/lib/Analysis/DXILMetadataAnalysis.cpp
index a7f666a3f8b48..388e3853008ea 100644
--- a/llvm/lib/Analysis/DXILMetadataAnalysis.cpp
+++ b/llvm/lib/Analysis/DXILMetadataAnalysis.cpp
@@ -15,12 +15,91 @@
 #include "llvm/IR/Metadata.h"
 #include "llvm/IR/Module.h"
 #include "llvm/InitializePasses.h"
+#include "llvm/MC/DXContainerRootSignature.h"
+#include "llvm/Support/Casting.h"
 #include "llvm/Support/ErrorHandling.h"
+#include <memory>
 
 #define DEBUG_TYPE "dxil-metadata-analysis"
 
 using namespace llvm;
 using namespace dxil;
+using namespace llvm::mcdxbc;
+
+static bool parseRootFlags(MDNode *RootFlagNode, RootSignatureDesc *Desc) {
+
+  assert(RootFlagNode->getNumOperands() == 2 &&
+         "Invalid format for RootFlag Element");
+  auto *Flag = mdconst::extract<ConstantInt>(RootFlagNode->getOperand(1));
+  auto Value = (RootSignatureFlags)Flag->getZExtValue();
+
+  if ((Value & ~RootSignatureFlags::ValidFlags) != RootSignatureFlags::None)
+    return true;
+
+  Desc->Flags = Value;
+  return false;
+}
+
+static bool parseRootSignatureElement(MDNode *Element,
+                                      RootSignatureDesc *Desc) {
+  MDString *ElementText = cast<MDString>(Element->getOperand(0));
+
+  assert(ElementText != nullptr && "First preoperty of element is not ");
+
+  RootSignatureElementKind ElementKind =
+      StringSwitch<RootSignatureElementKind>(ElementText->getString())
+          .Case("RootFlags", RootSignatureElementKind::RootFlags)
+          .Case("RootConstants", RootSignatureElementKind::RootConstants)
+          .Case("RootCBV", RootSignatureElementKind::RootDescriptor)
+          .Case("RootSRV", RootSignatureElementKind::RootDescriptor)
+          .Case("RootUAV", RootSignatureElementKind::RootDescriptor)
+          .Case("Sampler", RootSignatureElementKind::RootDescriptor)
+          .Case("DescriptorTable", RootSignatureElementKind::DescriptorTable)
+          .Case("StaticSampler", RootSignatureElementKind::StaticSampler)
+          .Default(RootSignatureElementKind::None);
+
+  switch (ElementKind) {
+
+  case RootSignatureElementKind::RootFlags: {
+    return parseRootFlags(Element, Desc);
+    break;
+  }
+
+  case RootSignatureElementKind::RootConstants:
+  case RootSignatureElementKind::RootDescriptor:
+  case RootSignatureElementKind::DescriptorTable:
+  case RootSignatureElementKind::StaticSampler:
+  case RootSignatureElementKind::None:
+    llvm_unreachable("Not Implemented yet");
+    break;
+  }
+
+  return true;
+}
+
+bool parseRootSignature(RootSignatureDesc *Desc, int32_t Version,
+                        NamedMDNode *Root) {
+  Desc->Version = Version;
+  bool HasError = false;
+
+  for (unsigned int Sid = 0; Sid < Root->getNumOperands(); Sid++) {
+    // This should be an if, for error handling
+    MDNode *Node = cast<MDNode>(Root->getOperand(Sid));
+
+    // Not sure what use this for...
+    Metadata *Func = Node->getOperand(0).get();
+
+    // This should be an if, for error handling
+    MDNode *Elements = cast<MDNode>(Node->getOperand(1).get());
+
+    for (unsigned int Eid = 0; Eid < Elements->getNumOperands(); Eid++) {
+      MDNode *Element = cast<MDNode>(Elements->getOperand(Eid));
+
+      HasError = HasError || parseRootSignatureElement(Element, Desc);
+    }
+  }
+  return HasError;
+}
 
 static ModuleMetadataInfo collectMetadataInfo(Module &M) {
   ModuleMetadataInfo MMDAI;
@@ -28,6 +107,7 @@ static ModuleMetadataInfo collectMetadataInfo(Module &M) {
   MMDAI.DXILVersion = TT.getDXILVersion();
   MMDAI.ShaderModelVersion = TT.getOSVersion();
   MMDAI.ShaderProfile = TT.getEnvironment();
+
   NamedMDNode *ValidatorVerNode = M.getNamedMetadata("dx.valver");
   if (ValidatorVerNode) {
     auto *ValVerMD = cast<MDNode>(ValidatorVerNode->getOperand(0));
@@ -37,6 +117,15 @@ static ModuleMetadataInfo collectMetadataInfo(Module &M) {
         VersionTuple(MajorMD->getZExtValue(), MinorMD->getZExtValue());
   }
 
+  NamedMDNode *RootSignatureNode = M.getNamedMetadata("dx.rootsignatures");
+  if (RootSignatureNode) {
+    mcdxbc::RootSignatureDesc Desc;
+
+    parseRootSignature(&Desc, 1, RootSignatureNode);
+
+    MMDAI.RootSignatureDesc = Desc;
+  }
+
   // For all HLSL Shader functions
   for (auto &F : M.functions()) {
     if (!F.hasFnAttribute("hlsl.shader"))
diff --git a/llvm/lib/Target/DirectX/DXContainerGlobals.cpp b/llvm/lib/Target/DirectX/DXContainerGlobals.cpp
index 7a0bd6a7c8869..7ab11ce757e43 100644
--- a/llvm/lib/Target/DirectX/DXContainerGlobals.cpp
+++ b/llvm/lib/Target/DirectX/DXContainerGlobals.cpp
@@ -23,9 +23,11 @@
 #include "llvm/IR/Module.h"
 #include "llvm/InitializePasses.h"
 #include "llvm/MC/DXContainerPSVInfo.h"
+#include "llvm/MC/DXContainerRootSignature.h"
 #include "llvm/Pass.h"
 #include "llvm/Support/MD5.h"
 #include "llvm/Transforms/Utils/ModuleUtils.h"
+#include <optional>
 
 using namespace llvm;
 using namespace llvm::dxil;
@@ -41,6 +43,7 @@ class DXContainerGlobals : public llvm::ModulePass {
   GlobalVariable *buildSignature(Module &M, Signature &Sig, StringRef Name,
                                  StringRef SectionName);
   void addSignature(Module &M, SmallVector<GlobalValue *> &Globals);
+  void addRootSignature(Module &M, SmallVector<GlobalValue *> &Globals);
   void addResourcesForPSV(Module &M, PSVRuntimeInfo &PSV);
   void addPipelineStateValidationInfo(Module &M,
                                       SmallVector<GlobalValue *> &Globals);
@@ -73,6 +76,7 @@ bool DXContainerGlobals::runOnModule(Module &M) {
   Globals.push_back(getFeatureFlags(M));
   Globals.push_back(computeShaderHash(M));
   addSignature(M, Globals);
+  addRootSignature(M, Globals);
   addPipelineStateValidationInfo(M, Globals);
   appendToCompilerUsed(M, Globals);
   return true;
@@ -144,6 +148,26 @@ void DXContainerGlobals::addSignature(Module &M,
   Globals.emplace_back(buildSignature(M, OutputSig, "dx.osg1", "OSG1"));
 }
 
+void DXContainerGlobals::addRootSignature(Module &M,
+                                          SmallVector<GlobalValue *> &Globals) {
+
+  std::optional<RootSignatureDesc> Desc =
+      getAnalysis<DXILMetadataAnalysisWrapperPass>()
+          .getModuleMetadata()
+          .RootSignatureDesc;
+  if (!Desc.has_value())
+    return;
+
+  SmallString<256> Data;
+  raw_svector_ostream OS(Data);
+  RootSignatureDescWriter writer(&Desc.value());
+  writer.write(OS);
+
+  Constant *Constant =
+      ConstantDataArray::getString(M.getContext(), Data, /*AddNull*/ false);
+  Globals.emplace_back(buildContainerGlobal(M, Constant, "dx.rts0", "RTS0"));
+}
+
 void DXContainerGlobals::addResourcesForPSV(Module &M, PSVRuntimeInfo &PSV) {
   const DXILBindingMap &DBM =
       getAnalysis<DXILResourceBindingWrapperPass>().getBindingMap();

>From 4f6f941e3410e6aab982a73572d5ab2fa2cc1520 Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Thu, 16 Jan 2025 00:36:11 +0000
Subject: [PATCH 29/64] moving root signature to it's own pass

---
 .../llvm/Analysis/DXILMetadataAnalysis.h      |   2 -
 llvm/lib/Analysis/DXILMetadataAnalysis.cpp    |  84 ----------
 llvm/lib/MC/CMakeLists.txt                    |   1 -
 llvm/lib/Target/DirectX/CMakeLists.txt        |   2 +-
 .../lib/Target/DirectX/DXContainerGlobals.cpp |  15 +-
 llvm/lib/Target/DirectX/DXILRootSignature.cpp | 146 ++++++++++++++++++
 llvm/lib/Target/DirectX/DXILRootSignature.h   |  75 +++++++++
 llvm/lib/Target/DirectX/DirectX.h             |   3 +
 .../Target/DirectX/DirectXTargetMachine.cpp   |   1 +
 .../ContainerData/RootSignature-Flags.ll      |  38 +++++
 10 files changed, 271 insertions(+), 96 deletions(-)
 create mode 100644 llvm/lib/Target/DirectX/DXILRootSignature.cpp
 create mode 100644 llvm/lib/Target/DirectX/DXILRootSignature.h
 create mode 100644 llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Flags.ll

diff --git a/llvm/include/llvm/Analysis/DXILMetadataAnalysis.h b/llvm/include/llvm/Analysis/DXILMetadataAnalysis.h
index f420244ba111a..dcc3237f57802 100644
--- a/llvm/include/llvm/Analysis/DXILMetadataAnalysis.h
+++ b/llvm/include/llvm/Analysis/DXILMetadataAnalysis.h
@@ -11,7 +11,6 @@
 
 #include "llvm/ADT/SmallVector.h"
 #include "llvm/IR/PassManager.h"
-#include "llvm/MC/DXContainerRootSignature.h"
 #include "llvm/Pass.h"
 #include "llvm/Support/VersionTuple.h"
 #include "llvm/TargetParser/Triple.h"
@@ -39,7 +38,6 @@ struct ModuleMetadataInfo {
   Triple::EnvironmentType ShaderProfile{Triple::UnknownEnvironment};
   VersionTuple ValidatorVersion{};
   SmallVector<EntryProperties> EntryPropertyVec{};
-  std::optional<mcdxbc::RootSignatureDesc> RootSignatureDesc;
   void print(raw_ostream &OS) const;
 };
 
diff --git a/llvm/lib/Analysis/DXILMetadataAnalysis.cpp b/llvm/lib/Analysis/DXILMetadataAnalysis.cpp
index 388e3853008ea..15e72bf17515b 100644
--- a/llvm/lib/Analysis/DXILMetadataAnalysis.cpp
+++ b/llvm/lib/Analysis/DXILMetadataAnalysis.cpp
@@ -15,7 +15,6 @@
 #include "llvm/IR/Metadata.h"
 #include "llvm/IR/Module.h"
 #include "llvm/InitializePasses.h"
-#include "llvm/MC/DXContainerRootSignature.h"
 #include "llvm/Support/Casting.h"
 #include "llvm/Support/ErrorHandling.h"
 #include <memory>
@@ -24,82 +23,8 @@
 
 using namespace llvm;
 using namespace dxil;
-using namespace llvm::mcdxbc;
 
-static bool parseRootFlags(MDNode *RootFlagNode, RootSignatureDesc *Desc) {
 
-  assert(RootFlagNode->getNumOperands() == 2 &&
-         "Invalid format for RootFlag Element");
-  auto *Flag = mdconst::extract<ConstantInt>(RootFlagNode->getOperand(1));
-  auto Value = (RootSignatureFlags)Flag->getZExtValue();
-
-  if ((Value & ~RootSignatureFlags::ValidFlags) != RootSignatureFlags::None)
-    return true;
-
-  Desc->Flags = Value;
-  return false;
-}
-
-static bool parseRootSignatureElement(MDNode *Element,
-                                      RootSignatureDesc *Desc) {
-  MDString *ElementText = cast<MDString>(Element->getOperand(0));
-
-  assert(ElementText != nullptr && "First preoperty of element is not ");
-
-  RootSignatureElementKind ElementKind =
-      StringSwitch<RootSignatureElementKind>(ElementText->getString())
-          .Case("RootFlags", RootSignatureElementKind::RootFlags)
-          .Case("RootConstants", RootSignatureElementKind::RootConstants)
-          .Case("RootCBV", RootSignatureElementKind::RootDescriptor)
-          .Case("RootSRV", RootSignatureElementKind::RootDescriptor)
-          .Case("RootUAV", RootSignatureElementKind::RootDescriptor)
-          .Case("Sampler", RootSignatureElementKind::RootDescriptor)
-          .Case("DescriptorTable", RootSignatureElementKind::DescriptorTable)
-          .Case("StaticSampler", RootSignatureElementKind::StaticSampler)
-          .Default(RootSignatureElementKind::None);
-
-  switch (ElementKind) {
-
-  case RootSignatureElementKind::RootFlags: {
-    return parseRootFlags(Element, Desc);
-    break;
-  }
-
-  case RootSignatureElementKind::RootConstants:
-  case RootSignatureElementKind::RootDescriptor:
-  case RootSignatureElementKind::DescriptorTable:
-  case RootSignatureElementKind::StaticSampler:
-  case RootSignatureElementKind::None:
-    llvm_unreachable("Not Implemented yet");
-    break;
-  }
-
-  return true;
-}
-
-bool parseRootSignature(RootSignatureDesc *Desc, int32_t Version,
-                        NamedMDNode *Root) {
-  Desc->Version = Version;
-  bool HasError = false;
-
-  for (unsigned int Sid = 0; Sid < Root->getNumOperands(); Sid++) {
-    // This should be an if, for error handling
-    MDNode *Node = cast<MDNode>(Root->getOperand(Sid));
-
-    // Not sure what use this for...
-    Metadata *Func = Node->getOperand(0).get();
-
-    // This should be an if, for error handling
-    MDNode *Elements = cast<MDNode>(Node->getOperand(1).get());
-
-    for (unsigned int Eid = 0; Eid < Elements->getNumOperands(); Eid++) {
-      MDNode *Element = cast<MDNode>(Elements->getOperand(Eid));
-
-      HasError = HasError || parseRootSignatureElement(Element, Desc);
-    }
-  }
-  return HasError;
-}
 
 static ModuleMetadataInfo collectMetadataInfo(Module &M) {
   ModuleMetadataInfo MMDAI;
@@ -117,15 +42,6 @@ static ModuleMetadataInfo collectMetadataInfo(Module &M) {
         VersionTuple(MajorMD->getZExtValue(), MinorMD->getZExtValue());
   }
 
-  NamedMDNode *RootSignatureNode = M.getNamedMetadata("dx.rootsignatures");
-  if (RootSignatureNode) {
-    mcdxbc::RootSignatureDesc Desc;
-
-    parseRootSignature(&Desc, 1, RootSignatureNode);
-
-    MMDAI.RootSignatureDesc = Desc;
-  }
-
   // For all HLSL Shader functions
   for (auto &F : M.functions()) {
     if (!F.hasFnAttribute("hlsl.shader"))
diff --git a/llvm/lib/MC/CMakeLists.txt b/llvm/lib/MC/CMakeLists.txt
index f49f14c848b90..e1d19196c8766 100644
--- a/llvm/lib/MC/CMakeLists.txt
+++ b/llvm/lib/MC/CMakeLists.txt
@@ -1,7 +1,6 @@
 add_llvm_component_library(LLVMMC
   ConstantPools.cpp
   DXContainerPSVInfo.cpp
-  DXContainerRootSignature.cpp
   ELFObjectWriter.cpp
   GOFFObjectWriter.cpp
   MCAsmBackend.cpp
diff --git a/llvm/lib/Target/DirectX/CMakeLists.txt b/llvm/lib/Target/DirectX/CMakeLists.txt
index 26315db891b57..89fe494dea71c 100644
--- a/llvm/lib/Target/DirectX/CMakeLists.txt
+++ b/llvm/lib/Target/DirectX/CMakeLists.txt
@@ -33,7 +33,7 @@ add_llvm_target(DirectXCodeGen
   DXILResourceAccess.cpp
   DXILShaderFlags.cpp
   DXILTranslateMetadata.cpp
-
+  DXILRootSignature.cpp
   LINK_COMPONENTS
   Analysis
   AsmPrinter
diff --git a/llvm/lib/Target/DirectX/DXContainerGlobals.cpp b/llvm/lib/Target/DirectX/DXContainerGlobals.cpp
index 7ab11ce757e43..833a22a9b3e81 100644
--- a/llvm/lib/Target/DirectX/DXContainerGlobals.cpp
+++ b/llvm/lib/Target/DirectX/DXContainerGlobals.cpp
@@ -11,6 +11,7 @@
 //===----------------------------------------------------------------------===//
 
 #include "DXILShaderFlags.h"
+#include "DXILRootSignature.h"
 #include "DirectX.h"
 #include "llvm/ADT/SmallVector.h"
 #include "llvm/ADT/StringExtras.h"
@@ -23,7 +24,6 @@
 #include "llvm/IR/Module.h"
 #include "llvm/InitializePasses.h"
 #include "llvm/MC/DXContainerPSVInfo.h"
-#include "llvm/MC/DXContainerRootSignature.h"
 #include "llvm/Pass.h"
 #include "llvm/Support/MD5.h"
 #include "llvm/Transforms/Utils/ModuleUtils.h"
@@ -63,6 +63,7 @@ class DXContainerGlobals : public llvm::ModulePass {
   void getAnalysisUsage(AnalysisUsage &AU) const override {
     AU.setPreservesAll();
     AU.addRequired<ShaderFlagsAnalysisWrapper>();
+    AU.addRequired<RootSignatureAnalysisWrapper>();
     AU.addRequired<DXILMetadataAnalysisWrapperPass>();
     AU.addRequired<DXILResourceTypeWrapperPass>();
     AU.addRequired<DXILResourceBindingWrapperPass>();
@@ -151,17 +152,15 @@ void DXContainerGlobals::addSignature(Module &M,
 void DXContainerGlobals::addRootSignature(Module &M,
                                           SmallVector<GlobalValue *> &Globals) {
 
-  std::optional<RootSignatureDesc> Desc =
-      getAnalysis<DXILMetadataAnalysisWrapperPass>()
-          .getModuleMetadata()
-          .RootSignatureDesc;
-  if (!Desc.has_value())
+  std::optional<ModuleRootSignature> MRS =
+      getAnalysis<RootSignatureAnalysisWrapper>()
+          .getRootSignature();
+  if (!MRS.has_value())
     return;
 
   SmallString<256> Data;
   raw_svector_ostream OS(Data);
-  RootSignatureDescWriter writer(&Desc.value());
-  writer.write(OS);
+  MRS->write(OS);
 
   Constant *Constant =
       ConstantDataArray::getString(M.getContext(), Data, /*AddNull*/ false);
diff --git a/llvm/lib/Target/DirectX/DXILRootSignature.cpp b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
new file mode 100644
index 0000000000000..4a51198d97ac3
--- /dev/null
+++ b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
@@ -0,0 +1,146 @@
+//===- DXILRootSignature.cpp - DXIL Root Signature helper objects ---------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+///
+/// \file This file contains helper objects and APIs for working with DXIL
+///       Root Signatures.
+///
+//===----------------------------------------------------------------------===//
+#include "DXILRootSignature.h"
+#include "DirectX.h"
+#include "llvm/ADT/StringSwitch.h"
+#include "llvm/BinaryFormat/DXContainer.h"
+#include "llvm/IR/Constants.h"
+#include "llvm/IR/Metadata.h"
+#include "llvm/IR/Module.h"
+
+using namespace llvm;
+using namespace llvm::dxil;
+
+static bool parseRootFlags(ModuleRootSignature *MRS, MDNode *RootFlagNode) {
+
+  assert(RootFlagNode->getNumOperands() == 2 &&
+         "Invalid format for RootFlag Element");
+  auto *Flag = mdconst::extract<ConstantInt>(RootFlagNode->getOperand(1));
+  auto Value = Flag->getZExtValue();
+
+  // Root Element validation, as specified: https://github.com/llvm/wg-hlsl/blob/main/proposals/0002-root-signature-in-clang.md#validations-during-dxil-generation
+  if ((Value & ~0x80000fff) != 0)
+    return true;
+
+  MRS->Flags = Value;
+  return false;
+}
+
+static bool parseRootSignatureElement(ModuleRootSignature *MRS, MDNode *Element) {
+  MDString *ElementText = cast<MDString>(Element->getOperand(0));
+
+  assert(ElementText != nullptr && "First preoperty of element is not ");
+
+  RootSignatureElementKind ElementKind =
+      StringSwitch<RootSignatureElementKind>(ElementText->getString())
+          .Case("RootFlags", RootSignatureElementKind::RootFlags)
+          .Case("RootConstants", RootSignatureElementKind::RootConstants)
+          .Case("RootCBV", RootSignatureElementKind::RootDescriptor)
+          .Case("RootSRV", RootSignatureElementKind::RootDescriptor)
+          .Case("RootUAV", RootSignatureElementKind::RootDescriptor)
+          .Case("Sampler", RootSignatureElementKind::RootDescriptor)
+          .Case("DescriptorTable", RootSignatureElementKind::DescriptorTable)
+          .Case("StaticSampler", RootSignatureElementKind::StaticSampler)
+          .Default(RootSignatureElementKind::None);
+
+  switch (ElementKind) {
+
+  case RootSignatureElementKind::RootFlags: {
+    return parseRootFlags(MRS, Element);
+    break;
+  }
+
+  case RootSignatureElementKind::RootConstants:
+  case RootSignatureElementKind::RootDescriptor:
+  case RootSignatureElementKind::DescriptorTable:
+  case RootSignatureElementKind::StaticSampler:
+  case RootSignatureElementKind::None:
+    llvm_unreachable("Not Implemented yet");
+    break;
+  }
+
+  return true;
+}
+
+bool ModuleRootSignature::parse( int32_t Version,
+                        NamedMDNode *Root) {
+  this->Version = Version;
+  bool HasError = false;
+
+  for (unsigned int Sid = 0; Sid < Root->getNumOperands(); Sid++) {
+    // This should be an if, for error handling
+    MDNode *Node = cast<MDNode>(Root->getOperand(Sid));
+
+    // Not sure what use this for...
+    Metadata *Func = Node->getOperand(0).get();
+
+    // This should be an if, for error handling
+    MDNode *Elements = cast<MDNode>(Node->getOperand(1).get());
+
+    for (unsigned int Eid = 0; Eid < Elements->getNumOperands(); Eid++) {
+      MDNode *Element = cast<MDNode>(Elements->getOperand(Eid));
+
+      HasError = HasError || parseRootSignatureElement(this, Element);
+    }
+  }
+  return HasError;
+}
+
+void ModuleRootSignature::write(raw_ostream &OS) {
+  dxbc::RootSignatureDesc Out{this->Version, this->Flags};
+
+  if (sys::IsBigEndianHost) {
+    Out.swapBytes();
+  }
+
+  OS.write(reinterpret_cast<const char *>(&Out), sizeof(dxbc::RootSignatureDesc));
+}
+
+AnalysisKey RootSignatureAnalysis::Key;
+
+ModuleRootSignature RootSignatureAnalysis::run(Module &M,
+                                           ModuleAnalysisManager &AM) { 
+    ModuleRootSignature MRSI;
+
+    NamedMDNode *RootSignatureNode = M.getNamedMetadata("dx.rootsignatures");
+    if (RootSignatureNode) {
+        MRSI.parse(1, RootSignatureNode);
+    }
+
+    return MRSI;
+
+}
+
+
+//===----------------------------------------------------------------------===//
+bool RootSignatureAnalysisWrapper::runOnModule(Module &M) {
+  ModuleRootSignature MRS;
+
+    NamedMDNode *RootSignatureNode = M.getNamedMetadata("dx.rootsignatures");
+    if (RootSignatureNode) {
+        MRS.parse(1, RootSignatureNode);
+        this->MRS = MRS;
+    }
+
+
+    return false;
+}
+
+void RootSignatureAnalysisWrapper::getAnalysisUsage(AnalysisUsage &AU) const {
+  AU.setPreservesAll();
+}
+
+char RootSignatureAnalysisWrapper::ID = 0;
+
+INITIALIZE_PASS(RootSignatureAnalysisWrapper, "dx-root-signature-analysis", 
+          "DXIL Root Signature Analysis", true, true)
diff --git a/llvm/lib/Target/DirectX/DXILRootSignature.h b/llvm/lib/Target/DirectX/DXILRootSignature.h
new file mode 100644
index 0000000000000..fdfd6c41c0af3
--- /dev/null
+++ b/llvm/lib/Target/DirectX/DXILRootSignature.h
@@ -0,0 +1,75 @@
+//===- DXILRootSignature.h - DXIL Root Signature helper objects ---------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+///
+/// \file This file contains helper objects and APIs for working with DXIL
+///       Root Signatures.
+///
+//===----------------------------------------------------------------------===//
+
+
+#include "llvm/IR/Metadata.h"
+#include "llvm/IR/PassManager.h"
+#include "llvm/Pass.h"
+#include <optional>
+
+namespace llvm {
+namespace dxil {
+
+
+    enum class RootSignatureElementKind {
+    None = 0,
+    RootFlags = 1,
+    RootConstants = 2,
+    RootDescriptor = 3,
+    DescriptorTable = 4,
+    StaticSampler = 5
+    };
+
+    struct ModuleRootSignature {
+        uint32_t Version;
+        uint32_t Flags;
+
+        ModuleRootSignature() = default;
+
+        bool parse( int32_t Version, NamedMDNode *Root);
+        void write(raw_ostream &OS);
+    };
+
+    class RootSignatureAnalysis : public AnalysisInfoMixin<RootSignatureAnalysis> {
+    friend AnalysisInfoMixin<RootSignatureAnalysis>;
+    static AnalysisKey Key;
+
+    public:
+    RootSignatureAnalysis() = default;
+
+    using Result = ModuleRootSignature;
+
+    ModuleRootSignature run(Module &M, ModuleAnalysisManager &AM);
+    };
+
+    /// Wrapper pass for the legacy pass manager.
+    ///
+    /// This is required because the passes that will depend on this are codegen
+    /// passes which run through the legacy pass manager.
+    class RootSignatureAnalysisWrapper : public ModulePass {
+    std::optional<ModuleRootSignature> MRS;
+
+    public:
+    static char ID;
+
+    RootSignatureAnalysisWrapper() : ModulePass(ID) {}
+
+    const std::optional<ModuleRootSignature> &getRootSignature() { return MRS; }
+
+    bool runOnModule(Module &M) override;
+
+    void getAnalysisUsage(AnalysisUsage &AU) const override;
+    };
+
+} // namespace dxil
+} // namespace llvm
diff --git a/llvm/lib/Target/DirectX/DirectX.h b/llvm/lib/Target/DirectX/DirectX.h
index add23587de7d5..953ac3eb82098 100644
--- a/llvm/lib/Target/DirectX/DirectX.h
+++ b/llvm/lib/Target/DirectX/DirectX.h
@@ -77,6 +77,9 @@ void initializeDXILPrettyPrinterLegacyPass(PassRegistry &);
 /// Initializer for dxil::ShaderFlagsAnalysisWrapper pass.
 void initializeShaderFlagsAnalysisWrapperPass(PassRegistry &);
 
+/// Initializer for dxil::RootSignatureAnalysisWrapper pass.
+void initializeRootSignatureAnalysisWrapperPass(PassRegistry &);
+
 /// Initializer for DXContainerGlobals pass.
 void initializeDXContainerGlobalsPass(PassRegistry &);
 
diff --git a/llvm/lib/Target/DirectX/DirectXTargetMachine.cpp b/llvm/lib/Target/DirectX/DirectXTargetMachine.cpp
index ecb1bf775f857..93745d7a5cb0d 100644
--- a/llvm/lib/Target/DirectX/DirectXTargetMachine.cpp
+++ b/llvm/lib/Target/DirectX/DirectXTargetMachine.cpp
@@ -61,6 +61,7 @@ extern "C" LLVM_EXTERNAL_VISIBILITY void LLVMInitializeDirectXTarget() {
   initializeDXILTranslateMetadataLegacyPass(*PR);
   initializeDXILResourceMDWrapperPass(*PR);
   initializeShaderFlagsAnalysisWrapperPass(*PR);
+  initializeRootSignatureAnalysisWrapperPass(*PR);
   initializeDXILFinalizeLinkageLegacyPass(*PR);
 }
 
diff --git a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Flags.ll b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Flags.ll
new file mode 100644
index 0000000000000..ffbf5e9ffd1d3
--- /dev/null
+++ b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Flags.ll
@@ -0,0 +1,38 @@
+; 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 [8 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 = !{ !"RootFlags", i32 1 } ; 1 = allow_input_assembler_input_layout
+
+
+; DXC:    - Name: RTS0
+; DXC-NEXT: Size: 8
+; DXC-NEXT: RootSignature:
+; DXC-NEXT:   Version: 1
+; DXC-NEXT:   AllowInputAssemblerInputLayout: true
+; DXC-NEXT:   DenyVertexShaderRootAccess: false
+; DXC-NEXT:   DenyHullShaderRootAccess: false
+; DXC-NEXT:   DenyDomainShaderRootAccess: false
+; DXC-NEXT:   DenyGeometryShaderRootAccess: false
+; DXC-NEXT:   DenyPixelShaderRootAccess: false
+; DXC-NEXT:   AllowStreamOutput: false
+; DXC-NEXT:   LocalRootSignature: false
+; DXC-NEXT:   DenyAmplificationShaderRootAccess: false
+; DXC-NEXT:   DenyMeshShaderRootAccess: false
+; DXC-NEXT:   CBVSRVUAVHeapDirectlyIndexed: false
+; DXC-NEXT:   SamplerHeapDirectlyIndexed: false

>From a7f778412de28258703b51aed85699e413491e29 Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Thu, 16 Jan 2025 00:37:14 +0000
Subject: [PATCH 30/64] formating

---
 llvm/lib/Analysis/DXILMetadataAnalysis.cpp    |  2 -
 .../lib/Target/DirectX/DXContainerGlobals.cpp |  5 +-
 llvm/lib/Target/DirectX/DXILRootSignature.cpp | 48 ++++++------
 llvm/lib/Target/DirectX/DXILRootSignature.h   | 77 +++++++++----------
 4 files changed, 64 insertions(+), 68 deletions(-)

diff --git a/llvm/lib/Analysis/DXILMetadataAnalysis.cpp b/llvm/lib/Analysis/DXILMetadataAnalysis.cpp
index 15e72bf17515b..197b7e422092c 100644
--- a/llvm/lib/Analysis/DXILMetadataAnalysis.cpp
+++ b/llvm/lib/Analysis/DXILMetadataAnalysis.cpp
@@ -24,8 +24,6 @@
 using namespace llvm;
 using namespace dxil;
 
-
-
 static ModuleMetadataInfo collectMetadataInfo(Module &M) {
   ModuleMetadataInfo MMDAI;
   Triple TT(Triple(M.getTargetTriple()));
diff --git a/llvm/lib/Target/DirectX/DXContainerGlobals.cpp b/llvm/lib/Target/DirectX/DXContainerGlobals.cpp
index 833a22a9b3e81..ac70bd3771dad 100644
--- a/llvm/lib/Target/DirectX/DXContainerGlobals.cpp
+++ b/llvm/lib/Target/DirectX/DXContainerGlobals.cpp
@@ -10,8 +10,8 @@
 //
 //===----------------------------------------------------------------------===//
 
-#include "DXILShaderFlags.h"
 #include "DXILRootSignature.h"
+#include "DXILShaderFlags.h"
 #include "DirectX.h"
 #include "llvm/ADT/SmallVector.h"
 #include "llvm/ADT/StringExtras.h"
@@ -153,8 +153,7 @@ void DXContainerGlobals::addRootSignature(Module &M,
                                           SmallVector<GlobalValue *> &Globals) {
 
   std::optional<ModuleRootSignature> MRS =
-      getAnalysis<RootSignatureAnalysisWrapper>()
-          .getRootSignature();
+      getAnalysis<RootSignatureAnalysisWrapper>().getRootSignature();
   if (!MRS.has_value())
     return;
 
diff --git a/llvm/lib/Target/DirectX/DXILRootSignature.cpp b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
index 4a51198d97ac3..89621868a9336 100644
--- a/llvm/lib/Target/DirectX/DXILRootSignature.cpp
+++ b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
@@ -1,4 +1,5 @@
-//===- DXILRootSignature.cpp - DXIL Root Signature helper objects ---------------===//
+//===- DXILRootSignature.cpp - DXIL Root Signature helper objects
+//---------------===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
@@ -28,7 +29,8 @@ static bool parseRootFlags(ModuleRootSignature *MRS, MDNode *RootFlagNode) {
   auto *Flag = mdconst::extract<ConstantInt>(RootFlagNode->getOperand(1));
   auto Value = Flag->getZExtValue();
 
-  // Root Element validation, as specified: https://github.com/llvm/wg-hlsl/blob/main/proposals/0002-root-signature-in-clang.md#validations-during-dxil-generation
+  // Root Element validation, as specified:
+  // https://github.com/llvm/wg-hlsl/blob/main/proposals/0002-root-signature-in-clang.md#validations-during-dxil-generation
   if ((Value & ~0x80000fff) != 0)
     return true;
 
@@ -36,7 +38,8 @@ static bool parseRootFlags(ModuleRootSignature *MRS, MDNode *RootFlagNode) {
   return false;
 }
 
-static bool parseRootSignatureElement(ModuleRootSignature *MRS, MDNode *Element) {
+static bool parseRootSignatureElement(ModuleRootSignature *MRS,
+                                      MDNode *Element) {
   MDString *ElementText = cast<MDString>(Element->getOperand(0));
 
   assert(ElementText != nullptr && "First preoperty of element is not ");
@@ -72,8 +75,7 @@ static bool parseRootSignatureElement(ModuleRootSignature *MRS, MDNode *Element)
   return true;
 }
 
-bool ModuleRootSignature::parse( int32_t Version,
-                        NamedMDNode *Root) {
+bool ModuleRootSignature::parse(int32_t Version, NamedMDNode *Root) {
   this->Version = Version;
   bool HasError = false;
 
@@ -103,37 +105,35 @@ void ModuleRootSignature::write(raw_ostream &OS) {
     Out.swapBytes();
   }
 
-  OS.write(reinterpret_cast<const char *>(&Out), sizeof(dxbc::RootSignatureDesc));
+  OS.write(reinterpret_cast<const char *>(&Out),
+           sizeof(dxbc::RootSignatureDesc));
 }
 
 AnalysisKey RootSignatureAnalysis::Key;
 
 ModuleRootSignature RootSignatureAnalysis::run(Module &M,
-                                           ModuleAnalysisManager &AM) { 
-    ModuleRootSignature MRSI;
+                                               ModuleAnalysisManager &AM) {
+  ModuleRootSignature MRSI;
 
-    NamedMDNode *RootSignatureNode = M.getNamedMetadata("dx.rootsignatures");
-    if (RootSignatureNode) {
-        MRSI.parse(1, RootSignatureNode);
-    }
-
-    return MRSI;
+  NamedMDNode *RootSignatureNode = M.getNamedMetadata("dx.rootsignatures");
+  if (RootSignatureNode) {
+    MRSI.parse(1, RootSignatureNode);
+  }
 
+  return MRSI;
 }
 
-
 //===----------------------------------------------------------------------===//
 bool RootSignatureAnalysisWrapper::runOnModule(Module &M) {
   ModuleRootSignature MRS;
 
-    NamedMDNode *RootSignatureNode = M.getNamedMetadata("dx.rootsignatures");
-    if (RootSignatureNode) {
-        MRS.parse(1, RootSignatureNode);
-        this->MRS = MRS;
-    }
-
+  NamedMDNode *RootSignatureNode = M.getNamedMetadata("dx.rootsignatures");
+  if (RootSignatureNode) {
+    MRS.parse(1, RootSignatureNode);
+    this->MRS = MRS;
+  }
 
-    return false;
+  return false;
 }
 
 void RootSignatureAnalysisWrapper::getAnalysisUsage(AnalysisUsage &AU) const {
@@ -142,5 +142,5 @@ void RootSignatureAnalysisWrapper::getAnalysisUsage(AnalysisUsage &AU) const {
 
 char RootSignatureAnalysisWrapper::ID = 0;
 
-INITIALIZE_PASS(RootSignatureAnalysisWrapper, "dx-root-signature-analysis", 
-          "DXIL Root Signature Analysis", true, true)
+INITIALIZE_PASS(RootSignatureAnalysisWrapper, "dx-root-signature-analysis",
+                "DXIL Root Signature Analysis", true, true)
diff --git a/llvm/lib/Target/DirectX/DXILRootSignature.h b/llvm/lib/Target/DirectX/DXILRootSignature.h
index fdfd6c41c0af3..de82afcdc8c46 100644
--- a/llvm/lib/Target/DirectX/DXILRootSignature.h
+++ b/llvm/lib/Target/DirectX/DXILRootSignature.h
@@ -1,4 +1,5 @@
-//===- DXILRootSignature.h - DXIL Root Signature helper objects ---------------===//
+//===- DXILRootSignature.h - DXIL Root Signature helper objects
+//---------------===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
@@ -11,7 +12,6 @@
 ///
 //===----------------------------------------------------------------------===//
 
-
 #include "llvm/IR/Metadata.h"
 #include "llvm/IR/PassManager.h"
 #include "llvm/Pass.h"
@@ -20,56 +20,55 @@
 namespace llvm {
 namespace dxil {
 
+enum class RootSignatureElementKind {
+  None = 0,
+  RootFlags = 1,
+  RootConstants = 2,
+  RootDescriptor = 3,
+  DescriptorTable = 4,
+  StaticSampler = 5
+};
 
-    enum class RootSignatureElementKind {
-    None = 0,
-    RootFlags = 1,
-    RootConstants = 2,
-    RootDescriptor = 3,
-    DescriptorTable = 4,
-    StaticSampler = 5
-    };
-
-    struct ModuleRootSignature {
-        uint32_t Version;
-        uint32_t Flags;
+struct ModuleRootSignature {
+  uint32_t Version;
+  uint32_t Flags;
 
-        ModuleRootSignature() = default;
+  ModuleRootSignature() = default;
 
-        bool parse( int32_t Version, NamedMDNode *Root);
-        void write(raw_ostream &OS);
-    };
+  bool parse(int32_t Version, NamedMDNode *Root);
+  void write(raw_ostream &OS);
+};
 
-    class RootSignatureAnalysis : public AnalysisInfoMixin<RootSignatureAnalysis> {
-    friend AnalysisInfoMixin<RootSignatureAnalysis>;
-    static AnalysisKey Key;
+class RootSignatureAnalysis : public AnalysisInfoMixin<RootSignatureAnalysis> {
+  friend AnalysisInfoMixin<RootSignatureAnalysis>;
+  static AnalysisKey Key;
 
-    public:
-    RootSignatureAnalysis() = default;
+public:
+  RootSignatureAnalysis() = default;
 
-    using Result = ModuleRootSignature;
+  using Result = ModuleRootSignature;
 
-    ModuleRootSignature run(Module &M, ModuleAnalysisManager &AM);
-    };
+  ModuleRootSignature run(Module &M, ModuleAnalysisManager &AM);
+};
 
-    /// Wrapper pass for the legacy pass manager.
-    ///
-    /// This is required because the passes that will depend on this are codegen
-    /// passes which run through the legacy pass manager.
-    class RootSignatureAnalysisWrapper : public ModulePass {
-    std::optional<ModuleRootSignature> MRS;
+/// Wrapper pass for the legacy pass manager.
+///
+/// This is required because the passes that will depend on this are codegen
+/// passes which run through the legacy pass manager.
+class RootSignatureAnalysisWrapper : public ModulePass {
+  std::optional<ModuleRootSignature> MRS;
 
-    public:
-    static char ID;
+public:
+  static char ID;
 
-    RootSignatureAnalysisWrapper() : ModulePass(ID) {}
+  RootSignatureAnalysisWrapper() : ModulePass(ID) {}
 
-    const std::optional<ModuleRootSignature> &getRootSignature() { return MRS; }
+  const std::optional<ModuleRootSignature> &getRootSignature() { return MRS; }
 
-    bool runOnModule(Module &M) override;
+  bool runOnModule(Module &M) override;
 
-    void getAnalysisUsage(AnalysisUsage &AU) const override;
-    };
+  void getAnalysisUsage(AnalysisUsage &AU) const override;
+};
 
 } // namespace dxil
 } // namespace llvm

>From bf3b2e0ed560e5776391db1511997b7278b9a122 Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Thu, 16 Jan 2025 00:42:54 +0000
Subject: [PATCH 31/64] removing useless imports

---
 llvm/include/llvm/Analysis/DXILMetadataAnalysis.h | 1 -
 llvm/lib/Analysis/DXILMetadataAnalysis.cpp        | 3 ---
 2 files changed, 4 deletions(-)

diff --git a/llvm/include/llvm/Analysis/DXILMetadataAnalysis.h b/llvm/include/llvm/Analysis/DXILMetadataAnalysis.h
index dcc3237f57802..cb535ac14f1c6 100644
--- a/llvm/include/llvm/Analysis/DXILMetadataAnalysis.h
+++ b/llvm/include/llvm/Analysis/DXILMetadataAnalysis.h
@@ -14,7 +14,6 @@
 #include "llvm/Pass.h"
 #include "llvm/Support/VersionTuple.h"
 #include "llvm/TargetParser/Triple.h"
-#include <optional>
 
 namespace llvm {
 
diff --git a/llvm/lib/Analysis/DXILMetadataAnalysis.cpp b/llvm/lib/Analysis/DXILMetadataAnalysis.cpp
index 197b7e422092c..a7f666a3f8b48 100644
--- a/llvm/lib/Analysis/DXILMetadataAnalysis.cpp
+++ b/llvm/lib/Analysis/DXILMetadataAnalysis.cpp
@@ -15,9 +15,7 @@
 #include "llvm/IR/Metadata.h"
 #include "llvm/IR/Module.h"
 #include "llvm/InitializePasses.h"
-#include "llvm/Support/Casting.h"
 #include "llvm/Support/ErrorHandling.h"
-#include <memory>
 
 #define DEBUG_TYPE "dxil-metadata-analysis"
 
@@ -30,7 +28,6 @@ static ModuleMetadataInfo collectMetadataInfo(Module &M) {
   MMDAI.DXILVersion = TT.getDXILVersion();
   MMDAI.ShaderModelVersion = TT.getOSVersion();
   MMDAI.ShaderProfile = TT.getEnvironment();
-
   NamedMDNode *ValidatorVerNode = M.getNamedMetadata("dx.valver");
   if (ValidatorVerNode) {
     auto *ValVerMD = cast<MDNode>(ValidatorVerNode->getOperand(0));

>From 16b4d03d316c40f1f97cb766d9ae979185132807 Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Thu, 16 Jan 2025 19:22:31 +0000
Subject: [PATCH 32/64] fixing pr changes

---
 llvm/lib/ObjectYAML/DXContainerYAML.cpp | 1 +
 1 file changed, 1 insertion(+)

diff --git a/llvm/lib/ObjectYAML/DXContainerYAML.cpp b/llvm/lib/ObjectYAML/DXContainerYAML.cpp
index 0869fd4fa9785..afcc093cf0456 100644
--- a/llvm/lib/ObjectYAML/DXContainerYAML.cpp
+++ b/llvm/lib/ObjectYAML/DXContainerYAML.cpp
@@ -15,6 +15,7 @@
 #include "llvm/ADT/ScopeExit.h"
 #include "llvm/BinaryFormat/DXContainer.h"
 #include "llvm/Support/ScopedPrinter.h"
+#include <cstdint>
 
 namespace llvm {
 

>From e0433700ff8ddc13d88876075deea7116715e8c8 Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Thu, 16 Jan 2025 20:06:13 +0000
Subject: [PATCH 33/64] adding some asserts

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

diff --git a/llvm/lib/Target/DirectX/DXILRootSignature.cpp b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
index 89621868a9336..024743b9f81a6 100644
--- a/llvm/lib/Target/DirectX/DXILRootSignature.cpp
+++ b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
@@ -18,6 +18,7 @@
 #include "llvm/IR/Constants.h"
 #include "llvm/IR/Metadata.h"
 #include "llvm/IR/Module.h"
+#include <cassert>
 
 using namespace llvm;
 using namespace llvm::dxil;
@@ -31,8 +32,7 @@ static bool parseRootFlags(ModuleRootSignature *MRS, MDNode *RootFlagNode) {
 
   // Root Element validation, as specified:
   // https://github.com/llvm/wg-hlsl/blob/main/proposals/0002-root-signature-in-clang.md#validations-during-dxil-generation
-  if ((Value & ~0x80000fff) != 0)
-    return true;
+  assert((Value & ~0x80000fff) != 0 && "Invalid flag for RootFlag Element");
 
   MRS->Flags = Value;
   return false;
@@ -41,8 +41,7 @@ static bool parseRootFlags(ModuleRootSignature *MRS, MDNode *RootFlagNode) {
 static bool parseRootSignatureElement(ModuleRootSignature *MRS,
                                       MDNode *Element) {
   MDString *ElementText = cast<MDString>(Element->getOperand(0));
-
-  assert(ElementText != nullptr && "First preoperty of element is not ");
+  assert(ElementText != nullptr && "First preoperty of element is not a string");
 
   RootSignatureElementKind ElementKind =
       StringSwitch<RootSignatureElementKind>(ElementText->getString())
@@ -84,13 +83,14 @@ bool ModuleRootSignature::parse(int32_t Version, NamedMDNode *Root) {
     MDNode *Node = cast<MDNode>(Root->getOperand(Sid));
 
     // Not sure what use this for...
-    Metadata *Func = Node->getOperand(0).get();
+    // Metadata *Func = Node->getOperand(0).get();
 
-    // This should be an if, for error handling
     MDNode *Elements = cast<MDNode>(Node->getOperand(1).get());
+    assert(Elements && "Invalid Metadata type on root signature");
 
     for (unsigned int Eid = 0; Eid < Elements->getNumOperands(); Eid++) {
       MDNode *Element = cast<MDNode>(Elements->getOperand(Eid));
+      assert(Element && "Invalid Metadata type on root element");
 
       HasError = HasError || parseRootSignatureElement(this, Element);
     }

>From 57bf935dccd2f4aaaa211984a77b94a28ef267bc Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Thu, 16 Jan 2025 20:11:36 +0000
Subject: [PATCH 34/64] format

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

diff --git a/llvm/lib/Target/DirectX/DXILRootSignature.cpp b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
index 024743b9f81a6..cabaec3671078 100644
--- a/llvm/lib/Target/DirectX/DXILRootSignature.cpp
+++ b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
@@ -41,7 +41,8 @@ static bool parseRootFlags(ModuleRootSignature *MRS, MDNode *RootFlagNode) {
 static bool parseRootSignatureElement(ModuleRootSignature *MRS,
                                       MDNode *Element) {
   MDString *ElementText = cast<MDString>(Element->getOperand(0));
-  assert(ElementText != nullptr && "First preoperty of element is not a string");
+  assert(ElementText != nullptr &&
+         "First preoperty of element is not a string");
 
   RootSignatureElementKind ElementKind =
       StringSwitch<RootSignatureElementKind>(ElementText->getString())

>From 1f8c0a5c34d1f3f5350c8282c7d65ea9753d5de9 Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Sat, 18 Jan 2025 00:24:53 +0000
Subject: [PATCH 35/64] fixing assert

---
 llvm/lib/MC/CMakeLists.txt                       |  1 +
 llvm/lib/Target/DirectX/DXContainerGlobals.cpp   |  7 ++++++-
 llvm/lib/Target/DirectX/DXILRootSignature.cpp    | 13 +------------
 llvm/lib/Target/DirectX/DXILRootSignature.h      |  1 -
 .../DirectX/ContainerData/RootSignature-Flags.ll | 16 +++-------------
 5 files changed, 11 insertions(+), 27 deletions(-)

diff --git a/llvm/lib/MC/CMakeLists.txt b/llvm/lib/MC/CMakeLists.txt
index e1d19196c8766..f49f14c848b90 100644
--- a/llvm/lib/MC/CMakeLists.txt
+++ b/llvm/lib/MC/CMakeLists.txt
@@ -1,6 +1,7 @@
 add_llvm_component_library(LLVMMC
   ConstantPools.cpp
   DXContainerPSVInfo.cpp
+  DXContainerRootSignature.cpp
   ELFObjectWriter.cpp
   GOFFObjectWriter.cpp
   MCAsmBackend.cpp
diff --git a/llvm/lib/Target/DirectX/DXContainerGlobals.cpp b/llvm/lib/Target/DirectX/DXContainerGlobals.cpp
index ac70bd3771dad..c090d1074250a 100644
--- a/llvm/lib/Target/DirectX/DXContainerGlobals.cpp
+++ b/llvm/lib/Target/DirectX/DXContainerGlobals.cpp
@@ -24,6 +24,7 @@
 #include "llvm/IR/Module.h"
 #include "llvm/InitializePasses.h"
 #include "llvm/MC/DXContainerPSVInfo.h"
+#include "llvm/MC/DXContainerRootSignature.h"
 #include "llvm/Pass.h"
 #include "llvm/Support/MD5.h"
 #include "llvm/Transforms/Utils/ModuleUtils.h"
@@ -159,7 +160,11 @@ void DXContainerGlobals::addRootSignature(Module &M,
 
   SmallString<256> Data;
   raw_svector_ostream OS(Data);
-  MRS->write(OS);
+
+  RootSignatureHeader RSH;
+  RSH.Flags = MRS->Flags;
+  RSH.Version = MRS->Version;
+  RSH.write(OS);
 
   Constant *Constant =
       ConstantDataArray::getString(M.getContext(), Data, /*AddNull*/ false);
diff --git a/llvm/lib/Target/DirectX/DXILRootSignature.cpp b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
index cabaec3671078..5ee9eea68b9e6 100644
--- a/llvm/lib/Target/DirectX/DXILRootSignature.cpp
+++ b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
@@ -32,7 +32,7 @@ static bool parseRootFlags(ModuleRootSignature *MRS, MDNode *RootFlagNode) {
 
   // Root Element validation, as specified:
   // https://github.com/llvm/wg-hlsl/blob/main/proposals/0002-root-signature-in-clang.md#validations-during-dxil-generation
-  assert((Value & ~0x80000fff) != 0 && "Invalid flag for RootFlag Element");
+  assert((Value & ~0x80000fff) == 0 && "Invalid flag for RootFlag Element");
 
   MRS->Flags = Value;
   return false;
@@ -99,17 +99,6 @@ bool ModuleRootSignature::parse(int32_t Version, NamedMDNode *Root) {
   return HasError;
 }
 
-void ModuleRootSignature::write(raw_ostream &OS) {
-  dxbc::RootSignatureDesc Out{this->Version, this->Flags};
-
-  if (sys::IsBigEndianHost) {
-    Out.swapBytes();
-  }
-
-  OS.write(reinterpret_cast<const char *>(&Out),
-           sizeof(dxbc::RootSignatureDesc));
-}
-
 AnalysisKey RootSignatureAnalysis::Key;
 
 ModuleRootSignature RootSignatureAnalysis::run(Module &M,
diff --git a/llvm/lib/Target/DirectX/DXILRootSignature.h b/llvm/lib/Target/DirectX/DXILRootSignature.h
index de82afcdc8c46..3bbbaa12b0798 100644
--- a/llvm/lib/Target/DirectX/DXILRootSignature.h
+++ b/llvm/lib/Target/DirectX/DXILRootSignature.h
@@ -36,7 +36,6 @@ struct ModuleRootSignature {
   ModuleRootSignature() = default;
 
   bool parse(int32_t Version, NamedMDNode *Root);
-  void write(raw_ostream &OS);
 };
 
 class RootSignatureAnalysis : public AnalysisInfoMixin<RootSignatureAnalysis> {
diff --git a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Flags.ll b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Flags.ll
index ffbf5e9ffd1d3..20253efbb8e5c 100644
--- a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Flags.ll
+++ b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Flags.ll
@@ -3,7 +3,7 @@
 
 target triple = "dxil-unknown-shadermodel6.0-compute"
 
-; CHECK: @dx.rts0 = private constant [8 x i8]  c"{{.*}}", section "RTS0", align 4
+; CHECK: @dx.rts0 = private constant [12 x i8]  c"{{.*}}", section "RTS0", align 4
 
 
 define void @main() #0 {
@@ -21,18 +21,8 @@ attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" }
 
 
 ; DXC:    - Name: RTS0
-; DXC-NEXT: Size: 8
+; DXC-NEXT: Size: 12
 ; DXC-NEXT: RootSignature:
+; DXC-NEXT:   Size: 8
 ; DXC-NEXT:   Version: 1
 ; DXC-NEXT:   AllowInputAssemblerInputLayout: true
-; DXC-NEXT:   DenyVertexShaderRootAccess: false
-; DXC-NEXT:   DenyHullShaderRootAccess: false
-; DXC-NEXT:   DenyDomainShaderRootAccess: false
-; DXC-NEXT:   DenyGeometryShaderRootAccess: false
-; DXC-NEXT:   DenyPixelShaderRootAccess: false
-; DXC-NEXT:   AllowStreamOutput: false
-; DXC-NEXT:   LocalRootSignature: false
-; DXC-NEXT:   DenyAmplificationShaderRootAccess: false
-; DXC-NEXT:   DenyMeshShaderRootAccess: false
-; DXC-NEXT:   CBVSRVUAVHeapDirectlyIndexed: false
-; DXC-NEXT:   SamplerHeapDirectlyIndexed: false

>From 0905b8341c5baa6225b5f8fcd51455c80c160593 Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Mon, 27 Jan 2025 23:45:45 +0000
Subject: [PATCH 36/64] cleaning

---
 llvm/lib/ObjectYAML/DXContainerYAML.cpp        | 1 -
 llvm/lib/Target/DirectX/DXContainerGlobals.cpp | 1 -
 2 files changed, 2 deletions(-)

diff --git a/llvm/lib/ObjectYAML/DXContainerYAML.cpp b/llvm/lib/ObjectYAML/DXContainerYAML.cpp
index afcc093cf0456..0869fd4fa9785 100644
--- a/llvm/lib/ObjectYAML/DXContainerYAML.cpp
+++ b/llvm/lib/ObjectYAML/DXContainerYAML.cpp
@@ -15,7 +15,6 @@
 #include "llvm/ADT/ScopeExit.h"
 #include "llvm/BinaryFormat/DXContainer.h"
 #include "llvm/Support/ScopedPrinter.h"
-#include <cstdint>
 
 namespace llvm {
 
diff --git a/llvm/lib/Target/DirectX/DXContainerGlobals.cpp b/llvm/lib/Target/DirectX/DXContainerGlobals.cpp
index c090d1074250a..36e7cedbdaee0 100644
--- a/llvm/lib/Target/DirectX/DXContainerGlobals.cpp
+++ b/llvm/lib/Target/DirectX/DXContainerGlobals.cpp
@@ -28,7 +28,6 @@
 #include "llvm/Pass.h"
 #include "llvm/Support/MD5.h"
 #include "llvm/Transforms/Utils/ModuleUtils.h"
-#include <optional>
 
 using namespace llvm;
 using namespace llvm::dxil;

>From 77e85444c8ebd747046267d10d5ac221eb912b40 Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Wed, 29 Jan 2025 18:36:55 +0000
Subject: [PATCH 37/64] clean up

---
 llvm/lib/Target/DirectX/DXILRootSignature.cpp | 2 --
 llvm/test/CodeGen/DirectX/llc-pipeline.ll     | 1 +
 2 files changed, 1 insertion(+), 2 deletions(-)

diff --git a/llvm/lib/Target/DirectX/DXILRootSignature.cpp b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
index 5ee9eea68b9e6..71ca8a91bc3fe 100644
--- a/llvm/lib/Target/DirectX/DXILRootSignature.cpp
+++ b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
@@ -14,11 +14,9 @@
 #include "DXILRootSignature.h"
 #include "DirectX.h"
 #include "llvm/ADT/StringSwitch.h"
-#include "llvm/BinaryFormat/DXContainer.h"
 #include "llvm/IR/Constants.h"
 #include "llvm/IR/Metadata.h"
 #include "llvm/IR/Module.h"
-#include <cassert>
 
 using namespace llvm;
 using namespace llvm::dxil;
diff --git a/llvm/test/CodeGen/DirectX/llc-pipeline.ll b/llvm/test/CodeGen/DirectX/llc-pipeline.ll
index b071557249414..fc0a7833ea2f0 100644
--- a/llvm/test/CodeGen/DirectX/llc-pipeline.ll
+++ b/llvm/test/CodeGen/DirectX/llc-pipeline.ll
@@ -33,6 +33,7 @@
 ; CHECK-ASM-NEXT: Print Module IR
 
 ; CHECK-OBJ-NEXT: DXIL Embedder
+; CHECK-OBJ-NEXT: DXIL Root Signature Analysis
 ; CHECK-OBJ-NEXT: DXContainer Global Emitter
 ; CHECK-OBJ-NEXT: FunctionPass Manager
 ; CHECK-OBJ-NEXT:   Lazy Machine Block Frequency Analysis

>From 1351fb06360ace76419d9d5991695d4b80c5eca2 Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Thu, 30 Jan 2025 00:22:01 +0000
Subject: [PATCH 38/64] addressing comments

---
 llvm/lib/Target/DirectX/DXILRootSignature.cpp | 89 ++++++++++++-------
 llvm/lib/Target/DirectX/DXILRootSignature.h   |  2 +
 .../ContainerData/RootSignature-Error.ll      | 17 ++++
 .../RootSignature-Flags-Error.ll              | 19 ++++
 .../RootSignature-Flags-Validation-Error.ll   | 19 ++++
 .../RootSignature-RootElement-Error.ll        | 18 ++++
 6 files changed, 132 insertions(+), 32 deletions(-)
 create mode 100644 llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Error.ll
 create mode 100644 llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Flags-Error.ll
 create mode 100644 llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Flags-Validation-Error.ll
 create mode 100644 llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootElement-Error.ll

diff --git a/llvm/lib/Target/DirectX/DXILRootSignature.cpp b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
index 71ca8a91bc3fe..52c7ad8e24937 100644
--- a/llvm/lib/Target/DirectX/DXILRootSignature.cpp
+++ b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
@@ -1,5 +1,4 @@
-//===- DXILRootSignature.cpp - DXIL Root Signature helper objects
-//---------------===//
+//===- DXILRootSignature.cpp - DXIL Root Signature helper objects ----===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
@@ -14,23 +13,31 @@
 #include "DXILRootSignature.h"
 #include "DirectX.h"
 #include "llvm/ADT/StringSwitch.h"
+#include "llvm/ADT/Twine.h"
 #include "llvm/IR/Constants.h"
-#include "llvm/IR/Metadata.h"
 #include "llvm/IR/Module.h"
+#include <cstdint>
 
 using namespace llvm;
 using namespace llvm::dxil;
 
+static bool reportError(Twine Message) {
+  report_fatal_error(Message, false);
+  return true;
+}
+
 static bool parseRootFlags(ModuleRootSignature *MRS, MDNode *RootFlagNode) {
 
-  assert(RootFlagNode->getNumOperands() == 2 &&
-         "Invalid format for RootFlag Element");
+  if (RootFlagNode->getNumOperands() != 2)
+    return reportError("Invalid format for RootFlag Element");
+
   auto *Flag = mdconst::extract<ConstantInt>(RootFlagNode->getOperand(1));
-  auto Value = Flag->getZExtValue();
+  uint32_t Value = Flag->getZExtValue();
 
   // Root Element validation, as specified:
   // https://github.com/llvm/wg-hlsl/blob/main/proposals/0002-root-signature-in-clang.md#validations-during-dxil-generation
-  assert((Value & ~0x80000fff) == 0 && "Invalid flag for RootFlag Element");
+  if ((Value & ~0x80000fff) != 0)
+    return reportError("Invalid flag value for RootFlag");
 
   MRS->Flags = Value;
   return false;
@@ -39,8 +46,8 @@ static bool parseRootFlags(ModuleRootSignature *MRS, MDNode *RootFlagNode) {
 static bool parseRootSignatureElement(ModuleRootSignature *MRS,
                                       MDNode *Element) {
   MDString *ElementText = cast<MDString>(Element->getOperand(0));
-  assert(ElementText != nullptr &&
-         "First preoperty of element is not a string");
+  if (ElementText == nullptr)
+    return reportError("Invalid format for Root Element");
 
   RootSignatureElementKind ElementKind =
       StringSwitch<RootSignatureElementKind>(ElementText->getString())
@@ -66,7 +73,7 @@ static bool parseRootSignatureElement(ModuleRootSignature *MRS,
   case RootSignatureElementKind::DescriptorTable:
   case RootSignatureElementKind::StaticSampler:
   case RootSignatureElementKind::None:
-    llvm_unreachable("Not Implemented yet");
+    return reportError("Invalid Root Element: " + ElementText->getString());
     break;
   }
 
@@ -77,19 +84,37 @@ bool ModuleRootSignature::parse(int32_t Version, NamedMDNode *Root) {
   this->Version = Version;
   bool HasError = false;
 
+  /** Root Signature are specified as following in the metadata:
+
+      !dx.rootsignatures = !{!2} ; list of function/root signature pairs
+      !2 = !{ ptr @main, !3 } ; function, root signature
+      !3 = !{ !4, !5, !6, !7 } ; list of root signature elements
+
+      So for each MDNode inside dx.rootsignatures NamedMDNode
+      (the Root parameter of this function), the parsing process needs
+      to loop through each of it's operand and process the pairs function
+      signature pair.
+   */
+
   for (unsigned int Sid = 0; Sid < Root->getNumOperands(); Sid++) {
-    // This should be an if, for error handling
-    MDNode *Node = cast<MDNode>(Root->getOperand(Sid));
+    MDNode *Node = dyn_cast<MDNode>(Root->getOperand(Sid));
+
+    if (Node == nullptr || Node->getNumOperands() != 2)
+      return reportError("Invalid format for Root Signature Definition. Pairs "
+                         "of function, root signature expected.");
+
+    // Get the Root Signature Description from the function signature pair.
+    MDNode *RS = dyn_cast<MDNode>(Node->getOperand(1).get());
 
-    // Not sure what use this for...
-    // Metadata *Func = Node->getOperand(0).get();
+    if (RS == nullptr)
+      return reportError("Missing Root Signature Metadata node.");
 
-    MDNode *Elements = cast<MDNode>(Node->getOperand(1).get());
-    assert(Elements && "Invalid Metadata type on root signature");
+    // Loop through the Root Elements of the root signature.
+    for (unsigned int Eid = 0; Eid < RS->getNumOperands(); Eid++) {
 
-    for (unsigned int Eid = 0; Eid < Elements->getNumOperands(); Eid++) {
-      MDNode *Element = cast<MDNode>(Elements->getOperand(Eid));
-      assert(Element && "Invalid Metadata type on root element");
+      MDNode *Element = dyn_cast<MDNode>(RS->getOperand(Eid));
+      if (Element == nullptr)
+        return reportError("Missing Root Element Metadata Node.");
 
       HasError = HasError || parseRootSignatureElement(this, Element);
     }
@@ -97,29 +122,29 @@ bool ModuleRootSignature::parse(int32_t Version, NamedMDNode *Root) {
   return HasError;
 }
 
-AnalysisKey RootSignatureAnalysis::Key;
-
-ModuleRootSignature RootSignatureAnalysis::run(Module &M,
-                                               ModuleAnalysisManager &AM) {
-  ModuleRootSignature MRSI;
+ModuleRootSignature ModuleRootSignature::analyzeModule(Module &M) {
+  ModuleRootSignature MRS;
 
   NamedMDNode *RootSignatureNode = M.getNamedMetadata("dx.rootsignatures");
   if (RootSignatureNode) {
-    MRSI.parse(1, RootSignatureNode);
+    if (MRS.parse(1, RootSignatureNode))
+      llvm_unreachable("Invalid Root Signature Metadata.");
   }
 
-  return MRSI;
+  return MRS;
+}
+
+AnalysisKey RootSignatureAnalysis::Key;
+
+ModuleRootSignature RootSignatureAnalysis::run(Module &M,
+                                               ModuleAnalysisManager &AM) {
+  return ModuleRootSignature::analyzeModule(M);
 }
 
 //===----------------------------------------------------------------------===//
 bool RootSignatureAnalysisWrapper::runOnModule(Module &M) {
-  ModuleRootSignature MRS;
 
-  NamedMDNode *RootSignatureNode = M.getNamedMetadata("dx.rootsignatures");
-  if (RootSignatureNode) {
-    MRS.parse(1, RootSignatureNode);
-    this->MRS = MRS;
-  }
+  this->MRS = MRS = ModuleRootSignature::analyzeModule(M);
 
   return false;
 }
diff --git a/llvm/lib/Target/DirectX/DXILRootSignature.h b/llvm/lib/Target/DirectX/DXILRootSignature.h
index 3bbbaa12b0798..0439deea6451a 100644
--- a/llvm/lib/Target/DirectX/DXILRootSignature.h
+++ b/llvm/lib/Target/DirectX/DXILRootSignature.h
@@ -36,6 +36,8 @@ struct ModuleRootSignature {
   ModuleRootSignature() = default;
 
   bool parse(int32_t Version, NamedMDNode *Root);
+
+  static ModuleRootSignature analyzeModule(Module &M);
 };
 
 class RootSignatureAnalysis : public AnalysisInfoMixin<RootSignatureAnalysis> {
diff --git a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Error.ll b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Error.ll
new file mode 100644
index 0000000000000..cbcd8e56c1c04
--- /dev/null
+++ b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Error.ll
@@ -0,0 +1,17 @@
+; RUN: not llc %s --filetype=obj -o - 2>&1 | FileCheck %s
+
+target triple = "dxil-unknown-shadermodel6.0-compute"
+
+; CHECK: LLVM ERROR: Invalid format for Root Signature Definition. Pairs of function, root signature expected.
+
+
+define void @main() #0 {
+entry:
+  ret void
+}
+
+attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" }
+
+
+!dx.rootsignatures = !{!1} ; list of function/root signature pairs
+!1= !{ !"RootFlags" } ; function, root signature
diff --git a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Flags-Error.ll b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Flags-Error.ll
new file mode 100644
index 0000000000000..9b4208011bba5
--- /dev/null
+++ b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Flags-Error.ll
@@ -0,0 +1,19 @@
+; RUN: not llc %s --filetype=obj -o - 2>&1 | FileCheck %s
+
+target triple = "dxil-unknown-shadermodel6.0-compute"
+
+; CHECK: LLVM ERROR: Invalid Root Element: NOTRootFlags
+
+
+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 = !{ !"NOTRootFlags", i32 1 } ; 1 = allow_input_assembler_input_layout
diff --git a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Flags-Validation-Error.ll b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Flags-Validation-Error.ll
new file mode 100644
index 0000000000000..85e6f4d6748d5
--- /dev/null
+++ b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Flags-Validation-Error.ll
@@ -0,0 +1,19 @@
+; RUN: not llc %s --filetype=obj -o - 2>&1 | FileCheck %s
+
+target triple = "dxil-unknown-shadermodel6.0-compute"
+
+; CHECK: LLVM ERROR: Invalid flag value for RootFlag
+
+
+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
diff --git a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootElement-Error.ll b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootElement-Error.ll
new file mode 100644
index 0000000000000..501e3438943a3
--- /dev/null
+++ b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootElement-Error.ll
@@ -0,0 +1,18 @@
+; RUN: not llc %s --filetype=obj -o - 2>&1 | FileCheck %s
+
+target triple = "dxil-unknown-shadermodel6.0-compute"
+
+; CHECK: LLVM ERROR: Missing Root Element Metadata Node.
+
+
+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 = !{ !"NOTRootElements" } ; list of root signature elements

>From 09e645aec09371cd145cf42f54809d8ae0832ce5 Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Thu, 30 Jan 2025 18:33:23 +0000
Subject: [PATCH 39/64] removing version

---
 llvm/lib/Target/DirectX/DXContainerGlobals.cpp | 2 +-
 llvm/lib/Target/DirectX/DXILRootSignature.cpp  | 5 ++---
 llvm/lib/Target/DirectX/DXILRootSignature.h    | 3 +--
 3 files changed, 4 insertions(+), 6 deletions(-)

diff --git a/llvm/lib/Target/DirectX/DXContainerGlobals.cpp b/llvm/lib/Target/DirectX/DXContainerGlobals.cpp
index 36e7cedbdaee0..37108f92718df 100644
--- a/llvm/lib/Target/DirectX/DXContainerGlobals.cpp
+++ b/llvm/lib/Target/DirectX/DXContainerGlobals.cpp
@@ -162,7 +162,7 @@ void DXContainerGlobals::addRootSignature(Module &M,
 
   RootSignatureHeader RSH;
   RSH.Flags = MRS->Flags;
-  RSH.Version = MRS->Version;
+
   RSH.write(OS);
 
   Constant *Constant =
diff --git a/llvm/lib/Target/DirectX/DXILRootSignature.cpp b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
index 52c7ad8e24937..c86be5bd9eb67 100644
--- a/llvm/lib/Target/DirectX/DXILRootSignature.cpp
+++ b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
@@ -80,8 +80,7 @@ static bool parseRootSignatureElement(ModuleRootSignature *MRS,
   return true;
 }
 
-bool ModuleRootSignature::parse(int32_t Version, NamedMDNode *Root) {
-  this->Version = Version;
+bool ModuleRootSignature::parse(NamedMDNode *Root) {
   bool HasError = false;
 
   /** Root Signature are specified as following in the metadata:
@@ -127,7 +126,7 @@ ModuleRootSignature ModuleRootSignature::analyzeModule(Module &M) {
 
   NamedMDNode *RootSignatureNode = M.getNamedMetadata("dx.rootsignatures");
   if (RootSignatureNode) {
-    if (MRS.parse(1, RootSignatureNode))
+    if (MRS.parse(RootSignatureNode))
       llvm_unreachable("Invalid Root Signature Metadata.");
   }
 
diff --git a/llvm/lib/Target/DirectX/DXILRootSignature.h b/llvm/lib/Target/DirectX/DXILRootSignature.h
index 0439deea6451a..f89fb0f00b5a4 100644
--- a/llvm/lib/Target/DirectX/DXILRootSignature.h
+++ b/llvm/lib/Target/DirectX/DXILRootSignature.h
@@ -30,12 +30,11 @@ enum class RootSignatureElementKind {
 };
 
 struct ModuleRootSignature {
-  uint32_t Version;
   uint32_t Flags;
 
   ModuleRootSignature() = default;
 
-  bool parse(int32_t Version, NamedMDNode *Root);
+  bool parse(NamedMDNode *Root);
 
   static ModuleRootSignature analyzeModule(Module &M);
 };

>From 5a44b6286fd8da48d46927d031f442a41eca2840 Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Thu, 30 Jan 2025 22:29:30 +0000
Subject: [PATCH 40/64] fix test

---
 .../CodeGen/DirectX/ContainerData/RootSignature-Flags.ll  | 8 +++++---
 1 file changed, 5 insertions(+), 3 deletions(-)

diff --git a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Flags.ll b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Flags.ll
index 20253efbb8e5c..b44d31c5b3857 100644
--- a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Flags.ll
+++ b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Flags.ll
@@ -3,7 +3,7 @@
 
 target triple = "dxil-unknown-shadermodel6.0-compute"
 
-; CHECK: @dx.rts0 = private constant [12 x i8]  c"{{.*}}", section "RTS0", align 4
+; CHECK: @dx.rts0 = private constant [8 x i8]  c"{{.*}}", section "RTS0", align 4
 
 
 define void @main() #0 {
@@ -11,6 +11,9 @@ entry:
   ret void
 }
 
+
+
+
 attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" }
 
 
@@ -21,8 +24,7 @@ attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" }
 
 
 ; DXC:    - Name: RTS0
-; DXC-NEXT: Size: 12
+; DXC-NEXT: Size: 8
 ; DXC-NEXT: RootSignature:
 ; DXC-NEXT:   Size: 8
-; DXC-NEXT:   Version: 1
 ; DXC-NEXT:   AllowInputAssemblerInputLayout: true

>From d1a79b3678375e587460844419a65a74b2ba7412 Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Fri, 31 Jan 2025 00:42:33 +0000
Subject: [PATCH 41/64] addressing PR Comments

---
 llvm/lib/Target/DirectX/DXILRootSignature.cpp | 5 ++---
 llvm/lib/Target/DirectX/DXILRootSignature.h   | 2 +-
 2 files changed, 3 insertions(+), 4 deletions(-)

diff --git a/llvm/lib/Target/DirectX/DXILRootSignature.cpp b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
index c86be5bd9eb67..109069eb66dea 100644
--- a/llvm/lib/Target/DirectX/DXILRootSignature.cpp
+++ b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
@@ -95,10 +95,9 @@ bool ModuleRootSignature::parse(NamedMDNode *Root) {
       signature pair.
    */
 
-  for (unsigned int Sid = 0; Sid < Root->getNumOperands(); Sid++) {
-    MDNode *Node = dyn_cast<MDNode>(Root->getOperand(Sid));
+  for (const MDNode *Node : Root->operands()) {
 
-    if (Node == nullptr || Node->getNumOperands() != 2)
+    if (Node->getNumOperands() != 2)
       return reportError("Invalid format for Root Signature Definition. Pairs "
                          "of function, root signature expected.");
 
diff --git a/llvm/lib/Target/DirectX/DXILRootSignature.h b/llvm/lib/Target/DirectX/DXILRootSignature.h
index f89fb0f00b5a4..5bbea29d22ae5 100644
--- a/llvm/lib/Target/DirectX/DXILRootSignature.h
+++ b/llvm/lib/Target/DirectX/DXILRootSignature.h
@@ -30,7 +30,7 @@ enum class RootSignatureElementKind {
 };
 
 struct ModuleRootSignature {
-  uint32_t Flags;
+  uint32_t Flags = 0;
 
   ModuleRootSignature() = default;
 

>From 9f8e51255b6c2f23761bab88478094da282311db Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Mon, 3 Feb 2025 21:32:59 +0000
Subject: [PATCH 42/64] fix test

---
 .../DirectX/ContainerData/RootSignature-Flags.ll | 16 ++++++++++------
 1 file changed, 10 insertions(+), 6 deletions(-)

diff --git a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Flags.ll b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Flags.ll
index b44d31c5b3857..c3e38c44c6194 100644
--- a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Flags.ll
+++ b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Flags.ll
@@ -3,7 +3,7 @@
 
 target triple = "dxil-unknown-shadermodel6.0-compute"
 
-; CHECK: @dx.rts0 = private constant [8 x i8]  c"{{.*}}", section "RTS0", align 4
+; CHECK: @dx.rts0 = private constant [24 x i8]  c"{{.*}}", section "RTS0", align 4
 
 
 define void @main() #0 {
@@ -23,8 +23,12 @@ attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" }
 !4 = !{ !"RootFlags", i32 1 } ; 1 = allow_input_assembler_input_layout
 
 
-; DXC:    - Name: RTS0
-; DXC-NEXT: Size: 8
-; DXC-NEXT: RootSignature:
-; DXC-NEXT:   Size: 8
-; DXC-NEXT:   AllowInputAssemblerInputLayout: true
+; DXC:  - Name:            RTS0
+; DXC-NEXT:    Size:            24
+; DXC-NEXT:    RootSignature:
+; DXC-NEXT:      Version:         2
+; DXC-NEXT:      NumParameters:   0
+; DXC-NEXT:      RootParametersOffset: 0
+; DXC-NEXT:      NumStaticSamplers: 0
+; DXC-NEXT:      StaticSamplersOffset: 0
+; DXC-NEXT:      AllowInputAssemblerInputLayout: true

>From 5c7ed7e42803423cb9771fbf895ef1878b4ed803 Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Tue, 4 Feb 2025 00:07:43 +0000
Subject: [PATCH 43/64] filtering root signatures not associated with entry
 function

---
 llvm/lib/Target/DirectX/DXILRootSignature.cpp | 57 ++++++++++++++++---
 llvm/lib/Target/DirectX/DXILRootSignature.h   |  4 +-
 .../ContainerData/RootSignature-Flags.ll      |  1 -
 3 files changed, 50 insertions(+), 12 deletions(-)

diff --git a/llvm/lib/Target/DirectX/DXILRootSignature.cpp b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
index 109069eb66dea..984505b3fb85b 100644
--- a/llvm/lib/Target/DirectX/DXILRootSignature.cpp
+++ b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
@@ -14,9 +14,12 @@
 #include "DirectX.h"
 #include "llvm/ADT/StringSwitch.h"
 #include "llvm/ADT/Twine.h"
+#include "llvm/Analysis/DXILMetadataAnalysis.h"
 #include "llvm/IR/Constants.h"
+#include "llvm/IR/Function.h"
 #include "llvm/IR/Module.h"
-#include <cstdint>
+#include "llvm/InitializePasses.h"
+#include "llvm/Pass.h"
 
 using namespace llvm;
 using namespace llvm::dxil;
@@ -80,7 +83,7 @@ static bool parseRootSignatureElement(ModuleRootSignature *MRS,
   return true;
 }
 
-bool ModuleRootSignature::parse(NamedMDNode *Root) {
+bool ModuleRootSignature::parse(NamedMDNode *Root, const Function *EF) {
   bool HasError = false;
 
   /** Root Signature are specified as following in the metadata:
@@ -96,11 +99,25 @@ bool ModuleRootSignature::parse(NamedMDNode *Root) {
    */
 
   for (const MDNode *Node : Root->operands()) {
-
     if (Node->getNumOperands() != 2)
       return reportError("Invalid format for Root Signature Definition. Pairs "
                          "of function, root signature expected.");
 
+    Metadata *MD = Node->getOperand(0).get();
+    if (auto *VAM = llvm::dyn_cast<llvm::ValueAsMetadata>(MD)) {
+      llvm::Value *V = VAM->getValue();
+      if (Function *F = dyn_cast<Function>(V)) {
+        if (F != EF)
+          continue;
+      } else {
+        return reportError(
+            "Root Signature MD node, first element is not a function.");
+      }
+    } else {
+      return reportError(
+          "Root Signature MD node, first element is not a function.");
+    }
+
     // Get the Root Signature Description from the function signature pair.
     MDNode *RS = dyn_cast<MDNode>(Node->getOperand(1).get());
 
@@ -120,12 +137,13 @@ bool ModuleRootSignature::parse(NamedMDNode *Root) {
   return HasError;
 }
 
-ModuleRootSignature ModuleRootSignature::analyzeModule(Module &M) {
+ModuleRootSignature ModuleRootSignature::analyzeModule(Module &M,
+                                                       const Function *F) {
   ModuleRootSignature MRS;
 
   NamedMDNode *RootSignatureNode = M.getNamedMetadata("dx.rootsignatures");
   if (RootSignatureNode) {
-    if (MRS.parse(RootSignatureNode))
+    if (MRS.parse(RootSignatureNode, F))
       llvm_unreachable("Invalid Root Signature Metadata.");
   }
 
@@ -136,22 +154,43 @@ AnalysisKey RootSignatureAnalysis::Key;
 
 ModuleRootSignature RootSignatureAnalysis::run(Module &M,
                                                ModuleAnalysisManager &AM) {
-  return ModuleRootSignature::analyzeModule(M);
+  auto MMI = AM.getResult<DXILMetadataAnalysis>(M);
+
+  if (MMI.ShaderProfile == Triple::Library)
+    return ModuleRootSignature();
+
+  assert(MMI.EntryPropertyVec.size() == 1);
+
+  const Function *EntryFunction = MMI.EntryPropertyVec[0].Entry;
+  return ModuleRootSignature::analyzeModule(M, EntryFunction);
 }
 
 //===----------------------------------------------------------------------===//
 bool RootSignatureAnalysisWrapper::runOnModule(Module &M) {
 
-  this->MRS = MRS = ModuleRootSignature::analyzeModule(M);
+  dxil::ModuleMetadataInfo &MMI =
+      getAnalysis<DXILMetadataAnalysisWrapperPass>().getModuleMetadata();
+
+  if (MMI.ShaderProfile == Triple::Library)
+    return false;
+  assert(MMI.EntryPropertyVec.size() == 1);
+
+  const Function *EntryFunction = MMI.EntryPropertyVec[0].Entry;
+  this->MRS = MRS = ModuleRootSignature::analyzeModule(M, EntryFunction);
 
   return false;
 }
 
 void RootSignatureAnalysisWrapper::getAnalysisUsage(AnalysisUsage &AU) const {
   AU.setPreservesAll();
+  AU.addRequired<DXILMetadataAnalysisWrapperPass>();
 }
 
 char RootSignatureAnalysisWrapper::ID = 0;
 
-INITIALIZE_PASS(RootSignatureAnalysisWrapper, "dx-root-signature-analysis",
-                "DXIL Root Signature Analysis", true, true)
+INITIALIZE_PASS_BEGIN(RootSignatureAnalysisWrapper,
+                      "dx-root-signature-analysis",
+                      "DXIL Root Signature Analysis", true, true)
+INITIALIZE_PASS_DEPENDENCY(DXILMetadataAnalysisWrapperPass)
+INITIALIZE_PASS_END(RootSignatureAnalysisWrapper, "dx-root-signature-analysis",
+                    "DXIL Root Signature Analysis", true, true)
diff --git a/llvm/lib/Target/DirectX/DXILRootSignature.h b/llvm/lib/Target/DirectX/DXILRootSignature.h
index 5bbea29d22ae5..0650ffa7edf41 100644
--- a/llvm/lib/Target/DirectX/DXILRootSignature.h
+++ b/llvm/lib/Target/DirectX/DXILRootSignature.h
@@ -34,9 +34,9 @@ struct ModuleRootSignature {
 
   ModuleRootSignature() = default;
 
-  bool parse(NamedMDNode *Root);
+  bool parse(NamedMDNode *Root, const Function *F);
 
-  static ModuleRootSignature analyzeModule(Module &M);
+  static ModuleRootSignature analyzeModule(Module &M, const Function *F);
 };
 
 class RootSignatureAnalysis : public AnalysisInfoMixin<RootSignatureAnalysis> {
diff --git a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Flags.ll b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Flags.ll
index c3e38c44c6194..cf00609a7307e 100644
--- a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Flags.ll
+++ b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Flags.ll
@@ -5,7 +5,6 @@ target triple = "dxil-unknown-shadermodel6.0-compute"
 
 ; CHECK: @dx.rts0 = private constant [24 x i8]  c"{{.*}}", section "RTS0", align 4
 
-
 define void @main() #0 {
 entry:
   ret void

>From 93f7c4c87d2f60358371eabf07bc3512ac336587 Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Tue, 4 Feb 2025 01:17:18 +0000
Subject: [PATCH 44/64] separating parsing and validation

---
 llvm/lib/Target/DirectX/DXILRootSignature.cpp | 37 ++++++++++++-------
 llvm/lib/Target/DirectX/DXILRootSignature.h   |  7 +++-
 2 files changed, 29 insertions(+), 15 deletions(-)

diff --git a/llvm/lib/Target/DirectX/DXILRootSignature.cpp b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
index 984505b3fb85b..c85291186f618 100644
--- a/llvm/lib/Target/DirectX/DXILRootSignature.cpp
+++ b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
@@ -29,25 +29,18 @@ static bool reportError(Twine Message) {
   return true;
 }
 
-static bool parseRootFlags(ModuleRootSignature *MRS, MDNode *RootFlagNode) {
+bool ModuleRootSignature::parseRootFlags(MDNode *RootFlagNode) {
 
   if (RootFlagNode->getNumOperands() != 2)
     return reportError("Invalid format for RootFlag Element");
 
   auto *Flag = mdconst::extract<ConstantInt>(RootFlagNode->getOperand(1));
-  uint32_t Value = Flag->getZExtValue();
+  this->Flags = Flag->getZExtValue();
 
-  // Root Element validation, as specified:
-  // https://github.com/llvm/wg-hlsl/blob/main/proposals/0002-root-signature-in-clang.md#validations-during-dxil-generation
-  if ((Value & ~0x80000fff) != 0)
-    return reportError("Invalid flag value for RootFlag");
-
-  MRS->Flags = Value;
   return false;
 }
 
-static bool parseRootSignatureElement(ModuleRootSignature *MRS,
-                                      MDNode *Element) {
+bool ModuleRootSignature::parseRootSignatureElement(MDNode *Element) {
   MDString *ElementText = cast<MDString>(Element->getOperand(0));
   if (ElementText == nullptr)
     return reportError("Invalid format for Root Element");
@@ -67,7 +60,7 @@ static bool parseRootSignatureElement(ModuleRootSignature *MRS,
   switch (ElementKind) {
 
   case RootSignatureElementKind::RootFlags: {
-    return parseRootFlags(MRS, Element);
+    return parseRootFlags(Element);
     break;
   }
 
@@ -131,19 +124,35 @@ bool ModuleRootSignature::parse(NamedMDNode *Root, const Function *EF) {
       if (Element == nullptr)
         return reportError("Missing Root Element Metadata Node.");
 
-      HasError = HasError || parseRootSignatureElement(this, Element);
+      HasError = HasError || parseRootSignatureElement(Element);
     }
   }
   return HasError;
 }
 
+bool ModuleRootSignature::validateRootFlag() {
+  // Root Element validation, as specified:
+  // https://github.com/llvm/wg-hlsl/blob/main/proposals/0002-root-signature-in-clang.md#validations-during-dxil-generation
+  if ((Flags & ~0x80000fff) != 0)
+    return reportError("Invalid flag value for RootFlag");
+
+  return false;
+}
+
+bool ModuleRootSignature::validate() {
+  if (validateRootFlag())
+    return reportError("Invalid flag value for RootFlag");
+
+  return false;
+}
+
 ModuleRootSignature ModuleRootSignature::analyzeModule(Module &M,
                                                        const Function *F) {
   ModuleRootSignature MRS;
 
   NamedMDNode *RootSignatureNode = M.getNamedMetadata("dx.rootsignatures");
   if (RootSignatureNode) {
-    if (MRS.parse(RootSignatureNode, F))
+    if (MRS.parse(RootSignatureNode, F) || MRS.validate())
       llvm_unreachable("Invalid Root Signature Metadata.");
   }
 
@@ -176,7 +185,7 @@ bool RootSignatureAnalysisWrapper::runOnModule(Module &M) {
   assert(MMI.EntryPropertyVec.size() == 1);
 
   const Function *EntryFunction = MMI.EntryPropertyVec[0].Entry;
-  this->MRS = MRS = ModuleRootSignature::analyzeModule(M, EntryFunction);
+  MRS = ModuleRootSignature::analyzeModule(M, EntryFunction);
 
   return false;
 }
diff --git a/llvm/lib/Target/DirectX/DXILRootSignature.h b/llvm/lib/Target/DirectX/DXILRootSignature.h
index 0650ffa7edf41..f79597721c350 100644
--- a/llvm/lib/Target/DirectX/DXILRootSignature.h
+++ b/llvm/lib/Target/DirectX/DXILRootSignature.h
@@ -33,10 +33,15 @@ struct ModuleRootSignature {
   uint32_t Flags = 0;
 
   ModuleRootSignature() = default;
+  static ModuleRootSignature analyzeModule(Module &M, const Function *F);
 
+private:
   bool parse(NamedMDNode *Root, const Function *F);
+  bool parseRootSignatureElement(MDNode *Element);
+  bool parseRootFlags(MDNode *RootFlagNode);
 
-  static ModuleRootSignature analyzeModule(Module &M, const Function *F);
+  bool validate();
+  bool validateRootFlag();
 };
 
 class RootSignatureAnalysis : public AnalysisInfoMixin<RootSignatureAnalysis> {

>From 5aac761b8a254dfa7a02c4e182091ce795cf8579 Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Thu, 6 Feb 2025 01:32:09 +0000
Subject: [PATCH 45/64] improve error handling

---
 llvm/include/llvm/BinaryFormat/DXContainer.h  | 12 ++----
 llvm/lib/Object/DXContainer.cpp               | 17 +++-----
 .../lib/Target/DirectX/DXContainerGlobals.cpp | 10 +++--
 llvm/lib/Target/DirectX/DXILRootSignature.cpp | 43 ++++++++-----------
 llvm/lib/Target/DirectX/DXILRootSignature.h   | 27 ++++++++----
 .../ContainerData/RootSignature-Error.ll      |  2 +-
 .../RootSignature-Flags-Error.ll              |  4 +-
 .../RootSignature-Flags-Validation-Error.ll   |  6 +--
 .../RootSignature-RootElement-Error.ll        |  2 +-
 9 files changed, 61 insertions(+), 62 deletions(-)

diff --git a/llvm/include/llvm/BinaryFormat/DXContainer.h b/llvm/include/llvm/BinaryFormat/DXContainer.h
index c219aa819795e..7bcf6f2bc7db5 100644
--- a/llvm/include/llvm/BinaryFormat/DXContainer.h
+++ b/llvm/include/llvm/BinaryFormat/DXContainer.h
@@ -550,16 +550,12 @@ static_assert(sizeof(ProgramSignatureElement) == 32,
 
 struct RootSignatureValidations {
 
-  static Expected<uint32_t> validateRootFlag(uint32_t Flags) {
-    if ((Flags & ~0x80000fff) != 0)
-      return llvm::make_error<BinaryStreamError>("Invalid flag");
-    return Flags;
+  static bool validateRootFlag(uint32_t Flags) {
+    return (Flags & ~0x80000fff) != 0;
   }
 
-  static Expected<uint32_t> validateVersion(uint32_t Version) {
-    if (Version < 1 || Version > 2)
-      return llvm::make_error<BinaryStreamError>("Invalid Version");
-    return Version;
+  static bool validateVersion(uint32_t Version) {
+    return (Version < 1 || Version > 2);
   }
 };
 
diff --git a/llvm/lib/Object/DXContainer.cpp b/llvm/lib/Object/DXContainer.cpp
index 4a5f581808045..460d4a10207b6 100644
--- a/llvm/lib/Object/DXContainer.cpp
+++ b/llvm/lib/Object/DXContainer.cpp
@@ -11,6 +11,7 @@
 #include "llvm/Object/Error.h"
 #include "llvm/Support/Alignment.h"
 #include "llvm/Support/Endian.h"
+#include "llvm/Support/Error.h"
 #include "llvm/Support/FormatVariadic.h"
 
 using namespace llvm;
@@ -254,11 +255,9 @@ Error DirectX::RootSignature::parse(StringRef Data) {
       support::endian::read<uint32_t, llvm::endianness::little>(Current);
   Current += sizeof(uint32_t);
 
-  Expected<uint32_t> MaybeVersion =
-      dxbc::RootSignatureValidations::validateVersion(VValue);
-  if (Error E = MaybeVersion.takeError())
-    return E;
-  Version = MaybeVersion.get();
+  if (dxbc::RootSignatureValidations::validateVersion(VValue))
+    return make_error<GenericBinaryError>("Invalid Version");
+  Version = VValue;
 
   NumParameters =
       support::endian::read<uint32_t, llvm::endianness::little>(Current);
@@ -280,11 +279,9 @@ Error DirectX::RootSignature::parse(StringRef Data) {
       support::endian::read<uint32_t, llvm::endianness::little>(Current);
   Current += sizeof(uint32_t);
 
-  Expected<uint32_t> MaybeFlag =
-      dxbc::RootSignatureValidations::validateRootFlag(FValue);
-  if (Error E = MaybeFlag.takeError())
-    return E;
-  Flags = MaybeFlag.get();
+  if (dxbc::RootSignatureValidations::validateRootFlag(FValue))
+    return make_error<GenericBinaryError>("Invalid flag");
+  Flags = FValue;
 
   return Error::success();
 }
diff --git a/llvm/lib/Target/DirectX/DXContainerGlobals.cpp b/llvm/lib/Target/DirectX/DXContainerGlobals.cpp
index 37108f92718df..b0f00c2735080 100644
--- a/llvm/lib/Target/DirectX/DXContainerGlobals.cpp
+++ b/llvm/lib/Target/DirectX/DXContainerGlobals.cpp
@@ -152,16 +152,18 @@ void DXContainerGlobals::addSignature(Module &M,
 void DXContainerGlobals::addRootSignature(Module &M,
                                           SmallVector<GlobalValue *> &Globals) {
 
-  std::optional<ModuleRootSignature> MRS =
-      getAnalysis<RootSignatureAnalysisWrapper>().getRootSignature();
-  if (!MRS.has_value())
+  auto &RSA = getAnalysis<RootSignatureAnalysisWrapper>();
+
+  if (!RSA.hasRootSignature())
     return;
 
+  ModuleRootSignature MRS = RSA.getRootSignature();
+
   SmallString<256> Data;
   raw_svector_ostream OS(Data);
 
   RootSignatureHeader RSH;
-  RSH.Flags = MRS->Flags;
+  RSH.Flags = MRS.Flags;
 
   RSH.write(OS);
 
diff --git a/llvm/lib/Target/DirectX/DXILRootSignature.cpp b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
index c85291186f618..f051de8f8c896 100644
--- a/llvm/lib/Target/DirectX/DXILRootSignature.cpp
+++ b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
@@ -15,17 +15,23 @@
 #include "llvm/ADT/StringSwitch.h"
 #include "llvm/ADT/Twine.h"
 #include "llvm/Analysis/DXILMetadataAnalysis.h"
+#include "llvm/BinaryFormat/DXContainer.h"
 #include "llvm/IR/Constants.h"
+#include "llvm/IR/DiagnosticInfo.h"
 #include "llvm/IR/Function.h"
+#include "llvm/IR/LLVMContext.h"
 #include "llvm/IR/Module.h"
 #include "llvm/InitializePasses.h"
 #include "llvm/Pass.h"
+#include "llvm/Support/Error.h"
+#include <optional>
 
 using namespace llvm;
 using namespace llvm::dxil;
 
-static bool reportError(Twine Message) {
-  report_fatal_error(Message, false);
+bool ModuleRootSignature::reportError(Twine Message,
+                                      DiagnosticSeverity Severity) {
+  Ctx->diagnose(DiagnosticInfoGeneric(Message, Severity));
   return true;
 }
 
@@ -130,43 +136,33 @@ bool ModuleRootSignature::parse(NamedMDNode *Root, const Function *EF) {
   return HasError;
 }
 
-bool ModuleRootSignature::validateRootFlag() {
-  // Root Element validation, as specified:
-  // https://github.com/llvm/wg-hlsl/blob/main/proposals/0002-root-signature-in-clang.md#validations-during-dxil-generation
-  if ((Flags & ~0x80000fff) != 0)
-    return reportError("Invalid flag value for RootFlag");
-
-  return false;
-}
-
 bool ModuleRootSignature::validate() {
-  if (validateRootFlag())
+  if (dxbc::RootSignatureValidations::validateRootFlag(Flags)) {
     return reportError("Invalid flag value for RootFlag");
-
+  }
   return false;
 }
 
-ModuleRootSignature ModuleRootSignature::analyzeModule(Module &M,
-                                                       const Function *F) {
-  ModuleRootSignature MRS;
+OptionalRootSignature ModuleRootSignature::analyzeModule(Module &M,
+                                                         const Function *F) {
+  ModuleRootSignature MRS(&M.getContext());
 
   NamedMDNode *RootSignatureNode = M.getNamedMetadata("dx.rootsignatures");
-  if (RootSignatureNode) {
-    if (MRS.parse(RootSignatureNode, F) || MRS.validate())
-      llvm_unreachable("Invalid Root Signature Metadata.");
-  }
+  if (RootSignatureNode == nullptr || MRS.parse(RootSignatureNode, F) ||
+      MRS.validate())
+    return std::nullopt;
 
   return MRS;
 }
 
 AnalysisKey RootSignatureAnalysis::Key;
 
-ModuleRootSignature RootSignatureAnalysis::run(Module &M,
-                                               ModuleAnalysisManager &AM) {
+OptionalRootSignature RootSignatureAnalysis::run(Module &M,
+                                                 ModuleAnalysisManager &AM) {
   auto MMI = AM.getResult<DXILMetadataAnalysis>(M);
 
   if (MMI.ShaderProfile == Triple::Library)
-    return ModuleRootSignature();
+    return std::nullopt;
 
   assert(MMI.EntryPropertyVec.size() == 1);
 
@@ -186,7 +182,6 @@ bool RootSignatureAnalysisWrapper::runOnModule(Module &M) {
 
   const Function *EntryFunction = MMI.EntryPropertyVec[0].Entry;
   MRS = ModuleRootSignature::analyzeModule(M, EntryFunction);
-
   return false;
 }
 
diff --git a/llvm/lib/Target/DirectX/DXILRootSignature.h b/llvm/lib/Target/DirectX/DXILRootSignature.h
index f79597721c350..da38078ad42f8 100644
--- a/llvm/lib/Target/DirectX/DXILRootSignature.h
+++ b/llvm/lib/Target/DirectX/DXILRootSignature.h
@@ -12,10 +12,13 @@
 ///
 //===----------------------------------------------------------------------===//
 
+#include "llvm/IR/DiagnosticInfo.h"
 #include "llvm/IR/Metadata.h"
+#include "llvm/IR/Module.h"
 #include "llvm/IR/PassManager.h"
 #include "llvm/Pass.h"
 #include <optional>
+#include <utility>
 
 namespace llvm {
 namespace dxil {
@@ -31,19 +34,25 @@ enum class RootSignatureElementKind {
 
 struct ModuleRootSignature {
   uint32_t Flags = 0;
-
-  ModuleRootSignature() = default;
-  static ModuleRootSignature analyzeModule(Module &M, const Function *F);
+  ModuleRootSignature() { Ctx = nullptr; };
+  ModuleRootSignature(LLVMContext *Ctx) : Ctx(Ctx) {}
+  static std::optional<ModuleRootSignature> analyzeModule(Module &M,
+                                                          const Function *F);
 
 private:
+  LLVMContext *Ctx;
+
   bool parse(NamedMDNode *Root, const Function *F);
   bool parseRootSignatureElement(MDNode *Element);
   bool parseRootFlags(MDNode *RootFlagNode);
 
   bool validate();
-  bool validateRootFlag();
+
+  bool reportError(Twine Message, DiagnosticSeverity Severity = DS_Error);
 };
 
+using OptionalRootSignature = std::optional<ModuleRootSignature>;
+
 class RootSignatureAnalysis : public AnalysisInfoMixin<RootSignatureAnalysis> {
   friend AnalysisInfoMixin<RootSignatureAnalysis>;
   static AnalysisKey Key;
@@ -51,9 +60,9 @@ class RootSignatureAnalysis : public AnalysisInfoMixin<RootSignatureAnalysis> {
 public:
   RootSignatureAnalysis() = default;
 
-  using Result = ModuleRootSignature;
+  using Result = OptionalRootSignature;
 
-  ModuleRootSignature run(Module &M, ModuleAnalysisManager &AM);
+  OptionalRootSignature run(Module &M, ModuleAnalysisManager &AM);
 };
 
 /// Wrapper pass for the legacy pass manager.
@@ -61,14 +70,16 @@ class RootSignatureAnalysis : public AnalysisInfoMixin<RootSignatureAnalysis> {
 /// This is required because the passes that will depend on this are codegen
 /// passes which run through the legacy pass manager.
 class RootSignatureAnalysisWrapper : public ModulePass {
-  std::optional<ModuleRootSignature> MRS;
+private:
+  OptionalRootSignature MRS;
 
 public:
   static char ID;
 
   RootSignatureAnalysisWrapper() : ModulePass(ID) {}
 
-  const std::optional<ModuleRootSignature> &getRootSignature() { return MRS; }
+  const ModuleRootSignature &getRootSignature() { return MRS.value(); }
+  bool hasRootSignature() { return MRS.has_value(); }
 
   bool runOnModule(Module &M) override;
 
diff --git a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Error.ll b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Error.ll
index cbcd8e56c1c04..0f0c7cc39d73b 100644
--- a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Error.ll
+++ b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Error.ll
@@ -2,7 +2,7 @@
 
 target triple = "dxil-unknown-shadermodel6.0-compute"
 
-; CHECK: LLVM ERROR: Invalid format for Root Signature Definition. Pairs of function, root signature expected.
+; CHECK: error: Invalid format for Root Signature Definition. Pairs of function, root signature expected.
 
 
 define void @main() #0 {
diff --git a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Flags-Error.ll b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Flags-Error.ll
index 9b4208011bba5..630bd5c1e3836 100644
--- a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Flags-Error.ll
+++ b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Flags-Error.ll
@@ -1,8 +1,8 @@
-; RUN: not llc %s --filetype=obj -o - 2>&1 | FileCheck %s
+; RUN: not llc %s --filetype=obj -o -
 
 target triple = "dxil-unknown-shadermodel6.0-compute"
 
-; CHECK: LLVM ERROR: Invalid Root Element: NOTRootFlags
+; expected-error at -1: Invalid Root Element: NOTRootFlags
 
 
 define void @main() #0 {
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 85e6f4d6748d5..dae3c75e70cb8 100644
--- a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Flags-Validation-Error.ll
+++ b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Flags-Validation-Error.ll
@@ -1,8 +1,6 @@
-; RUN: not llc %s --filetype=obj -o - 2>&1 | FileCheck %s
-
+; RUN: not llc %s --filetype=obj -o - 
 target triple = "dxil-unknown-shadermodel6.0-compute"
-
-; CHECK: LLVM ERROR: Invalid flag value for RootFlag
+; expected-error at -1: Invalid flag value for RootFlag
 
 
 define void @main() #0 {
diff --git a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootElement-Error.ll b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootElement-Error.ll
index 501e3438943a3..80f969e849d25 100644
--- a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootElement-Error.ll
+++ b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootElement-Error.ll
@@ -2,7 +2,7 @@
 
 target triple = "dxil-unknown-shadermodel6.0-compute"
 
-; CHECK: LLVM ERROR: Missing Root Element Metadata Node.
+; CHECK: error: Missing Root Element Metadata Node.
 
 
 define void @main() #0 {

>From 47b01f7aa435c266a05e81657a1605de62ba4a6f Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Thu, 6 Feb 2025 18:31:30 +0000
Subject: [PATCH 46/64] clean up

---
 llvm/lib/Object/DXContainer.cpp               |  1 -
 llvm/lib/Target/DirectX/DXILRootSignature.cpp | 28 ++++++++-----------
 llvm/lib/Target/DirectX/DXILRootSignature.h   |  3 +-
 3 files changed, 14 insertions(+), 18 deletions(-)

diff --git a/llvm/lib/Object/DXContainer.cpp b/llvm/lib/Object/DXContainer.cpp
index 460d4a10207b6..5c37d0ae6f9a4 100644
--- a/llvm/lib/Object/DXContainer.cpp
+++ b/llvm/lib/Object/DXContainer.cpp
@@ -11,7 +11,6 @@
 #include "llvm/Object/Error.h"
 #include "llvm/Support/Alignment.h"
 #include "llvm/Support/Endian.h"
-#include "llvm/Support/Error.h"
 #include "llvm/Support/FormatVariadic.h"
 
 using namespace llvm;
diff --git a/llvm/lib/Target/DirectX/DXILRootSignature.cpp b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
index f051de8f8c896..dd0c7618c728d 100644
--- a/llvm/lib/Target/DirectX/DXILRootSignature.cpp
+++ b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
@@ -102,30 +102,26 @@ bool ModuleRootSignature::parse(NamedMDNode *Root, const Function *EF) {
       return reportError("Invalid format for Root Signature Definition. Pairs "
                          "of function, root signature expected.");
 
-    Metadata *MD = Node->getOperand(0).get();
-    if (auto *VAM = llvm::dyn_cast<llvm::ValueAsMetadata>(MD)) {
-      llvm::Value *V = VAM->getValue();
-      if (Function *F = dyn_cast<Function>(V)) {
-        if (F != EF)
-          continue;
-      } else {
-        return reportError(
-            "Root Signature MD node, first element is not a function.");
-      }
-    } else {
-      return reportError(
-          "Root Signature MD node, first element is not a function.");
-    }
+    ValueAsMetadata *VAM =
+        llvm::dyn_cast<ValueAsMetadata>(Node->getOperand(0).get());
+    if (VAM == nullptr)
+      return reportError("First element of root signature is not a value");
+
+    Function *F = dyn_cast<Function>(VAM->getValue());
+    if (F == nullptr)
+      return reportError("First element of root signature is not a function");
+
+    if (F != EF)
+      continue;
 
     // Get the Root Signature Description from the function signature pair.
     MDNode *RS = dyn_cast<MDNode>(Node->getOperand(1).get());
 
     if (RS == nullptr)
-      return reportError("Missing Root Signature Metadata node.");
+      return reportError("Missing Root Element List Metadata node.");
 
     // Loop through the Root Elements of the root signature.
     for (unsigned int Eid = 0; Eid < RS->getNumOperands(); Eid++) {
-
       MDNode *Element = dyn_cast<MDNode>(RS->getOperand(Eid));
       if (Element == nullptr)
         return reportError("Missing Root Element Metadata Node.");
diff --git a/llvm/lib/Target/DirectX/DXILRootSignature.h b/llvm/lib/Target/DirectX/DXILRootSignature.h
index da38078ad42f8..9bb95102952b3 100644
--- a/llvm/lib/Target/DirectX/DXILRootSignature.h
+++ b/llvm/lib/Target/DirectX/DXILRootSignature.h
@@ -35,13 +35,14 @@ enum class RootSignatureElementKind {
 struct ModuleRootSignature {
   uint32_t Flags = 0;
   ModuleRootSignature() { Ctx = nullptr; };
-  ModuleRootSignature(LLVMContext *Ctx) : Ctx(Ctx) {}
   static std::optional<ModuleRootSignature> analyzeModule(Module &M,
                                                           const Function *F);
 
 private:
   LLVMContext *Ctx;
 
+  ModuleRootSignature(LLVMContext *Ctx) : Ctx(Ctx) {}
+
   bool parse(NamedMDNode *Root, const Function *F);
   bool parseRootSignatureElement(MDNode *Element);
   bool parseRootFlags(MDNode *RootFlagNode);

>From 486ab883257d99206cf66e33c89ebf5acc586f47 Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Thu, 6 Feb 2025 22:04:48 +0000
Subject: [PATCH 47/64] clean up

---
 llvm/lib/Target/DirectX/DXILRootSignature.h | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/llvm/lib/Target/DirectX/DXILRootSignature.h b/llvm/lib/Target/DirectX/DXILRootSignature.h
index 9bb95102952b3..dd19fd97165ee 100644
--- a/llvm/lib/Target/DirectX/DXILRootSignature.h
+++ b/llvm/lib/Target/DirectX/DXILRootSignature.h
@@ -18,7 +18,6 @@
 #include "llvm/IR/PassManager.h"
 #include "llvm/Pass.h"
 #include <optional>
-#include <utility>
 
 namespace llvm {
 namespace dxil {
@@ -80,6 +79,7 @@ class RootSignatureAnalysisWrapper : public ModulePass {
   RootSignatureAnalysisWrapper() : ModulePass(ID) {}
 
   const ModuleRootSignature &getRootSignature() { return MRS.value(); }
+  
   bool hasRootSignature() { return MRS.has_value(); }
 
   bool runOnModule(Module &M) override;

>From 852ac25e3989ecc3d36d93ebd776afdf8a850de0 Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Thu, 6 Feb 2025 22:12:25 +0000
Subject: [PATCH 48/64] formating

---
 llvm/lib/Target/DirectX/DXILRootSignature.h | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/llvm/lib/Target/DirectX/DXILRootSignature.h b/llvm/lib/Target/DirectX/DXILRootSignature.h
index dd19fd97165ee..eb3fcbcbc5701 100644
--- a/llvm/lib/Target/DirectX/DXILRootSignature.h
+++ b/llvm/lib/Target/DirectX/DXILRootSignature.h
@@ -79,7 +79,7 @@ class RootSignatureAnalysisWrapper : public ModulePass {
   RootSignatureAnalysisWrapper() : ModulePass(ID) {}
 
   const ModuleRootSignature &getRootSignature() { return MRS.value(); }
-  
+
   bool hasRootSignature() { return MRS.has_value(); }
 
   bool runOnModule(Module &M) override;

>From 74f722698fa3058dc2e6ad1bde6f4b22869a4a86 Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Fri, 7 Feb 2025 18:26:44 +0000
Subject: [PATCH 49/64] addressing comments and fix tests

---
 llvm/include/llvm/BinaryFormat/DXContainer.h |  5 +++--
 llvm/lib/Object/DXContainer.cpp              |  6 +++---
 llvm/unittests/Object/DXContainerTest.cpp    | 18 ++++++++++++------
 3 files changed, 18 insertions(+), 11 deletions(-)

diff --git a/llvm/include/llvm/BinaryFormat/DXContainer.h b/llvm/include/llvm/BinaryFormat/DXContainer.h
index c219aa819795e..548760afc08e8 100644
--- a/llvm/include/llvm/BinaryFormat/DXContainer.h
+++ b/llvm/include/llvm/BinaryFormat/DXContainer.h
@@ -552,13 +552,14 @@ struct RootSignatureValidations {
 
   static Expected<uint32_t> validateRootFlag(uint32_t Flags) {
     if ((Flags & ~0x80000fff) != 0)
-      return llvm::make_error<BinaryStreamError>("Invalid flag");
+      return llvm::make_error<BinaryStreamError>("Invalid Root Signature flag");
     return Flags;
   }
 
   static Expected<uint32_t> validateVersion(uint32_t Version) {
     if (Version < 1 || Version > 2)
-      return llvm::make_error<BinaryStreamError>("Invalid Version");
+      return llvm::make_error<BinaryStreamError>(
+          "Invalid Root Signature Version");
     return Version;
   }
 };
diff --git a/llvm/lib/Object/DXContainer.cpp b/llvm/lib/Object/DXContainer.cpp
index 4a5f581808045..f28b096008b2f 100644
--- a/llvm/lib/Object/DXContainer.cpp
+++ b/llvm/lib/Object/DXContainer.cpp
@@ -246,9 +246,9 @@ Error DirectX::RootSignature::parse(StringRef Data) {
   const char *Current = Data.begin();
 
   // Root Signature headers expects 6 integers to be present.
-  if (Data.size() < 6 * sizeof(uint32_t)) {
-    return parseFailed("Invalid data. Too small.");
-  }
+  if (Data.size() < 6 * sizeof(uint32_t))
+    return parseFailed(
+        "Invalid root signature, insufficient space for header.");
 
   uint32_t VValue =
       support::endian::read<uint32_t, llvm::endianness::little>(Current);
diff --git a/llvm/unittests/Object/DXContainerTest.cpp b/llvm/unittests/Object/DXContainerTest.cpp
index 8489b05f8b331..88a915f560e05 100644
--- a/llvm/unittests/Object/DXContainerTest.cpp
+++ b/llvm/unittests/Object/DXContainerTest.cpp
@@ -855,8 +855,10 @@ TEST(RootSignature, ParseRootFlags) {
         0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     };
-    EXPECT_THAT_EXPECTED(DXContainer::create(getMemoryBuffer<64>(Buffer)),
-                         FailedWithMessage("Invalid data. Too small."));
+    EXPECT_THAT_EXPECTED(
+        DXContainer::create(getMemoryBuffer<64>(Buffer)),
+        FailedWithMessage(
+            "Invalid root signature, insufficient space for header."));
   }
   {
     // Version has been changed to an invalid number.
@@ -868,8 +870,10 @@ TEST(RootSignature, ParseRootFlags) {
         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
         0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
     };
-    EXPECT_THAT_EXPECTED(DXContainer::create(getMemoryBuffer<68>(Buffer)),
-                         FailedWithMessage("Invalid Version"));
+    EXPECT_THAT_EXPECTED(
+        DXContainer::create(getMemoryBuffer<68>(Buffer)),
+        FailedWithMessage("Stream Error: An unspecified error has occurred.  "
+                          "Invalid Root Signature Version"));
   }
   {
     // Flag has been set to an invalid value
@@ -881,7 +885,9 @@ TEST(RootSignature, ParseRootFlags) {
         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
         0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0xFF,
     };
-    EXPECT_THAT_EXPECTED(DXContainer::create(getMemoryBuffer<68>(Buffer)),
-                         FailedWithMessage("Invalid flag"));
+    EXPECT_THAT_EXPECTED(
+        DXContainer::create(getMemoryBuffer<68>(Buffer)),
+        FailedWithMessage("Stream Error: An unspecified error has occurred.  "
+                          "Invalid Root Signature flag"));
   }
 }

>From c67d039ac978adc8abb6e0f2195f92be95cbbefa Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Fri, 7 Feb 2025 19:56:57 +0000
Subject: [PATCH 50/64] formating

---
 llvm/unittests/Object/DXContainerTest.cpp | 10 ++++------
 1 file changed, 4 insertions(+), 6 deletions(-)

diff --git a/llvm/unittests/Object/DXContainerTest.cpp b/llvm/unittests/Object/DXContainerTest.cpp
index 1fd0e973ddfd3..bafde7334fbbc 100644
--- a/llvm/unittests/Object/DXContainerTest.cpp
+++ b/llvm/unittests/Object/DXContainerTest.cpp
@@ -870,9 +870,8 @@ TEST(RootSignature, ParseRootFlags) {
         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
         0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
     };
-    EXPECT_THAT_EXPECTED(
-        DXContainer::create(getMemoryBuffer<68>(Buffer)),
-        FailedWithMessage("Invalid Root Signature Version"));
+    EXPECT_THAT_EXPECTED(DXContainer::create(getMemoryBuffer<68>(Buffer)),
+                         FailedWithMessage("Invalid Root Signature Version"));
   }
   {
     // Flag has been set to an invalid value
@@ -884,8 +883,7 @@ TEST(RootSignature, ParseRootFlags) {
         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
         0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0xFF,
     };
-    EXPECT_THAT_EXPECTED(
-        DXContainer::create(getMemoryBuffer<68>(Buffer)),
-        FailedWithMessage("Invalid Root Signature flag"));
+    EXPECT_THAT_EXPECTED(DXContainer::create(getMemoryBuffer<68>(Buffer)),
+                         FailedWithMessage("Invalid Root Signature flag"));
   }
 }

>From 83b0979bdc378301e94f27e0bc215f2a841c0697 Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Mon, 10 Feb 2025 19:21:04 +0000
Subject: [PATCH 51/64] addressing pr comments

---
 llvm/include/llvm/BinaryFormat/DXContainer.h  |  4 +-
 .../lib/Target/DirectX/DXContainerGlobals.cpp |  6 ++-
 llvm/lib/Target/DirectX/DXILRootSignature.cpp | 46 +++++++++----------
 llvm/lib/Target/DirectX/DXILRootSignature.h   | 26 ++---------
 .../ContainerData/RootSignature-Flags.ll      |  4 --
 5 files changed, 32 insertions(+), 54 deletions(-)

diff --git a/llvm/include/llvm/BinaryFormat/DXContainer.h b/llvm/include/llvm/BinaryFormat/DXContainer.h
index e703c38a4ad3c..289dcd4d94484 100644
--- a/llvm/include/llvm/BinaryFormat/DXContainer.h
+++ b/llvm/include/llvm/BinaryFormat/DXContainer.h
@@ -548,9 +548,7 @@ static_assert(sizeof(ProgramSignatureElement) == 32,
 
 struct RootSignatureValidations {
 
-  static bool validateRootFlag(uint32_t Flags) {
-    return (Flags & ~0x80000fff) != 0;
-  }
+  static bool validateRootFlag(uint32_t Flags) { return (Flags & ~0xfff) != 0; }
 
   static bool validateVersion(uint32_t Version) {
     return !(Version == 1 || Version == 2);
diff --git a/llvm/lib/Target/DirectX/DXContainerGlobals.cpp b/llvm/lib/Target/DirectX/DXContainerGlobals.cpp
index b0f00c2735080..614e5cc9cb11d 100644
--- a/llvm/lib/Target/DirectX/DXContainerGlobals.cpp
+++ b/llvm/lib/Target/DirectX/DXContainerGlobals.cpp
@@ -28,6 +28,7 @@
 #include "llvm/Pass.h"
 #include "llvm/Support/MD5.h"
 #include "llvm/Transforms/Utils/ModuleUtils.h"
+#include <optional>
 
 using namespace llvm;
 using namespace llvm::dxil;
@@ -153,11 +154,12 @@ void DXContainerGlobals::addRootSignature(Module &M,
                                           SmallVector<GlobalValue *> &Globals) {
 
   auto &RSA = getAnalysis<RootSignatureAnalysisWrapper>();
+  std::optional<ModuleRootSignature> MaybeRootSignature = RSA.getResult();
 
-  if (!RSA.hasRootSignature())
+  if (!MaybeRootSignature.has_value())
     return;
 
-  ModuleRootSignature MRS = RSA.getRootSignature();
+  ModuleRootSignature MRS = MaybeRootSignature.value();
 
   SmallString<256> Data;
   raw_svector_ostream OS(Data);
diff --git a/llvm/lib/Target/DirectX/DXILRootSignature.cpp b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
index 33ba2019e08ca..d6cc18c54a7e8 100644
--- a/llvm/lib/Target/DirectX/DXILRootSignature.cpp
+++ b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
@@ -29,24 +29,26 @@
 using namespace llvm;
 using namespace llvm::dxil;
 
-bool ModuleRootSignature::reportError(Twine Message,
-                                      DiagnosticSeverity Severity) {
+LLVMContext *Ctx;
+
+static bool reportError(Twine Message, DiagnosticSeverity Severity = DS_Error) {
   Ctx->diagnose(DiagnosticInfoGeneric(Message, Severity));
   return true;
 }
 
-bool ModuleRootSignature::parseRootFlags(MDNode *RootFlagNode) {
+static bool parseRootFlags(ModuleRootSignature *MRS, MDNode *RootFlagNode) {
 
   if (RootFlagNode->getNumOperands() != 2)
     return reportError("Invalid format for RootFlag Element");
 
   auto *Flag = mdconst::extract<ConstantInt>(RootFlagNode->getOperand(1));
-  this->Flags = Flag->getZExtValue();
+  MRS->Flags = Flag->getZExtValue();
 
   return false;
 }
 
-bool ModuleRootSignature::parseRootSignatureElement(MDNode *Element) {
+static bool parseRootSignatureElement(ModuleRootSignature *MRS,
+                                      MDNode *Element) {
   MDString *ElementText = cast<MDString>(Element->getOperand(0));
   if (ElementText == nullptr)
     return reportError("Invalid format for Root Element");
@@ -65,24 +67,21 @@ bool ModuleRootSignature::parseRootSignatureElement(MDNode *Element) {
 
   switch (ElementKind) {
 
-  case RootSignatureElementKind::RootFlags: {
-    return parseRootFlags(Element);
-    break;
-  }
-
+  case RootSignatureElementKind::RootFlags:
+    return parseRootFlags(MRS, Element);
   case RootSignatureElementKind::RootConstants:
   case RootSignatureElementKind::RootDescriptor:
   case RootSignatureElementKind::DescriptorTable:
   case RootSignatureElementKind::StaticSampler:
   case RootSignatureElementKind::None:
     return reportError("Invalid Root Element: " + ElementText->getString());
-    break;
   }
 
   return true;
 }
 
-bool ModuleRootSignature::parse(NamedMDNode *Root, const Function *EF) {
+static bool parse(ModuleRootSignature *MRS, NamedMDNode *Root,
+                  const Function *EF) {
   bool HasError = false;
 
   /** Root Signature are specified as following in the metadata:
@@ -93,7 +92,7 @@ bool ModuleRootSignature::parse(NamedMDNode *Root, const Function *EF) {
 
       So for each MDNode inside dx.rootsignatures NamedMDNode
       (the Root parameter of this function), the parsing process needs
-      to loop through each of it's operand and process the pairs function
+      to loop through each of its operands and process the function,
       signature pair.
    */
 
@@ -126,26 +125,27 @@ bool ModuleRootSignature::parse(NamedMDNode *Root, const Function *EF) {
       if (Element == nullptr)
         return reportError("Missing Root Element Metadata Node.");
 
-      HasError = HasError || parseRootSignatureElement(Element);
+      HasError = HasError || parseRootSignatureElement(MRS, Element);
     }
   }
   return HasError;
 }
 
-bool ModuleRootSignature::validate() {
-  if (dxbc::RootSignatureValidations::validateRootFlag(Flags)) {
+static bool validate(ModuleRootSignature *MRS) {
+  if (dxbc::RootSignatureValidations::validateRootFlag(MRS->Flags)) {
     return reportError("Invalid Root Signature flag value");
   }
   return false;
 }
 
-OptionalRootSignature ModuleRootSignature::analyzeModule(Module &M,
-                                                         const Function *F) {
-  ModuleRootSignature MRS(&M.getContext());
+std::optional<ModuleRootSignature>
+ModuleRootSignature::analyzeModule(Module &M, const Function *F) {
+  ModuleRootSignature MRS;
+  Ctx = &M.getContext();
 
   NamedMDNode *RootSignatureNode = M.getNamedMetadata("dx.rootsignatures");
-  if (RootSignatureNode == nullptr || MRS.parse(RootSignatureNode, F) ||
-      MRS.validate())
+  if (RootSignatureNode == nullptr || parse(&MRS, RootSignatureNode, F) ||
+      validate(&MRS))
     return std::nullopt;
 
   return MRS;
@@ -153,8 +153,8 @@ OptionalRootSignature ModuleRootSignature::analyzeModule(Module &M,
 
 AnalysisKey RootSignatureAnalysis::Key;
 
-OptionalRootSignature RootSignatureAnalysis::run(Module &M,
-                                                 ModuleAnalysisManager &AM) {
+std::optional<ModuleRootSignature>
+RootSignatureAnalysis::run(Module &M, ModuleAnalysisManager &AM) {
   auto MMI = AM.getResult<DXILMetadataAnalysis>(M);
 
   if (MMI.ShaderProfile == Triple::Library)
diff --git a/llvm/lib/Target/DirectX/DXILRootSignature.h b/llvm/lib/Target/DirectX/DXILRootSignature.h
index eb3fcbcbc5701..ca8801fe6bbef 100644
--- a/llvm/lib/Target/DirectX/DXILRootSignature.h
+++ b/llvm/lib/Target/DirectX/DXILRootSignature.h
@@ -33,26 +33,10 @@ enum class RootSignatureElementKind {
 
 struct ModuleRootSignature {
   uint32_t Flags = 0;
-  ModuleRootSignature() { Ctx = nullptr; };
   static std::optional<ModuleRootSignature> analyzeModule(Module &M,
                                                           const Function *F);
-
-private:
-  LLVMContext *Ctx;
-
-  ModuleRootSignature(LLVMContext *Ctx) : Ctx(Ctx) {}
-
-  bool parse(NamedMDNode *Root, const Function *F);
-  bool parseRootSignatureElement(MDNode *Element);
-  bool parseRootFlags(MDNode *RootFlagNode);
-
-  bool validate();
-
-  bool reportError(Twine Message, DiagnosticSeverity Severity = DS_Error);
 };
 
-using OptionalRootSignature = std::optional<ModuleRootSignature>;
-
 class RootSignatureAnalysis : public AnalysisInfoMixin<RootSignatureAnalysis> {
   friend AnalysisInfoMixin<RootSignatureAnalysis>;
   static AnalysisKey Key;
@@ -60,9 +44,9 @@ class RootSignatureAnalysis : public AnalysisInfoMixin<RootSignatureAnalysis> {
 public:
   RootSignatureAnalysis() = default;
 
-  using Result = OptionalRootSignature;
+  using Result = std::optional<ModuleRootSignature>;
 
-  OptionalRootSignature run(Module &M, ModuleAnalysisManager &AM);
+  std::optional<ModuleRootSignature> run(Module &M, ModuleAnalysisManager &AM);
 };
 
 /// Wrapper pass for the legacy pass manager.
@@ -71,16 +55,14 @@ class RootSignatureAnalysis : public AnalysisInfoMixin<RootSignatureAnalysis> {
 /// passes which run through the legacy pass manager.
 class RootSignatureAnalysisWrapper : public ModulePass {
 private:
-  OptionalRootSignature MRS;
+  std::optional<ModuleRootSignature> MRS;
 
 public:
   static char ID;
 
   RootSignatureAnalysisWrapper() : ModulePass(ID) {}
 
-  const ModuleRootSignature &getRootSignature() { return MRS.value(); }
-
-  bool hasRootSignature() { return MRS.has_value(); }
+  std::optional<ModuleRootSignature> getResult() const { return MRS; }
 
   bool runOnModule(Module &M) override;
 
diff --git a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Flags.ll b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Flags.ll
index cf00609a7307e..3f5bb166ad0e5 100644
--- a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Flags.ll
+++ b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Flags.ll
@@ -9,10 +9,6 @@ define void @main() #0 {
 entry:
   ret void
 }
-
-
-
-
 attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" }
 
 

>From b175b65f4640a89d104487c1099636282c9acba6 Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Tue, 11 Feb 2025 00:04:13 +0000
Subject: [PATCH 52/64] addressing PR comments

---
 llvm/lib/Target/DirectX/DXILRootSignature.cpp | 79 ++++++++++++-------
 llvm/lib/Target/DirectX/DXILRootSignature.h   |  2 +-
 2 files changed, 52 insertions(+), 29 deletions(-)

diff --git a/llvm/lib/Target/DirectX/DXILRootSignature.cpp b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
index d6cc18c54a7e8..73da337d9ce0e 100644
--- a/llvm/lib/Target/DirectX/DXILRootSignature.cpp
+++ b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
@@ -29,17 +29,17 @@
 using namespace llvm;
 using namespace llvm::dxil;
 
-LLVMContext *Ctx;
-
-static bool reportError(Twine Message, DiagnosticSeverity Severity = DS_Error) {
+static bool reportError(LLVMContext *Ctx, Twine Message,
+                        DiagnosticSeverity Severity = DS_Error) {
   Ctx->diagnose(DiagnosticInfoGeneric(Message, Severity));
   return true;
 }
 
-static bool parseRootFlags(ModuleRootSignature *MRS, MDNode *RootFlagNode) {
+static bool parseRootFlags(LLVMContext *Ctx, ModuleRootSignature *MRS,
+                           MDNode *RootFlagNode) {
 
   if (RootFlagNode->getNumOperands() != 2)
-    return reportError("Invalid format for RootFlag Element");
+    return reportError(Ctx, "Invalid format for RootFlag Element");
 
   auto *Flag = mdconst::extract<ConstantInt>(RootFlagNode->getOperand(1));
   MRS->Flags = Flag->getZExtValue();
@@ -47,11 +47,12 @@ static bool parseRootFlags(ModuleRootSignature *MRS, MDNode *RootFlagNode) {
   return false;
 }
 
-static bool parseRootSignatureElement(ModuleRootSignature *MRS,
+static bool parseRootSignatureElement(LLVMContext *Ctx,
+                                      ModuleRootSignature *MRS,
                                       MDNode *Element) {
   MDString *ElementText = cast<MDString>(Element->getOperand(0));
   if (ElementText == nullptr)
-    return reportError("Invalid format for Root Element");
+    return reportError(Ctx, "Invalid format for Root Element");
 
   RootSignatureElementKind ElementKind =
       StringSwitch<RootSignatureElementKind>(ElementText->getString())
@@ -68,19 +69,20 @@ static bool parseRootSignatureElement(ModuleRootSignature *MRS,
   switch (ElementKind) {
 
   case RootSignatureElementKind::RootFlags:
-    return parseRootFlags(MRS, Element);
+    return parseRootFlags(Ctx, MRS, Element);
   case RootSignatureElementKind::RootConstants:
   case RootSignatureElementKind::RootDescriptor:
   case RootSignatureElementKind::DescriptorTable:
   case RootSignatureElementKind::StaticSampler:
   case RootSignatureElementKind::None:
-    return reportError("Invalid Root Element: " + ElementText->getString());
+    return reportError(Ctx,
+                       "Invalid Root Element: " + ElementText->getString());
   }
 
   return true;
 }
 
-static bool parse(ModuleRootSignature *MRS, NamedMDNode *Root,
+static bool parse(LLVMContext *Ctx, ModuleRootSignature *MRS, NamedMDNode *Root,
                   const Function *EF) {
   bool HasError = false;
 
@@ -97,18 +99,27 @@ static bool parse(ModuleRootSignature *MRS, NamedMDNode *Root,
    */
 
   for (const MDNode *Node : Root->operands()) {
-    if (Node->getNumOperands() != 2)
-      return reportError("Invalid format for Root Signature Definition. Pairs "
-                         "of function, root signature expected.");
+    if (Node->getNumOperands() != 2) {
+      HasError = reportError(
+          Ctx, "Invalid format for Root Signature Definition. Pairs "
+               "of function, root signature expected.");
+      continue;
+    }
 
     ValueAsMetadata *VAM =
         llvm::dyn_cast<ValueAsMetadata>(Node->getOperand(0).get());
-    if (VAM == nullptr)
-      return reportError("First element of root signature is not a value");
+    if (VAM == nullptr) {
+      HasError =
+          reportError(Ctx, "First element of root signature is not a value");
+      continue;
+    }
 
     Function *F = dyn_cast<Function>(VAM->getValue());
-    if (F == nullptr)
-      return reportError("First element of root signature is not a function");
+    if (F == nullptr) {
+      HasError =
+          reportError(Ctx, "First element of root signature is not a function");
+      continue;
+    }
 
     if (F != EF)
       continue;
@@ -116,24 +127,26 @@ static bool parse(ModuleRootSignature *MRS, NamedMDNode *Root,
     // Get the Root Signature Description from the function signature pair.
     MDNode *RS = dyn_cast<MDNode>(Node->getOperand(1).get());
 
-    if (RS == nullptr)
-      return reportError("Missing Root Element List Metadata node.");
+    if (RS == nullptr) {
+      reportError(Ctx, "Missing Root Element List Metadata node.");
+      continue;
+    }
 
     // Loop through the Root Elements of the root signature.
     for (unsigned int Eid = 0; Eid < RS->getNumOperands(); Eid++) {
       MDNode *Element = dyn_cast<MDNode>(RS->getOperand(Eid));
       if (Element == nullptr)
-        return reportError("Missing Root Element Metadata Node.");
+        return reportError(Ctx, "Missing Root Element Metadata Node.");
 
-      HasError = HasError || parseRootSignatureElement(MRS, Element);
+      HasError = HasError || parseRootSignatureElement(Ctx, MRS, Element);
     }
   }
   return HasError;
 }
 
-static bool validate(ModuleRootSignature *MRS) {
+static bool validate(LLVMContext *Ctx, ModuleRootSignature *MRS) {
   if (dxbc::RootSignatureValidations::validateRootFlag(MRS->Flags)) {
-    return reportError("Invalid Root Signature flag value");
+    return reportError(Ctx, "Invalid Root Signature flag value");
   }
   return false;
 }
@@ -141,11 +154,11 @@ static bool validate(ModuleRootSignature *MRS) {
 std::optional<ModuleRootSignature>
 ModuleRootSignature::analyzeModule(Module &M, const Function *F) {
   ModuleRootSignature MRS;
-  Ctx = &M.getContext();
+  LLVMContext *Ctx = &M.getContext();
 
   NamedMDNode *RootSignatureNode = M.getNamedMetadata("dx.rootsignatures");
-  if (RootSignatureNode == nullptr || parse(&MRS, RootSignatureNode, F) ||
-      validate(&MRS))
+  if (RootSignatureNode == nullptr || parse(Ctx, &MRS, RootSignatureNode, F) ||
+      validate(Ctx, &MRS))
     return std::nullopt;
 
   return MRS;
@@ -160,7 +173,12 @@ RootSignatureAnalysis::run(Module &M, ModuleAnalysisManager &AM) {
   if (MMI.ShaderProfile == Triple::Library)
     return std::nullopt;
 
-  assert(MMI.EntryPropertyVec.size() == 1);
+  LLVMContext *Ctx = &M.getContext();
+
+  if (MMI.EntryPropertyVec.size() != 1) {
+    reportError(Ctx, "More than one entry function defined.");
+    return std::nullopt;
+  }
 
   const Function *EntryFunction = MMI.EntryPropertyVec[0].Entry;
   return ModuleRootSignature::analyzeModule(M, EntryFunction);
@@ -174,7 +192,12 @@ bool RootSignatureAnalysisWrapper::runOnModule(Module &M) {
 
   if (MMI.ShaderProfile == Triple::Library)
     return false;
-  assert(MMI.EntryPropertyVec.size() == 1);
+
+  LLVMContext *Ctx = &M.getContext();
+  if (MMI.EntryPropertyVec.size() != 1) {
+    reportError(Ctx, "More than one entry function defined.");
+    return false;
+  }
 
   const Function *EntryFunction = MMI.EntryPropertyVec[0].Entry;
   MRS = ModuleRootSignature::analyzeModule(M, EntryFunction);
diff --git a/llvm/lib/Target/DirectX/DXILRootSignature.h b/llvm/lib/Target/DirectX/DXILRootSignature.h
index ca8801fe6bbef..ab9a7c3da9a19 100644
--- a/llvm/lib/Target/DirectX/DXILRootSignature.h
+++ b/llvm/lib/Target/DirectX/DXILRootSignature.h
@@ -62,7 +62,7 @@ class RootSignatureAnalysisWrapper : public ModulePass {
 
   RootSignatureAnalysisWrapper() : ModulePass(ID) {}
 
-  std::optional<ModuleRootSignature> getResult() const { return MRS; }
+  const std::optional<ModuleRootSignature> &getResult() const { return MRS; }
 
   bool runOnModule(Module &M) override;
 

>From 01b49a7dedab39b6994508a472aaa6741857d479 Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Tue, 11 Feb 2025 20:40:00 +0000
Subject: [PATCH 53/64] addressing pr comments

---
 llvm/include/llvm/BinaryFormat/DXContainer.h  |  6 +-
 llvm/lib/Object/DXContainer.cpp               |  4 +-
 .../lib/Target/DirectX/DXContainerGlobals.cpp |  8 +--
 llvm/lib/Target/DirectX/DXILRootSignature.cpp | 70 ++++++-------------
 llvm/lib/Target/DirectX/DXILRootSignature.h   | 17 ++---
 5 files changed, 35 insertions(+), 70 deletions(-)

diff --git a/llvm/include/llvm/BinaryFormat/DXContainer.h b/llvm/include/llvm/BinaryFormat/DXContainer.h
index 289dcd4d94484..bd5a796c0b31c 100644
--- a/llvm/include/llvm/BinaryFormat/DXContainer.h
+++ b/llvm/include/llvm/BinaryFormat/DXContainer.h
@@ -548,10 +548,10 @@ static_assert(sizeof(ProgramSignatureElement) == 32,
 
 struct RootSignatureValidations {
 
-  static bool validateRootFlag(uint32_t Flags) { return (Flags & ~0xfff) != 0; }
+  static bool isValidRootFlag(uint32_t Flags) { return (Flags & ~0xfff) == 0; }
 
-  static bool validateVersion(uint32_t Version) {
-    return !(Version == 1 || Version == 2);
+  static bool isValidVersion(uint32_t Version) {
+    return (Version == 1 || Version == 2);
   }
 };
 
diff --git a/llvm/lib/Object/DXContainer.cpp b/llvm/lib/Object/DXContainer.cpp
index 53e203f1cc20b..2d79eaf7ffefb 100644
--- a/llvm/lib/Object/DXContainer.cpp
+++ b/llvm/lib/Object/DXContainer.cpp
@@ -254,7 +254,7 @@ Error DirectX::RootSignature::parse(StringRef Data) {
       support::endian::read<uint32_t, llvm::endianness::little>(Current);
   Current += sizeof(uint32_t);
 
-  if (dxbc::RootSignatureValidations::validateVersion(VValue))
+  if (!dxbc::RootSignatureValidations::isValidVersion(VValue))
     return make_error<GenericBinaryError>("Invalid Root Signature Version");
   Version = VValue;
 
@@ -278,7 +278,7 @@ Error DirectX::RootSignature::parse(StringRef Data) {
       support::endian::read<uint32_t, llvm::endianness::little>(Current);
   Current += sizeof(uint32_t);
 
-  if (dxbc::RootSignatureValidations::validateRootFlag(FValue))
+  if (!dxbc::RootSignatureValidations::isValidRootFlag(FValue))
     return make_error<GenericBinaryError>("Invalid Root Signature flag");
   Flags = FValue;
 
diff --git a/llvm/lib/Target/DirectX/DXContainerGlobals.cpp b/llvm/lib/Target/DirectX/DXContainerGlobals.cpp
index 614e5cc9cb11d..bec2fb6574a03 100644
--- a/llvm/lib/Target/DirectX/DXContainerGlobals.cpp
+++ b/llvm/lib/Target/DirectX/DXContainerGlobals.cpp
@@ -154,18 +154,14 @@ void DXContainerGlobals::addRootSignature(Module &M,
                                           SmallVector<GlobalValue *> &Globals) {
 
   auto &RSA = getAnalysis<RootSignatureAnalysisWrapper>();
-  std::optional<ModuleRootSignature> MaybeRootSignature = RSA.getResult();
-
-  if (!MaybeRootSignature.has_value())
+  if (!RSA.getResult())
     return;
 
-  ModuleRootSignature MRS = MaybeRootSignature.value();
-
   SmallString<256> Data;
   raw_svector_ostream OS(Data);
 
   RootSignatureHeader RSH;
-  RSH.Flags = MRS.Flags;
+  RSH.Flags = RSA.getResult()->Flags;
 
   RSH.write(OS);
 
diff --git a/llvm/lib/Target/DirectX/DXILRootSignature.cpp b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
index 73da337d9ce0e..b4cde78c3748a 100644
--- a/llvm/lib/Target/DirectX/DXILRootSignature.cpp
+++ b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
@@ -57,24 +57,13 @@ static bool parseRootSignatureElement(LLVMContext *Ctx,
   RootSignatureElementKind ElementKind =
       StringSwitch<RootSignatureElementKind>(ElementText->getString())
           .Case("RootFlags", RootSignatureElementKind::RootFlags)
-          .Case("RootConstants", RootSignatureElementKind::RootConstants)
-          .Case("RootCBV", RootSignatureElementKind::RootDescriptor)
-          .Case("RootSRV", RootSignatureElementKind::RootDescriptor)
-          .Case("RootUAV", RootSignatureElementKind::RootDescriptor)
-          .Case("Sampler", RootSignatureElementKind::RootDescriptor)
-          .Case("DescriptorTable", RootSignatureElementKind::DescriptorTable)
-          .Case("StaticSampler", RootSignatureElementKind::StaticSampler)
           .Default(RootSignatureElementKind::None);
 
   switch (ElementKind) {
 
   case RootSignatureElementKind::RootFlags:
     return parseRootFlags(Ctx, MRS, Element);
-  case RootSignatureElementKind::RootConstants:
-  case RootSignatureElementKind::RootDescriptor:
-  case RootSignatureElementKind::DescriptorTable:
-  case RootSignatureElementKind::StaticSampler:
-  case RootSignatureElementKind::None:
+  default:
     return reportError(Ctx,
                        "Invalid Root Element: " + ElementText->getString());
   }
@@ -83,7 +72,7 @@ static bool parseRootSignatureElement(LLVMContext *Ctx,
 }
 
 static bool parse(LLVMContext *Ctx, ModuleRootSignature *MRS, NamedMDNode *Root,
-                  const Function *EF) {
+                  const Function *EntryFunction) {
   bool HasError = false;
 
   /** Root Signature are specified as following in the metadata:
@@ -121,7 +110,7 @@ static bool parse(LLVMContext *Ctx, ModuleRootSignature *MRS, NamedMDNode *Root,
       continue;
     }
 
-    if (F != EF)
+    if (F != EntryFunction)
       continue;
 
     // Get the Root Signature Description from the function signature pair.
@@ -133,8 +122,8 @@ static bool parse(LLVMContext *Ctx, ModuleRootSignature *MRS, NamedMDNode *Root,
     }
 
     // Loop through the Root Elements of the root signature.
-    for (unsigned int Eid = 0; Eid < RS->getNumOperands(); Eid++) {
-      MDNode *Element = dyn_cast<MDNode>(RS->getOperand(Eid));
+    for (const auto &Operand : RS->operands()) {
+      MDNode *Element = dyn_cast<MDNode>(Operand);
       if (Element == nullptr)
         return reportError(Ctx, "Missing Root Element Metadata Node.");
 
@@ -145,20 +134,30 @@ static bool parse(LLVMContext *Ctx, ModuleRootSignature *MRS, NamedMDNode *Root,
 }
 
 static bool validate(LLVMContext *Ctx, ModuleRootSignature *MRS) {
-  if (dxbc::RootSignatureValidations::validateRootFlag(MRS->Flags)) {
+  if (!dxbc::RootSignatureValidations::isValidRootFlag(MRS->Flags)) {
     return reportError(Ctx, "Invalid Root Signature flag value");
   }
   return false;
 }
 
 std::optional<ModuleRootSignature>
-ModuleRootSignature::analyzeModule(Module &M, const Function *F) {
-  ModuleRootSignature MRS;
+ModuleRootSignature::analyzeModule(Module &M, ModuleMetadataInfo MMI) {
+  if (MMI.ShaderProfile == Triple::Library)
+    return std::nullopt;
+
   LLVMContext *Ctx = &M.getContext();
 
+  if (MMI.EntryPropertyVec.size() != 1) {
+    reportError(Ctx, "More than one entry function defined.");
+    return std::nullopt;
+  }
+
+  ModuleRootSignature MRS;
+  const Function *EntryFunction = MMI.EntryPropertyVec[0].Entry;
+
   NamedMDNode *RootSignatureNode = M.getNamedMetadata("dx.rootsignatures");
-  if (RootSignatureNode == nullptr || parse(Ctx, &MRS, RootSignatureNode, F) ||
-      validate(Ctx, &MRS))
+  if (RootSignatureNode == nullptr ||
+      parse(Ctx, &MRS, RootSignatureNode, EntryFunction) || validate(Ctx, &MRS))
     return std::nullopt;
 
   return MRS;
@@ -168,20 +167,8 @@ AnalysisKey RootSignatureAnalysis::Key;
 
 std::optional<ModuleRootSignature>
 RootSignatureAnalysis::run(Module &M, ModuleAnalysisManager &AM) {
-  auto MMI = AM.getResult<DXILMetadataAnalysis>(M);
-
-  if (MMI.ShaderProfile == Triple::Library)
-    return std::nullopt;
-
-  LLVMContext *Ctx = &M.getContext();
-
-  if (MMI.EntryPropertyVec.size() != 1) {
-    reportError(Ctx, "More than one entry function defined.");
-    return std::nullopt;
-  }
-
-  const Function *EntryFunction = MMI.EntryPropertyVec[0].Entry;
-  return ModuleRootSignature::analyzeModule(M, EntryFunction);
+  ModuleMetadataInfo MMI = AM.getResult<DXILMetadataAnalysis>(M);
+  return ModuleRootSignature::analyzeModule(M, MMI);
 }
 
 //===----------------------------------------------------------------------===//
@@ -189,18 +176,7 @@ bool RootSignatureAnalysisWrapper::runOnModule(Module &M) {
 
   dxil::ModuleMetadataInfo &MMI =
       getAnalysis<DXILMetadataAnalysisWrapperPass>().getModuleMetadata();
-
-  if (MMI.ShaderProfile == Triple::Library)
-    return false;
-
-  LLVMContext *Ctx = &M.getContext();
-  if (MMI.EntryPropertyVec.size() != 1) {
-    reportError(Ctx, "More than one entry function defined.");
-    return false;
-  }
-
-  const Function *EntryFunction = MMI.EntryPropertyVec[0].Entry;
-  MRS = ModuleRootSignature::analyzeModule(M, EntryFunction);
+  MRS = ModuleRootSignature::analyzeModule(M, MMI);
   return false;
 }
 
diff --git a/llvm/lib/Target/DirectX/DXILRootSignature.h b/llvm/lib/Target/DirectX/DXILRootSignature.h
index ab9a7c3da9a19..638f44a58778a 100644
--- a/llvm/lib/Target/DirectX/DXILRootSignature.h
+++ b/llvm/lib/Target/DirectX/DXILRootSignature.h
@@ -1,5 +1,4 @@
-//===- DXILRootSignature.h - DXIL Root Signature helper objects
-//---------------===//
+//===- DXILRootSignature.h - DXIL Root Signature helper objects -----------===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
@@ -12,6 +11,7 @@
 ///
 //===----------------------------------------------------------------------===//
 
+#include "llvm/Analysis/DXILMetadataAnalysis.h"
 #include "llvm/IR/DiagnosticInfo.h"
 #include "llvm/IR/Metadata.h"
 #include "llvm/IR/Module.h"
@@ -22,19 +22,12 @@
 namespace llvm {
 namespace dxil {
 
-enum class RootSignatureElementKind {
-  None = 0,
-  RootFlags = 1,
-  RootConstants = 2,
-  RootDescriptor = 3,
-  DescriptorTable = 4,
-  StaticSampler = 5
-};
+enum class RootSignatureElementKind { None = 0, RootFlags = 1 };
 
 struct ModuleRootSignature {
   uint32_t Flags = 0;
-  static std::optional<ModuleRootSignature> analyzeModule(Module &M,
-                                                          const Function *F);
+  static std::optional<ModuleRootSignature>
+  analyzeModule(Module &M, ModuleMetadataInfo MMI);
 };
 
 class RootSignatureAnalysis : public AnalysisInfoMixin<RootSignatureAnalysis> {

>From 7bba9d3a84bdf9ba22e26b19695669161dac89dc Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Tue, 11 Feb 2025 20:55:04 +0000
Subject: [PATCH 54/64] removing copies from root signature use in dx container
 globals

---
 llvm/lib/Target/DirectX/DXContainerGlobals.cpp | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/llvm/lib/Target/DirectX/DXContainerGlobals.cpp b/llvm/lib/Target/DirectX/DXContainerGlobals.cpp
index bec2fb6574a03..e91c04ed680c3 100644
--- a/llvm/lib/Target/DirectX/DXContainerGlobals.cpp
+++ b/llvm/lib/Target/DirectX/DXContainerGlobals.cpp
@@ -154,14 +154,16 @@ void DXContainerGlobals::addRootSignature(Module &M,
                                           SmallVector<GlobalValue *> &Globals) {
 
   auto &RSA = getAnalysis<RootSignatureAnalysisWrapper>();
+
   if (!RSA.getResult())
     return;
 
+  const ModuleRootSignature &MRS = RSA.getResult().value();
   SmallString<256> Data;
   raw_svector_ostream OS(Data);
 
   RootSignatureHeader RSH;
-  RSH.Flags = RSA.getResult()->Flags;
+  RSH.Flags = MRS.Flags;
 
   RSH.write(OS);
 

>From 2809c2fa8784ffa29320275b1ec88d07d96d3ea0 Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Wed, 12 Feb 2025 00:48:50 +0000
Subject: [PATCH 55/64] adding more tests

---
 llvm/lib/Target/DirectX/DXILRootSignature.cpp | 41 +++++++++++--------
 llvm/lib/Target/DirectX/DXILRootSignature.h   |  4 +-
 .../RootSignature-Flags-Error.ll              | 19 ---------
 ...tSignature-MultipleEntryFunctions-Error.ll | 26 ++++++++++++
 .../RootSignature-MultipleEntryFunctions.ll   | 35 ++++++++++++++++
 5 files changed, 88 insertions(+), 37 deletions(-)
 delete mode 100644 llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Flags-Error.ll
 create mode 100644 llvm/test/CodeGen/DirectX/ContainerData/RootSignature-MultipleEntryFunctions-Error.ll
 create mode 100644 llvm/test/CodeGen/DirectX/ContainerData/RootSignature-MultipleEntryFunctions.ll

diff --git a/llvm/lib/Target/DirectX/DXILRootSignature.cpp b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
index b4cde78c3748a..7837b4cd2eeb9 100644
--- a/llvm/lib/Target/DirectX/DXILRootSignature.cpp
+++ b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
@@ -20,6 +20,7 @@
 #include "llvm/IR/DiagnosticInfo.h"
 #include "llvm/IR/Function.h"
 #include "llvm/IR/LLVMContext.h"
+#include "llvm/IR/Metadata.h"
 #include "llvm/IR/Module.h"
 #include "llvm/InitializePasses.h"
 #include "llvm/Pass.h"
@@ -63,9 +64,6 @@ static bool parseRootSignatureElement(LLVMContext *Ctx,
 
   case RootSignatureElementKind::RootFlags:
     return parseRootFlags(Ctx, MRS, Element);
-  default:
-    return reportError(Ctx,
-                       "Invalid Root Element: " + ElementText->getString());
   }
 
   return true;
@@ -95,8 +93,14 @@ static bool parse(LLVMContext *Ctx, ModuleRootSignature *MRS, NamedMDNode *Root,
       continue;
     }
 
+    const MDOperand &FunctionPointerMdNode = Node->getOperand(0);
+    if (FunctionPointerMdNode == nullptr) {
+      // Function was pruned during compilation.
+      continue;
+    }
+
     ValueAsMetadata *VAM =
-        llvm::dyn_cast<ValueAsMetadata>(Node->getOperand(0).get());
+        llvm::dyn_cast<ValueAsMetadata>(FunctionPointerMdNode.get());
     if (VAM == nullptr) {
       HasError =
           reportError(Ctx, "First element of root signature is not a value");
@@ -140,24 +144,26 @@ static bool validate(LLVMContext *Ctx, ModuleRootSignature *MRS) {
   return false;
 }
 
-std::optional<ModuleRootSignature>
-ModuleRootSignature::analyzeModule(Module &M, ModuleMetadataInfo MMI) {
-  if (MMI.ShaderProfile == Triple::Library)
-    return std::nullopt;
+static const Function *getEntryFunction(Module &M, ModuleMetadataInfo MMI) {
 
   LLVMContext *Ctx = &M.getContext();
-
   if (MMI.EntryPropertyVec.size() != 1) {
     reportError(Ctx, "More than one entry function defined.");
-    return std::nullopt;
+    return nullptr;
   }
+  return MMI.EntryPropertyVec[0].Entry;
+}
+
+std::optional<ModuleRootSignature>
+ModuleRootSignature::analyzeModule(Module &M, const Function *F) {
+
+  LLVMContext *Ctx = &M.getContext();
 
   ModuleRootSignature MRS;
-  const Function *EntryFunction = MMI.EntryPropertyVec[0].Entry;
 
   NamedMDNode *RootSignatureNode = M.getNamedMetadata("dx.rootsignatures");
-  if (RootSignatureNode == nullptr ||
-      parse(Ctx, &MRS, RootSignatureNode, EntryFunction) || validate(Ctx, &MRS))
+  if (RootSignatureNode == nullptr || parse(Ctx, &MRS, RootSignatureNode, F) ||
+      validate(Ctx, &MRS))
     return std::nullopt;
 
   return MRS;
@@ -168,15 +174,18 @@ AnalysisKey RootSignatureAnalysis::Key;
 std::optional<ModuleRootSignature>
 RootSignatureAnalysis::run(Module &M, ModuleAnalysisManager &AM) {
   ModuleMetadataInfo MMI = AM.getResult<DXILMetadataAnalysis>(M);
-  return ModuleRootSignature::analyzeModule(M, MMI);
+  if (MMI.ShaderProfile == Triple::Library)
+    return std::nullopt;
+  return ModuleRootSignature::analyzeModule(M, getEntryFunction(M, MMI));
 }
 
 //===----------------------------------------------------------------------===//
 bool RootSignatureAnalysisWrapper::runOnModule(Module &M) {
-
   dxil::ModuleMetadataInfo &MMI =
       getAnalysis<DXILMetadataAnalysisWrapperPass>().getModuleMetadata();
-  MRS = ModuleRootSignature::analyzeModule(M, MMI);
+  if (MMI.ShaderProfile == Triple::Library)
+    return false;
+  MRS = ModuleRootSignature::analyzeModule(M, getEntryFunction(M, MMI));
   return false;
 }
 
diff --git a/llvm/lib/Target/DirectX/DXILRootSignature.h b/llvm/lib/Target/DirectX/DXILRootSignature.h
index 638f44a58778a..d97c666f76e9e 100644
--- a/llvm/lib/Target/DirectX/DXILRootSignature.h
+++ b/llvm/lib/Target/DirectX/DXILRootSignature.h
@@ -26,8 +26,8 @@ enum class RootSignatureElementKind { None = 0, RootFlags = 1 };
 
 struct ModuleRootSignature {
   uint32_t Flags = 0;
-  static std::optional<ModuleRootSignature>
-  analyzeModule(Module &M, ModuleMetadataInfo MMI);
+  static std::optional<ModuleRootSignature> analyzeModule(Module &M,
+                                                          const Function *F);
 };
 
 class RootSignatureAnalysis : public AnalysisInfoMixin<RootSignatureAnalysis> {
diff --git a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Flags-Error.ll b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Flags-Error.ll
deleted file mode 100644
index 630bd5c1e3836..0000000000000
--- a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Flags-Error.ll
+++ /dev/null
@@ -1,19 +0,0 @@
-; RUN: not llc %s --filetype=obj -o -
-
-target triple = "dxil-unknown-shadermodel6.0-compute"
-
-; expected-error at -1: Invalid Root Element: NOTRootFlags
-
-
-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 = !{ !"NOTRootFlags", i32 1 } ; 1 = allow_input_assembler_input_layout
diff --git a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-MultipleEntryFunctions-Error.ll b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-MultipleEntryFunctions-Error.ll
new file mode 100644
index 0000000000000..dd3fbe810d846
--- /dev/null
+++ b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-MultipleEntryFunctions-Error.ll
@@ -0,0 +1,26 @@
+; RUN: not --crash llc %s --filetype=obj -o - 2>&1 | FileCheck %s
+; CHECK: error: More than one entry function defined
+
+target triple = "dxil-unknown-shadermodel6.0-compute"
+
+
+define void @main() #0 {
+entry:
+  ret void
+}
+
+define void @anotherMain() #1 {
+entry:
+  ret void
+}
+
+attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" }
+attributes #1 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" }
+
+!dx.rootsignatures = !{!2, !5} ; list of function/root signature pairs
+!2 = !{ ptr @main, !3 } ; function, root signature
+!3 = !{ !4 } ; list of root signature elements
+!4 = !{ !"RootFlags", i32 1 } ; 1 = allow_input_assembler_input_layout
+!5 = !{ ptr @anotherMain, !6 } ; function, root signature
+!6 = !{ !7 } ; list of root signature elements
+!7 = !{ !"RootFlags", i32 2 } ; 1 = allow_input_assembler_input_layout
diff --git a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-MultipleEntryFunctions.ll b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-MultipleEntryFunctions.ll
new file mode 100644
index 0000000000000..eb3c738a5fc03
--- /dev/null
+++ b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-MultipleEntryFunctions.ll
@@ -0,0 +1,35 @@
+; RUN: llc %s --filetype=obj -o - | obj2yaml | FileCheck %s
+
+target triple = "dxil-unknown-shadermodel6.0-compute"
+
+
+define void @main() {
+entry:
+  ret void
+}
+
+define void @anotherMain() #0 {
+entry:
+  ret void
+}
+
+attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" }
+
+!dx.rootsignatures = !{!2, !5} ; list of function/root signature pairs
+!2 = !{ ptr @main, !3 } ; function, root signature
+!3 = !{ !4 } ; list of root signature elements
+!4 = !{ !"RootFlags", i32 1 } ; 1 = allow_input_assembler_input_layout
+!5 = !{ ptr @anotherMain, !6 } ; function, root signature
+!6 = !{ !7 } ; list of root signature elements
+!7 = !{ !"RootFlags", i32 2 } ; 1 = allow_input_assembler_input_layout
+
+
+; CHECK:  - Name:            RTS0
+; CHECK-NEXT:    Size:            24
+; CHECK-NEXT:    RootSignature:
+; CHECK-NEXT:      Version:         2
+; CHECK-NEXT:      NumParameters:   0
+; CHECK-NEXT:      RootParametersOffset: 0
+; CHECK-NEXT:      NumStaticSamplers: 0
+; CHECK-NEXT:      StaticSamplersOffset: 0
+; CHECK-NEXT:      DenyVertexShaderRootAccess: true

>From 023dcb86556742c0a9fc58d1f1d98f5e2f8f46ba Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Wed, 12 Feb 2025 01:03:40 +0000
Subject: [PATCH 56/64] maybe fix test?

---
 llvm/lib/Target/DirectX/DXILRootSignature.cpp                 | 3 +--
 llvm/lib/Target/DirectX/DXILRootSignature.h                   | 2 +-
 .../RootSignature-MultipleEntryFunctions-Error.ll             | 4 ++--
 3 files changed, 4 insertions(+), 5 deletions(-)

diff --git a/llvm/lib/Target/DirectX/DXILRootSignature.cpp b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
index 7837b4cd2eeb9..73b6dd96a9fa0 100644
--- a/llvm/lib/Target/DirectX/DXILRootSignature.cpp
+++ b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
@@ -57,8 +57,7 @@ static bool parseRootSignatureElement(LLVMContext *Ctx,
 
   RootSignatureElementKind ElementKind =
       StringSwitch<RootSignatureElementKind>(ElementText->getString())
-          .Case("RootFlags", RootSignatureElementKind::RootFlags)
-          .Default(RootSignatureElementKind::None);
+          .Case("RootFlags", RootSignatureElementKind::RootFlags);
 
   switch (ElementKind) {
 
diff --git a/llvm/lib/Target/DirectX/DXILRootSignature.h b/llvm/lib/Target/DirectX/DXILRootSignature.h
index d97c666f76e9e..427593c89418b 100644
--- a/llvm/lib/Target/DirectX/DXILRootSignature.h
+++ b/llvm/lib/Target/DirectX/DXILRootSignature.h
@@ -22,7 +22,7 @@
 namespace llvm {
 namespace dxil {
 
-enum class RootSignatureElementKind { None = 0, RootFlags = 1 };
+enum class RootSignatureElementKind { RootFlags = 1 };
 
 struct ModuleRootSignature {
   uint32_t Flags = 0;
diff --git a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-MultipleEntryFunctions-Error.ll b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-MultipleEntryFunctions-Error.ll
index dd3fbe810d846..033661ae9a0bb 100644
--- a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-MultipleEntryFunctions-Error.ll
+++ b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-MultipleEntryFunctions-Error.ll
@@ -1,5 +1,5 @@
-; RUN: not --crash llc %s --filetype=obj -o - 2>&1 | FileCheck %s
-; CHECK: error: More than one entry function defined
+; RUN: not --crash llc %s --filetype=obj -o -
+; expected-error at -1: More than one entry function defined
 
 target triple = "dxil-unknown-shadermodel6.0-compute"
 

>From aedb446d48e16e3760587f2597db46ee25f6bfcc Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Wed, 12 Feb 2025 01:17:10 +0000
Subject: [PATCH 57/64] fixing clang format

---
 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 2d79eaf7ffefb..4632d43ea7252 100644
--- a/llvm/lib/Object/DXContainer.cpp
+++ b/llvm/lib/Object/DXContainer.cpp
@@ -9,9 +9,9 @@
 #include "llvm/Object/DXContainer.h"
 #include "llvm/BinaryFormat/DXContainer.h"
 #include "llvm/Object/Error.h"
-#include "llvm/Support/FormatVariadic.h"
 #include "llvm/Support/Alignment.h"
 #include "llvm/Support/Endian.h"
+#include "llvm/Support/FormatVariadic.h"
 
 using namespace llvm;
 using namespace llvm::object;

>From 39e60c06ce6a9b1a533c696a4e5db75ba83e5d47 Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Wed, 12 Feb 2025 01:35:12 +0000
Subject: [PATCH 58/64] try fix format

---
 llvm/lib/Target/DirectX/DXILRootSignature.cpp |  6 +++++-
 llvm/lib/Target/DirectX/DXILRootSignature.h   |  2 +-
 .../RootSignature-Flags-Error.ll              | 19 +++++++++++++++++++
 3 files changed, 25 insertions(+), 2 deletions(-)
 create mode 100644 llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Flags-Error.ll

diff --git a/llvm/lib/Target/DirectX/DXILRootSignature.cpp b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
index 73b6dd96a9fa0..3a80a938e8ec2 100644
--- a/llvm/lib/Target/DirectX/DXILRootSignature.cpp
+++ b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
@@ -57,12 +57,16 @@ static bool parseRootSignatureElement(LLVMContext *Ctx,
 
   RootSignatureElementKind ElementKind =
       StringSwitch<RootSignatureElementKind>(ElementText->getString())
-          .Case("RootFlags", RootSignatureElementKind::RootFlags);
+          .Case("RootFlags", RootSignatureElementKind::RootFlags)
+          .Default(RootSignatureElementKind::None);
 
   switch (ElementKind) {
 
   case RootSignatureElementKind::RootFlags:
     return parseRootFlags(Ctx, MRS, Element);
+  case RootSignatureElementKind::None:
+    return reportError(Ctx,
+                       "Invalid Root Element: " + ElementText->getString());
   }
 
   return true;
diff --git a/llvm/lib/Target/DirectX/DXILRootSignature.h b/llvm/lib/Target/DirectX/DXILRootSignature.h
index 427593c89418b..d97c666f76e9e 100644
--- a/llvm/lib/Target/DirectX/DXILRootSignature.h
+++ b/llvm/lib/Target/DirectX/DXILRootSignature.h
@@ -22,7 +22,7 @@
 namespace llvm {
 namespace dxil {
 
-enum class RootSignatureElementKind { RootFlags = 1 };
+enum class RootSignatureElementKind { None = 0, RootFlags = 1 };
 
 struct ModuleRootSignature {
   uint32_t Flags = 0;
diff --git a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Flags-Error.ll b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Flags-Error.ll
new file mode 100644
index 0000000000000..630bd5c1e3836
--- /dev/null
+++ b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Flags-Error.ll
@@ -0,0 +1,19 @@
+; RUN: not llc %s --filetype=obj -o -
+
+target triple = "dxil-unknown-shadermodel6.0-compute"
+
+; expected-error at -1: Invalid Root Element: NOTRootFlags
+
+
+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 = !{ !"NOTRootFlags", i32 1 } ; 1 = allow_input_assembler_input_layout

>From 3b135c6d5937e806d8f28ada6068d0d8e5f52647 Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Wed, 12 Feb 2025 01:47:06 +0000
Subject: [PATCH 59/64] removing test

---
 ...tSignature-MultipleEntryFunctions-Error.ll | 26 -------------------
 1 file changed, 26 deletions(-)
 delete mode 100644 llvm/test/CodeGen/DirectX/ContainerData/RootSignature-MultipleEntryFunctions-Error.ll

diff --git a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-MultipleEntryFunctions-Error.ll b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-MultipleEntryFunctions-Error.ll
deleted file mode 100644
index 033661ae9a0bb..0000000000000
--- a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-MultipleEntryFunctions-Error.ll
+++ /dev/null
@@ -1,26 +0,0 @@
-; RUN: not --crash llc %s --filetype=obj -o -
-; expected-error at -1: More than one entry function defined
-
-target triple = "dxil-unknown-shadermodel6.0-compute"
-
-
-define void @main() #0 {
-entry:
-  ret void
-}
-
-define void @anotherMain() #1 {
-entry:
-  ret void
-}
-
-attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" }
-attributes #1 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" }
-
-!dx.rootsignatures = !{!2, !5} ; list of function/root signature pairs
-!2 = !{ ptr @main, !3 } ; function, root signature
-!3 = !{ !4 } ; list of root signature elements
-!4 = !{ !"RootFlags", i32 1 } ; 1 = allow_input_assembler_input_layout
-!5 = !{ ptr @anotherMain, !6 } ; function, root signature
-!6 = !{ !7 } ; list of root signature elements
-!7 = !{ !"RootFlags", i32 2 } ; 1 = allow_input_assembler_input_layout

>From ae3d03f347b86d934623952af42310a5365c2097 Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Wed, 12 Feb 2025 04:19:58 +0000
Subject: [PATCH 60/64] adding llvm unreachable and testing test

---
 llvm/lib/Target/DirectX/DXILRootSignature.cpp |  2 +-
 ...tSignature-MultipleEntryFunctions-Error.ll | 26 +++++++++++++++++++
 2 files changed, 27 insertions(+), 1 deletion(-)
 create mode 100644 llvm/test/CodeGen/DirectX/ContainerData/RootSignature-MultipleEntryFunctions-Error.ll

diff --git a/llvm/lib/Target/DirectX/DXILRootSignature.cpp b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
index 3a80a938e8ec2..075925845d58b 100644
--- a/llvm/lib/Target/DirectX/DXILRootSignature.cpp
+++ b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
@@ -69,7 +69,7 @@ static bool parseRootSignatureElement(LLVMContext *Ctx,
                        "Invalid Root Element: " + ElementText->getString());
   }
 
-  return true;
+  llvm_unreachable("Root signature element kind not expected.");
 }
 
 static bool parse(LLVMContext *Ctx, ModuleRootSignature *MRS, NamedMDNode *Root,
diff --git a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-MultipleEntryFunctions-Error.ll b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-MultipleEntryFunctions-Error.ll
new file mode 100644
index 0000000000000..6df70632730b7
--- /dev/null
+++ b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-MultipleEntryFunctions-Error.ll
@@ -0,0 +1,26 @@
+; RUN: not llc %s --filetype=obj -o -
+; expected-error at -1: More than one entry function defined
+
+target triple = "dxil-unknown-shadermodel6.0-compute"
+
+
+define void @main() #0 {
+entry:
+  ret void
+}
+
+define void @anotherMain() #1 {
+entry:
+  ret void
+}
+
+attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" }
+attributes #1 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" }
+
+!dx.rootsignatures = !{!2, !5} ; list of function/root signature pairs
+!2 = !{ ptr @main, !3 } ; function, root signature
+!3 = !{ !4 } ; list of root signature elements
+!4 = !{ !"RootFlags", i32 1 } ; 1 = allow_input_assembler_input_layout
+!5 = !{ ptr @anotherMain, !6 } ; function, root signature
+!6 = !{ !7 } ; list of root signature elements
+!7 = !{ !"RootFlags", i32 2 } ; 1 = allow_input_assembler_input_layout

>From 3d19f8b22e114618ba3b37e8fd95748341b7e7ab Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Wed, 12 Feb 2025 06:57:10 +0000
Subject: [PATCH 61/64] stopping compilation if root signature error were
 emitted

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

diff --git a/llvm/lib/Target/DirectX/DXILRootSignature.cpp b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
index 075925845d58b..afa7e327f6292 100644
--- a/llvm/lib/Target/DirectX/DXILRootSignature.cpp
+++ b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
@@ -25,6 +25,7 @@
 #include "llvm/InitializePasses.h"
 #include "llvm/Pass.h"
 #include "llvm/Support/Error.h"
+#include "llvm/Support/ErrorHandling.h"
 #include <optional>
 
 using namespace llvm;
@@ -152,6 +153,8 @@ static const Function *getEntryFunction(Module &M, ModuleMetadataInfo MMI) {
   LLVMContext *Ctx = &M.getContext();
   if (MMI.EntryPropertyVec.size() != 1) {
     reportError(Ctx, "More than one entry function defined.");
+    // needed to stop compilation
+    report_fatal_error("Invalid Root Signature Definition", false);
     return nullptr;
   }
   return MMI.EntryPropertyVec[0].Entry;
@@ -165,10 +168,15 @@ ModuleRootSignature::analyzeModule(Module &M, const Function *F) {
   ModuleRootSignature MRS;
 
   NamedMDNode *RootSignatureNode = M.getNamedMetadata("dx.rootsignatures");
-  if (RootSignatureNode == nullptr || parse(Ctx, &MRS, RootSignatureNode, F) ||
-      validate(Ctx, &MRS))
+  if (RootSignatureNode == nullptr)
     return std::nullopt;
 
+  if (parse(Ctx, &MRS, RootSignatureNode, F) || validate(Ctx, &MRS)) {
+    // needed to stop compilation
+    report_fatal_error("Invalid Root Signature Definition", false);
+    return std::nullopt;
+  }
+
   return MRS;
 }
 

>From 5a3be7ccf2346c06277367518cd041f4cb1925f4 Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Wed, 12 Feb 2025 17:37:32 +0000
Subject: [PATCH 62/64] making sure Error tests fail

---
 .../DirectX/ContainerData/RootSignature-Flags-Error.ll      | 4 ++--
 .../ContainerData/RootSignature-Flags-Validation-Error.ll   | 6 ++++--
 .../RootSignature-MultipleEntryFunctions-Error.ll           | 5 +++--
 3 files changed, 9 insertions(+), 6 deletions(-)

diff --git a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Flags-Error.ll b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Flags-Error.ll
index 630bd5c1e3836..31e9db6f36e5e 100644
--- a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Flags-Error.ll
+++ b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Flags-Error.ll
@@ -1,8 +1,8 @@
-; RUN: not llc %s --filetype=obj -o -
+; RUN: not llc %s --filetype=obj -o - 2>&1 | FileCheck %s
 
 target triple = "dxil-unknown-shadermodel6.0-compute"
 
-; expected-error at -1: Invalid Root Element: NOTRootFlags
+; CHECK: error: Invalid Root Element: NOTRootFlags
 
 
 define void @main() #0 {
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 dae3c75e70cb8..43c9ecbd36570 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,8 @@
-; RUN: not llc %s --filetype=obj -o - 
+; RUN: not llc %s --filetype=obj -o - 2>&1 | FileCheck %s
+
+; CHECK: error: Invalid Root Signature flag value
+
 target triple = "dxil-unknown-shadermodel6.0-compute"
-; expected-error at -1: Invalid flag value for RootFlag
 
 
 define void @main() #0 {
diff --git a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-MultipleEntryFunctions-Error.ll b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-MultipleEntryFunctions-Error.ll
index 6df70632730b7..d6e2030cb6fda 100644
--- a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-MultipleEntryFunctions-Error.ll
+++ b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-MultipleEntryFunctions-Error.ll
@@ -1,5 +1,6 @@
-; RUN: not llc %s --filetype=obj -o -
-; expected-error at -1: More than one entry function defined
+; RUN: not llc %s --filetype=obj -o - 2>&1 | FileCheck %s
+
+; CHECK: error: More than one entry function defined
 
 target triple = "dxil-unknown-shadermodel6.0-compute"
 

>From f64c608cd6f14f5f3d0c624e7ed979dd66a9582e Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Wed, 12 Feb 2025 22:35:05 +0000
Subject: [PATCH 63/64] refactoring root signature analysis to return a map
 instead

---
 .../lib/Target/DirectX/DXContainerGlobals.cpp |  16 +-
 llvm/lib/Target/DirectX/DXILRootSignature.cpp | 161 ++++++++++--------
 llvm/lib/Target/DirectX/DXILRootSignature.h   |  28 ++-
 .../Target/DirectX/DirectXPassRegistry.def    |   2 +
 .../Target/DirectX/DirectXTargetMachine.cpp   |   1 +
 .../ContainerData/RootSignature-Error.ll      |   3 +-
 .../RootSignature-Flags-Error.ll              |   3 +-
 .../RootSignature-Flags-Validation-Error.ll   |   3 +-
 ...tSignature-MultipleEntryFunctions-Error.ll |  27 ---
 .../RootSignature-MultipleEntryFunctions.ll   |  18 +-
 .../RootSignature-RootElement-Error.ll        |   3 +-
 11 files changed, 140 insertions(+), 125 deletions(-)
 delete mode 100644 llvm/test/CodeGen/DirectX/ContainerData/RootSignature-MultipleEntryFunctions-Error.ll

diff --git a/llvm/lib/Target/DirectX/DXContainerGlobals.cpp b/llvm/lib/Target/DirectX/DXContainerGlobals.cpp
index e91c04ed680c3..09be5e3aff330 100644
--- a/llvm/lib/Target/DirectX/DXContainerGlobals.cpp
+++ b/llvm/lib/Target/DirectX/DXContainerGlobals.cpp
@@ -27,6 +27,7 @@
 #include "llvm/MC/DXContainerRootSignature.h"
 #include "llvm/Pass.h"
 #include "llvm/Support/MD5.h"
+#include "llvm/TargetParser/Triple.h"
 #include "llvm/Transforms/Utils/ModuleUtils.h"
 #include <optional>
 
@@ -153,12 +154,23 @@ void DXContainerGlobals::addSignature(Module &M,
 void DXContainerGlobals::addRootSignature(Module &M,
                                           SmallVector<GlobalValue *> &Globals) {
 
+  dxil::ModuleMetadataInfo &MMI =
+      getAnalysis<DXILMetadataAnalysisWrapperPass>().getModuleMetadata();
+
+  // Root Signature in Library shaders are different,
+  // since they don't use DXContainer to share it.
+  if (MMI.ShaderProfile == llvm::Triple::Library)
+    return;
+
+  assert(MMI.EntryPropertyVec.size() == 1);
+
   auto &RSA = getAnalysis<RootSignatureAnalysisWrapper>();
+  const Function *&EntryFunction = MMI.EntryPropertyVec[0].Entry;
 
-  if (!RSA.getResult())
+  if (!RSA.hasForFunction(EntryFunction))
     return;
 
-  const ModuleRootSignature &MRS = RSA.getResult().value();
+  const ModuleRootSignature &MRS = RSA.getForFunction(EntryFunction);
   SmallString<256> Data;
   raw_svector_ostream OS(Data);
 
diff --git a/llvm/lib/Target/DirectX/DXILRootSignature.cpp b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
index afa7e327f6292..cf474a4ba23cb 100644
--- a/llvm/lib/Target/DirectX/DXILRootSignature.cpp
+++ b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
@@ -26,7 +26,9 @@
 #include "llvm/Pass.h"
 #include "llvm/Support/Error.h"
 #include "llvm/Support/ErrorHandling.h"
+#include <cstdint>
 #include <optional>
+#include <utility>
 
 using namespace llvm;
 using namespace llvm::dxil;
@@ -37,20 +39,20 @@ static bool reportError(LLVMContext *Ctx, Twine Message,
   return true;
 }
 
-static bool parseRootFlags(LLVMContext *Ctx, ModuleRootSignature *MRS,
+static bool parseRootFlags(LLVMContext *Ctx, ModuleRootSignature &MRS,
                            MDNode *RootFlagNode) {
 
   if (RootFlagNode->getNumOperands() != 2)
     return reportError(Ctx, "Invalid format for RootFlag Element");
 
   auto *Flag = mdconst::extract<ConstantInt>(RootFlagNode->getOperand(1));
-  MRS->Flags = Flag->getZExtValue();
+  MRS.Flags = Flag->getZExtValue();
 
   return false;
 }
 
 static bool parseRootSignatureElement(LLVMContext *Ctx,
-                                      ModuleRootSignature *MRS,
+                                      ModuleRootSignature &MRS,
                                       MDNode *Element) {
   MDString *ElementText = cast<MDString>(Element->getOperand(0));
   if (ElementText == nullptr)
@@ -73,8 +75,7 @@ static bool parseRootSignatureElement(LLVMContext *Ctx,
   llvm_unreachable("Root signature element kind not expected.");
 }
 
-static bool parse(LLVMContext *Ctx, ModuleRootSignature *MRS, NamedMDNode *Root,
-                  const Function *EntryFunction) {
+static bool parse(LLVMContext *Ctx, ModuleRootSignature &MRS, MDNode *Node) {
   bool HasError = false;
 
   /** Root Signature are specified as following in the metadata:
@@ -89,15 +90,46 @@ static bool parse(LLVMContext *Ctx, ModuleRootSignature *MRS, NamedMDNode *Root,
       signature pair.
    */
 
-  for (const MDNode *Node : Root->operands()) {
-    if (Node->getNumOperands() != 2) {
-      HasError = reportError(
-          Ctx, "Invalid format for Root Signature Definition. Pairs "
-               "of function, root signature expected.");
+  // Get the Root Signature Description from the function signature pair.
+
+  // Loop through the Root Elements of the root signature.
+  for (const auto &Operand : Node->operands()) {
+    MDNode *Element = dyn_cast<MDNode>(Operand);
+    if (Element == nullptr)
+      return reportError(Ctx, "Missing Root Element Metadata Node.");
+
+    HasError = HasError || parseRootSignatureElement(Ctx, MRS, Element);
+  }
+
+  return HasError;
+}
+
+static bool validate(LLVMContext *Ctx, const ModuleRootSignature &MRS) {
+  if (!dxbc::RootSignatureValidations::isValidRootFlag(MRS.Flags)) {
+    return reportError(Ctx, "Invalid Root Signature flag value");
+  }
+  return false;
+}
+
+static SmallDenseMap<const Function *, ModuleRootSignature>
+analyzeModule(Module &M) {
+
+  LLVMContext *Ctx = &M.getContext();
+
+  SmallDenseMap<const Function *, ModuleRootSignature> MRSMap;
+
+  NamedMDNode *RootSignatureNode = M.getNamedMetadata("dx.rootsignatures");
+  if (RootSignatureNode == nullptr)
+    return MRSMap;
+
+  for (const auto &RSDefNode : RootSignatureNode->operands()) {
+    if (RSDefNode->getNumOperands() != 2) {
+      reportError(Ctx, "Invalid format for Root Signature Definition. Pairs "
+                       "of function, root signature expected.");
       continue;
     }
 
-    const MDOperand &FunctionPointerMdNode = Node->getOperand(0);
+    const MDOperand &FunctionPointerMdNode = RSDefNode->getOperand(0);
     if (FunctionPointerMdNode == nullptr) {
       // Function was pruned during compilation.
       continue;
@@ -106,97 +138,76 @@ static bool parse(LLVMContext *Ctx, ModuleRootSignature *MRS, NamedMDNode *Root,
     ValueAsMetadata *VAM =
         llvm::dyn_cast<ValueAsMetadata>(FunctionPointerMdNode.get());
     if (VAM == nullptr) {
-      HasError =
-          reportError(Ctx, "First element of root signature is not a value");
+      reportError(Ctx, "First element of root signature is not a value");
       continue;
     }
 
     Function *F = dyn_cast<Function>(VAM->getValue());
     if (F == nullptr) {
-      HasError =
-          reportError(Ctx, "First element of root signature is not a function");
+      reportError(Ctx, "First element of root signature is not a function");
       continue;
     }
 
-    if (F != EntryFunction)
-      continue;
+    MDNode *RootElementListNode =
+        dyn_cast<MDNode>(RSDefNode->getOperand(1).get());
 
-    // Get the Root Signature Description from the function signature pair.
-    MDNode *RS = dyn_cast<MDNode>(Node->getOperand(1).get());
-
-    if (RS == nullptr) {
+    if (RootElementListNode == nullptr) {
       reportError(Ctx, "Missing Root Element List Metadata node.");
-      continue;
     }
 
-    // Loop through the Root Elements of the root signature.
-    for (const auto &Operand : RS->operands()) {
-      MDNode *Element = dyn_cast<MDNode>(Operand);
-      if (Element == nullptr)
-        return reportError(Ctx, "Missing Root Element Metadata Node.");
+    ModuleRootSignature MRS;
 
-      HasError = HasError || parseRootSignatureElement(Ctx, MRS, Element);
+    if (parse(Ctx, MRS, RootElementListNode) || validate(Ctx, MRS)) {
+      return MRSMap;
     }
-  }
-  return HasError;
-}
 
-static bool validate(LLVMContext *Ctx, ModuleRootSignature *MRS) {
-  if (!dxbc::RootSignatureValidations::isValidRootFlag(MRS->Flags)) {
-    return reportError(Ctx, "Invalid Root Signature flag value");
+    MRSMap.insert(std::make_pair(F, MRS));
   }
-  return false;
-}
 
-static const Function *getEntryFunction(Module &M, ModuleMetadataInfo MMI) {
-
-  LLVMContext *Ctx = &M.getContext();
-  if (MMI.EntryPropertyVec.size() != 1) {
-    reportError(Ctx, "More than one entry function defined.");
-    // needed to stop compilation
-    report_fatal_error("Invalid Root Signature Definition", false);
-    return nullptr;
-  }
-  return MMI.EntryPropertyVec[0].Entry;
+  return MRSMap;
 }
 
-std::optional<ModuleRootSignature>
-ModuleRootSignature::analyzeModule(Module &M, const Function *F) {
-
-  LLVMContext *Ctx = &M.getContext();
+AnalysisKey RootSignatureAnalysis::Key;
 
-  ModuleRootSignature MRS;
+SmallDenseMap<const Function *, ModuleRootSignature>
+RootSignatureAnalysis::run(Module &M, ModuleAnalysisManager &AM) {
+  return analyzeModule(M);
+}
 
-  NamedMDNode *RootSignatureNode = M.getNamedMetadata("dx.rootsignatures");
-  if (RootSignatureNode == nullptr)
-    return std::nullopt;
+//===----------------------------------------------------------------------===//
 
-  if (parse(Ctx, &MRS, RootSignatureNode, F) || validate(Ctx, &MRS)) {
-    // needed to stop compilation
-    report_fatal_error("Invalid Root Signature Definition", false);
-    return std::nullopt;
+static void printSpaces(raw_ostream &Stream, unsigned int Count) {
+  for (unsigned int I = 0; I < Count; ++I) {
+    Stream << ' ';
   }
-
-  return MRS;
 }
 
-AnalysisKey RootSignatureAnalysis::Key;
+PreservedAnalyses RootSignatureAnalysisPrinter::run(Module &M,
+                                                    ModuleAnalysisManager &AM) {
+
+  SmallDenseMap<const Function *, ModuleRootSignature> &MRSMap =
+      AM.getResult<RootSignatureAnalysis>(M);
+  OS << "Root Signature Definitions"
+     << "\n";
+  uint8_t Space = 0;
+  for (const auto &P : MRSMap) {
+    const auto &[Function, MRS] = P;
+    OS << "Definition for '" << Function->getName() << "':\n";
+
+    // start root signature header
+    Space++;
+    printSpaces(OS, Space);
+    OS << "Flags: " << format_hex(MRS.Flags, 8) << ":\n";
+    Space--;
+    // end root signature header
+  }
 
-std::optional<ModuleRootSignature>
-RootSignatureAnalysis::run(Module &M, ModuleAnalysisManager &AM) {
-  ModuleMetadataInfo MMI = AM.getResult<DXILMetadataAnalysis>(M);
-  if (MMI.ShaderProfile == Triple::Library)
-    return std::nullopt;
-  return ModuleRootSignature::analyzeModule(M, getEntryFunction(M, MMI));
+  return PreservedAnalyses::all();
 }
 
 //===----------------------------------------------------------------------===//
 bool RootSignatureAnalysisWrapper::runOnModule(Module &M) {
-  dxil::ModuleMetadataInfo &MMI =
-      getAnalysis<DXILMetadataAnalysisWrapperPass>().getModuleMetadata();
-  if (MMI.ShaderProfile == Triple::Library)
-    return false;
-  MRS = ModuleRootSignature::analyzeModule(M, getEntryFunction(M, MMI));
+  MRS = analyzeModule(M);
   return false;
 }
 
@@ -208,8 +219,8 @@ void RootSignatureAnalysisWrapper::getAnalysisUsage(AnalysisUsage &AU) const {
 char RootSignatureAnalysisWrapper::ID = 0;
 
 INITIALIZE_PASS_BEGIN(RootSignatureAnalysisWrapper,
-                      "dx-root-signature-analysis",
+                      "dxil-root-signature-analysis",
                       "DXIL Root Signature Analysis", true, true)
-INITIALIZE_PASS_DEPENDENCY(DXILMetadataAnalysisWrapperPass)
-INITIALIZE_PASS_END(RootSignatureAnalysisWrapper, "dx-root-signature-analysis",
+INITIALIZE_PASS_END(RootSignatureAnalysisWrapper,
+                    "dxil-root-signature-analysis",
                     "DXIL Root Signature Analysis", true, true)
diff --git a/llvm/lib/Target/DirectX/DXILRootSignature.h b/llvm/lib/Target/DirectX/DXILRootSignature.h
index d97c666f76e9e..992041696c557 100644
--- a/llvm/lib/Target/DirectX/DXILRootSignature.h
+++ b/llvm/lib/Target/DirectX/DXILRootSignature.h
@@ -11,6 +11,7 @@
 ///
 //===----------------------------------------------------------------------===//
 
+#include "llvm/ADT/DenseMap.h"
 #include "llvm/Analysis/DXILMetadataAnalysis.h"
 #include "llvm/IR/DiagnosticInfo.h"
 #include "llvm/IR/Metadata.h"
@@ -25,9 +26,8 @@ namespace dxil {
 enum class RootSignatureElementKind { None = 0, RootFlags = 1 };
 
 struct ModuleRootSignature {
+  ModuleRootSignature() = default;
   uint32_t Flags = 0;
-  static std::optional<ModuleRootSignature> analyzeModule(Module &M,
-                                                          const Function *F);
 };
 
 class RootSignatureAnalysis : public AnalysisInfoMixin<RootSignatureAnalysis> {
@@ -37,9 +37,10 @@ class RootSignatureAnalysis : public AnalysisInfoMixin<RootSignatureAnalysis> {
 public:
   RootSignatureAnalysis() = default;
 
-  using Result = std::optional<ModuleRootSignature>;
+  using Result = SmallDenseMap<const Function *, ModuleRootSignature>;
 
-  std::optional<ModuleRootSignature> run(Module &M, ModuleAnalysisManager &AM);
+  SmallDenseMap<const Function *, ModuleRootSignature>
+  run(Module &M, ModuleAnalysisManager &AM);
 };
 
 /// Wrapper pass for the legacy pass manager.
@@ -48,19 +49,34 @@ class RootSignatureAnalysis : public AnalysisInfoMixin<RootSignatureAnalysis> {
 /// passes which run through the legacy pass manager.
 class RootSignatureAnalysisWrapper : public ModulePass {
 private:
-  std::optional<ModuleRootSignature> MRS;
+  SmallDenseMap<const Function *, ModuleRootSignature> MRS;
 
 public:
   static char ID;
 
   RootSignatureAnalysisWrapper() : ModulePass(ID) {}
 
-  const std::optional<ModuleRootSignature> &getResult() const { return MRS; }
+  bool hasForFunction(const Function *F) { return MRS.find(F) != MRS.end(); }
+
+  ModuleRootSignature getForFunction(const Function *F) {
+    assert(hasForFunction(F));
+    return MRS[F];
+  }
 
   bool runOnModule(Module &M) override;
 
   void getAnalysisUsage(AnalysisUsage &AU) const override;
 };
 
+/// Printer pass for RootSignatureAnalysis results.
+class RootSignatureAnalysisPrinter
+    : public PassInfoMixin<RootSignatureAnalysisPrinter> {
+  raw_ostream &OS;
+
+public:
+  explicit RootSignatureAnalysisPrinter(raw_ostream &OS) : OS(OS) {}
+  PreservedAnalyses run(Module &M, ModuleAnalysisManager &AM);
+};
+
 } // namespace dxil
 } // namespace llvm
diff --git a/llvm/lib/Target/DirectX/DirectXPassRegistry.def b/llvm/lib/Target/DirectX/DirectXPassRegistry.def
index 87591b104ce52..de5087ce1ae2f 100644
--- a/llvm/lib/Target/DirectX/DirectXPassRegistry.def
+++ b/llvm/lib/Target/DirectX/DirectXPassRegistry.def
@@ -18,6 +18,7 @@
 #endif
 MODULE_ANALYSIS("dx-shader-flags", dxil::ShaderFlagsAnalysis())
 MODULE_ANALYSIS("dxil-resource-md", DXILResourceMDAnalysis())
+MODULE_ANALYSIS("dxil-root-signature-analysis", dxil::RootSignatureAnalysis())
 #undef MODULE_ANALYSIS
 
 #ifndef MODULE_PASS
@@ -31,6 +32,7 @@ MODULE_PASS("dxil-pretty-printer", DXILPrettyPrinterPass(dbgs()))
 MODULE_PASS("dxil-translate-metadata", DXILTranslateMetadata())
 // TODO: rename to print<foo> after NPM switch
 MODULE_PASS("print-dx-shader-flags", dxil::ShaderFlagsAnalysisPrinter(dbgs()))
+MODULE_PASS("print<dxil-root-signature>", dxil::RootSignatureAnalysisPrinter(dbgs()))
 #undef MODULE_PASS
 
 #ifndef FUNCTION_PASS
diff --git a/llvm/lib/Target/DirectX/DirectXTargetMachine.cpp b/llvm/lib/Target/DirectX/DirectXTargetMachine.cpp
index 93745d7a5cb0d..a76c07f784177 100644
--- a/llvm/lib/Target/DirectX/DirectXTargetMachine.cpp
+++ b/llvm/lib/Target/DirectX/DirectXTargetMachine.cpp
@@ -19,6 +19,7 @@
 #include "DXILPrettyPrinter.h"
 #include "DXILResourceAccess.h"
 #include "DXILResourceAnalysis.h"
+#include "DXILRootSignature.h"
 #include "DXILShaderFlags.h"
 #include "DXILTranslateMetadata.h"
 #include "DXILWriter/DXILWriterPass.h"
diff --git a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Error.ll b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Error.ll
index 0f0c7cc39d73b..44a012c92c9d7 100644
--- a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Error.ll
+++ b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Error.ll
@@ -1,8 +1,9 @@
-; RUN: not llc %s --filetype=obj -o - 2>&1 | FileCheck %s
+; 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 format for Root Signature Definition. Pairs of function, root signature expected.
+; CHECK-NO: Root Signature Definitions
 
 
 define void @main() #0 {
diff --git a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Flags-Error.ll b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Flags-Error.ll
index 31e9db6f36e5e..d839c9f825d1d 100644
--- a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Flags-Error.ll
+++ b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Flags-Error.ll
@@ -1,8 +1,9 @@
-; RUN: not llc %s --filetype=obj -o - 2>&1 | FileCheck %s
+; RUN: not opt -passes='print<dxil-root-signature>' %s -S -o - 2>&1 | FileCheck %s
 
 target triple = "dxil-unknown-shadermodel6.0-compute"
 
 ; CHECK: error: Invalid Root Element: NOTRootFlags
+; CHECK-NO: Root Signature Definitions
 
 
 define void @main() #0 {
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 43c9ecbd36570..0a2fb552af278 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,7 @@
-; RUN: not llc %s --filetype=obj -o - 2>&1 | FileCheck %s
+; RUN: not opt -passes='print<dxil-root-signature>' %s -S -o - 2>&1 | FileCheck %s
 
 ; CHECK: error: Invalid Root Signature flag value
+; CHECK-NO: Root Signature Definitions
 
 target triple = "dxil-unknown-shadermodel6.0-compute"
 
diff --git a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-MultipleEntryFunctions-Error.ll b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-MultipleEntryFunctions-Error.ll
deleted file mode 100644
index d6e2030cb6fda..0000000000000
--- a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-MultipleEntryFunctions-Error.ll
+++ /dev/null
@@ -1,27 +0,0 @@
-; RUN: not llc %s --filetype=obj -o - 2>&1 | FileCheck %s
-
-; CHECK: error: More than one entry function defined
-
-target triple = "dxil-unknown-shadermodel6.0-compute"
-
-
-define void @main() #0 {
-entry:
-  ret void
-}
-
-define void @anotherMain() #1 {
-entry:
-  ret void
-}
-
-attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" }
-attributes #1 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" }
-
-!dx.rootsignatures = !{!2, !5} ; list of function/root signature pairs
-!2 = !{ ptr @main, !3 } ; function, root signature
-!3 = !{ !4 } ; list of root signature elements
-!4 = !{ !"RootFlags", i32 1 } ; 1 = allow_input_assembler_input_layout
-!5 = !{ ptr @anotherMain, !6 } ; function, root signature
-!6 = !{ !7 } ; list of root signature elements
-!7 = !{ !"RootFlags", i32 2 } ; 1 = allow_input_assembler_input_layout
diff --git a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-MultipleEntryFunctions.ll b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-MultipleEntryFunctions.ll
index eb3c738a5fc03..f81927d9229f9 100644
--- a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-MultipleEntryFunctions.ll
+++ b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-MultipleEntryFunctions.ll
@@ -1,9 +1,9 @@
-; RUN: llc %s --filetype=obj -o - | obj2yaml | FileCheck %s
+; RUN: opt -passes='print<dxil-root-signature>' %s -S -o - 2>&1 | FileCheck %s
 
 target triple = "dxil-unknown-shadermodel6.0-compute"
 
 
-define void @main() {
+define void @main() #0 {
 entry:
   ret void
 }
@@ -24,12 +24,8 @@ attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" }
 !7 = !{ !"RootFlags", i32 2 } ; 1 = allow_input_assembler_input_layout
 
 
-; CHECK:  - Name:            RTS0
-; CHECK-NEXT:    Size:            24
-; CHECK-NEXT:    RootSignature:
-; CHECK-NEXT:      Version:         2
-; CHECK-NEXT:      NumParameters:   0
-; CHECK-NEXT:      RootParametersOffset: 0
-; CHECK-NEXT:      NumStaticSamplers: 0
-; CHECK-NEXT:      StaticSamplersOffset: 0
-; CHECK-NEXT:      DenyVertexShaderRootAccess: true
+; CHECK: Root Signature Definitions
+; CHECK-NEXT: Definition for 'main':
+; CHECK-NEXT:  Flags: 0x000001:
+; CHECK-NEXT: Definition for 'anotherMain':
+; CHECK-NEXT:  Flags: 0x000002:
diff --git a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootElement-Error.ll b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootElement-Error.ll
index 80f969e849d25..3680c162a4f5c 100644
--- a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootElement-Error.ll
+++ b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootElement-Error.ll
@@ -1,8 +1,9 @@
-; RUN: not llc %s --filetype=obj -o - 2>&1 | FileCheck %s
+; RUN: not opt -passes='print<dxil-root-signature>' %s -S -o - 2>&1 | FileCheck %s
 
 target triple = "dxil-unknown-shadermodel6.0-compute"
 
 ; CHECK: error: Missing Root Element Metadata Node.
+; CHECK-NO: Root Signature Definitions
 
 
 define void @main() #0 {

>From a5a2093a6e386bb831a053e6d56fb7034a745eba Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Wed, 12 Feb 2025 23:27:11 +0000
Subject: [PATCH 64/64] addressing pr comments

---
 llvm/lib/Object/DXContainer.cpp               | 12 +++++-
 llvm/lib/Target/DirectX/DXILRootSignature.cpp | 38 +++++++++----------
 llvm/lib/Target/DirectX/DXILRootSignature.h   |  1 -
 .../RootSignature-Flags-Error.ll              |  2 +-
 llvm/unittests/Object/DXContainerTest.cpp     | 11 ++++--
 5 files changed, 36 insertions(+), 28 deletions(-)

diff --git a/llvm/lib/Object/DXContainer.cpp b/llvm/lib/Object/DXContainer.cpp
index 4632d43ea7252..30a8d5264e86e 100644
--- a/llvm/lib/Object/DXContainer.cpp
+++ b/llvm/lib/Object/DXContainer.cpp
@@ -7,10 +7,12 @@
 //===----------------------------------------------------------------------===//
 
 #include "llvm/Object/DXContainer.h"
+#include "llvm/ADT/Twine.h"
 #include "llvm/BinaryFormat/DXContainer.h"
 #include "llvm/Object/Error.h"
 #include "llvm/Support/Alignment.h"
 #include "llvm/Support/Endian.h"
+#include "llvm/Support/Error.h"
 #include "llvm/Support/FormatVariadic.h"
 
 using namespace llvm;
@@ -20,6 +22,10 @@ static Error parseFailed(const Twine &Msg) {
   return make_error<GenericBinaryError>(Msg.str(), object_error::parse_failed);
 }
 
+static Error validationFailed(const Twine &Msg) {
+  return make_error<StringError>(Msg.str(), inconvertibleErrorCode());
+}
+
 template <typename T>
 static Error readStruct(StringRef Buffer, const char *Src, T &Struct) {
   // Don't read before the beginning or past the end of the file
@@ -255,7 +261,8 @@ Error DirectX::RootSignature::parse(StringRef Data) {
   Current += sizeof(uint32_t);
 
   if (!dxbc::RootSignatureValidations::isValidVersion(VValue))
-    return make_error<GenericBinaryError>("Invalid Root Signature Version");
+    return validationFailed("unsupported root signature version read: " +
+                            llvm::Twine(VValue));
   Version = VValue;
 
   NumParameters =
@@ -279,7 +286,8 @@ Error DirectX::RootSignature::parse(StringRef Data) {
   Current += sizeof(uint32_t);
 
   if (!dxbc::RootSignatureValidations::isValidRootFlag(FValue))
-    return make_error<GenericBinaryError>("Invalid Root Signature flag");
+    return validationFailed("unsupported root signature flag value read: " +
+                            llvm::Twine(FValue));
   Flags = FValue;
 
   return Error::success();
diff --git a/llvm/lib/Target/DirectX/DXILRootSignature.cpp b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
index cf474a4ba23cb..ecca7abfe3e99 100644
--- a/llvm/lib/Target/DirectX/DXILRootSignature.cpp
+++ b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
@@ -1,4 +1,4 @@
-//===- DXILRootSignature.cpp - DXIL Root Signature helper objects ----===//
+//===- DXILRootSignature.cpp - DXIL Root Signature helper objects -------===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
@@ -68,8 +68,8 @@ static bool parseRootSignatureElement(LLVMContext *Ctx,
   case RootSignatureElementKind::RootFlags:
     return parseRootFlags(Ctx, MRS, Element);
   case RootSignatureElementKind::None:
-    return reportError(Ctx,
-                       "Invalid Root Element: " + ElementText->getString());
+    return reportError(Ctx, "Invalid Root Signature Element: " +
+                                ElementText->getString());
   }
 
   llvm_unreachable("Root signature element kind not expected.");
@@ -78,20 +78,6 @@ static bool parseRootSignatureElement(LLVMContext *Ctx,
 static bool parse(LLVMContext *Ctx, ModuleRootSignature &MRS, MDNode *Node) {
   bool HasError = false;
 
-  /** Root Signature are specified as following in the metadata:
-
-      !dx.rootsignatures = !{!2} ; list of function/root signature pairs
-      !2 = !{ ptr @main, !3 } ; function, root signature
-      !3 = !{ !4, !5, !6, !7 } ; list of root signature elements
-
-      So for each MDNode inside dx.rootsignatures NamedMDNode
-      (the Root parameter of this function), the parsing process needs
-      to loop through each of its operands and process the function,
-      signature pair.
-   */
-
-  // Get the Root Signature Description from the function signature pair.
-
   // Loop through the Root Elements of the root signature.
   for (const auto &Operand : Node->operands()) {
     MDNode *Element = dyn_cast<MDNode>(Operand);
@@ -114,6 +100,18 @@ static bool validate(LLVMContext *Ctx, const ModuleRootSignature &MRS) {
 static SmallDenseMap<const Function *, ModuleRootSignature>
 analyzeModule(Module &M) {
 
+  /** Root Signature are specified as following in the metadata:
+
+    !dx.rootsignatures = !{!2} ; list of function/root signature pairs
+    !2 = !{ ptr @main, !3 } ; function, root signature
+    !3 = !{ !4, !5, !6, !7 } ; list of root signature elements
+
+    So for each MDNode inside dx.rootsignatures NamedMDNode
+    (the Root parameter of this function), the parsing process needs
+    to loop through each of its operands and process the function,
+    signature pair.
+ */
+
   LLVMContext *Ctx = &M.getContext();
 
   SmallDenseMap<const Function *, ModuleRootSignature> MRSMap;
@@ -129,22 +127,22 @@ analyzeModule(Module &M) {
       continue;
     }
 
+    // Function was pruned during compilation.
     const MDOperand &FunctionPointerMdNode = RSDefNode->getOperand(0);
     if (FunctionPointerMdNode == nullptr) {
-      // Function was pruned during compilation.
       continue;
     }
 
     ValueAsMetadata *VAM =
         llvm::dyn_cast<ValueAsMetadata>(FunctionPointerMdNode.get());
     if (VAM == nullptr) {
-      reportError(Ctx, "First element of root signature is not a value");
+      reportError(Ctx, "First element of root signature is not a Value");
       continue;
     }
 
     Function *F = dyn_cast<Function>(VAM->getValue());
     if (F == nullptr) {
-      reportError(Ctx, "First element of root signature is not a function");
+      reportError(Ctx, "First element of root signature is not a Function");
       continue;
     }
 
diff --git a/llvm/lib/Target/DirectX/DXILRootSignature.h b/llvm/lib/Target/DirectX/DXILRootSignature.h
index 992041696c557..95970f2048767 100644
--- a/llvm/lib/Target/DirectX/DXILRootSignature.h
+++ b/llvm/lib/Target/DirectX/DXILRootSignature.h
@@ -18,7 +18,6 @@
 #include "llvm/IR/Module.h"
 #include "llvm/IR/PassManager.h"
 #include "llvm/Pass.h"
-#include <optional>
 
 namespace llvm {
 namespace dxil {
diff --git a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Flags-Error.ll b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Flags-Error.ll
index d839c9f825d1d..25599d4d345b9 100644
--- a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Flags-Error.ll
+++ b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Flags-Error.ll
@@ -2,7 +2,7 @@
 
 target triple = "dxil-unknown-shadermodel6.0-compute"
 
-; CHECK: error: Invalid Root Element: NOTRootFlags
+; CHECK: error: Invalid Root Signature Element: NOTRootFlags
 ; CHECK-NO: Root Signature Definitions
 
 
diff --git a/llvm/unittests/Object/DXContainerTest.cpp b/llvm/unittests/Object/DXContainerTest.cpp
index aae111597c7a0..5a73f32ab7c32 100644
--- a/llvm/unittests/Object/DXContainerTest.cpp
+++ b/llvm/unittests/Object/DXContainerTest.cpp
@@ -870,8 +870,9 @@ TEST(RootSignature, ParseRootFlags) {
         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
         0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
     };
-    EXPECT_THAT_EXPECTED(DXContainer::create(getMemoryBuffer<68>(Buffer)),
-                         FailedWithMessage("Invalid Root Signature Version"));
+    EXPECT_THAT_EXPECTED(
+        DXContainer::create(getMemoryBuffer<100>(Buffer)),
+        FailedWithMessage("unsupported root signature version read: 3"));
   }
   {
     // Flag has been set to an invalid value
@@ -883,7 +884,9 @@ TEST(RootSignature, ParseRootFlags) {
         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
         0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0xFF,
     };
-    EXPECT_THAT_EXPECTED(DXContainer::create(getMemoryBuffer<68>(Buffer)),
-                         FailedWithMessage("Invalid Root Signature flag"));
+    EXPECT_THAT_EXPECTED(
+        DXContainer::create(getMemoryBuffer<100>(Buffer)),
+        FailedWithMessage(
+            "unsupported root signature flag value read: 4278190081"));
   }
 }



More information about the llvm-commits mailing list