diff --git a/llvm/include/llvm/BinaryFormat/DXContainer.h b/llvm/include/llvm/BinaryFormat/DXContainer.h index 847d8103e6811c..013431faff2728 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 8f9d99816931a5..b3bb354b38ff58 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 ff64c6e538ac68..1d82a7ec849fe9 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 f8269a51dc0bbe..4fc1ff5aaa051f 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 306e5c385b5a31..9f4fb19d86fa03 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 115de47a3cefda..9da6543c520c74 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 @@ -283,8 +285,8 @@ TEST(DXCFile, PSVResourceIterators) { MinorVersion: 0 ShaderKind: 14 Size: 6 - DXILMajorVersion: 0 - DXILMinorVersion: 1 + DXILMajorVersion: 1 + DXILMinorVersion: 0 DXILSize: 0 ... )"; @@ -404,8 +406,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 +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