|
7 | 7 | //===----------------------------------------------------------------------===// |
8 | 8 |
|
9 | 9 | #include "llvm/MC/DXContainerRootSignature.h" |
| 10 | +#include "llvm/ADT/SmallString.h" |
| 11 | +#include "llvm/ADT/SmallVector.h" |
| 12 | +#include "llvm/BinaryFormat/DXContainer.h" |
10 | 13 | #include "llvm/Support/EndianStream.h" |
| 14 | +#include <cstdint> |
11 | 15 |
|
12 | 16 | using namespace llvm; |
13 | 17 | using namespace llvm::mcdxbc; |
14 | 18 |
|
15 | | -static uint32_t writePlaceholder(raw_ostream &Stream) { |
| 19 | +static uint32_t writePlaceholder(raw_svector_ostream &Stream) { |
16 | 20 | const uint32_t DummyValue = std::numeric_limits<uint32_t>::max(); |
17 | 21 | uint32_t Offset = Stream.tell(); |
18 | 22 | support::endian::write(Stream, DummyValue, llvm::endianness::little); |
19 | 23 | return Offset; |
20 | 24 | } |
21 | 25 |
|
22 | | -static void rewriteOffset(buffer_ostream &Stream, uint32_t Offset) { |
| 26 | +static void rewriteOffset(raw_svector_ostream &Stream, uint32_t Offset) { |
23 | 27 | uint32_t Value = |
24 | 28 | support::endian::byte_swap<uint32_t, llvm::endianness::little>( |
25 | 29 | Stream.tell()); |
26 | 30 | Stream.pwrite(reinterpret_cast<const char *>(&Value), sizeof(Value), Offset); |
27 | 31 | } |
28 | 32 |
|
29 | 33 | void RootSignatureDesc::write(raw_ostream &OS) const { |
30 | | - buffer_ostream BOS(OS); |
| 34 | + SmallString<256> Storage; |
| 35 | + raw_svector_ostream BOS(Storage); |
| 36 | + BOS.reserveExtraSpace(getSize()); |
31 | 37 | const uint32_t NumParameters = Parameters.size(); |
32 | 38 | const uint32_t Zero = 0; |
33 | 39 |
|
34 | 40 | support::endian::write(BOS, Header.Version, llvm::endianness::little); |
35 | 41 | support::endian::write(BOS, NumParameters, llvm::endianness::little); |
36 | 42 |
|
37 | | - uint32_t HeaderPoint = writePlaceholder(BOS); |
| 43 | + // Root Parameters offset should always start after the |
| 44 | + support::endian::write(BOS, (uint32_t)sizeof(dxbc::RootSignatureHeader), |
| 45 | + llvm::endianness::little); |
38 | 46 |
|
39 | 47 | support::endian::write(BOS, Zero, llvm::endianness::little); |
40 | 48 | support::endian::write(BOS, Zero, llvm::endianness::little); |
41 | 49 | support::endian::write(BOS, Header.Flags, llvm::endianness::little); |
42 | 50 |
|
43 | | - rewriteOffset(BOS, HeaderPoint); |
44 | | - |
45 | 51 | SmallVector<uint32_t> ParamsOffsets; |
46 | 52 | for (const auto &P : Parameters) { |
47 | 53 | support::endian::write(BOS, P.Header.ParameterType, |
@@ -70,4 +76,6 @@ void RootSignatureDesc::write(raw_ostream &OS) const { |
70 | 76 | llvm_unreachable("Invalid RootParameterType"); |
71 | 77 | } |
72 | 78 | } |
| 79 | + |
| 80 | + OS.write(Storage.data(), Storage.size()); |
73 | 81 | } |
0 commit comments