[llvm] 30463fb - [HLSL] Leave out entryname from string table for PSV versions < 3 (#191528)

via llvm-commits llvm-commits at lists.llvm.org
Fri May 1 15:46:54 PDT 2026


Author: Joshua Batista
Date: 2026-05-01T15:46:50-07:00
New Revision: 30463fbc4cd49bc1caa02bf799da5226dd5d7927

URL: https://github.com/llvm/llvm-project/commit/30463fbc4cd49bc1caa02bf799da5226dd5d7927
DIFF: https://github.com/llvm/llvm-project/commit/30463fbc4cd49bc1caa02bf799da5226dd5d7927.diff

LOG: [HLSL] Leave out entryname from string table for PSV versions < 3 (#191528)

This PR adjusts how the string table is generated for PSV versions 1 and
2. Previously, the
string name would be unconditionally added to the string table, when it
should only be added in version 3.
Adds a test to verify there is no entry name in the string table for
older PSV versions.
Fixes https://github.com/llvm/llvm-project/issues/117267

Assisted by: Github Copilot

Added: 
    

Modified: 
    llvm/include/llvm/BinaryFormat/DXContainer.h
    llvm/include/llvm/MC/DXContainerPSVInfo.h
    llvm/include/llvm/ObjectYAML/DXContainerYAML.h
    llvm/lib/MC/DXContainerPSVInfo.cpp
    llvm/lib/MC/StringTableBuilder.cpp
    llvm/lib/ObjectYAML/DXContainerEmitter.cpp
    llvm/lib/ObjectYAML/DXContainerYAML.cpp
    llvm/test/ObjectYAML/DXContainer/PSVv1-amplification.yaml
    llvm/test/ObjectYAML/DXContainer/PSVv1-compute.yaml
    llvm/test/ObjectYAML/DXContainer/PSVv1-domain.yaml
    llvm/test/ObjectYAML/DXContainer/PSVv1-geometry.yaml
    llvm/test/ObjectYAML/DXContainer/PSVv1-hull.yaml
    llvm/test/ObjectYAML/DXContainer/PSVv1-mesh.yaml
    llvm/test/ObjectYAML/DXContainer/PSVv1-pixel.yaml
    llvm/test/ObjectYAML/DXContainer/PSVv1-vertex.yaml
    llvm/test/ObjectYAML/DXContainer/PSVv2-amplification.yaml
    llvm/test/ObjectYAML/DXContainer/PSVv2-compute.yaml
    llvm/test/ObjectYAML/DXContainer/PSVv2-domain.yaml
    llvm/test/ObjectYAML/DXContainer/PSVv2-geometry.yaml
    llvm/test/ObjectYAML/DXContainer/PSVv2-hull.yaml
    llvm/test/ObjectYAML/DXContainer/PSVv2-mesh.yaml
    llvm/test/ObjectYAML/DXContainer/PSVv2-pixel.yaml
    llvm/test/ObjectYAML/DXContainer/PSVv2-vertex.yaml
    llvm/test/ObjectYAML/DXContainer/PSVv3-amplification.yaml
    llvm/test/ObjectYAML/DXContainer/PSVv3-compute.yaml
    llvm/test/ObjectYAML/DXContainer/PSVv3-domain.yaml
    llvm/test/ObjectYAML/DXContainer/PSVv3-geometry.yaml
    llvm/test/ObjectYAML/DXContainer/PSVv3-hull.yaml
    llvm/test/ObjectYAML/DXContainer/PSVv3-mesh.yaml
    llvm/test/ObjectYAML/DXContainer/PSVv3-pixel.yaml
    llvm/test/ObjectYAML/DXContainer/PSVv3-vertex.yaml
    llvm/tools/obj2yaml/dxcontainer2yaml.cpp
    llvm/unittests/Object/CMakeLists.txt
    llvm/unittests/Object/DXContainerTest.cpp

Removed: 
    


################################################################################
diff  --git a/llvm/include/llvm/BinaryFormat/DXContainer.h b/llvm/include/llvm/BinaryFormat/DXContainer.h
index 1756ab0b555ff..99bd32a2ff87a 100644
--- a/llvm/include/llvm/BinaryFormat/DXContainer.h
+++ b/llvm/include/llvm/BinaryFormat/DXContainer.h
@@ -562,6 +562,8 @@ struct ResourceBindInfo : public v0::ResourceBindInfo {
 
 namespace v3 {
 struct RuntimeInfo : public v2::RuntimeInfo {
+  // Offset into the string table, which is stored separately in the PSV0 part.
+  // The entry name string itself is not stored in the RuntimeInfo record.
   uint32_t EntryNameOffset;
 
   void swapBytes() {

diff  --git a/llvm/include/llvm/MC/DXContainerPSVInfo.h b/llvm/include/llvm/MC/DXContainerPSVInfo.h
index eb6d9e14d92c3..1129f520be2cc 100644
--- a/llvm/include/llvm/MC/DXContainerPSVInfo.h
+++ b/llvm/include/llvm/MC/DXContainerPSVInfo.h
@@ -68,7 +68,7 @@ struct PSVRuntimeInfo {
   std::array<SmallVector<uint32_t>, 4> InputOutputMap;
   SmallVector<uint32_t> InputPatchMap;
   SmallVector<uint32_t> PatchOutputMap;
-  llvm::StringRef EntryName;
+  StringRef EntryName;
 
   // Serialize PSVInfo into the provided raw_ostream. The version field
   // specifies the data version to encode, the default value specifies encoding
@@ -76,7 +76,8 @@ struct PSVRuntimeInfo {
   void write(raw_ostream &OS,
              uint32_t Version = std::numeric_limits<uint32_t>::max()) const;
 
-  void finalize(Triple::EnvironmentType Stage);
+  void finalize(Triple::EnvironmentType Stage,
+                uint32_t Version = std::numeric_limits<uint32_t>::max());
 
 private:
   SmallVector<uint32_t, 64> IndexBuffer;

diff  --git a/llvm/include/llvm/ObjectYAML/DXContainerYAML.h b/llvm/include/llvm/ObjectYAML/DXContainerYAML.h
index fbfe3069566d3..e95e047f546d7 100644
--- a/llvm/include/llvm/ObjectYAML/DXContainerYAML.h
+++ b/llvm/include/llvm/ObjectYAML/DXContainerYAML.h
@@ -240,6 +240,11 @@ struct SignatureElement {
   uint8_t Stream;
 };
 
+struct StringTableEntry {
+  StringRef String;
+  uint32_t Offset;
+};
+
 struct PSVInfo {
   // The version field isn't actually encoded in the file, but it is inferred by
   // the size of data regions. We include it in the yaml because it simplifies
@@ -262,6 +267,10 @@ struct PSVInfo {
 
   StringRef EntryName;
 
+  // Output-only fields populated by obj2yaml for inspection.
+  SmallVector<StringTableEntry> StringTable;
+  uint32_t RuntimeInfoSize = 0;
+
   LLVM_ABI void mapInfoForVersion(yaml::IO &IO);
 
   LLVM_ABI PSVInfo();
@@ -316,6 +325,7 @@ LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::DXContainerYAML::SignatureParameter)
 LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::DXContainerYAML::RootParameterLocationYaml)
 LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::DXContainerYAML::DescriptorRangeYaml)
 LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::DXContainerYAML::StaticSamplerYamlDesc)
+LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::DXContainerYAML::StringTableEntry)
 LLVM_YAML_DECLARE_ENUM_TRAITS(llvm::dxbc::PSV::SemanticKind)
 LLVM_YAML_DECLARE_ENUM_TRAITS(llvm::dxbc::PSV::ComponentType)
 LLVM_YAML_DECLARE_ENUM_TRAITS(llvm::dxbc::PSV::InterpolationMode)
@@ -384,6 +394,10 @@ template <> struct MappingTraits<DXContainerYAML::SignatureElement> {
                                llvm::DXContainerYAML::SignatureElement &El);
 };
 
+template <> struct MappingTraits<DXContainerYAML::StringTableEntry> {
+  static void mapping(IO &IO, DXContainerYAML::StringTableEntry &E);
+};
+
 template <> struct MappingTraits<DXContainerYAML::SignatureParameter> {
   LLVM_ABI static void mapping(IO &IO,
                                llvm::DXContainerYAML::SignatureParameter &El);

diff  --git a/llvm/lib/MC/DXContainerPSVInfo.cpp b/llvm/lib/MC/DXContainerPSVInfo.cpp
index f70c8b1af01b3..a6aa556535b48 100644
--- a/llvm/lib/MC/DXContainerPSVInfo.cpp
+++ b/llvm/lib/MC/DXContainerPSVInfo.cpp
@@ -146,7 +146,7 @@ void PSVRuntimeInfo::write(raw_ostream &OS, uint32_t Version) const {
                                llvm::endianness::little);
 }
 
-void PSVRuntimeInfo::finalize(Triple::EnvironmentType Stage) {
+void PSVRuntimeInfo::finalize(Triple::EnvironmentType Stage, uint32_t Version) {
   IsFinalized = true;
   BaseData.SigInputElements = static_cast<uint32_t>(InputElements.size());
   BaseData.SigOutputElements = static_cast<uint32_t>(OutputElements.size());
@@ -164,7 +164,8 @@ void PSVRuntimeInfo::finalize(Triple::EnvironmentType Stage) {
   ProcessElementList(DXConStrTabBuilder, IndexBuffer, SignatureElements,
                      SemanticNames, PatchOrPrimElements);
 
-  DXConStrTabBuilder.add(EntryName);
+  if (Version >= 3 && !EntryName.empty())
+    DXConStrTabBuilder.add(EntryName);
 
   DXConStrTabBuilder.finalize();
   for (auto ElAndName : zip(SignatureElements, SemanticNames)) {
@@ -175,8 +176,9 @@ void PSVRuntimeInfo::finalize(Triple::EnvironmentType Stage) {
       El.swapBytes();
   }
 
-  BaseData.EntryNameOffset =
-      static_cast<uint32_t>(DXConStrTabBuilder.getOffset(EntryName));
+  if (Version >= 3 && !EntryName.empty())
+    BaseData.EntryNameOffset =
+        static_cast<uint32_t>(DXConStrTabBuilder.getOffset(EntryName));
 
   if (!sys::IsBigEndianHost)
     return;

diff  --git a/llvm/lib/MC/StringTableBuilder.cpp b/llvm/lib/MC/StringTableBuilder.cpp
index f2b82998f2457..eb1a62f1f6412 100644
--- a/llvm/lib/MC/StringTableBuilder.cpp
+++ b/llvm/lib/MC/StringTableBuilder.cpp
@@ -201,7 +201,7 @@ void StringTableBuilder::finalizeStringTable(bool Optimize) {
   // specification. In 'initSize()' we reserved the first byte to hold null for
   // this purpose and here we actually add the string to allow 'getOffset()' to
   // be called on an empty string.
-  if (K == ELF)
+  if (K == ELF || K == DXContainer)
     StringIndexMap[CachedHashStringRef("")] = 0;
 }
 

diff  --git a/llvm/lib/ObjectYAML/DXContainerEmitter.cpp b/llvm/lib/ObjectYAML/DXContainerEmitter.cpp
index b00e45d912be1..312c74befd752 100644
--- a/llvm/lib/ObjectYAML/DXContainerEmitter.cpp
+++ b/llvm/lib/ObjectYAML/DXContainerEmitter.cpp
@@ -242,7 +242,8 @@ Error DXContainerWriter::writeParts(raw_ostream &OS) {
                                 P.Info->PatchOutputMap.end());
 
       PSV.finalize(static_cast<Triple::EnvironmentType>(
-          Triple::Pixel + P.Info->Info.ShaderStage));
+                       Triple::Pixel + P.Info->Info.ShaderStage),
+                   P.Info->Version);
       PSV.write(OS, P.Info->Version);
       break;
     }

diff  --git a/llvm/lib/ObjectYAML/DXContainerYAML.cpp b/llvm/lib/ObjectYAML/DXContainerYAML.cpp
index 15f614871f57e..f81bf5f55cddd 100644
--- a/llvm/lib/ObjectYAML/DXContainerYAML.cpp
+++ b/llvm/lib/ObjectYAML/DXContainerYAML.cpp
@@ -374,6 +374,10 @@ void MappingTraits<DXContainerYAML::PSVInfo>::mapping(
   PSV.mapInfoForVersion(IO);
 
   IO.mapRequired("ResourceStride", PSV.ResourceStride);
+  if (PSV.Version > 0) {
+    IO.mapOptional("RuntimeInfoSize", PSV.RuntimeInfoSize);
+    IO.mapOptional("StringTable", PSV.StringTable);
+  }
   IO.mapRequired("Resources", PSV.Resources);
   if (PSV.Version == 0)
     return;
@@ -586,6 +590,12 @@ void MappingTraits<DXContainerYAML::SignatureElement>::mapping(
   IO.mapRequired("Stream", El.Stream);
 }
 
+void MappingTraits<DXContainerYAML::StringTableEntry>::mapping(
+    IO &IO, DXContainerYAML::StringTableEntry &E) {
+  IO.mapRequired("String", E.String);
+  IO.mapRequired("Offset", E.Offset);
+}
+
 void ScalarEnumerationTraits<dxbc::PSV::SemanticKind>::enumeration(
     IO &IO, dxbc::PSV::SemanticKind &Value) {
   for (const auto &E : dxbc::PSV::getSemanticKinds())

diff  --git a/llvm/test/ObjectYAML/DXContainer/PSVv1-amplification.yaml b/llvm/test/ObjectYAML/DXContainer/PSVv1-amplification.yaml
index beb85ee982820..9d58718a71004 100644
--- a/llvm/test/ObjectYAML/DXContainer/PSVv1-amplification.yaml
+++ b/llvm/test/ObjectYAML/DXContainer/PSVv1-amplification.yaml
@@ -61,6 +61,7 @@ Parts:
 # CHECK-NEXT: SigInputVectors: 0
 # CHECK-NEXT: SigOutputVectors: [ 8, 16, 32, 64 ]
 # CHECK-NEXT: ResourceStride: 16
+# CHECK-NEXT: RuntimeInfoSize: 36
 # CHECK-NEXT: Resources:
 # CHECK-NEXT: - Type:            Sampler
 # CHECK-NEXT: Space:           2

diff  --git a/llvm/test/ObjectYAML/DXContainer/PSVv1-compute.yaml b/llvm/test/ObjectYAML/DXContainer/PSVv1-compute.yaml
index 6c90fbb206c6a..ecdcb976ce660 100644
--- a/llvm/test/ObjectYAML/DXContainer/PSVv1-compute.yaml
+++ b/llvm/test/ObjectYAML/DXContainer/PSVv1-compute.yaml
@@ -59,6 +59,7 @@ Parts:
 # CHECK-NEXT: SigInputVectors: 0
 # CHECK-NEXT: SigOutputVectors: [ 8, 16, 32, 64 ]
 # CHECK-NEXT: ResourceStride: 16
+# CHECK-NEXT: RuntimeInfoSize: 36
 # CHECK-NEXT: Resources:
 # CHECK-NEXT: - Type:            Sampler
 # CHECK-NEXT: Space:           2

diff  --git a/llvm/test/ObjectYAML/DXContainer/PSVv1-domain.yaml b/llvm/test/ObjectYAML/DXContainer/PSVv1-domain.yaml
index 28a4884d1228f..2122f4dced05a 100644
--- a/llvm/test/ObjectYAML/DXContainer/PSVv1-domain.yaml
+++ b/llvm/test/ObjectYAML/DXContainer/PSVv1-domain.yaml
@@ -68,6 +68,7 @@ Parts:
 # CHECK-NEXT: SigInputVectors: 0
 # CHECK-NEXT: SigOutputVectors: [ 0, 16, 32, 64 ]
 # CHECK-NEXT: ResourceStride: 16
+# CHECK-NEXT: RuntimeInfoSize: 36
 # CHECK-NEXT: Resources:
 # CHECK-NEXT: - Type:            Sampler
 # CHECK-NEXT: Space:           2

diff  --git a/llvm/test/ObjectYAML/DXContainer/PSVv1-geometry.yaml b/llvm/test/ObjectYAML/DXContainer/PSVv1-geometry.yaml
index 2884fd75e73d5..54204c5d5ea5d 100644
--- a/llvm/test/ObjectYAML/DXContainer/PSVv1-geometry.yaml
+++ b/llvm/test/ObjectYAML/DXContainer/PSVv1-geometry.yaml
@@ -69,6 +69,7 @@ Parts:
 # CHECK-NEXT: SigInputVectors: 0
 # CHECK-NEXT: SigOutputVectors: [ 8, 16, 32, 64 ]
 # CHECK-NEXT: ResourceStride: 16
+# CHECK-NEXT: RuntimeInfoSize: 36
 # CHECK-NEXT: Resources:
 # CHECK-NEXT: - Type:            Sampler
 # CHECK-NEXT: Space:           2

diff  --git a/llvm/test/ObjectYAML/DXContainer/PSVv1-hull.yaml b/llvm/test/ObjectYAML/DXContainer/PSVv1-hull.yaml
index 0e71276ad1c16..53f3b859e90a9 100644
--- a/llvm/test/ObjectYAML/DXContainer/PSVv1-hull.yaml
+++ b/llvm/test/ObjectYAML/DXContainer/PSVv1-hull.yaml
@@ -70,6 +70,7 @@ Parts:
 # CHECK-NEXT: SigInputVectors: 0
 # CHECK-NEXT: SigOutputVectors: [ 0, 16, 32, 64 ]
 # CHECK-NEXT: ResourceStride: 16
+# CHECK-NEXT: RuntimeInfoSize: 36
 # CHECK-NEXT: Resources:
 # CHECK-NEXT: - Type:            Sampler
 # CHECK-NEXT: Space:           2

diff  --git a/llvm/test/ObjectYAML/DXContainer/PSVv1-mesh.yaml b/llvm/test/ObjectYAML/DXContainer/PSVv1-mesh.yaml
index 1af47f95c5e72..77142c4aaa8d7 100644
--- a/llvm/test/ObjectYAML/DXContainer/PSVv1-mesh.yaml
+++ b/llvm/test/ObjectYAML/DXContainer/PSVv1-mesh.yaml
@@ -73,6 +73,7 @@ Parts:
 # CHECK-NEXT: SigInputVectors: 0
 # CHECK-NEXT: SigOutputVectors: [ 8, 16, 32, 64 ]
 # CHECK-NEXT: ResourceStride: 16
+# CHECK-NEXT: RuntimeInfoSize: 36
 # CHECK-NEXT: Resources:
 # CHECK-NEXT: - Type:            Sampler
 # CHECK-NEXT: Space:           2

diff  --git a/llvm/test/ObjectYAML/DXContainer/PSVv1-pixel.yaml b/llvm/test/ObjectYAML/DXContainer/PSVv1-pixel.yaml
index 156e83f655e4f..124f4cb674201 100644
--- a/llvm/test/ObjectYAML/DXContainer/PSVv1-pixel.yaml
+++ b/llvm/test/ObjectYAML/DXContainer/PSVv1-pixel.yaml
@@ -63,6 +63,7 @@ Parts:
 # CHECK-NEXT: SigInputVectors: 0
 # CHECK-NEXT: SigOutputVectors: [ 8, 16, 32, 64 ]
 # CHECK-NEXT: ResourceStride: 16
+# CHECK-NEXT: RuntimeInfoSize: 36
 # CHECK-NEXT: Resources:
 # CHECK-NEXT: - Type:            Sampler
 # CHECK-NEXT: Space:           2

diff  --git a/llvm/test/ObjectYAML/DXContainer/PSVv1-vertex.yaml b/llvm/test/ObjectYAML/DXContainer/PSVv1-vertex.yaml
index 020e2345c6eec..f01c6786a050f 100644
--- a/llvm/test/ObjectYAML/DXContainer/PSVv1-vertex.yaml
+++ b/llvm/test/ObjectYAML/DXContainer/PSVv1-vertex.yaml
@@ -61,6 +61,7 @@ Parts:
 # CHECK-NEXT: SigInputVectors: 0
 # CHECK-NEXT: SigOutputVectors: [ 8, 16, 32, 64 ]
 # CHECK-NEXT: ResourceStride: 16
+# CHECK-NEXT: RuntimeInfoSize: 36
 # CHECK-NEXT: Resources:
 # CHECK-NEXT: - Type:            Sampler
 # CHECK-NEXT: Space:           2

diff  --git a/llvm/test/ObjectYAML/DXContainer/PSVv2-amplification.yaml b/llvm/test/ObjectYAML/DXContainer/PSVv2-amplification.yaml
index 1e00e604f3e24..beecb32f8603e 100644
--- a/llvm/test/ObjectYAML/DXContainer/PSVv2-amplification.yaml
+++ b/llvm/test/ObjectYAML/DXContainer/PSVv2-amplification.yaml
@@ -73,6 +73,7 @@ Parts:
 # CHECK-NEXT: NumThreadsY:     1024
 # CHECK-NEXT: NumThreadsZ:     2048
 # CHECK-NEXT: ResourceStride: 24
+# CHECK-NEXT: RuntimeInfoSize: 48
 # CHECK-NEXT: Resources:
 # CHECK-NEXT: - Type:            Sampler
 # CHECK-NEXT: Space:           2

diff  --git a/llvm/test/ObjectYAML/DXContainer/PSVv2-compute.yaml b/llvm/test/ObjectYAML/DXContainer/PSVv2-compute.yaml
index c8bfd9acf68ef..b20a0b03fba5d 100644
--- a/llvm/test/ObjectYAML/DXContainer/PSVv2-compute.yaml
+++ b/llvm/test/ObjectYAML/DXContainer/PSVv2-compute.yaml
@@ -71,6 +71,7 @@ Parts:
 # CHECK-NEXT: NumThreadsY:     1024
 # CHECK-NEXT: NumThreadsZ:     2048
 # CHECK-NEXT: ResourceStride: 24
+# CHECK-NEXT: RuntimeInfoSize: 48
 # CHECK-NEXT: Resources:
 # CHECK-NEXT: - Type:            Sampler
 # CHECK-NEXT: Space:           2

diff  --git a/llvm/test/ObjectYAML/DXContainer/PSVv2-domain.yaml b/llvm/test/ObjectYAML/DXContainer/PSVv2-domain.yaml
index 021fb1b5fffb1..37c07c510d18f 100644
--- a/llvm/test/ObjectYAML/DXContainer/PSVv2-domain.yaml
+++ b/llvm/test/ObjectYAML/DXContainer/PSVv2-domain.yaml
@@ -80,6 +80,7 @@ Parts:
 # CHECK-NEXT: NumThreadsY:     1024
 # CHECK-NEXT: NumThreadsZ:     2048
 # CHECK-NEXT: ResourceStride: 24
+# CHECK-NEXT: RuntimeInfoSize: 48
 # CHECK-NEXT: Resources:
 # CHECK-NEXT: - Type:            Sampler
 # CHECK-NEXT: Space:           2

diff  --git a/llvm/test/ObjectYAML/DXContainer/PSVv2-geometry.yaml b/llvm/test/ObjectYAML/DXContainer/PSVv2-geometry.yaml
index 74e32efbe2c65..729809704b97d 100644
--- a/llvm/test/ObjectYAML/DXContainer/PSVv2-geometry.yaml
+++ b/llvm/test/ObjectYAML/DXContainer/PSVv2-geometry.yaml
@@ -81,6 +81,7 @@ Parts:
 # CHECK-NEXT: NumThreadsY:     1024
 # CHECK-NEXT: NumThreadsZ:     2048
 # CHECK-NEXT: ResourceStride: 24
+# CHECK-NEXT: RuntimeInfoSize: 48
 # CHECK-NEXT: Resources:
 # CHECK-NEXT: - Type:            Sampler
 # CHECK-NEXT: Space:           2

diff  --git a/llvm/test/ObjectYAML/DXContainer/PSVv2-hull.yaml b/llvm/test/ObjectYAML/DXContainer/PSVv2-hull.yaml
index 79d92e2f0c5e6..d425672181ebf 100644
--- a/llvm/test/ObjectYAML/DXContainer/PSVv2-hull.yaml
+++ b/llvm/test/ObjectYAML/DXContainer/PSVv2-hull.yaml
@@ -82,6 +82,7 @@ Parts:
 # CHECK-NEXT: NumThreadsY:     1024
 # CHECK-NEXT: NumThreadsZ:     2048
 # CHECK-NEXT: ResourceStride: 24
+# CHECK-NEXT: RuntimeInfoSize: 48
 # CHECK-NEXT: Resources:
 # CHECK-NEXT: - Type:            Sampler
 # CHECK-NEXT: Space:           2

diff  --git a/llvm/test/ObjectYAML/DXContainer/PSVv2-mesh.yaml b/llvm/test/ObjectYAML/DXContainer/PSVv2-mesh.yaml
index 27bf148126005..1f2db59b1c42f 100644
--- a/llvm/test/ObjectYAML/DXContainer/PSVv2-mesh.yaml
+++ b/llvm/test/ObjectYAML/DXContainer/PSVv2-mesh.yaml
@@ -85,6 +85,7 @@ Parts:
 # CHECK-NEXT: NumThreadsY:     1024
 # CHECK-NEXT: NumThreadsZ:     2048
 # CHECK-NEXT: ResourceStride: 24
+# CHECK-NEXT: RuntimeInfoSize: 48
 # CHECK-NEXT: Resources:
 # CHECK-NEXT: - Type:            Sampler
 # CHECK-NEXT: Space:           2

diff  --git a/llvm/test/ObjectYAML/DXContainer/PSVv2-pixel.yaml b/llvm/test/ObjectYAML/DXContainer/PSVv2-pixel.yaml
index 1a1a74d7f3121..bb5383c97de36 100644
--- a/llvm/test/ObjectYAML/DXContainer/PSVv2-pixel.yaml
+++ b/llvm/test/ObjectYAML/DXContainer/PSVv2-pixel.yaml
@@ -75,6 +75,7 @@ Parts:
 # CHECK-NEXT: NumThreadsY:     1024
 # CHECK-NEXT: NumThreadsZ:     2048
 # CHECK-NEXT: ResourceStride: 24
+# CHECK-NEXT: RuntimeInfoSize: 48
 # CHECK-NEXT: Resources:
 # CHECK-NEXT: - Type:            Sampler
 # CHECK-NEXT: Space:           2

diff  --git a/llvm/test/ObjectYAML/DXContainer/PSVv2-vertex.yaml b/llvm/test/ObjectYAML/DXContainer/PSVv2-vertex.yaml
index 6b0ba5eb3d19f..d067b97a75f8e 100644
--- a/llvm/test/ObjectYAML/DXContainer/PSVv2-vertex.yaml
+++ b/llvm/test/ObjectYAML/DXContainer/PSVv2-vertex.yaml
@@ -73,6 +73,7 @@ Parts:
 # CHECK-NEXT: NumThreadsY:     1024
 # CHECK-NEXT: NumThreadsZ:     2048
 # CHECK-NEXT: ResourceStride: 24
+# CHECK-NEXT: RuntimeInfoSize: 48
 # CHECK-NEXT: Resources:
 # CHECK-NEXT: - Type:            Sampler
 # CHECK-NEXT: Space:           2

diff  --git a/llvm/test/ObjectYAML/DXContainer/PSVv3-amplification.yaml b/llvm/test/ObjectYAML/DXContainer/PSVv3-amplification.yaml
index 6f7d151b266c9..d84f1f321123e 100644
--- a/llvm/test/ObjectYAML/DXContainer/PSVv3-amplification.yaml
+++ b/llvm/test/ObjectYAML/DXContainer/PSVv3-amplification.yaml
@@ -75,6 +75,10 @@ Parts:
 # CHECK-NEXT: NumThreadsZ:     2048
 # CHECK-NEXT: EntryName: ASEntry
 # CHECK-NEXT: ResourceStride: 24
+# CHECK-NEXT: RuntimeInfoSize: 52
+# CHECK-NEXT: StringTable:
+# CHECK-NEXT: - String:            ASEntry
+# CHECK-NEXT: Offset:          1
 # CHECK-NEXT: Resources:
 # CHECK-NEXT: - Type:            Sampler
 # CHECK-NEXT: Space:           2

diff  --git a/llvm/test/ObjectYAML/DXContainer/PSVv3-compute.yaml b/llvm/test/ObjectYAML/DXContainer/PSVv3-compute.yaml
index 2de3d435af1de..d1a70541479a2 100644
--- a/llvm/test/ObjectYAML/DXContainer/PSVv3-compute.yaml
+++ b/llvm/test/ObjectYAML/DXContainer/PSVv3-compute.yaml
@@ -73,6 +73,10 @@ Parts:
 # CHECK-NEXT: NumThreadsZ:     2048
 # CHECK-NEXT: EntryName: CSEntry
 # CHECK-NEXT: ResourceStride: 24
+# CHECK-NEXT: RuntimeInfoSize: 52
+# CHECK-NEXT: StringTable:
+# CHECK-NEXT: - String:            CSEntry
+# CHECK-NEXT: Offset:          1
 # CHECK-NEXT: Resources:
 # CHECK-NEXT: - Type:            Sampler
 # CHECK-NEXT: Space:           2

diff  --git a/llvm/test/ObjectYAML/DXContainer/PSVv3-domain.yaml b/llvm/test/ObjectYAML/DXContainer/PSVv3-domain.yaml
index 91afb2f11fc7c..0e575453ca6cf 100644
--- a/llvm/test/ObjectYAML/DXContainer/PSVv3-domain.yaml
+++ b/llvm/test/ObjectYAML/DXContainer/PSVv3-domain.yaml
@@ -82,6 +82,10 @@ Parts:
 # CHECK-NEXT: NumThreadsZ:     2048
 # CHECK-NEXT: EntryName: DSEntry
 # CHECK-NEXT: ResourceStride: 24
+# CHECK-NEXT: RuntimeInfoSize: 52
+# CHECK-NEXT: StringTable:
+# CHECK-NEXT: - String:            DSEntry
+# CHECK-NEXT: Offset:          1
 # CHECK-NEXT: Resources:
 # CHECK-NEXT: - Type:            Sampler
 # CHECK-NEXT: Space:           2

diff  --git a/llvm/test/ObjectYAML/DXContainer/PSVv3-geometry.yaml b/llvm/test/ObjectYAML/DXContainer/PSVv3-geometry.yaml
index f661e81fe869b..38708b34b7650 100644
--- a/llvm/test/ObjectYAML/DXContainer/PSVv3-geometry.yaml
+++ b/llvm/test/ObjectYAML/DXContainer/PSVv3-geometry.yaml
@@ -83,6 +83,10 @@ Parts:
 # CHECK-NEXT: NumThreadsZ:     2048
 # CHECK-NEXT: EntryName: GSEntry
 # CHECK-NEXT: ResourceStride: 24
+# CHECK-NEXT: RuntimeInfoSize: 52
+# CHECK-NEXT: StringTable:
+# CHECK-NEXT: - String:            GSEntry
+# CHECK-NEXT: Offset:          1
 # CHECK-NEXT: Resources:
 # CHECK-NEXT: - Type:            Sampler
 # CHECK-NEXT: Space:           2

diff  --git a/llvm/test/ObjectYAML/DXContainer/PSVv3-hull.yaml b/llvm/test/ObjectYAML/DXContainer/PSVv3-hull.yaml
index 4140c3180e32c..c439c2268b112 100644
--- a/llvm/test/ObjectYAML/DXContainer/PSVv3-hull.yaml
+++ b/llvm/test/ObjectYAML/DXContainer/PSVv3-hull.yaml
@@ -84,6 +84,10 @@ Parts:
 # CHECK-NEXT: NumThreadsZ:     2048
 # CHECK-NEXT: EntryName: HSEntry
 # CHECK-NEXT: ResourceStride: 24
+# CHECK-NEXT: RuntimeInfoSize: 52
+# CHECK-NEXT: StringTable:
+# CHECK-NEXT: - String:            HSEntry
+# CHECK-NEXT: Offset:          1
 # CHECK-NEXT: Resources:
 # CHECK-NEXT: - Type:            Sampler
 # CHECK-NEXT: Space:           2

diff  --git a/llvm/test/ObjectYAML/DXContainer/PSVv3-mesh.yaml b/llvm/test/ObjectYAML/DXContainer/PSVv3-mesh.yaml
index 03ce5b583315d..3bd430ba14601 100644
--- a/llvm/test/ObjectYAML/DXContainer/PSVv3-mesh.yaml
+++ b/llvm/test/ObjectYAML/DXContainer/PSVv3-mesh.yaml
@@ -87,6 +87,10 @@ Parts:
 # CHECK-NEXT: NumThreadsZ:     2048
 # CHECK-NEXT: EntryName: MSEntry
 # CHECK-NEXT: ResourceStride: 24
+# CHECK-NEXT: RuntimeInfoSize: 52
+# CHECK-NEXT: StringTable:
+# CHECK-NEXT: - String:            MSEntry
+# CHECK-NEXT: Offset:          1
 # CHECK-NEXT: Resources:
 # CHECK-NEXT: - Type:            Sampler
 # CHECK-NEXT: Space:           2

diff  --git a/llvm/test/ObjectYAML/DXContainer/PSVv3-pixel.yaml b/llvm/test/ObjectYAML/DXContainer/PSVv3-pixel.yaml
index 2434567b2a6f5..8ce35c41ec725 100644
--- a/llvm/test/ObjectYAML/DXContainer/PSVv3-pixel.yaml
+++ b/llvm/test/ObjectYAML/DXContainer/PSVv3-pixel.yaml
@@ -77,6 +77,10 @@ Parts:
 # CHECK-NEXT: NumThreadsZ:     2048
 # CHECK-NEXT: EntryName: PSEntry
 # CHECK-NEXT: ResourceStride: 24
+# CHECK-NEXT: RuntimeInfoSize: 52
+# CHECK-NEXT: StringTable:
+# CHECK-NEXT: - String:            PSEntry
+# CHECK-NEXT: Offset:          1
 # CHECK-NEXT: Resources:
 # CHECK-NEXT: - Type:            Sampler
 # CHECK-NEXT: Space:           2

diff  --git a/llvm/test/ObjectYAML/DXContainer/PSVv3-vertex.yaml b/llvm/test/ObjectYAML/DXContainer/PSVv3-vertex.yaml
index b43f6aa6b71d4..7faeb4f19cd00 100644
--- a/llvm/test/ObjectYAML/DXContainer/PSVv3-vertex.yaml
+++ b/llvm/test/ObjectYAML/DXContainer/PSVv3-vertex.yaml
@@ -75,6 +75,10 @@ Parts:
 # CHECK-NEXT: NumThreadsZ:     2048
 # CHECK-NEXT: EntryName: VSEntry
 # CHECK-NEXT: ResourceStride: 24
+# CHECK-NEXT: RuntimeInfoSize: 52
+# CHECK-NEXT: StringTable:
+# CHECK-NEXT: - String:            VSEntry
+# CHECK-NEXT: Offset:          1
 # CHECK-NEXT: Resources:
 # CHECK-NEXT: - Type:            Sampler
 # CHECK-NEXT: Space:           2

diff  --git a/llvm/tools/obj2yaml/dxcontainer2yaml.cpp b/llvm/tools/obj2yaml/dxcontainer2yaml.cpp
index c727595406767..09a6422d0d7b9 100644
--- a/llvm/tools/obj2yaml/dxcontainer2yaml.cpp
+++ b/llvm/tools/obj2yaml/dxcontainer2yaml.cpp
@@ -103,6 +103,20 @@ dumpDXContainer(MemoryBufferRef Source) {
                    std::get_if<dxbc::PSV::v3::RuntimeInfo>(&PSVInfo->getInfo()))
         NewPart.Info = DXContainerYAML::PSVInfo(P, PSVInfo->getStringTable());
       NewPart.Info->ResourceStride = PSVInfo->getResourceStride();
+      NewPart.Info->RuntimeInfoSize = PSVInfo->getSize();
+      if (PSVInfo->getVersion() > 0) {
+        StringRef ST = PSVInfo->getStringTable();
+        size_t Pos = 0;
+        while (Pos < ST.size()) {
+          size_t End = ST.find('\0', Pos);
+          if (End == StringRef::npos)
+            End = ST.size();
+          if (End > Pos)
+            NewPart.Info->StringTable.push_back(
+                {ST.slice(Pos, End), static_cast<uint32_t>(Pos)});
+          Pos = End + 1;
+        }
+      }
       for (auto Res : PSVInfo->getResources())
         NewPart.Info->Resources.push_back(Res);
 

diff  --git a/llvm/unittests/Object/CMakeLists.txt b/llvm/unittests/Object/CMakeLists.txt
index cd70a7b18b5f4..e61f6ec592e09 100644
--- a/llvm/unittests/Object/CMakeLists.txt
+++ b/llvm/unittests/Object/CMakeLists.txt
@@ -1,5 +1,6 @@
 set(LLVM_LINK_COMPONENTS
   BinaryFormat
+  MC
   Object
   ObjectYAML
   TargetParser

diff  --git a/llvm/unittests/Object/DXContainerTest.cpp b/llvm/unittests/Object/DXContainerTest.cpp
index d6f7b26b99cd7..ac8b45825c04d 100644
--- a/llvm/unittests/Object/DXContainerTest.cpp
+++ b/llvm/unittests/Object/DXContainerTest.cpp
@@ -9,6 +9,7 @@
 #include "llvm/Object/DXContainer.h"
 #include "llvm/ADT/StringRef.h"
 #include "llvm/BinaryFormat/Magic.h"
+#include "llvm/MC/DXContainerPSVInfo.h"
 #include "llvm/ObjectYAML/DXContainerYAML.h"
 #include "llvm/ObjectYAML/yaml2obj.h"
 #include "llvm/Support/Error.h"
@@ -1249,3 +1250,49 @@ TEST(RootSignature, ParseStaticSamplers) {
     ASSERT_EQ(Sampler.Flags, 1U);
   }
 }
+
+// PSVInfo:
+//   Version:         2
+//   ShaderStage:     5
+//   MinimumWaveLaneCount: 0
+//   MaximumWaveLaneCount: 4294967295
+//   NumThreadsX:     8
+//   NumThreadsY:     1
+//   NumThreadsZ:     1
+//   EntryName:       CSMain  <--- not serialized for version < 3
+//   ResourceStride:  0
+//   Resources:       []
+TEST(DXCFile, PSVv2EntryNameNotInStringTable) {
+  // Verify that when EntryName is set but PSV version is < 3,
+  // the entry name does not appear in the serialized string table.
+  mcdxbc::PSVRuntimeInfo PSV;
+  PSV.BaseData.ShaderStage =
+      static_cast<uint8_t>(Triple::EnvironmentType::Compute - Triple::Pixel);
+  PSV.BaseData.MinimumWaveLaneCount = 0;
+  PSV.BaseData.MaximumWaveLaneCount = 0xFFFFFFFF;
+  PSV.BaseData.NumThreadsX = 8;
+  PSV.BaseData.NumThreadsY = 1;
+  PSV.BaseData.NumThreadsZ = 1;
+  PSV.EntryName = "CSMain";
+
+  PSV.finalize(Triple::EnvironmentType::Compute, 2);
+
+  SmallVector<char> Buffer;
+  raw_svector_ostream OS(Buffer);
+  PSV.write(OS, 2);
+
+  // The serialized PSV data should not contain the entry name string.
+  StringRef Data(Buffer.data(), Buffer.size());
+  EXPECT_FALSE(Data.contains("CSMain"));
+
+  // Deserialize and verify the string table contains only null bytes
+  // (size 4 = one null byte padded to 4-byte alignment).
+  DirectX::PSVRuntimeInfo ParsedPSV(Data);
+  ASSERT_THAT_ERROR(ParsedPSV.parse(static_cast<uint16_t>(
+                        Triple::EnvironmentType::Compute - Triple::Pixel)),
+                    Succeeded());
+  EXPECT_EQ(ParsedPSV.getVersion(), 2u);
+  StringRef StrTab = ParsedPSV.getStringTable();
+  EXPECT_EQ(StrTab.size(), 4u);
+  EXPECT_TRUE(llvm::all_of(StrTab, [](char C) { return C == '\0'; }));
+}


        


More information about the llvm-commits mailing list