@@ -166,6 +166,90 @@ readMemInfoBlocksV4(const char *Ptr) {
166
166
return Items;
167
167
}
168
168
169
+ llvm::SmallVector<std::pair<uint64_t , MemInfoBlock>>
170
+ readMemInfoBlocksV5 (const char *Ptr) {
171
+ using namespace support ;
172
+
173
+ const uint64_t NumItemsToRead =
174
+ endian::readNext<uint64_t , llvm::endianness::little, unaligned>(Ptr);
175
+
176
+ llvm::SmallVector<std::pair<uint64_t , MemInfoBlock>> Items;
177
+ for (uint64_t I = 0 ; I < NumItemsToRead; I++) {
178
+ const uint64_t Id =
179
+ endian::readNext<uint64_t , llvm::endianness::little, unaligned>(Ptr);
180
+
181
+ MemInfoBlock MIB;
182
+ MIB.AllocCount =
183
+ endian::readNext<uint32_t , llvm::endianness::little, unaligned>(Ptr);
184
+ MIB.TotalAccessCount =
185
+ endian::readNext<uint64_t , llvm::endianness::little, unaligned>(Ptr);
186
+ MIB.MinAccessCount =
187
+ endian::readNext<uint64_t , llvm::endianness::little, unaligned>(Ptr);
188
+ MIB.MaxAccessCount =
189
+ endian::readNext<uint64_t , llvm::endianness::little, unaligned>(Ptr);
190
+ MIB.TotalSize =
191
+ endian::readNext<uint64_t , llvm::endianness::little, unaligned>(Ptr);
192
+ MIB.MinSize =
193
+ endian::readNext<uint32_t , llvm::endianness::little, unaligned>(Ptr);
194
+ MIB.MaxSize =
195
+ endian::readNext<uint32_t , llvm::endianness::little, unaligned>(Ptr);
196
+ MIB.AllocTimestamp =
197
+ endian::readNext<uint32_t , llvm::endianness::little, unaligned>(Ptr);
198
+ MIB.DeallocTimestamp =
199
+ endian::readNext<uint32_t , llvm::endianness::little, unaligned>(Ptr);
200
+ MIB.TotalLifetime =
201
+ endian::readNext<uint64_t , llvm::endianness::little, unaligned>(Ptr);
202
+ MIB.MinLifetime =
203
+ endian::readNext<uint32_t , llvm::endianness::little, unaligned>(Ptr);
204
+ MIB.MaxLifetime =
205
+ endian::readNext<uint32_t , llvm::endianness::little, unaligned>(Ptr);
206
+ MIB.AllocCpuId =
207
+ endian::readNext<uint32_t , llvm::endianness::little, unaligned>(Ptr);
208
+ MIB.DeallocCpuId =
209
+ endian::readNext<uint32_t , llvm::endianness::little, unaligned>(Ptr);
210
+ MIB.NumMigratedCpu =
211
+ endian::readNext<uint32_t , llvm::endianness::little, unaligned>(Ptr);
212
+ MIB.NumLifetimeOverlaps =
213
+ endian::readNext<uint32_t , llvm::endianness::little, unaligned>(Ptr);
214
+ MIB.NumSameAllocCpu =
215
+ endian::readNext<uint32_t , llvm::endianness::little, unaligned>(Ptr);
216
+ MIB.NumSameDeallocCpu =
217
+ endian::readNext<uint32_t , llvm::endianness::little, unaligned>(Ptr);
218
+ MIB.DataTypeId =
219
+ endian::readNext<uint64_t , llvm::endianness::little, unaligned>(Ptr);
220
+ MIB.TotalAccessDensity =
221
+ endian::readNext<uint64_t , llvm::endianness::little, unaligned>(Ptr);
222
+ MIB.MinAccessDensity =
223
+ endian::readNext<uint32_t , llvm::endianness::little, unaligned>(Ptr);
224
+ MIB.MaxAccessDensity =
225
+ endian::readNext<uint32_t , llvm::endianness::little, unaligned>(Ptr);
226
+ MIB.TotalLifetimeAccessDensity =
227
+ endian::readNext<uint64_t , llvm::endianness::little, unaligned>(Ptr);
228
+ MIB.MinLifetimeAccessDensity =
229
+ endian::readNext<uint32_t , llvm::endianness::little, unaligned>(Ptr);
230
+ MIB.MaxLifetimeAccessDensity =
231
+ endian::readNext<uint32_t , llvm::endianness::little, unaligned>(Ptr);
232
+ MIB.AccessHistogramSize =
233
+ endian::readNext<uint32_t , llvm::endianness::little, unaligned>(Ptr);
234
+ MIB.AccessHistogram =
235
+ endian::readNext<uintptr_t , llvm::endianness::little, unaligned>(Ptr);
236
+
237
+ if (MIB.AccessHistogramSize > 0 ) {
238
+ // The in-memory representation uses uint64_t for histogram entries.
239
+ MIB.AccessHistogram =
240
+ (uintptr_t )malloc (MIB.AccessHistogramSize * sizeof (uint64_t ));
241
+ for (uint64_t J = 0 ; J < MIB.AccessHistogramSize ; J++) {
242
+ // The on-disk format for V5 uses uint8_t.
243
+ const uint8_t Val =
244
+ endian::readNext<uint8_t , llvm::endianness::little, unaligned>(Ptr);
245
+ ((uint64_t *)MIB.AccessHistogram )[J] = Val;
246
+ }
247
+ }
248
+ Items.push_back ({Id, MIB});
249
+ }
250
+ return Items;
251
+ }
252
+
169
253
CallStackMap readStackInfo (const char *Ptr) {
170
254
using namespace support ;
171
255
@@ -658,6 +742,8 @@ RawMemProfReader::readMemInfoBlocks(const char *Ptr) {
658
742
return readMemInfoBlocksV3 (Ptr);
659
743
if (MemprofRawVersion == 4ULL )
660
744
return readMemInfoBlocksV4 (Ptr);
745
+ if (MemprofRawVersion == 5ULL )
746
+ return readMemInfoBlocksV5 (Ptr);
661
747
llvm_unreachable (
662
748
" Panic: Unsupported version number when reading MemInfoBlocks" );
663
749
}
0 commit comments