[llvm] [HLSL] Add descriptor table metadata parsing (PR #142492)

Justin Bogner via llvm-commits llvm-commits at lists.llvm.org
Wed Jun 18 13:33:28 PDT 2025


================
@@ -391,58 +564,68 @@ PreservedAnalyses RootSignatureAnalysisPrinter::run(Module &M,
     OS << "Definition for '" << F.getName() << "':\n";
 
     // start root signature header
-    Space++;
-    OS << indent(Space) << "Flags: " << format_hex(RS.Flags, 8) << "\n";
-    OS << indent(Space) << "Version: " << RS.Version << "\n";
-    OS << indent(Space) << "RootParametersOffset: " << RS.RootParameterOffset
-       << "\n";
-    OS << indent(Space) << "NumParameters: " << RS.ParametersContainer.size()
-       << "\n";
-    Space++;
+    OS << "Flags: " << format_hex(RS.Flags, 8) << "\n";
+    OS << "Version: " << RS.Version << "\n";
+    OS << "RootParametersOffset: " << RS.RootParameterOffset << "\n";
+    OS << "NumParameters: " << RS.ParametersContainer.size() << "\n";
     for (size_t I = 0; I < RS.ParametersContainer.size(); I++) {
       const auto &[Type, Loc] =
           RS.ParametersContainer.getTypeAndLocForParameter(I);
       const dxbc::RTS0::v1::RootParameterHeader Header =
           RS.ParametersContainer.getHeader(I);
 
-      OS << indent(Space) << "- Parameter Type: " << Type << "\n";
-      OS << indent(Space + 2)
-         << "Shader Visibility: " << Header.ShaderVisibility << "\n";
+      OS << "- Parameter Type: " << Type << "\n";
+      OS << indent(2) << "Shader Visibility: " << Header.ShaderVisibility
+         << "\n";
 
       switch (Type) {
       case llvm::to_underlying(dxbc::RootParameterType::Constants32Bit): {
         const dxbc::RTS0::v1::RootConstants &Constants =
             RS.ParametersContainer.getConstant(Loc);
-        OS << indent(Space + 2) << "Register Space: " << Constants.RegisterSpace
+        OS << indent(2) << "Register Space: " << Constants.RegisterSpace
+           << "\n";
+        OS << indent(2) << "Shader Register: " << Constants.ShaderRegister
+           << "\n";
+        OS << indent(2) << "Num 32 Bit Values: " << Constants.Num32BitValues
            << "\n";
-        OS << indent(Space + 2)
-           << "Shader Register: " << Constants.ShaderRegister << "\n";
-        OS << indent(Space + 2)
-           << "Num 32 Bit Values: " << Constants.Num32BitValues << "\n";
         break;
       }
       case llvm::to_underlying(dxbc::RootParameterType::CBV):
       case llvm::to_underlying(dxbc::RootParameterType::UAV):
       case llvm::to_underlying(dxbc::RootParameterType::SRV): {
         const dxbc::RTS0::v2::RootDescriptor &Descriptor =
             RS.ParametersContainer.getRootDescriptor(Loc);
-        OS << indent(Space + 2)
-           << "Register Space: " << Descriptor.RegisterSpace << "\n";
-        OS << indent(Space + 2)
-           << "Shader Register: " << Descriptor.ShaderRegister << "\n";
+        OS << indent(2) << "Register Space: " << Descriptor.RegisterSpace
+           << "\n";
+        OS << indent(2) << "Shader Register: " << Descriptor.ShaderRegister
+           << "\n";
         if (RS.Version > 1)
-          OS << indent(Space + 2) << "Flags: " << Descriptor.Flags << "\n";
+          OS << indent(2) << "Flags: " << Descriptor.Flags << "\n";
+        break;
+      }
+      case llvm::to_underlying(dxbc::RootParameterType::DescriptorTable): {
+        const mcdxbc::DescriptorTable &Table =
+            RS.ParametersContainer.getDescriptorTable(Loc);
+        OS << indent(2) << "NumRanges: " << Table.Ranges.size() << "\n";
+
+        for (const dxbc::RTS0::v2::DescriptorRange Range : Table) {
+          OS << indent(2) << "- Range Type: " << Range.RangeType << "\n";
+          OS << indent(4) << "Register Space: " << Range.RegisterSpace << "\n";
+          OS << indent(4)
+             << "Base Shader Register: " << Range.BaseShaderRegister << "\n";
+          OS << indent(4) << "Num Descriptors: " << Range.NumDescriptors
+             << "\n";
+          OS << indent(4) << "Offset In Descriptors From Table Start: "
+             << Range.OffsetInDescriptorsFromTableStart << "\n";
+          if (RS.Version > 1)
+            OS << indent(4) << "Flags: " << Range.Flags << "\n";
----------------
bogner wrote:

Maybe it's just me, but I find using the `indent()` function with a small constant to be quite a bit less clear than just putting the spaces in the strings. Consider:
```c++
          OS << "  - Range Type: " << Range.RangeType << "\n"
             << "    Register Space: " << Range.RegisterSpace << "\n"
             << "    Base Shader Register: " << Range.BaseShaderRegister << "\n"
             << "    Num Descriptors: " << Range.NumDescriptors << "\n"
             << "    Offset In Descriptors From Table Start: "
             << Range.OffsetInDescriptorsFromTableStart << "\n";
          if (RS.Version > 1)
            OS << "    Flags: " << Range.Flags << "\n";
```

Here, you can see how the strings line up just by looking at them. Though admittedly it can get a bit messier with longer lines. IMO `indent()` is mostly useful when the indentation varies depending on context, or is large enough that just writing it out makes things less readable.

https://github.com/llvm/llvm-project/pull/142492


More information about the llvm-commits mailing list