@@ -370,12 +370,31 @@ static CallStackIdMapTy getCallStackMapping() {
370
370
return Mapping;
371
371
}
372
372
373
+ // Populate all of the fields of MIB.
374
+ MemInfoBlock makeFullMIB () {
375
+ MemInfoBlock MIB;
376
+ #define MIBEntryDef (NameTag, Name, Type ) MIB.NameTag;
377
+ #include " llvm/ProfileData/MIBEntryDef.inc"
378
+ #undef MIBEntryDef
379
+ return MIB;
380
+ }
381
+
382
+ // Populate those fields returned by getHotColdSchema.
383
+ MemInfoBlock makePartialMIB () {
384
+ MemInfoBlock MIB;
385
+ MIB.AllocCount = 1 ;
386
+ MIB.TotalSize = 5 ;
387
+ MIB.TotalLifetime = 10 ;
388
+ MIB.TotalLifetimeAccessDensity = 23 ;
389
+ return MIB;
390
+ }
391
+
373
392
IndexedMemProfRecord makeRecord (
374
393
std::initializer_list<std::initializer_list<::llvm::memprof::FrameId>>
375
394
AllocFrames,
376
395
std::initializer_list<std::initializer_list<::llvm::memprof::FrameId>>
377
396
CallSiteFrames,
378
- const MemInfoBlock &Block = MemInfoBlock ()) {
397
+ const MemInfoBlock &Block = makeFullMIB ()) {
379
398
llvm::memprof::IndexedMemProfRecord MR;
380
399
for (const auto &Frames : AllocFrames)
381
400
MR.AllocSites .emplace_back (Frames, llvm::memprof::hashCallStack (Frames),
@@ -388,7 +407,7 @@ IndexedMemProfRecord makeRecord(
388
407
IndexedMemProfRecord
389
408
makeRecordV2 (std::initializer_list<::llvm::memprof::CallStackId> AllocFrames,
390
409
std::initializer_list<::llvm::memprof::CallStackId> CallSiteFrames,
391
- const MemInfoBlock &Block = MemInfoBlock() ) {
410
+ const MemInfoBlock &Block) {
392
411
llvm::memprof::IndexedMemProfRecord MR;
393
412
for (const auto &CSId : AllocFrames)
394
413
// We don't populate IndexedAllocationInfo::CallStack because we use it only
@@ -476,15 +495,56 @@ TEST_F(InstrProfTest, test_memprof_v0) {
476
495
EXPECT_THAT (WantRecord, EqualsRecord (Record));
477
496
}
478
497
479
- TEST_F (InstrProfTest, test_memprof_v2) {
498
+ struct CallStackIdConverter {
499
+ std::optional<memprof::FrameId> LastUnmappedFrameId;
500
+ std::optional<memprof::CallStackId> LastUnmappedCSId;
501
+
502
+ const FrameIdMapTy &IdToFrameMap;
503
+ const CallStackIdMapTy &CSIdToCallStackMap;
504
+
505
+ CallStackIdConverter () = delete ;
506
+ CallStackIdConverter (const FrameIdMapTy &IdToFrameMap,
507
+ const CallStackIdMapTy &CSIdToCallStackMap)
508
+ : IdToFrameMap(IdToFrameMap), CSIdToCallStackMap(CSIdToCallStackMap) {}
509
+
510
+ llvm::SmallVector<memprof::Frame>
511
+ operator ()(::llvm::memprof::CallStackId CSId) {
512
+ auto IdToFrameCallback = [&](const memprof::FrameId Id) {
513
+ auto Iter = IdToFrameMap.find (Id);
514
+ if (Iter == IdToFrameMap.end ()) {
515
+ LastUnmappedFrameId = Id;
516
+ return memprof::Frame (0 , 0 , 0 , false );
517
+ }
518
+ return Iter->second ;
519
+ };
520
+
521
+ llvm::SmallVector<memprof::Frame> Frames;
522
+ auto CSIter = CSIdToCallStackMap.find (CSId);
523
+ if (CSIter == CSIdToCallStackMap.end ()) {
524
+ LastUnmappedCSId = CSId;
525
+ } else {
526
+ const ::llvm::SmallVector<::llvm::memprof::FrameId> &CS =
527
+ CSIter->getSecond ();
528
+ Frames.reserve (CS.size ());
529
+ for (::llvm::memprof::FrameId Id : CS)
530
+ Frames.push_back (IdToFrameCallback (Id));
531
+ }
532
+ return Frames;
533
+ }
534
+ };
535
+
536
+ TEST_F (InstrProfTest, test_memprof_v2_full_schema) {
537
+ const MemInfoBlock MIB = makeFullMIB ();
538
+
480
539
Writer.setMemProfVersionRequested (memprof::Version2);
540
+ Writer.setMemProfFullSchema (true );
481
541
482
542
ASSERT_THAT_ERROR (Writer.mergeProfileKind (InstrProfKind::MemProf),
483
543
Succeeded ());
484
544
485
545
const IndexedMemProfRecord IndexedMR = makeRecordV2 (
486
546
/* AllocFrames=*/ {0x111 , 0x222 },
487
- /* CallSiteFrames=*/ {0x333 });
547
+ /* CallSiteFrames=*/ {0x333 }, MIB );
488
548
const FrameIdMapTy IdToFrameMap = getFrameMapping ();
489
549
const auto CSIdToCallStackMap = getCallStackMapping ();
490
550
for (const auto &I : IdToFrameMap) {
@@ -502,38 +562,54 @@ TEST_F(InstrProfTest, test_memprof_v2) {
502
562
ASSERT_THAT_ERROR (RecordOr.takeError (), Succeeded ());
503
563
const memprof::MemProfRecord &Record = RecordOr.get ();
504
564
505
- std::optional<memprof::FrameId> LastUnmappedFrameId;
506
- auto IdToFrameCallback = [&](const memprof::FrameId Id) {
507
- auto Iter = IdToFrameMap.find (Id);
508
- if (Iter == IdToFrameMap.end ()) {
509
- LastUnmappedFrameId = Id;
510
- return memprof::Frame (0 , 0 , 0 , false );
511
- }
512
- return Iter->second ;
513
- };
565
+ CallStackIdConverter CSIdConv (IdToFrameMap, CSIdToCallStackMap);
514
566
515
- std::optional<::llvm::memprof::CallStackId> LastUnmappedCSId;
516
- auto CSIdToCallStackCallback = [&](::llvm::memprof::CallStackId CSId) {
517
- llvm::SmallVector<memprof::Frame> Frames;
518
- auto CSIter = CSIdToCallStackMap.find (CSId);
519
- if (CSIter == CSIdToCallStackMap.end ()) {
520
- LastUnmappedCSId = CSId;
521
- } else {
522
- const ::llvm::SmallVector<::llvm::memprof::FrameId> &CS =
523
- CSIter->getSecond ();
524
- Frames.reserve (CS.size ());
525
- for (::llvm::memprof::FrameId Id : CS)
526
- Frames.push_back (IdToFrameCallback (Id));
527
- }
528
- return Frames;
529
- };
567
+ const ::llvm::memprof::MemProfRecord WantRecord =
568
+ IndexedMR.toMemProfRecord (CSIdConv);
569
+ ASSERT_EQ (CSIdConv.LastUnmappedFrameId , std::nullopt)
570
+ << " could not map frame id: " << *CSIdConv.LastUnmappedFrameId ;
571
+ ASSERT_EQ (CSIdConv.LastUnmappedCSId , std::nullopt)
572
+ << " could not map call stack id: " << *CSIdConv.LastUnmappedCSId ;
573
+ EXPECT_THAT (WantRecord, EqualsRecord (Record));
574
+ }
575
+
576
+ TEST_F (InstrProfTest, test_memprof_v2_partial_schema) {
577
+ const MemInfoBlock MIB = makePartialMIB ();
578
+
579
+ Writer.setMemProfVersionRequested (memprof::Version2);
580
+ Writer.setMemProfFullSchema (false );
581
+
582
+ ASSERT_THAT_ERROR (Writer.mergeProfileKind (InstrProfKind::MemProf),
583
+ Succeeded ());
584
+
585
+ const IndexedMemProfRecord IndexedMR = makeRecordV2 (
586
+ /* AllocFrames=*/ {0x111 , 0x222 },
587
+ /* CallSiteFrames=*/ {0x333 }, MIB);
588
+ const FrameIdMapTy IdToFrameMap = getFrameMapping ();
589
+ const auto CSIdToCallStackMap = getCallStackMapping ();
590
+ for (const auto &I : IdToFrameMap) {
591
+ Writer.addMemProfFrame (I.first , I.getSecond (), Err);
592
+ }
593
+ for (const auto &I : CSIdToCallStackMap) {
594
+ Writer.addMemProfCallStack (I.first , I.getSecond (), Err);
595
+ }
596
+ Writer.addMemProfRecord (/* Id=*/ 0x9999 , IndexedMR);
597
+
598
+ auto Profile = Writer.writeBuffer ();
599
+ readProfile (std::move (Profile));
600
+
601
+ auto RecordOr = Reader->getMemProfRecord (0x9999 );
602
+ ASSERT_THAT_ERROR (RecordOr.takeError (), Succeeded ());
603
+ const memprof::MemProfRecord &Record = RecordOr.get ();
604
+
605
+ CallStackIdConverter CSIdConv (IdToFrameMap, CSIdToCallStackMap);
530
606
531
607
const ::llvm::memprof::MemProfRecord WantRecord =
532
- IndexedMR.toMemProfRecord (CSIdToCallStackCallback );
533
- ASSERT_EQ (LastUnmappedFrameId, std::nullopt)
534
- << " could not map frame id: " << *LastUnmappedFrameId;
535
- ASSERT_EQ (LastUnmappedCSId, std::nullopt)
536
- << " could not map call stack id: " << *LastUnmappedCSId;
608
+ IndexedMR.toMemProfRecord (CSIdConv );
609
+ ASSERT_EQ (CSIdConv. LastUnmappedFrameId , std::nullopt)
610
+ << " could not map frame id: " << *CSIdConv. LastUnmappedFrameId ;
611
+ ASSERT_EQ (CSIdConv. LastUnmappedCSId , std::nullopt)
612
+ << " could not map call stack id: " << *CSIdConv. LastUnmappedCSId ;
537
613
EXPECT_THAT (WantRecord, EqualsRecord (Record));
538
614
}
539
615
0 commit comments