https://github.com/joaosaffran updated https://github.com/llvm/llvm-project/pull/128577
>From 767b7d02bf71e6e0137e2b5f9f9b8d8b799ac81f Mon Sep 17 00:00:00 2001 From: joaosaffran <joao.saff...@microsoft.com> Date: Sat, 22 Feb 2025 06:19:15 +0000 Subject: [PATCH 01/12] first working version --- .../llvm/MC/DXContainerRootSignature.h | 5 +- llvm/lib/MC/DXContainerRootSignature.cpp | 90 +++++++++++++------ llvm/lib/Object/DXContainer.cpp | 10 ++- llvm/lib/ObjectYAML/DXContainerEmitter.cpp | 4 +- .../lib/Target/DirectX/DXContainerGlobals.cpp | 5 +- .../ContainerData/RootSignature-Flags.ll | 2 +- .../DXContainer/RootSignature-Flags.yaml | 2 +- .../RootSignature-MultipleParameters.yaml | 2 +- .../ObjectYAML/DXContainerYAMLTest.cpp | 8 +- 9 files changed, 85 insertions(+), 43 deletions(-) diff --git a/llvm/include/llvm/MC/DXContainerRootSignature.h b/llvm/include/llvm/MC/DXContainerRootSignature.h index b31b0da352038..cae4f79aef56f 100644 --- a/llvm/include/llvm/MC/DXContainerRootSignature.h +++ b/llvm/include/llvm/MC/DXContainerRootSignature.h @@ -7,8 +7,7 @@ //===----------------------------------------------------------------------===// #include "llvm/BinaryFormat/DXContainer.h" -#include <cstdint> -#include <limits> +#include "llvm/Support/raw_ostream.h" namespace llvm { @@ -19,7 +18,7 @@ struct RootSignatureDesc { dxbc::RootSignatureHeader Header; SmallVector<dxbc::RootParameter> Parameters; - void write(raw_ostream &OS) const; + Error write(raw_ostream &OS) const; }; } // namespace mcdxbc } // namespace llvm diff --git a/llvm/lib/MC/DXContainerRootSignature.cpp b/llvm/lib/MC/DXContainerRootSignature.cpp index 35a4ef322d01e..9a279ab722877 100644 --- a/llvm/lib/MC/DXContainerRootSignature.cpp +++ b/llvm/lib/MC/DXContainerRootSignature.cpp @@ -7,53 +7,89 @@ //===----------------------------------------------------------------------===// #include "llvm/MC/DXContainerRootSignature.h" -#include "llvm/Support/EndianStream.h" +#include "llvm/Support/BinaryStreamWriter.h" +#include <vector> using namespace llvm; using namespace llvm::mcdxbc; -void RootSignatureDesc::write(raw_ostream &OS) const { - // Root signature header in dxcontainer has 6 uint_32t values. - const uint32_t HeaderSize = 24; - const uint32_t ParameterByteSize = Parameters.size_in_bytes(); - const uint32_t NumParametes = Parameters.size(); +Error RootSignatureDesc::write(raw_ostream &OS) const { + // Header Size + accounting for parameter offset + parameters size + std::vector<uint8_t> Buffer(24 + (Parameters.size() * 4) + + Parameters.size_in_bytes()); + BinaryStreamWriter Writer(Buffer, llvm::endianness::little); + + SmallVector<uint64_t> OffsetsToReplace; + SmallVector<uint32_t> ValuesToReplaceOffsetsWith; + const uint32_t Dummy = std::numeric_limits<uint32_t>::max(); + + const uint32_t NumParameters = Parameters.size(); const uint32_t Zero = 0; - // Writing header information - support::endian::write(OS, Header.Version, llvm::endianness::little); - support::endian::write(OS, NumParametes, llvm::endianness::little); - support::endian::write(OS, HeaderSize, llvm::endianness::little); + if (Error Err = Writer.writeInteger(Header.Version)) + return Err; + + if (Error Err = Writer.writeInteger(NumParameters)) + return Err; + + OffsetsToReplace.push_back(Writer.getOffset()); + if (Error Err = Writer.writeInteger(Dummy)) + return Err; // Static samplers still not implemented - support::endian::write(OS, Zero, llvm::endianness::little); - support::endian::write(OS, ParameterByteSize + HeaderSize, - llvm::endianness::little); + if (Error Err = Writer.writeInteger(Zero)) + return Err; + + if (Error Err = Writer.writeInteger(Zero)) + return Err; + + if (Error Err = Writer.writeInteger(Header.Flags)) + return Err; - support::endian::write(OS, Header.Flags, llvm::endianness::little); + ValuesToReplaceOffsetsWith.push_back(Writer.getOffset()); - uint32_t ParamsOffset = - HeaderSize + (3 * sizeof(uint32_t) * Parameters.size()); for (const dxbc::RootParameter &P : Parameters) { - support::endian::write(OS, P.ParameterType, llvm::endianness::little); - support::endian::write(OS, P.ShaderVisibility, llvm::endianness::little); - support::endian::write(OS, ParamsOffset, llvm::endianness::little); + if (Error Err = Writer.writeEnum(P.ParameterType)) + return Err; + if (Error Err = Writer.writeEnum(P.ShaderVisibility)) + return Err; - // Size of root parameter, removing the ParameterType and ShaderVisibility. - ParamsOffset += sizeof(dxbc::RootParameter) - 2 * sizeof(uint32_t); + OffsetsToReplace.push_back(Writer.getOffset()); + if (Error Err = Writer.writeInteger(Dummy)) + return Err; } for (const dxbc::RootParameter &P : Parameters) { + ValuesToReplaceOffsetsWith.push_back(Writer.getOffset()); switch (P.ParameterType) { case dxbc::RootParameterType::Constants32Bit: { - support::endian::write(OS, P.Constants.ShaderRegister, - llvm::endianness::little); - support::endian::write(OS, P.Constants.RegisterSpace, - llvm::endianness::little); - support::endian::write(OS, P.Constants.Num32BitValues, - llvm::endianness::little); + if (Error Err = Writer.writeInteger(P.Constants.ShaderRegister)) + return Err; + if (Error Err = Writer.writeInteger(P.Constants.RegisterSpace)) + return Err; + if (Error Err = Writer.writeInteger(P.Constants.Num32BitValues)) + return Err; } break; case dxbc::RootParameterType::Empty: llvm_unreachable("Invalid RootParameterType"); } } + + assert(ValuesToReplaceOffsetsWith.size() == OffsetsToReplace.size() && + "Offset missing value to replace with."); + + for (size_t It = 0; It < ValuesToReplaceOffsetsWith.size(); It++) { + uint32_t Position = OffsetsToReplace[It]; + uint32_t Value = ValuesToReplaceOffsetsWith[It]; + + Writer.setOffset(Position); + if (Error Err = Writer.writeInteger(Value)) + return Err; + } + + llvm::ArrayRef<char> BufferRef(reinterpret_cast<char *>(Buffer.data()), + Buffer.size()); + OS.write(BufferRef.data(), BufferRef.size()); + + return Error::success(); } diff --git a/llvm/lib/Object/DXContainer.cpp b/llvm/lib/Object/DXContainer.cpp index 010f70a952ebf..35261b661cf2f 100644 --- a/llvm/lib/Object/DXContainer.cpp +++ b/llvm/lib/Object/DXContainer.cpp @@ -296,16 +296,18 @@ Error DirectX::RootSignature::parse(StringRef Data) { NewParam.ParameterType = support::endian::read<dxbc::RootParameterType, llvm::endianness::little>(Current); - if (!dxbc::RootSignatureValidations::isValidParameterType(NewParam.ParameterType)) + if (!dxbc::RootSignatureValidations::isValidParameterType( + NewParam.ParameterType)) return validationFailed("unsupported parameter type value read: " + llvm::Twine((uint32_t)NewParam.ParameterType)); Current += sizeof(dxbc::RootParameterType); NewParam.ShaderVisibility = - support::endian::read<dxbc::ShaderVisibility, - llvm::endianness::little>(Current); - if (!dxbc::RootSignatureValidations::isValidShaderVisibility(NewParam.ShaderVisibility)) + support::endian::read<dxbc::ShaderVisibility, llvm::endianness::little>( + Current); + if (!dxbc::RootSignatureValidations::isValidShaderVisibility( + NewParam.ShaderVisibility)) return validationFailed("unsupported shader visility flag value read: " + llvm::Twine((uint32_t)NewParam.ShaderVisibility)); diff --git a/llvm/lib/ObjectYAML/DXContainerEmitter.cpp b/llvm/lib/ObjectYAML/DXContainerEmitter.cpp index 87ba16fd40ba9..a5831a69f9bca 100644 --- a/llvm/lib/ObjectYAML/DXContainerEmitter.cpp +++ b/llvm/lib/ObjectYAML/DXContainerEmitter.cpp @@ -271,7 +271,9 @@ void DXContainerWriter::writeParts(raw_ostream &OS) { RS.Header.Version = P.RootSignature->Version; RS.Parameters = std::move(P.RootSignature->Parameters); - RS.write(OS); + if (Error Err = RS.write(OS)) + handleAllErrors(std::move(Err)); + break; } uint64_t BytesWritten = OS.tell() - DataStart; diff --git a/llvm/lib/Target/DirectX/DXContainerGlobals.cpp b/llvm/lib/Target/DirectX/DXContainerGlobals.cpp index 5508af40663b1..5801046f83674 100644 --- a/llvm/lib/Target/DirectX/DXContainerGlobals.cpp +++ b/llvm/lib/Target/DirectX/DXContainerGlobals.cpp @@ -25,10 +25,12 @@ #include "llvm/InitializePasses.h" #include "llvm/MC/DXContainerPSVInfo.h" #include "llvm/Pass.h" +#include "llvm/Support/Error.h" #include "llvm/Support/MD5.h" #include "llvm/TargetParser/Triple.h" #include "llvm/Transforms/Utils/ModuleUtils.h" #include <optional> +#include <utility> using namespace llvm; using namespace llvm::dxil; @@ -173,7 +175,8 @@ void DXContainerGlobals::addRootSignature(Module &M, SmallString<256> Data; raw_svector_ostream OS(Data); - RS.write(OS); + if (Error Err = RS.write(OS)) + handleAllErrors(std::move(Err)); Constant *Constant = ConstantDataArray::getString(M.getContext(), Data, /*AddNull*/ false); diff --git a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Flags.ll b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Flags.ll index 035ea373d30ea..1ca6ebb7ddab8 100644 --- a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Flags.ll +++ b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Flags.ll @@ -23,6 +23,6 @@ attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" } ; DXC-NEXT: RootSignature: ; DXC-NEXT: Version: 2 ; DXC-NEXT: NumStaticSamplers: 0 -; DXC-NEXT: StaticSamplersOffset: 24 +; DXC-NEXT: StaticSamplersOffset: 0 ; DXC-NEXT: Parameters: [] ; DXC-NEXT: AllowInputAssemblerInputLayout: true diff --git a/llvm/test/ObjectYAML/DXContainer/RootSignature-Flags.yaml b/llvm/test/ObjectYAML/DXContainer/RootSignature-Flags.yaml index 1b73b830f015f..0d7902afdaa66 100644 --- a/llvm/test/ObjectYAML/DXContainer/RootSignature-Flags.yaml +++ b/llvm/test/ObjectYAML/DXContainer/RootSignature-Flags.yaml @@ -25,7 +25,7 @@ Parts: # CHECK-NEXT: RootSignature: # CHECK-NEXT: Version: 2 # CHECK-NEXT: NumStaticSamplers: 0 -# CHECK-NEXT: StaticSamplersOffset: 24 +# CHECK-NEXT: StaticSamplersOffset: 0 # CHECK-NEXT: Parameters: [] # CHECK-NEXT: AllowInputAssemblerInputLayout: true # CHECK-NEXT: DenyGeometryShaderRootAccess: true diff --git a/llvm/test/ObjectYAML/DXContainer/RootSignature-MultipleParameters.yaml b/llvm/test/ObjectYAML/DXContainer/RootSignature-MultipleParameters.yaml index bccfacb72819b..8d5ab5c1b0b23 100644 --- a/llvm/test/ObjectYAML/DXContainer/RootSignature-MultipleParameters.yaml +++ b/llvm/test/ObjectYAML/DXContainer/RootSignature-MultipleParameters.yaml @@ -37,7 +37,7 @@ Parts: # CHECK-NEXT: RootSignature: # CHECK-NEXT: Version: 2 # CHECK-NEXT: NumStaticSamplers: 0 -# CHECK-NEXT: StaticSamplersOffset: 64 +# CHECK-NEXT: StaticSamplersOffset: 0 # CHECK-NEXT: Parameters: # CHECK-NEXT: - ParameterType: Constants32Bit # CHECK-NEXT: ShaderVisibility: Hull diff --git a/llvm/unittests/ObjectYAML/DXContainerYAMLTest.cpp b/llvm/unittests/ObjectYAML/DXContainerYAMLTest.cpp index b5fb8d143c0b9..fed941f685272 100644 --- a/llvm/unittests/ObjectYAML/DXContainerYAMLTest.cpp +++ b/llvm/unittests/ObjectYAML/DXContainerYAMLTest.cpp @@ -134,12 +134,12 @@ TEST(RootSignature, ParseRootFlags) { )")); uint8_t Buffer[] = { - 0x44, 0x58, 0x42, 0x43, 0x32, 0x9A, 0x53, 0xD8, 0xEC, 0xBE, 0x35, 0x6F, - 0x05, 0x39, 0xE1, 0xFE, 0x31, 0x20, 0xF0, 0xC1, 0x01, 0x00, 0x00, 0x00, + 0x44, 0x58, 0x42, 0x43, 0x32, 0x9a, 0x53, 0xd8, 0xec, 0xbe, 0x35, 0x6f, + 0x05, 0x39, 0xe1, 0xfe, 0x31, 0x20, 0xf0, 0xc1, 0x01, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x52, 0x54, 0x53, 0x30, 0x18, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x18, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, }; EXPECT_EQ(Storage.size(), 68u); @@ -184,7 +184,7 @@ TEST(RootSignature, ParseRootConstants) { 0x85, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x52, 0x54, 0x53, 0x30, 0x59, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x2c, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, >From d39172781e9f7e882de78d2e24a7bd1bd8c48688 Mon Sep 17 00:00:00 2001 From: joaosaffran <joao.saff...@microsoft.com> Date: Mon, 24 Feb 2025 20:57:23 +0000 Subject: [PATCH 02/12] moving the offset logic to it's own class --- .../llvm/MC/DXContainerRootSignature.h | 24 ++++++ llvm/lib/MC/DXContainerRootSignature.cpp | 83 +++++++++++++------ 2 files changed, 81 insertions(+), 26 deletions(-) diff --git a/llvm/include/llvm/MC/DXContainerRootSignature.h b/llvm/include/llvm/MC/DXContainerRootSignature.h index cae4f79aef56f..ca958c0780cdd 100644 --- a/llvm/include/llvm/MC/DXContainerRootSignature.h +++ b/llvm/include/llvm/MC/DXContainerRootSignature.h @@ -7,18 +7,42 @@ //===----------------------------------------------------------------------===// #include "llvm/BinaryFormat/DXContainer.h" +#include "llvm/Support/BinaryStreamWriter.h" #include "llvm/Support/raw_ostream.h" +#include <map> +#include <string> namespace llvm { class raw_ostream; namespace mcdxbc { + +class StreamOffsetHelper { +private: + std::map<std::string, std::pair<uint32_t, uint32_t>> OffsetsMaping; + BinaryStreamWriter &Stream; + +public: + explicit StreamOffsetHelper(BinaryStreamWriter &Stream) : Stream(Stream) {} + + Error addOffset(std::string Key); + + void addRewriteValue(std::string Key); + + Error rewrite(); +}; + struct RootSignatureDesc { dxbc::RootSignatureHeader Header; SmallVector<dxbc::RootParameter> Parameters; Error write(raw_ostream &OS) const; + + uint32_t getSizeInBytes() const { + // Header Size + accounting for parameter offset + parameters size + return 24 + (Parameters.size() * 4) + Parameters.size_in_bytes(); + } }; } // namespace mcdxbc } // namespace llvm diff --git a/llvm/lib/MC/DXContainerRootSignature.cpp b/llvm/lib/MC/DXContainerRootSignature.cpp index 9a279ab722877..828785980c15d 100644 --- a/llvm/lib/MC/DXContainerRootSignature.cpp +++ b/llvm/lib/MC/DXContainerRootSignature.cpp @@ -7,21 +7,55 @@ //===----------------------------------------------------------------------===// #include "llvm/MC/DXContainerRootSignature.h" +#include "llvm/ADT/Twine.h" #include "llvm/Support/BinaryStreamWriter.h" -#include <vector> using namespace llvm; using namespace llvm::mcdxbc; +Error StreamOffsetHelper::addOffset(std::string Key) { + const uint32_t DummyValue = std::numeric_limits<uint32_t>::max(); + + uint32_t Offset = Stream.getOffset(); + auto Value = std::make_pair(Offset, DummyValue); + + OffsetsMaping.insert_or_assign(Key, Value); + + if (Error Err = Stream.writeInteger(DummyValue)) + return Err; + + return Error::success(); +} + +void StreamOffsetHelper::addRewriteValue(std::string Key) { + auto It = OffsetsMaping.find(Key); + assert(It != OffsetsMaping.end() && "Offset address was not found."); + auto [Offset, _] = It->second; + + uint32_t Value = Stream.getOffset(); + + std::pair<uint32_t, uint32_t> NewValue = std::make_pair(Offset, Value); + OffsetsMaping.insert_or_assign(Key, NewValue); +} + +Error StreamOffsetHelper::rewrite() { + for (auto &[Key, RewriteInfo] : OffsetsMaping) { + auto [Position, Value] = RewriteInfo; + assert(Value != std::numeric_limits<uint32_t>::max()); + + Stream.setOffset(Position); + if (Error Err = Stream.writeInteger(Value)) + return Err; + } + + return Error::success(); +} + Error RootSignatureDesc::write(raw_ostream &OS) const { - // Header Size + accounting for parameter offset + parameters size - std::vector<uint8_t> Buffer(24 + (Parameters.size() * 4) + - Parameters.size_in_bytes()); + std::vector<uint8_t> Buffer(getSizeInBytes()); BinaryStreamWriter Writer(Buffer, llvm::endianness::little); - SmallVector<uint64_t> OffsetsToReplace; - SmallVector<uint32_t> ValuesToReplaceOffsetsWith; - const uint32_t Dummy = std::numeric_limits<uint32_t>::max(); + StreamOffsetHelper OffsetMap(Writer); const uint32_t NumParameters = Parameters.size(); const uint32_t Zero = 0; @@ -32,8 +66,7 @@ Error RootSignatureDesc::write(raw_ostream &OS) const { if (Error Err = Writer.writeInteger(NumParameters)) return Err; - OffsetsToReplace.push_back(Writer.getOffset()); - if (Error Err = Writer.writeInteger(Dummy)) + if (Error Err = OffsetMap.addOffset("header")) return Err; // Static samplers still not implemented @@ -46,21 +79,28 @@ Error RootSignatureDesc::write(raw_ostream &OS) const { if (Error Err = Writer.writeInteger(Header.Flags)) return Err; - ValuesToReplaceOffsetsWith.push_back(Writer.getOffset()); + OffsetMap.addRewriteValue("header"); + + for (size_t It = 0; It < Parameters.size(); It++) { + const auto &P = Parameters[It]; - for (const dxbc::RootParameter &P : Parameters) { if (Error Err = Writer.writeEnum(P.ParameterType)) return Err; + if (Error Err = Writer.writeEnum(P.ShaderVisibility)) return Err; - OffsetsToReplace.push_back(Writer.getOffset()); - if (Error Err = Writer.writeInteger(Dummy)) + std::string Key = ("parameters" + Twine(It)).str(); + if (Error Err = OffsetMap.addOffset(Key)) return Err; } - for (const dxbc::RootParameter &P : Parameters) { - ValuesToReplaceOffsetsWith.push_back(Writer.getOffset()); + for (size_t It = 0; It < Parameters.size(); It++) { + const auto &P = Parameters[It]; + + std::string Key = ("parameters" + Twine(It)).str(); + OffsetMap.addRewriteValue(Key); + switch (P.ParameterType) { case dxbc::RootParameterType::Constants32Bit: { if (Error Err = Writer.writeInteger(P.Constants.ShaderRegister)) @@ -75,17 +115,8 @@ Error RootSignatureDesc::write(raw_ostream &OS) const { } } - assert(ValuesToReplaceOffsetsWith.size() == OffsetsToReplace.size() && - "Offset missing value to replace with."); - - for (size_t It = 0; It < ValuesToReplaceOffsetsWith.size(); It++) { - uint32_t Position = OffsetsToReplace[It]; - uint32_t Value = ValuesToReplaceOffsetsWith[It]; - - Writer.setOffset(Position); - if (Error Err = Writer.writeInteger(Value)) - return Err; - } + if (Error Err = OffsetMap.rewrite()) + return Err; llvm::ArrayRef<char> BufferRef(reinterpret_cast<char *>(Buffer.data()), Buffer.size()); >From 68c7513d27ee9d5ada3851230b4dcd9611e88f02 Mon Sep 17 00:00:00 2001 From: joaosaffran <joao.saff...@microsoft.com> Date: Mon, 24 Feb 2025 22:39:34 +0000 Subject: [PATCH 03/12] refactoring to remove use of map and string --- .../llvm/MC/DXContainerRootSignature.h | 18 +---- llvm/lib/MC/DXContainerRootSignature.cpp | 65 ++++++++----------- 2 files changed, 28 insertions(+), 55 deletions(-) diff --git a/llvm/include/llvm/MC/DXContainerRootSignature.h b/llvm/include/llvm/MC/DXContainerRootSignature.h index ca958c0780cdd..911ff53c15fae 100644 --- a/llvm/include/llvm/MC/DXContainerRootSignature.h +++ b/llvm/include/llvm/MC/DXContainerRootSignature.h @@ -6,11 +6,10 @@ // //===----------------------------------------------------------------------===// +#include "llvm/ADT/IndexedMap.h" #include "llvm/BinaryFormat/DXContainer.h" #include "llvm/Support/BinaryStreamWriter.h" #include "llvm/Support/raw_ostream.h" -#include <map> -#include <string> namespace llvm { @@ -18,21 +17,6 @@ class raw_ostream; namespace mcdxbc { -class StreamOffsetHelper { -private: - std::map<std::string, std::pair<uint32_t, uint32_t>> OffsetsMaping; - BinaryStreamWriter &Stream; - -public: - explicit StreamOffsetHelper(BinaryStreamWriter &Stream) : Stream(Stream) {} - - Error addOffset(std::string Key); - - void addRewriteValue(std::string Key); - - Error rewrite(); -}; - struct RootSignatureDesc { dxbc::RootSignatureHeader Header; SmallVector<dxbc::RootParameter> Parameters; diff --git a/llvm/lib/MC/DXContainerRootSignature.cpp b/llvm/lib/MC/DXContainerRootSignature.cpp index 828785980c15d..abcaa66aff380 100644 --- a/llvm/lib/MC/DXContainerRootSignature.cpp +++ b/llvm/lib/MC/DXContainerRootSignature.cpp @@ -7,19 +7,19 @@ //===----------------------------------------------------------------------===// #include "llvm/MC/DXContainerRootSignature.h" +#include "llvm/ADT/SmallVector.h" #include "llvm/ADT/Twine.h" #include "llvm/Support/BinaryStreamWriter.h" +#include <cstdint> +#include <sys/types.h> using namespace llvm; using namespace llvm::mcdxbc; -Error StreamOffsetHelper::addOffset(std::string Key) { +Error setRewrite(BinaryStreamWriter &Stream, uint32_t &Offset) { const uint32_t DummyValue = std::numeric_limits<uint32_t>::max(); - uint32_t Offset = Stream.getOffset(); - auto Value = std::make_pair(Offset, DummyValue); - - OffsetsMaping.insert_or_assign(Key, Value); + Offset = Stream.getOffset(); if (Error Err = Stream.writeInteger(DummyValue)) return Err; @@ -27,26 +27,13 @@ Error StreamOffsetHelper::addOffset(std::string Key) { return Error::success(); } -void StreamOffsetHelper::addRewriteValue(std::string Key) { - auto It = OffsetsMaping.find(Key); - assert(It != OffsetsMaping.end() && "Offset address was not found."); - auto [Offset, _] = It->second; - - uint32_t Value = Stream.getOffset(); - - std::pair<uint32_t, uint32_t> NewValue = std::make_pair(Offset, Value); - OffsetsMaping.insert_or_assign(Key, NewValue); -} - -Error StreamOffsetHelper::rewrite() { - for (auto &[Key, RewriteInfo] : OffsetsMaping) { - auto [Position, Value] = RewriteInfo; - assert(Value != std::numeric_limits<uint32_t>::max()); +Error rewriteOffset(BinaryStreamWriter &Stream, uint32_t Offset) { + uint64_t Value = Stream.getOffset(); + Stream.setOffset(Offset); + if (Error Err = Stream.writeInteger((uint32_t)Value)) + return Err; - Stream.setOffset(Position); - if (Error Err = Stream.writeInteger(Value)) - return Err; - } + Stream.setOffset(Value); return Error::success(); } @@ -55,8 +42,6 @@ Error RootSignatureDesc::write(raw_ostream &OS) const { std::vector<uint8_t> Buffer(getSizeInBytes()); BinaryStreamWriter Writer(Buffer, llvm::endianness::little); - StreamOffsetHelper OffsetMap(Writer); - const uint32_t NumParameters = Parameters.size(); const uint32_t Zero = 0; @@ -66,7 +51,8 @@ Error RootSignatureDesc::write(raw_ostream &OS) const { if (Error Err = Writer.writeInteger(NumParameters)) return Err; - if (Error Err = OffsetMap.addOffset("header")) + uint32_t HeaderPoint; + if (Error Err = setRewrite(Writer, HeaderPoint)) return Err; // Static samplers still not implemented @@ -79,10 +65,11 @@ Error RootSignatureDesc::write(raw_ostream &OS) const { if (Error Err = Writer.writeInteger(Header.Flags)) return Err; - OffsetMap.addRewriteValue("header"); + if (Error Err = rewriteOffset(Writer, HeaderPoint)) + return Err; - for (size_t It = 0; It < Parameters.size(); It++) { - const auto &P = Parameters[It]; + SmallVector<uint32_t> ParamsOffset; + for (const auto &P : Parameters) { if (Error Err = Writer.writeEnum(P.ParameterType)) return Err; @@ -90,16 +77,19 @@ Error RootSignatureDesc::write(raw_ostream &OS) const { if (Error Err = Writer.writeEnum(P.ShaderVisibility)) return Err; - std::string Key = ("parameters" + Twine(It)).str(); - if (Error Err = OffsetMap.addOffset(Key)) + uint32_t Offset; + if (Error Err = setRewrite(Writer, Offset)) return Err; + ParamsOffset.push_back(Offset); } - for (size_t It = 0; It < Parameters.size(); It++) { - const auto &P = Parameters[It]; + size_t It = 0; + for (const auto &P : Parameters) { - std::string Key = ("parameters" + Twine(It)).str(); - OffsetMap.addRewriteValue(Key); + auto Offset = ParamsOffset[It]; + if (Error Err = rewriteOffset(Writer, Offset)) + return Err; + It++; switch (P.ParameterType) { case dxbc::RootParameterType::Constants32Bit: { @@ -115,8 +105,7 @@ Error RootSignatureDesc::write(raw_ostream &OS) const { } } - if (Error Err = OffsetMap.rewrite()) - return Err; + assert(It == NumParameters); llvm::ArrayRef<char> BufferRef(reinterpret_cast<char *>(Buffer.data()), Buffer.size()); >From 23069ab6def6089a74ce50f3d1b42c896b13f623 Mon Sep 17 00:00:00 2001 From: joaosaffran <joao.saff...@microsoft.com> Date: Tue, 25 Feb 2025 04:25:33 +0000 Subject: [PATCH 04/12] addressing comments --- llvm/lib/MC/DXContainerRootSignature.cpp | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/llvm/lib/MC/DXContainerRootSignature.cpp b/llvm/lib/MC/DXContainerRootSignature.cpp index abcaa66aff380..5cdd7726e6e3f 100644 --- a/llvm/lib/MC/DXContainerRootSignature.cpp +++ b/llvm/lib/MC/DXContainerRootSignature.cpp @@ -83,13 +83,12 @@ Error RootSignatureDesc::write(raw_ostream &OS) const { ParamsOffset.push_back(Offset); } - size_t It = 0; - for (const auto &P : Parameters) { - - auto Offset = ParamsOffset[It]; - if (Error Err = rewriteOffset(Writer, Offset)) + assert(NumParameters == ParamsOffset.size()); + for (size_t I = 0; I < NumParameters; ++I) { + if (Error Err = rewriteOffset(Writer, ParamsOffset[I])) return Err; - It++; + + const auto &P = Parameters[I]; switch (P.ParameterType) { case dxbc::RootParameterType::Constants32Bit: { @@ -105,8 +104,6 @@ Error RootSignatureDesc::write(raw_ostream &OS) const { } } - assert(It == NumParameters); - llvm::ArrayRef<char> BufferRef(reinterpret_cast<char *>(Buffer.data()), Buffer.size()); OS.write(BufferRef.data(), BufferRef.size()); >From d14471b11c7eaaa12870982229cc804946cc59fb Mon Sep 17 00:00:00 2001 From: joaosaffran <joao.saff...@microsoft.com> Date: Tue, 25 Feb 2025 18:52:33 +0000 Subject: [PATCH 05/12] using buffer_ostream --- .../llvm/MC/DXContainerRootSignature.h | 2 - llvm/lib/MC/DXContainerRootSignature.cpp | 90 ++++++------------- 2 files changed, 29 insertions(+), 63 deletions(-) diff --git a/llvm/include/llvm/MC/DXContainerRootSignature.h b/llvm/include/llvm/MC/DXContainerRootSignature.h index 911ff53c15fae..9e8c7ee54c148 100644 --- a/llvm/include/llvm/MC/DXContainerRootSignature.h +++ b/llvm/include/llvm/MC/DXContainerRootSignature.h @@ -6,9 +6,7 @@ // //===----------------------------------------------------------------------===// -#include "llvm/ADT/IndexedMap.h" #include "llvm/BinaryFormat/DXContainer.h" -#include "llvm/Support/BinaryStreamWriter.h" #include "llvm/Support/raw_ostream.h" namespace llvm { diff --git a/llvm/lib/MC/DXContainerRootSignature.cpp b/llvm/lib/MC/DXContainerRootSignature.cpp index 5cdd7726e6e3f..d66b9f7776a71 100644 --- a/llvm/lib/MC/DXContainerRootSignature.cpp +++ b/llvm/lib/MC/DXContainerRootSignature.cpp @@ -9,104 +9,72 @@ #include "llvm/MC/DXContainerRootSignature.h" #include "llvm/ADT/SmallVector.h" #include "llvm/ADT/Twine.h" -#include "llvm/Support/BinaryStreamWriter.h" +#include "llvm/Support/EndianStream.h" +#include "llvm/Support/Error.h" #include <cstdint> -#include <sys/types.h> using namespace llvm; using namespace llvm::mcdxbc; -Error setRewrite(BinaryStreamWriter &Stream, uint32_t &Offset) { +void setRewrite(raw_ostream &Stream, uint32_t &Offset) { const uint32_t DummyValue = std::numeric_limits<uint32_t>::max(); - - Offset = Stream.getOffset(); - - if (Error Err = Stream.writeInteger(DummyValue)) - return Err; - - return Error::success(); + Offset = Stream.tell(); + support::endian::write(Stream, DummyValue, llvm::endianness::little); } -Error rewriteOffset(BinaryStreamWriter &Stream, uint32_t Offset) { - uint64_t Value = Stream.getOffset(); - Stream.setOffset(Offset); - if (Error Err = Stream.writeInteger((uint32_t)Value)) - return Err; - - Stream.setOffset(Value); - - return Error::success(); +void rewriteOffset(buffer_ostream &Stream, uint32_t Offset) { + uint32_t Value = Stream.tell(); + auto *InsertPoint = &Stream.buffer()[Offset]; + support::endian::write(InsertPoint, Value, llvm::endianness::little); } Error RootSignatureDesc::write(raw_ostream &OS) const { - std::vector<uint8_t> Buffer(getSizeInBytes()); - BinaryStreamWriter Writer(Buffer, llvm::endianness::little); - + buffer_ostream Writer(OS); const uint32_t NumParameters = Parameters.size(); const uint32_t Zero = 0; - if (Error Err = Writer.writeInteger(Header.Version)) - return Err; - - if (Error Err = Writer.writeInteger(NumParameters)) - return Err; + support::endian::write(Writer, Header.Version, llvm::endianness::little); + support::endian::write(Writer, NumParameters, llvm::endianness::little); uint32_t HeaderPoint; - if (Error Err = setRewrite(Writer, HeaderPoint)) - return Err; - - // Static samplers still not implemented - if (Error Err = Writer.writeInteger(Zero)) - return Err; + setRewrite(Writer, HeaderPoint); - if (Error Err = Writer.writeInteger(Zero)) - return Err; + support::endian::write(Writer, Zero, llvm::endianness::little); + support::endian::write(Writer, Zero, llvm::endianness::little); + support::endian::write(Writer, Header.Flags, llvm::endianness::little); - if (Error Err = Writer.writeInteger(Header.Flags)) - return Err; - - if (Error Err = rewriteOffset(Writer, HeaderPoint)) - return Err; + rewriteOffset(Writer, HeaderPoint); SmallVector<uint32_t> ParamsOffset; for (const auto &P : Parameters) { - - if (Error Err = Writer.writeEnum(P.ParameterType)) - return Err; - - if (Error Err = Writer.writeEnum(P.ShaderVisibility)) - return Err; + support::endian::write(Writer, P.ParameterType, llvm::endianness::little); + support::endian::write(Writer, P.ShaderVisibility, + llvm::endianness::little); uint32_t Offset; - if (Error Err = setRewrite(Writer, Offset)) - return Err; + setRewrite(Writer, Offset); + ParamsOffset.push_back(Offset); } assert(NumParameters == ParamsOffset.size()); for (size_t I = 0; I < NumParameters; ++I) { - if (Error Err = rewriteOffset(Writer, ParamsOffset[I])) - return Err; - + rewriteOffset(Writer, ParamsOffset[I]); const auto &P = Parameters[I]; switch (P.ParameterType) { case dxbc::RootParameterType::Constants32Bit: { - if (Error Err = Writer.writeInteger(P.Constants.ShaderRegister)) - return Err; - if (Error Err = Writer.writeInteger(P.Constants.RegisterSpace)) - return Err; - if (Error Err = Writer.writeInteger(P.Constants.Num32BitValues)) - return Err; + support::endian::write(Writer, P.Constants.ShaderRegister, + llvm::endianness::little); + support::endian::write(Writer, P.Constants.RegisterSpace, + llvm::endianness::little); + support::endian::write(Writer, P.Constants.Num32BitValues, + llvm::endianness::little); } break; case dxbc::RootParameterType::Empty: llvm_unreachable("Invalid RootParameterType"); } } - llvm::ArrayRef<char> BufferRef(reinterpret_cast<char *>(Buffer.data()), - Buffer.size()); - OS.write(BufferRef.data(), BufferRef.size()); - return Error::success(); } >From 216341ca3457f9da59cecc6f400e75f88ce51e90 Mon Sep 17 00:00:00 2001 From: joaosaffran <joao.saff...@microsoft.com> Date: Tue, 25 Feb 2025 18:54:26 +0000 Subject: [PATCH 06/12] remove getsize --- llvm/include/llvm/MC/DXContainerRootSignature.h | 5 ----- 1 file changed, 5 deletions(-) diff --git a/llvm/include/llvm/MC/DXContainerRootSignature.h b/llvm/include/llvm/MC/DXContainerRootSignature.h index 9e8c7ee54c148..d2dfb77087212 100644 --- a/llvm/include/llvm/MC/DXContainerRootSignature.h +++ b/llvm/include/llvm/MC/DXContainerRootSignature.h @@ -20,11 +20,6 @@ struct RootSignatureDesc { SmallVector<dxbc::RootParameter> Parameters; Error write(raw_ostream &OS) const; - - uint32_t getSizeInBytes() const { - // Header Size + accounting for parameter offset + parameters size - return 24 + (Parameters.size() * 4) + Parameters.size_in_bytes(); - } }; } // namespace mcdxbc } // namespace llvm >From 85f012c3e9f05f91386d4c4731cbe98fadeabe3c Mon Sep 17 00:00:00 2001 From: joaosaffran <joao.saff...@microsoft.com> Date: Tue, 25 Feb 2025 19:16:56 +0000 Subject: [PATCH 07/12] clean up --- llvm/include/llvm/MC/DXContainerRootSignature.h | 4 +--- llvm/lib/MC/DXContainerRootSignature.cpp | 8 +------- llvm/lib/ObjectYAML/DXContainerEmitter.cpp | 3 +-- llvm/lib/Target/DirectX/DXContainerGlobals.cpp | 5 +---- 4 files changed, 4 insertions(+), 16 deletions(-) diff --git a/llvm/include/llvm/MC/DXContainerRootSignature.h b/llvm/include/llvm/MC/DXContainerRootSignature.h index d2dfb77087212..89e8a6c6c1834 100644 --- a/llvm/include/llvm/MC/DXContainerRootSignature.h +++ b/llvm/include/llvm/MC/DXContainerRootSignature.h @@ -7,19 +7,17 @@ //===----------------------------------------------------------------------===// #include "llvm/BinaryFormat/DXContainer.h" -#include "llvm/Support/raw_ostream.h" namespace llvm { class raw_ostream; namespace mcdxbc { - struct RootSignatureDesc { dxbc::RootSignatureHeader Header; SmallVector<dxbc::RootParameter> Parameters; - Error write(raw_ostream &OS) const; + void write(raw_ostream &OS) const; }; } // namespace mcdxbc } // namespace llvm diff --git a/llvm/lib/MC/DXContainerRootSignature.cpp b/llvm/lib/MC/DXContainerRootSignature.cpp index d66b9f7776a71..1a08d92c72cab 100644 --- a/llvm/lib/MC/DXContainerRootSignature.cpp +++ b/llvm/lib/MC/DXContainerRootSignature.cpp @@ -7,11 +7,7 @@ //===----------------------------------------------------------------------===// #include "llvm/MC/DXContainerRootSignature.h" -#include "llvm/ADT/SmallVector.h" -#include "llvm/ADT/Twine.h" #include "llvm/Support/EndianStream.h" -#include "llvm/Support/Error.h" -#include <cstdint> using namespace llvm; using namespace llvm::mcdxbc; @@ -28,7 +24,7 @@ void rewriteOffset(buffer_ostream &Stream, uint32_t Offset) { support::endian::write(InsertPoint, Value, llvm::endianness::little); } -Error RootSignatureDesc::write(raw_ostream &OS) const { +void RootSignatureDesc::write(raw_ostream &OS) const { buffer_ostream Writer(OS); const uint32_t NumParameters = Parameters.size(); const uint32_t Zero = 0; @@ -75,6 +71,4 @@ Error RootSignatureDesc::write(raw_ostream &OS) const { llvm_unreachable("Invalid RootParameterType"); } } - - return Error::success(); } diff --git a/llvm/lib/ObjectYAML/DXContainerEmitter.cpp b/llvm/lib/ObjectYAML/DXContainerEmitter.cpp index a5831a69f9bca..4f275fb58adc1 100644 --- a/llvm/lib/ObjectYAML/DXContainerEmitter.cpp +++ b/llvm/lib/ObjectYAML/DXContainerEmitter.cpp @@ -271,8 +271,7 @@ void DXContainerWriter::writeParts(raw_ostream &OS) { RS.Header.Version = P.RootSignature->Version; RS.Parameters = std::move(P.RootSignature->Parameters); - if (Error Err = RS.write(OS)) - handleAllErrors(std::move(Err)); + RS.write(OS); break; } diff --git a/llvm/lib/Target/DirectX/DXContainerGlobals.cpp b/llvm/lib/Target/DirectX/DXContainerGlobals.cpp index 5801046f83674..5508af40663b1 100644 --- a/llvm/lib/Target/DirectX/DXContainerGlobals.cpp +++ b/llvm/lib/Target/DirectX/DXContainerGlobals.cpp @@ -25,12 +25,10 @@ #include "llvm/InitializePasses.h" #include "llvm/MC/DXContainerPSVInfo.h" #include "llvm/Pass.h" -#include "llvm/Support/Error.h" #include "llvm/Support/MD5.h" #include "llvm/TargetParser/Triple.h" #include "llvm/Transforms/Utils/ModuleUtils.h" #include <optional> -#include <utility> using namespace llvm; using namespace llvm::dxil; @@ -175,8 +173,7 @@ void DXContainerGlobals::addRootSignature(Module &M, SmallString<256> Data; raw_svector_ostream OS(Data); - if (Error Err = RS.write(OS)) - handleAllErrors(std::move(Err)); + RS.write(OS); Constant *Constant = ConstantDataArray::getString(M.getContext(), Data, /*AddNull*/ false); >From 1e2bcf54b775f792fdf61818698a15932601b7cf Mon Sep 17 00:00:00 2001 From: joaosaffran <joao.saff...@microsoft.com> Date: Tue, 25 Feb 2025 19:17:51 +0000 Subject: [PATCH 08/12] clean up --- llvm/include/llvm/MC/DXContainerRootSignature.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/llvm/include/llvm/MC/DXContainerRootSignature.h b/llvm/include/llvm/MC/DXContainerRootSignature.h index 89e8a6c6c1834..b31b0da352038 100644 --- a/llvm/include/llvm/MC/DXContainerRootSignature.h +++ b/llvm/include/llvm/MC/DXContainerRootSignature.h @@ -7,6 +7,8 @@ //===----------------------------------------------------------------------===// #include "llvm/BinaryFormat/DXContainer.h" +#include <cstdint> +#include <limits> namespace llvm { >From 0e277d96f18808648a299195f436fc0216c4e155 Mon Sep 17 00:00:00 2001 From: joaosaffran <joao.saff...@microsoft.com> Date: Tue, 25 Feb 2025 19:19:51 +0000 Subject: [PATCH 09/12] clean up --- llvm/lib/Object/DXContainer.cpp | 10 ++++------ llvm/lib/ObjectYAML/DXContainerEmitter.cpp | 1 - 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/llvm/lib/Object/DXContainer.cpp b/llvm/lib/Object/DXContainer.cpp index 35261b661cf2f..8d955d01ce202 100644 --- a/llvm/lib/Object/DXContainer.cpp +++ b/llvm/lib/Object/DXContainer.cpp @@ -296,18 +296,16 @@ Error DirectX::RootSignature::parse(StringRef Data) { NewParam.ParameterType = support::endian::read<dxbc::RootParameterType, llvm::endianness::little>(Current); - if (!dxbc::RootSignatureValidations::isValidParameterType( - NewParam.ParameterType)) + if (!dxbc::RootSignatureValidations::isValidParameterType(NewParam.ParameterType)) return validationFailed("unsupported parameter type value read: " + llvm::Twine((uint32_t)NewParam.ParameterType)); Current += sizeof(dxbc::RootParameterType); NewParam.ShaderVisibility = - support::endian::read<dxbc::ShaderVisibility, llvm::endianness::little>( - Current); - if (!dxbc::RootSignatureValidations::isValidShaderVisibility( - NewParam.ShaderVisibility)) + support::endian::read<dxbc::ShaderVisibility, + llvm::endianness::little>(Current); + if (!dxbc::RootSignatureValidations::isValidShaderVisibility(NewParam.ShaderVisibility)) return validationFailed("unsupported shader visility flag value read: " + llvm::Twine((uint32_t)NewParam.ShaderVisibility)); diff --git a/llvm/lib/ObjectYAML/DXContainerEmitter.cpp b/llvm/lib/ObjectYAML/DXContainerEmitter.cpp index 4f275fb58adc1..87ba16fd40ba9 100644 --- a/llvm/lib/ObjectYAML/DXContainerEmitter.cpp +++ b/llvm/lib/ObjectYAML/DXContainerEmitter.cpp @@ -272,7 +272,6 @@ void DXContainerWriter::writeParts(raw_ostream &OS) { RS.Parameters = std::move(P.RootSignature->Parameters); RS.write(OS); - break; } uint64_t BytesWritten = OS.tell() - DataStart; >From 5cd0044cf3ae363b9adb129029b2d1d728e111ce Mon Sep 17 00:00:00 2001 From: joaosaffran <joao.saff...@microsoft.com> Date: Tue, 25 Feb 2025 19:20:35 +0000 Subject: [PATCH 10/12] clean up --- llvm/lib/Object/DXContainer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/llvm/lib/Object/DXContainer.cpp b/llvm/lib/Object/DXContainer.cpp index 8d955d01ce202..010f70a952ebf 100644 --- a/llvm/lib/Object/DXContainer.cpp +++ b/llvm/lib/Object/DXContainer.cpp @@ -303,7 +303,7 @@ Error DirectX::RootSignature::parse(StringRef Data) { Current += sizeof(dxbc::RootParameterType); NewParam.ShaderVisibility = - support::endian::read<dxbc::ShaderVisibility, + support::endian::read<dxbc::ShaderVisibility, llvm::endianness::little>(Current); if (!dxbc::RootSignatureValidations::isValidShaderVisibility(NewParam.ShaderVisibility)) return validationFailed("unsupported shader visility flag value read: " + >From 7a7c34d5976359975d44aed6495b34bfb0beb244 Mon Sep 17 00:00:00 2001 From: joaosaffran <joao.saff...@microsoft.com> Date: Tue, 25 Feb 2025 22:35:38 +0000 Subject: [PATCH 11/12] addressing pr comments --- llvm/lib/MC/DXContainerRootSignature.cpp | 54 ++++++++++++------------ llvm/lib/Object/DXContainer.cpp | 10 +++-- 2 files changed, 32 insertions(+), 32 deletions(-) diff --git a/llvm/lib/MC/DXContainerRootSignature.cpp b/llvm/lib/MC/DXContainerRootSignature.cpp index 1a08d92c72cab..d90ee510fddf3 100644 --- a/llvm/lib/MC/DXContainerRootSignature.cpp +++ b/llvm/lib/MC/DXContainerRootSignature.cpp @@ -8,63 +8,61 @@ #include "llvm/MC/DXContainerRootSignature.h" #include "llvm/Support/EndianStream.h" +#include <cstdint> using namespace llvm; using namespace llvm::mcdxbc; -void setRewrite(raw_ostream &Stream, uint32_t &Offset) { +static uint32_t writePlaceholder(raw_ostream &Stream) { const uint32_t DummyValue = std::numeric_limits<uint32_t>::max(); - Offset = Stream.tell(); + uint32_t Offset = Stream.tell(); support::endian::write(Stream, DummyValue, llvm::endianness::little); + return Offset; } -void rewriteOffset(buffer_ostream &Stream, uint32_t Offset) { - uint32_t Value = Stream.tell(); - auto *InsertPoint = &Stream.buffer()[Offset]; - support::endian::write(InsertPoint, Value, llvm::endianness::little); +static void rewriteOffset(buffer_ostream &Stream, uint32_t Offset) { + uint32_t Value = + support::endian::byte_swap<uint32_t, llvm::endianness::little>( + Stream.tell()); + Stream.pwrite(reinterpret_cast<const char *>(&Value), sizeof(Value), Offset); } void RootSignatureDesc::write(raw_ostream &OS) const { - buffer_ostream Writer(OS); + buffer_ostream BOS(OS); const uint32_t NumParameters = Parameters.size(); const uint32_t Zero = 0; - support::endian::write(Writer, Header.Version, llvm::endianness::little); - support::endian::write(Writer, NumParameters, llvm::endianness::little); + support::endian::write(BOS, Header.Version, llvm::endianness::little); + support::endian::write(BOS, NumParameters, llvm::endianness::little); - uint32_t HeaderPoint; - setRewrite(Writer, HeaderPoint); + uint32_t HeaderPoint = writePlaceholder(BOS); - support::endian::write(Writer, Zero, llvm::endianness::little); - support::endian::write(Writer, Zero, llvm::endianness::little); - support::endian::write(Writer, Header.Flags, llvm::endianness::little); + support::endian::write(BOS, Zero, llvm::endianness::little); + support::endian::write(BOS, Zero, llvm::endianness::little); + support::endian::write(BOS, Header.Flags, llvm::endianness::little); - rewriteOffset(Writer, HeaderPoint); + rewriteOffset(BOS, HeaderPoint); - SmallVector<uint32_t> ParamsOffset; + SmallVector<uint32_t> ParamsOffsets; for (const auto &P : Parameters) { - support::endian::write(Writer, P.ParameterType, llvm::endianness::little); - support::endian::write(Writer, P.ShaderVisibility, - llvm::endianness::little); + support::endian::write(BOS, P.ParameterType, llvm::endianness::little); + support::endian::write(BOS, P.ShaderVisibility, llvm::endianness::little); - uint32_t Offset; - setRewrite(Writer, Offset); - - ParamsOffset.push_back(Offset); + ParamsOffsets.push_back(writePlaceholder(BOS)); } - assert(NumParameters == ParamsOffset.size()); + assert(NumParameters == ParamsOffsets.size()); for (size_t I = 0; I < NumParameters; ++I) { - rewriteOffset(Writer, ParamsOffset[I]); + rewriteOffset(BOS, ParamsOffsets[I]); const auto &P = Parameters[I]; switch (P.ParameterType) { case dxbc::RootParameterType::Constants32Bit: { - support::endian::write(Writer, P.Constants.ShaderRegister, + support::endian::write(BOS, P.Constants.ShaderRegister, llvm::endianness::little); - support::endian::write(Writer, P.Constants.RegisterSpace, + support::endian::write(BOS, P.Constants.RegisterSpace, llvm::endianness::little); - support::endian::write(Writer, P.Constants.Num32BitValues, + support::endian::write(BOS, P.Constants.Num32BitValues, llvm::endianness::little); } break; case dxbc::RootParameterType::Empty: diff --git a/llvm/lib/Object/DXContainer.cpp b/llvm/lib/Object/DXContainer.cpp index 010f70a952ebf..35261b661cf2f 100644 --- a/llvm/lib/Object/DXContainer.cpp +++ b/llvm/lib/Object/DXContainer.cpp @@ -296,16 +296,18 @@ Error DirectX::RootSignature::parse(StringRef Data) { NewParam.ParameterType = support::endian::read<dxbc::RootParameterType, llvm::endianness::little>(Current); - if (!dxbc::RootSignatureValidations::isValidParameterType(NewParam.ParameterType)) + if (!dxbc::RootSignatureValidations::isValidParameterType( + NewParam.ParameterType)) return validationFailed("unsupported parameter type value read: " + llvm::Twine((uint32_t)NewParam.ParameterType)); Current += sizeof(dxbc::RootParameterType); NewParam.ShaderVisibility = - support::endian::read<dxbc::ShaderVisibility, - llvm::endianness::little>(Current); - if (!dxbc::RootSignatureValidations::isValidShaderVisibility(NewParam.ShaderVisibility)) + support::endian::read<dxbc::ShaderVisibility, llvm::endianness::little>( + Current); + if (!dxbc::RootSignatureValidations::isValidShaderVisibility( + NewParam.ShaderVisibility)) return validationFailed("unsupported shader visility flag value read: " + llvm::Twine((uint32_t)NewParam.ShaderVisibility)); >From d3fafab79d4964ea366af87cbb4c644594f09f93 Mon Sep 17 00:00:00 2001 From: joaosaffran <joao.saff...@microsoft.com> Date: Tue, 25 Feb 2025 22:40:05 +0000 Subject: [PATCH 12/12] clean up --- llvm/lib/MC/DXContainerRootSignature.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/llvm/lib/MC/DXContainerRootSignature.cpp b/llvm/lib/MC/DXContainerRootSignature.cpp index d90ee510fddf3..1db8f55a31658 100644 --- a/llvm/lib/MC/DXContainerRootSignature.cpp +++ b/llvm/lib/MC/DXContainerRootSignature.cpp @@ -8,7 +8,6 @@ #include "llvm/MC/DXContainerRootSignature.h" #include "llvm/Support/EndianStream.h" -#include <cstdint> using namespace llvm; using namespace llvm::mcdxbc; _______________________________________________ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits