|
8 | 8 |
|
9 | 9 | #include "llvm/MC/DXContainerRootSignature.h"
|
10 | 10 | #include "llvm/Support/EndianStream.h"
|
| 11 | +#include <cstdint> |
11 | 12 |
|
12 | 13 | using namespace llvm;
|
13 | 14 | using namespace llvm::mcdxbc;
|
14 | 15 |
|
15 |
| -void setRewrite(raw_ostream &Stream, uint32_t &Offset) { |
| 16 | +static uint32_t writePlaceholder(raw_ostream &Stream) { |
16 | 17 | const uint32_t DummyValue = std::numeric_limits<uint32_t>::max();
|
17 |
| - Offset = Stream.tell(); |
| 18 | + uint32_t Offset = Stream.tell(); |
18 | 19 | support::endian::write(Stream, DummyValue, llvm::endianness::little);
|
| 20 | + return Offset; |
19 | 21 | }
|
20 | 22 |
|
21 |
| -void rewriteOffset(buffer_ostream &Stream, uint32_t Offset) { |
22 |
| - uint32_t Value = Stream.tell(); |
23 |
| - auto *InsertPoint = &Stream.buffer()[Offset]; |
24 |
| - support::endian::write(InsertPoint, Value, llvm::endianness::little); |
| 23 | +static void rewriteOffset(buffer_ostream &Stream, uint32_t Offset) { |
| 24 | + uint32_t Value = |
| 25 | + support::endian::byte_swap<uint32_t, llvm::endianness::little>( |
| 26 | + Stream.tell()); |
| 27 | + Stream.pwrite(reinterpret_cast<const char *>(&Value), sizeof(Value), Offset); |
25 | 28 | }
|
26 | 29 |
|
27 | 30 | void RootSignatureDesc::write(raw_ostream &OS) const {
|
28 |
| - buffer_ostream Writer(OS); |
| 31 | + buffer_ostream BOS(OS); |
29 | 32 | const uint32_t NumParameters = Parameters.size();
|
30 | 33 | const uint32_t Zero = 0;
|
31 | 34 |
|
32 |
| - support::endian::write(Writer, Header.Version, llvm::endianness::little); |
33 |
| - support::endian::write(Writer, NumParameters, llvm::endianness::little); |
| 35 | + support::endian::write(BOS, Header.Version, llvm::endianness::little); |
| 36 | + support::endian::write(BOS, NumParameters, llvm::endianness::little); |
34 | 37 |
|
35 |
| - uint32_t HeaderPoint; |
36 |
| - setRewrite(Writer, HeaderPoint); |
| 38 | + uint32_t HeaderPoint = writePlaceholder(BOS); |
37 | 39 |
|
38 |
| - support::endian::write(Writer, Zero, llvm::endianness::little); |
39 |
| - support::endian::write(Writer, Zero, llvm::endianness::little); |
40 |
| - support::endian::write(Writer, Header.Flags, llvm::endianness::little); |
| 40 | + support::endian::write(BOS, Zero, llvm::endianness::little); |
| 41 | + support::endian::write(BOS, Zero, llvm::endianness::little); |
| 42 | + support::endian::write(BOS, Header.Flags, llvm::endianness::little); |
41 | 43 |
|
42 |
| - rewriteOffset(Writer, HeaderPoint); |
| 44 | + rewriteOffset(BOS, HeaderPoint); |
43 | 45 |
|
44 |
| - SmallVector<uint32_t> ParamsOffset; |
| 46 | + SmallVector<uint32_t> ParamsOffsets; |
45 | 47 | for (const auto &P : Parameters) {
|
46 |
| - support::endian::write(Writer, P.ParameterType, llvm::endianness::little); |
47 |
| - support::endian::write(Writer, P.ShaderVisibility, |
48 |
| - llvm::endianness::little); |
| 48 | + support::endian::write(BOS, P.ParameterType, llvm::endianness::little); |
| 49 | + support::endian::write(BOS, P.ShaderVisibility, llvm::endianness::little); |
49 | 50 |
|
50 |
| - uint32_t Offset; |
51 |
| - setRewrite(Writer, Offset); |
52 |
| - |
53 |
| - ParamsOffset.push_back(Offset); |
| 51 | + ParamsOffsets.push_back(writePlaceholder(BOS)); |
54 | 52 | }
|
55 | 53 |
|
56 |
| - assert(NumParameters == ParamsOffset.size()); |
| 54 | + assert(NumParameters == ParamsOffsets.size()); |
57 | 55 | for (size_t I = 0; I < NumParameters; ++I) {
|
58 |
| - rewriteOffset(Writer, ParamsOffset[I]); |
| 56 | + rewriteOffset(BOS, ParamsOffsets[I]); |
59 | 57 | const auto &P = Parameters[I];
|
60 | 58 |
|
61 | 59 | switch (P.ParameterType) {
|
62 | 60 | case dxbc::RootParameterType::Constants32Bit: {
|
63 |
| - support::endian::write(Writer, P.Constants.ShaderRegister, |
| 61 | + support::endian::write(BOS, P.Constants.ShaderRegister, |
64 | 62 | llvm::endianness::little);
|
65 |
| - support::endian::write(Writer, P.Constants.RegisterSpace, |
| 63 | + support::endian::write(BOS, P.Constants.RegisterSpace, |
66 | 64 | llvm::endianness::little);
|
67 |
| - support::endian::write(Writer, P.Constants.Num32BitValues, |
| 65 | + support::endian::write(BOS, P.Constants.Num32BitValues, |
68 | 66 | llvm::endianness::little);
|
69 | 67 | } break;
|
70 | 68 | case dxbc::RootParameterType::Empty:
|
|
0 commit comments