Skip to content

Commit 1ec7c01

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

25 files changed

+103
-17
lines changed

compiler-rt/include/profile/MemProfData.inc

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,7 @@
3636
#define MEMPROF_RAW_VERSION 5ULL
3737

3838
// Currently supported versions.
39-
#define MEMPROF_RAW_SUPPORTED_VERSIONS \
40-
{ 3ULL, 4ULL, 5ULL }
39+
#define MEMPROF_RAW_SUPPORTED_VERSIONS {3ULL, 4ULL, 5ULL}
4140

4241
#define MEMPROF_V3_MIB_SIZE 132ULL;
4342

compiler-rt/lib/memprof/memprof_allocator.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -333,7 +333,8 @@ struct Allocator {
333333
u8 Counter =
334334
*((u8 *)HISTOGRAM_MEM_TO_SHADOW(p + HISTOGRAM_GRANULARITY * i));
335335
// Cap the counter at HISTOGRAM_MAX_COUNTER (255) to prevent overflow
336-
((uint8_t *)Histogram)[i] = (Counter > HISTOGRAM_MAX_COUNTER) ? HISTOGRAM_MAX_COUNTER : Counter;
336+
((uint8_t *)Histogram)[i] =
337+
(Counter > HISTOGRAM_MAX_COUNTER) ? HISTOGRAM_MAX_COUNTER : Counter;
337338
}
338339
MemInfoBlock newMIB(user_size, c, m->timestamp_ms, curtime, m->cpu_id,
339340
GetCpuId(), Histogram, HistogramSize);

compiler-rt/test/memprof/TestCases/memprof_histogram_uint8.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,8 @@
66
int main() {
77
// Allocate memory that will create a histogram
88
char *buffer = (char *)malloc(1024);
9-
if (!buffer) return 1;
9+
if (!buffer)
10+
return 1;
1011

1112
for (int i = 0; i < 10; ++i) {
1213
// Access every 8th byte (since shadow granularity is 8b.
@@ -18,7 +19,7 @@ int main() {
1819
}
1920

2021
for (int j = 0; j < 400; ++j) {
21-
buffer[16] = 'B'; // Count is saturated at 255
22+
buffer[16] = 'B'; // Count is saturated at 255
2223
}
2324

2425
// Free the memory to trigger MIB creation with histogram

llvm/include/llvm/ProfileData/MemProfData.inc

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,7 @@
3636
#define MEMPROF_RAW_VERSION 5ULL
3737

3838
// Currently supported versions.
39-
#define MEMPROF_RAW_SUPPORTED_VERSIONS \
40-
{ 3ULL, 4ULL, 5ULL }
39+
#define MEMPROF_RAW_SUPPORTED_VERSIONS {3ULL, 4ULL, 5ULL}
4140

4241
#define MEMPROF_V3_MIB_SIZE 132ULL;
4342

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.

0 commit comments

Comments
 (0)