[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