aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorXiang Li <python3kgae@outlook.com>2024-05-13 15:50:16 -0700
committerGitHub <noreply@github.com>2024-05-13 18:50:16 -0400
commit531a0b67ea1ad65ea4d1a99c67fee280beeb8fbb (patch)
treee65d201af3cb9a517ce8296ed5510f4c946a5c2f
parent943baf327409fdcb01c9d02aa3c3368f2fca114b (diff)
downloadllvm-531a0b67ea1ad65ea4d1a99c67fee280beeb8fbb.zip
llvm-531a0b67ea1ad65ea4d1a99c67fee280beeb8fbb.tar.gz
llvm-531a0b67ea1ad65ea4d1a99c67fee280beeb8fbb.tar.bz2
[DirectX] Reapply Fix DXIL part header version encoding (#91956)
This reapplies https://github.com/llvm/llvm-project/commit/195d8ac26d91ca798733c3a5f58d67992d43503d [DirectX] Fix DXIL part header version encoding. The endian issue was fixed by https://github.com/llvm/llvm-project/commit/f42117c8517cc928c6373bad35ebf75d94fe865b. Move MinorVersion be the lower 8 bit. Set DXIL version in DXContainerObjectWriter::writeObject. Fixes #89952
-rw-r--r--llvm/include/llvm/BinaryFormat/DXContainer.h2
-rw-r--r--llvm/include/llvm/TargetParser/Triple.h2
-rw-r--r--llvm/lib/MC/MCDXContainerWriter.cpp3
-rw-r--r--llvm/lib/TargetParser/Triple.cpp2
-rw-r--r--llvm/test/CodeGen/DirectX/embed-dxil.ll4
-rw-r--r--llvm/unittests/Object/DXContainerTest.cpp16
6 files changed, 18 insertions, 11 deletions
diff --git a/llvm/include/llvm/BinaryFormat/DXContainer.h b/llvm/include/llvm/BinaryFormat/DXContainer.h
index 847d810..013431f 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 8f9d998..b3bb354 100644
--- a/llvm/include/llvm/TargetParser/Triple.h
+++ b/llvm/include/llvm/TargetParser/Triple.h
@@ -429,7 +429,7 @@ public:
/// (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 ff64c6e5..1d82a7e 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 f8269a5..4fc1ff5 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 306e5c3..9f4fb19 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 115de47..9da6543 100644
--- a/llvm/unittests/Object/DXContainerTest.cpp
+++ b/llvm/unittests/Object/DXContainerTest.cpp
@@ -215,6 +215,8 @@ TEST(DXCFile, ParseDXILPart) {
EXPECT_EQ(Header.getMinorVersion(), 5u);
EXPECT_EQ(Header.ShaderKind, 5u);
EXPECT_EQ(Header.Size, 8u);
+ EXPECT_EQ(Header.Bitcode.MajorVersion, 1u);
+ EXPECT_EQ(Header.Bitcode.MinorVersion, 5u);
}
static Expected<DXContainer>
@@ -283,8 +285,8 @@ Parts:
MinorVersion: 0
ShaderKind: 14
Size: 6
- DXILMajorVersion: 0
- DXILMinorVersion: 1
+ DXILMajorVersion: 1
+ DXILMinorVersion: 0
DXILSize: 0
...
)";
@@ -404,8 +406,8 @@ Parts:
// MinorVersion: 0
// ShaderKind: 14
// Size: 6
-// DXILMajorVersion: 0
-// DXILMinorVersion: 1
+// DXILMajorVersion: 1
+// DXILMinorVersion: 0
// DXILSize: 0
// - Name: PSV0
// Size: 36
@@ -520,7 +522,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 +536,8 @@ TEST(DXCFile, MaliciousFiles) {
// MinorVersion: 0
// ShaderKind: 14
// Size: 6
-// DXILMajorVersion: 0
-// DXILMinorVersion: 1
+// DXILMajorVersion: 1
+// DXILMinorVersion: 0
// DXILSize: 0
// - Name: PSV0
// Size: 100