7
7
// ===----------------------------------------------------------------------===//
8
8
9
9
#include " llvm/MC/DXContainerRootSignature.h"
10
+ #include " llvm/ADT/SmallVector.h"
10
11
#include " llvm/ADT/Twine.h"
11
12
#include " llvm/Support/BinaryStreamWriter.h"
13
+ #include < cstdint>
14
+ #include < sys/types.h>
12
15
13
16
using namespace llvm ;
14
17
using namespace llvm ::mcdxbc;
15
18
16
- Error StreamOffsetHelper::addOffset (std::string Key ) {
19
+ Error setRewrite (BinaryStreamWriter &Stream, uint32_t &Offset ) {
17
20
const uint32_t DummyValue = std::numeric_limits<uint32_t >::max ();
18
21
19
- uint32_t Offset = Stream.getOffset ();
20
- auto Value = std::make_pair (Offset, DummyValue);
21
-
22
- OffsetsMaping.insert_or_assign (Key, Value);
22
+ Offset = Stream.getOffset ();
23
23
24
24
if (Error Err = Stream.writeInteger (DummyValue))
25
25
return Err;
26
26
27
27
return Error::success ();
28
28
}
29
29
30
- void StreamOffsetHelper::addRewriteValue (std::string Key) {
31
- auto It = OffsetsMaping.find (Key);
32
- assert (It != OffsetsMaping.end () && " Offset address was not found." );
33
- auto [Offset, _] = It->second ;
34
-
35
- uint32_t Value = Stream.getOffset ();
36
-
37
- std::pair<uint32_t , uint32_t > NewValue = std::make_pair (Offset, Value);
38
- OffsetsMaping.insert_or_assign (Key, NewValue);
39
- }
40
-
41
- Error StreamOffsetHelper::rewrite () {
42
- for (auto &[Key, RewriteInfo] : OffsetsMaping) {
43
- auto [Position, Value] = RewriteInfo;
44
- assert (Value != std::numeric_limits<uint32_t >::max ());
30
+ Error rewriteOffset (BinaryStreamWriter &Stream, uint32_t Offset) {
31
+ uint64_t Value = Stream.getOffset ();
32
+ Stream.setOffset (Offset);
33
+ if (Error Err = Stream.writeInteger ((uint32_t )Value))
34
+ return Err;
45
35
46
- Stream.setOffset (Position);
47
- if (Error Err = Stream.writeInteger (Value))
48
- return Err;
49
- }
36
+ Stream.setOffset (Value);
50
37
51
38
return Error::success ();
52
39
}
@@ -55,8 +42,6 @@ Error RootSignatureDesc::write(raw_ostream &OS) const {
55
42
std::vector<uint8_t > Buffer (getSizeInBytes ());
56
43
BinaryStreamWriter Writer (Buffer, llvm::endianness::little);
57
44
58
- StreamOffsetHelper OffsetMap (Writer);
59
-
60
45
const uint32_t NumParameters = Parameters.size ();
61
46
const uint32_t Zero = 0 ;
62
47
@@ -66,7 +51,8 @@ Error RootSignatureDesc::write(raw_ostream &OS) const {
66
51
if (Error Err = Writer.writeInteger (NumParameters))
67
52
return Err;
68
53
69
- if (Error Err = OffsetMap.addOffset (" header" ))
54
+ uint32_t HeaderPoint;
55
+ if (Error Err = setRewrite (Writer, HeaderPoint))
70
56
return Err;
71
57
72
58
// Static samplers still not implemented
@@ -79,27 +65,31 @@ Error RootSignatureDesc::write(raw_ostream &OS) const {
79
65
if (Error Err = Writer.writeInteger (Header.Flags ))
80
66
return Err;
81
67
82
- OffsetMap.addRewriteValue (" header" );
68
+ if (Error Err = rewriteOffset (Writer, HeaderPoint))
69
+ return Err;
83
70
84
- for ( size_t It = 0 ; It < Parameters. size (); It++) {
85
- const auto &P = Parameters[It];
71
+ SmallVector< uint32_t > ParamsOffset;
72
+ for ( const auto &P : Parameters) {
86
73
87
74
if (Error Err = Writer.writeEnum (P.ParameterType ))
88
75
return Err;
89
76
90
77
if (Error Err = Writer.writeEnum (P.ShaderVisibility ))
91
78
return Err;
92
79
93
- std::string Key = ( " parameters " + Twine (It)). str () ;
94
- if (Error Err = OffsetMap. addOffset (Key ))
80
+ uint32_t Offset ;
81
+ if (Error Err = setRewrite (Writer, Offset ))
95
82
return Err;
83
+ ParamsOffset.push_back (Offset);
96
84
}
97
85
98
- for ( size_t It = 0 ; It < Parameters. size (); It++) {
99
- const auto &P = Parameters[It];
86
+ size_t It = 0 ;
87
+ for ( const auto &P : Parameters) {
100
88
101
- std::string Key = (" parameters" + Twine (It)).str ();
102
- OffsetMap.addRewriteValue (Key);
89
+ auto Offset = ParamsOffset[It];
90
+ if (Error Err = rewriteOffset (Writer, Offset))
91
+ return Err;
92
+ It++;
103
93
104
94
switch (P.ParameterType ) {
105
95
case dxbc::RootParameterType::Constants32Bit: {
@@ -115,8 +105,7 @@ Error RootSignatureDesc::write(raw_ostream &OS) const {
115
105
}
116
106
}
117
107
118
- if (Error Err = OffsetMap.rewrite ())
119
- return Err;
108
+ assert (It == NumParameters);
120
109
121
110
llvm::ArrayRef<char > BufferRef (reinterpret_cast <char *>(Buffer.data ()),
122
111
Buffer.size ());
0 commit comments