Skip to content

Commit 4135d07

Browse files
committed
Add reader support.
1 parent 3371ae2 commit 4135d07

21 files changed

+96
-10
lines changed

llvm/lib/ProfileData/MemProfReader.cpp

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -166,6 +166,90 @@ readMemInfoBlocksV4(const char *Ptr) {
166166
return Items;
167167
}
168168

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+
169253
CallStackMap readStackInfo(const char *Ptr) {
170254
using namespace support;
171255

@@ -658,6 +742,8 @@ RawMemProfReader::readMemInfoBlocks(const char *Ptr) {
658742
return readMemInfoBlocksV3(Ptr);
659743
if (MemprofRawVersion == 4ULL)
660744
return readMemInfoBlocksV4(Ptr);
745+
if (MemprofRawVersion == 5ULL)
746+
return readMemInfoBlocksV5(Ptr);
661747
llvm_unreachable(
662748
"Panic: Unsupported version number when reading MemInfoBlocks");
663749
}
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.

0 commit comments

Comments
 (0)