[llvm-branch-commits] [llvm] ec66d39 - Revert "Revert "[DirectX] Fix DXIL part header version encoding" (#91791)"
via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Mon May 13 05:58:39 PDT 2024
Author: Xiang Li
Date: 2024-05-13T08:58:36-04:00
New Revision: ec66d3931a3320cc21c278f94e6eeb815d4d274b
URL: https://github.com/llvm/llvm-project/commit/ec66d3931a3320cc21c278f94e6eeb815d4d274b
DIFF: https://github.com/llvm/llvm-project/commit/ec66d3931a3320cc21c278f94e6eeb815d4d274b.diff
LOG: Revert "Revert "[DirectX] Fix DXIL part header version encoding" (#91791)"
This reverts commit d655054395e2dba2b949e170d7764cc8c9c8a597.
Added:
Modified:
llvm/include/llvm/BinaryFormat/DXContainer.h
llvm/include/llvm/TargetParser/Triple.h
llvm/lib/MC/MCDXContainerWriter.cpp
llvm/lib/TargetParser/Triple.cpp
llvm/test/CodeGen/DirectX/embed-dxil.ll
llvm/unittests/Object/DXContainerTest.cpp
Removed:
################################################################################
diff --git a/llvm/include/llvm/BinaryFormat/DXContainer.h b/llvm/include/llvm/BinaryFormat/DXContainer.h
index 847d8103e6811..013431faff272 100644
--- a/llvm/include/llvm/BinaryFormat/DXContainer.h
+++ b/llvm/include/llvm/BinaryFormat/DXContainer.h
@@ -103,8 +103,8 @@ struct PartHeader {
struct BitcodeHeader {
uint8_t Magic[4]; // ACSII "DXIL".
- uint8_t MajorVersion; // DXIL version.
uint8_t MinorVersion; // DXIL version.
+ uint8_t MajorVersion; // DXIL version.
uint16_t Unused;
uint32_t Offset; // Offset to LLVM bitcode (from start of header).
uint32_t Size; // Size of LLVM bitcode (in bytes).
diff --git a/llvm/include/llvm/TargetParser/Triple.h b/llvm/include/llvm/TargetParser/Triple.h
index 8f9d99816931a..b3bb354b38ff5 100644
--- a/llvm/include/llvm/TargetParser/Triple.h
+++ b/llvm/include/llvm/TargetParser/Triple.h
@@ -429,7 +429,7 @@ class Triple {
/// (SubArch). This should only be called with Vulkan SPIR-V triples.
VersionTuple getVulkanVersion() const;
- /// Parse the DXIL version number from the DXIL version
+ /// Parse the DXIL version number from the OSVersion and DXIL version
/// (SubArch). This should only be called with DXIL triples.
VersionTuple getDXILVersion() const;
diff --git a/llvm/lib/MC/MCDXContainerWriter.cpp b/llvm/lib/MC/MCDXContainerWriter.cpp
index ff64c6e538ac6..1d82a7ec849fe 100644
--- a/llvm/lib/MC/MCDXContainerWriter.cpp
+++ b/llvm/lib/MC/MCDXContainerWriter.cpp
@@ -129,6 +129,9 @@ uint64_t DXContainerObjectWriter::writeObject(MCAssembler &Asm,
// The program header's size field is in 32-bit words.
Header.Size = (SectionSize + sizeof(dxbc::ProgramHeader) + 3) / 4;
memcpy(Header.Bitcode.Magic, "DXIL", 4);
+ VersionTuple DXILVersion = TT.getDXILVersion();
+ Header.Bitcode.MajorVersion = DXILVersion.getMajor();
+ Header.Bitcode.MinorVersion = DXILVersion.getMinor().value_or(0);
Header.Bitcode.Offset = sizeof(dxbc::BitcodeHeader);
Header.Bitcode.Size = SectionSize;
if (sys::IsBigEndianHost)
diff --git a/llvm/lib/TargetParser/Triple.cpp b/llvm/lib/TargetParser/Triple.cpp
index f8269a51dc0bb..4fc1ff5aaa051 100644
--- a/llvm/lib/TargetParser/Triple.cpp
+++ b/llvm/lib/TargetParser/Triple.cpp
@@ -1510,6 +1510,8 @@ VersionTuple Triple::getDXILVersion() const {
if (getArch() != dxil || getOS() != ShaderModel)
llvm_unreachable("invalid DXIL triple");
StringRef Arch = getArchName();
+ if (getSubArch() == NoSubArch)
+ Arch = getDXILArchNameFromShaderModel(getOSName());
Arch.consume_front("dxilv");
VersionTuple DXILVersion = parseVersionFromName(Arch);
// FIXME: validate DXIL version against Shader Model version.
diff --git a/llvm/test/CodeGen/DirectX/embed-dxil.ll b/llvm/test/CodeGen/DirectX/embed-dxil.ll
index 306e5c385b5a3..9f4fb19d86fa0 100644
--- a/llvm/test/CodeGen/DirectX/embed-dxil.ll
+++ b/llvm/test/CodeGen/DirectX/embed-dxil.ll
@@ -42,8 +42,8 @@ define i32 @add(i32 %a, i32 %b) {
; DXC-NEXT: MinorVersion: 5
; DXC-NEXT: ShaderKind: 6
; DXC-NEXT: Size: [[#div(SIZE,4)]]
-; DXC-NEXT: DXILMajorVersion: [[#]]
-; DXC-NEXT: DXILMinorVersion: [[#]]
+; DXC-NEXT: DXILMajorVersion: 1
+; DXC-NEXT: DXILMinorVersion: 5
; DXC-NEXT: DXILSize: [[#SIZE - 24]]
; DXC-NEXT: DXIL: [ 0x42, 0x43, 0xC0, 0xDE,
; DXC: - Name: SFI0
diff --git a/llvm/unittests/Object/DXContainerTest.cpp b/llvm/unittests/Object/DXContainerTest.cpp
index 115de47a3cefd..b83eecc339081 100644
--- a/llvm/unittests/Object/DXContainerTest.cpp
+++ b/llvm/unittests/Object/DXContainerTest.cpp
@@ -126,6 +126,51 @@ TEST(DXCFile, ParseOverlappingParts) {
"Part offset for part 1 begins before the previous part ends"));
}
+// This test verify DXILMajorVersion and DXILMinorVersion are correctly parsed.
+// This test is based on the binary output constructed from this yaml.
+// --- !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: 1
+// Parts:
+// - Name: DXIL
+// Size: 28
+// Program:
+// MajorVersion: 6
+// MinorVersion: 5
+// ShaderKind: 5
+// Size: 8
+// DXILMajorVersion: 1
+// DXILMinorVersion: 5
+// DXILSize: 4
+// DXIL: [ 0x42, 0x43, 0xC0, 0xDE, ]
+// ...
+TEST(DXCFile, ParseDXILPart) {
+ uint8_t Buffer[] = {
+ 0x44, 0x58, 0x42, 0x43, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
+ 0x48, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00,
+ 0x44, 0x58, 0x49, 0x4c, 0x1c, 0x00, 0x00, 0x00, 0x65, 0x00, 0x05, 0x00,
+ 0x08, 0x00, 0x00, 0x00, 0x44, 0x58, 0x49, 0x4c, 0x05, 0x01, 0x00, 0x00,
+ 0x10, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x42, 0x43, 0xc0, 0xde};
+ DXContainer C =
+ llvm::cantFail(DXContainer::create(getMemoryBuffer<116>(Buffer)));
+ EXPECT_EQ(C.getHeader().PartCount, 1u);
+ const std::optional<object::DXContainer::DXILData> &DXIL = C.getDXIL();
+ EXPECT_TRUE(DXIL.has_value());
+ dxbc::ProgramHeader Header = DXIL->first;
+ EXPECT_EQ(Header.MajorVersion, 6u);
+ EXPECT_EQ(Header.MinorVersion, 5u);
+ EXPECT_EQ(Header.ShaderKind, 5u);
+ EXPECT_EQ(Header.Size, 8u);
+ EXPECT_EQ(Header.Bitcode.MajorVersion, 1u);
+ EXPECT_EQ(Header.Bitcode.MinorVersion, 5u);
+}
+
TEST(DXCFile, ParseEmptyParts) {
uint8_t Buffer[] = {
0x44, 0x58, 0x42, 0x43, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
@@ -283,8 +328,8 @@ TEST(DXCFile, PSVResourceIterators) {
MinorVersion: 0
ShaderKind: 14
Size: 6
- DXILMajorVersion: 0
- DXILMinorVersion: 1
+ DXILMajorVersion: 1
+ DXILMinorVersion: 0
DXILSize: 0
...
)";
@@ -404,8 +449,8 @@ TEST(DXCFile, PSVResourceIterators) {
// MinorVersion: 0
// ShaderKind: 14
// Size: 6
-// DXILMajorVersion: 0
-// DXILMinorVersion: 1
+// DXILMajorVersion: 1
+// DXILMinorVersion: 0
// DXILSize: 0
// - Name: PSV0
// Size: 36
@@ -520,7 +565,7 @@ TEST(DXCFile, MaliciousFiles) {
//
// --- !dxcontainer
// Header:
-// Hash: [ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+// Hash: [ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
// 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 ]
// Version:
// Major: 1
@@ -534,8 +579,8 @@ TEST(DXCFile, MaliciousFiles) {
// MinorVersion: 0
// ShaderKind: 14
// Size: 6
-// DXILMajorVersion: 0
-// DXILMinorVersion: 1
+// DXILMajorVersion: 1
+// DXILMinorVersion: 0
// DXILSize: 0
// - Name: PSV0
// Size: 100
More information about the llvm-branch-commits
mailing list