@@ -45,15 +45,26 @@ static size_t serializedSizeV2(const IndexedAllocationInfo &IAI,
45
45
return Size ;
46
46
}
47
47
48
+ static size_t serializedSizeV3 (const IndexedAllocationInfo &IAI,
49
+ const MemProfSchema &Schema) {
50
+ size_t Size = 0 ;
51
+ // The linear call stack ID.
52
+ Size += sizeof (LinearCallStackId);
53
+ // The size of the payload.
54
+ Size += PortableMemInfoBlock::serializedSize (Schema);
55
+ return Size ;
56
+ }
57
+
48
58
size_t IndexedAllocationInfo::serializedSize (const MemProfSchema &Schema,
49
59
IndexedVersion Version) const {
50
60
switch (Version) {
51
61
case Version0:
52
62
case Version1:
53
63
return serializedSizeV0 (*this , Schema);
54
64
case Version2:
55
- case Version3:
56
65
return serializedSizeV2 (*this , Schema);
66
+ case Version3:
67
+ return serializedSizeV3 (*this , Schema);
57
68
}
58
69
llvm_unreachable (" unsupported MemProf version" );
59
70
}
@@ -89,15 +100,30 @@ static size_t serializedSizeV2(const IndexedMemProfRecord &Record,
89
100
return Result;
90
101
}
91
102
103
+ static size_t serializedSizeV3 (const IndexedMemProfRecord &Record,
104
+ const MemProfSchema &Schema) {
105
+ // The number of alloc sites to serialize.
106
+ size_t Result = sizeof (uint64_t );
107
+ for (const IndexedAllocationInfo &N : Record.AllocSites )
108
+ Result += N.serializedSize (Schema, Version3);
109
+
110
+ // The number of callsites we have information for.
111
+ Result += sizeof (uint64_t );
112
+ // The linear call stack ID.
113
+ Result += Record.CallSiteIds .size () * sizeof (LinearCallStackId);
114
+ return Result;
115
+ }
116
+
92
117
size_t IndexedMemProfRecord::serializedSize (const MemProfSchema &Schema,
93
118
IndexedVersion Version) const {
94
119
switch (Version) {
95
120
case Version0:
96
121
case Version1:
97
122
return serializedSizeV0 (*this , Schema);
98
123
case Version2:
99
- case Version3:
100
124
return serializedSizeV2 (*this , Schema);
125
+ case Version3:
126
+ return serializedSizeV3 (*this , Schema);
101
127
}
102
128
llvm_unreachable (" unsupported MemProf version" );
103
129
}
@@ -154,15 +180,15 @@ serializeV3(const IndexedMemProfRecord &Record, const MemProfSchema &Schema,
154
180
LE.write <uint64_t >(Record.AllocSites .size ());
155
181
for (const IndexedAllocationInfo &N : Record.AllocSites ) {
156
182
assert (MemProfCallStackIndexes.contains (N.CSId ));
157
- LE.write <uint64_t >(MemProfCallStackIndexes[N.CSId ]);
183
+ LE.write <uint32_t >(MemProfCallStackIndexes[N.CSId ]);
158
184
N.Info .serialize (Schema, OS);
159
185
}
160
186
161
187
// Related contexts.
162
188
LE.write <uint64_t >(Record.CallSiteIds .size ());
163
189
for (const auto &CSId : Record.CallSiteIds ) {
164
190
assert (MemProfCallStackIndexes.contains (CSId));
165
- LE.write <uint64_t >(MemProfCallStackIndexes[CSId]);
191
+ LE.write <uint32_t >(MemProfCallStackIndexes[CSId]);
166
192
}
167
193
}
168
194
@@ -259,6 +285,41 @@ static IndexedMemProfRecord deserializeV2(const MemProfSchema &Schema,
259
285
return Record;
260
286
}
261
287
288
+ static IndexedMemProfRecord deserializeV3 (const MemProfSchema &Schema,
289
+ const unsigned char *Ptr ) {
290
+ using namespace support ;
291
+
292
+ IndexedMemProfRecord Record;
293
+
294
+ // Read the meminfo nodes.
295
+ const uint64_t NumNodes =
296
+ endian::readNext<uint64_t , llvm::endianness::little>(Ptr );
297
+ Record.AllocSites .reserve (NumNodes);
298
+ for (uint64_t I = 0 ; I < NumNodes; I++) {
299
+ IndexedAllocationInfo Node;
300
+ Node.CSId = endian::readNext<uint32_t , llvm::endianness::little>(Ptr );
301
+ Node.Info .deserialize (Schema, Ptr );
302
+ Ptr += PortableMemInfoBlock::serializedSize (Schema);
303
+ Record.AllocSites .push_back (Node);
304
+ }
305
+
306
+ // Read the callsite information.
307
+ const uint64_t NumCtxs =
308
+ endian::readNext<uint64_t , llvm::endianness::little>(Ptr );
309
+ Record.CallSiteIds .reserve (NumCtxs);
310
+ for (uint64_t J = 0 ; J < NumCtxs; J++) {
311
+ // We are storing LinearCallStackId in CallSiteIds, which is a vector of
312
+ // CallStackId. Assert that CallStackId is no smaller than
313
+ // LinearCallStackId.
314
+ static_assert (sizeof (LinearCallStackId) <= sizeof (CallStackId));
315
+ LinearCallStackId CSId =
316
+ endian::readNext<LinearCallStackId, llvm::endianness::little>(Ptr );
317
+ Record.CallSiteIds .push_back (CSId);
318
+ }
319
+
320
+ return Record;
321
+ }
322
+
262
323
IndexedMemProfRecord
263
324
IndexedMemProfRecord::deserialize (const MemProfSchema &Schema,
264
325
const unsigned char *Ptr ,
@@ -268,8 +329,9 @@ IndexedMemProfRecord::deserialize(const MemProfSchema &Schema,
268
329
case Version1:
269
330
return deserializeV0 (Schema, Ptr );
270
331
case Version2:
271
- case Version3:
272
332
return deserializeV2 (Schema, Ptr );
333
+ case Version3:
334
+ return deserializeV3 (Schema, Ptr );
273
335
}
274
336
llvm_unreachable (" unsupported MemProf version" );
275
337
}
0 commit comments