@@ -495,6 +495,44 @@ TEST_F(InstrProfTest, test_memprof_v0) {
495495 EXPECT_THAT (WantRecord, EqualsRecord (Record));
496496}
497497
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+
498536TEST_F (InstrProfTest, test_memprof_v2_full_schema) {
499537 const MemInfoBlock MIB = makeFullMIB ();
500538
@@ -524,16 +562,14 @@ TEST_F(InstrProfTest, test_memprof_v2_full_schema) {
524562 ASSERT_THAT_ERROR (RecordOr.takeError (), Succeeded ());
525563 const memprof::MemProfRecord &Record = RecordOr.get ();
526564
527- memprof::FrameIdConverter<decltype (IdToFrameMap)> FrameIdConv (IdToFrameMap);
528- memprof::CallStackIdConverter<decltype (CSIdToCallStackMap)> CSIdConv (
529- CSIdToCallStackMap, FrameIdConv);
565+ CallStackIdConverter CSIdConv (IdToFrameMap, CSIdToCallStackMap);
530566
531567 const ::llvm::memprof::MemProfRecord WantRecord =
532568 IndexedMR.toMemProfRecord (CSIdConv);
533- ASSERT_EQ (FrameIdConv. LastUnmappedId , std::nullopt )
534- << " could not map frame id: " << *FrameIdConv. LastUnmappedId ;
535- ASSERT_EQ (CSIdConv.LastUnmappedId , std::nullopt )
536- << " could not map call stack id: " << *CSIdConv.LastUnmappedId ;
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 ;
537573 EXPECT_THAT (WantRecord, EqualsRecord (Record));
538574}
539575
@@ -566,16 +602,14 @@ TEST_F(InstrProfTest, test_memprof_v2_partial_schema) {
566602 ASSERT_THAT_ERROR (RecordOr.takeError (), Succeeded ());
567603 const memprof::MemProfRecord &Record = RecordOr.get ();
568604
569- memprof::FrameIdConverter<decltype (IdToFrameMap)> FrameIdConv (IdToFrameMap);
570- memprof::CallStackIdConverter<decltype (CSIdToCallStackMap)> CSIdConv (
571- CSIdToCallStackMap, FrameIdConv);
605+ CallStackIdConverter CSIdConv (IdToFrameMap, CSIdToCallStackMap);
572606
573607 const ::llvm::memprof::MemProfRecord WantRecord =
574608 IndexedMR.toMemProfRecord (CSIdConv);
575- ASSERT_EQ (FrameIdConv. LastUnmappedId , std::nullopt )
576- << " could not map frame id: " << *FrameIdConv. LastUnmappedId ;
577- ASSERT_EQ (CSIdConv.LastUnmappedId , std::nullopt )
578- << " could not map call stack id: " << *CSIdConv.LastUnmappedId ;
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 ;
579613 EXPECT_THAT (WantRecord, EqualsRecord (Record));
580614}
581615
0 commit comments