10
10
//
11
11
// ===----------------------------------------------------------------------===//
12
12
13
+ #include " llvm/ProfileData/DataAccessProf.h"
13
14
#include " llvm/ProfileData/InstrProf.h"
14
15
#include " llvm/ProfileData/InstrProfReader.h"
15
16
#include " llvm/ProfileData/MemProf.h"
@@ -216,7 +217,9 @@ static Error writeMemProfV2(ProfOStream &OS,
216
217
217
218
static Error writeMemProfRadixTreeBased (
218
219
ProfOStream &OS, memprof::IndexedMemProfData &MemProfData,
219
- memprof::IndexedVersion Version, bool MemProfFullSchema) {
220
+ memprof::IndexedVersion Version, bool MemProfFullSchema,
221
+ std::optional<std::reference_wrapper<data_access_prof::DataAccessProfData>>
222
+ DataAccessProfileData) {
220
223
assert ((Version == memprof::Version3 || Version == memprof::Version4) &&
221
224
" Unsupported version for radix tree format" );
222
225
@@ -225,6 +228,8 @@ static Error writeMemProfRadixTreeBased(
225
228
OS.write (0ULL ); // Reserve space for the memprof call stack payload offset.
226
229
OS.write (0ULL ); // Reserve space for the memprof record payload offset.
227
230
OS.write (0ULL ); // Reserve space for the memprof record table offset.
231
+ if (Version == memprof::Version4)
232
+ OS.write (0ULL ); // Reserve space for the data access profile offset.
228
233
229
234
auto Schema = memprof::getHotColdSchema ();
230
235
if (MemProfFullSchema)
@@ -251,17 +256,26 @@ static Error writeMemProfRadixTreeBased(
251
256
uint64_t RecordTableOffset = writeMemProfRecords (
252
257
OS, MemProfData.Records , &Schema, Version, &MemProfCallStackIndexes);
253
258
259
+ uint64_t DataAccessProfOffset = 0 ;
260
+ if (DataAccessProfileData.has_value ()) {
261
+ DataAccessProfOffset = OS.tell ();
262
+ if (Error E = (*DataAccessProfileData).get ().serialize (OS))
263
+ return E;
264
+ }
265
+
254
266
// Verify that the computation for the number of elements in the call stack
255
267
// array works.
256
268
assert (CallStackPayloadOffset +
257
269
NumElements * sizeof (memprof::LinearFrameId) ==
258
270
RecordPayloadOffset);
259
271
260
- uint64_t Header[] = {
272
+ SmallVector< uint64_t , 4 > Header = {
261
273
CallStackPayloadOffset,
262
274
RecordPayloadOffset,
263
275
RecordTableOffset,
264
276
};
277
+ if (Version == memprof::Version4)
278
+ Header.push_back (DataAccessProfOffset);
265
279
OS.patch ({{HeaderUpdatePos, Header}});
266
280
267
281
return Error::success ();
@@ -272,28 +286,33 @@ static Error writeMemProfV3(ProfOStream &OS,
272
286
memprof::IndexedMemProfData &MemProfData,
273
287
bool MemProfFullSchema) {
274
288
return writeMemProfRadixTreeBased (OS, MemProfData, memprof::Version3,
275
- MemProfFullSchema);
289
+ MemProfFullSchema, std::nullopt );
276
290
}
277
291
278
292
// Write out MemProf Version4
279
- static Error writeMemProfV4 (ProfOStream &OS,
280
- memprof::IndexedMemProfData &MemProfData,
281
- bool MemProfFullSchema) {
293
+ static Error writeMemProfV4 (
294
+ ProfOStream &OS, memprof::IndexedMemProfData &MemProfData,
295
+ bool MemProfFullSchema,
296
+ std::optional<std::reference_wrapper<data_access_prof::DataAccessProfData>>
297
+ DataAccessProfileData) {
282
298
return writeMemProfRadixTreeBased (OS, MemProfData, memprof::Version4,
283
- MemProfFullSchema);
299
+ MemProfFullSchema, DataAccessProfileData );
284
300
}
285
301
286
302
// Write out the MemProf data in a requested version.
287
- Error writeMemProf (ProfOStream &OS, memprof::IndexedMemProfData &MemProfData,
288
- memprof::IndexedVersion MemProfVersionRequested,
289
- bool MemProfFullSchema) {
303
+ Error writeMemProf (
304
+ ProfOStream &OS, memprof::IndexedMemProfData &MemProfData,
305
+ memprof::IndexedVersion MemProfVersionRequested, bool MemProfFullSchema,
306
+ std::optional<std::reference_wrapper<data_access_prof::DataAccessProfData>>
307
+ DataAccessProfileData) {
290
308
switch (MemProfVersionRequested) {
291
309
case memprof::Version2:
292
310
return writeMemProfV2 (OS, MemProfData, MemProfFullSchema);
293
311
case memprof::Version3:
294
312
return writeMemProfV3 (OS, MemProfData, MemProfFullSchema);
295
313
case memprof::Version4:
296
- return writeMemProfV4 (OS, MemProfData, MemProfFullSchema);
314
+ return writeMemProfV4 (OS, MemProfData, MemProfFullSchema,
315
+ DataAccessProfileData);
297
316
}
298
317
299
318
return make_error<InstrProfError>(
@@ -357,7 +376,10 @@ Error IndexedMemProfReader::deserializeV2(const unsigned char *Start,
357
376
}
358
377
359
378
Error IndexedMemProfReader::deserializeRadixTreeBased (
360
- const unsigned char *Start, const unsigned char *Ptr ) {
379
+ const unsigned char *Start, const unsigned char *Ptr ,
380
+ memprof::IndexedVersion Version) {
381
+ assert ((Version == memprof::Version3 || Version == memprof::Version4) &&
382
+ " Unsupported version for radix tree format" );
361
383
// The offset in the stream right before invoking
362
384
// CallStackTableGenerator.Emit.
363
385
const uint64_t CallStackPayloadOffset =
@@ -369,6 +391,11 @@ Error IndexedMemProfReader::deserializeRadixTreeBased(
369
391
const uint64_t RecordTableOffset =
370
392
support::endian::readNext<uint64_t , llvm::endianness::little>(Ptr );
371
393
394
+ uint64_t DataAccessProfOffset = 0 ;
395
+ if (Version == memprof::Version4)
396
+ DataAccessProfOffset =
397
+ support::endian::readNext<uint64_t , llvm::endianness::little>(Ptr );
398
+
372
399
// Read the schema.
373
400
auto SchemaOr = memprof::readMemProfSchema (Ptr );
374
401
if (!SchemaOr)
@@ -390,6 +417,14 @@ Error IndexedMemProfReader::deserializeRadixTreeBased(
390
417
/* Payload=*/ Start + RecordPayloadOffset,
391
418
/* Base=*/ Start, memprof::RecordLookupTrait (Version, Schema)));
392
419
420
+ if (DataAccessProfOffset > RecordTableOffset) {
421
+ DataAccessProfileData =
422
+ std::make_unique<data_access_prof::DataAccessProfData>();
423
+ const unsigned char *DAPPtr = Start + DataAccessProfOffset;
424
+ if (Error E = DataAccessProfileData->deserialize (DAPPtr))
425
+ return E;
426
+ }
427
+
393
428
return Error::success ();
394
429
}
395
430
@@ -423,7 +458,7 @@ Error IndexedMemProfReader::deserialize(const unsigned char *Start,
423
458
case memprof::Version3:
424
459
case memprof::Version4:
425
460
// V3 and V4 share the same high-level structure (radix tree, linear IDs).
426
- if (Error E = deserializeRadixTreeBased (Start, Ptr ))
461
+ if (Error E = deserializeRadixTreeBased (Start, Ptr , Version ))
427
462
return E;
428
463
break ;
429
464
}
0 commit comments