Skip to content

[memprof] Introduce IndexedCallstackIdConveter (NFC) #120540

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 21 additions & 0 deletions llvm/include/llvm/ProfileData/MemProf.h
Original file line number Diff line number Diff line change
Expand Up @@ -1030,6 +1030,27 @@ struct IndexedMemProfData {
CallStackId hashCallStack(ArrayRef<FrameId> CS) const;
};

// A convenience wrapper around FrameIdConverter and CallStackIdConverter for
// tests.
struct IndexedCallstackIdConveter {
IndexedCallstackIdConveter() = delete;
IndexedCallstackIdConveter(IndexedMemProfData &MemProfData)
: FrameIdConv(MemProfData.Frames),
CSIdConv(MemProfData.CallStacks, FrameIdConv) {}

// Delete the copy constructor and copy assignment operator to avoid a
// situation where a copy of IndexedCallStackIdConverter gets an error in
// LastUnmappedId while the original instance doesn't.
IndexedCallstackIdConveter(const IndexedCallstackIdConveter &) = delete;
IndexedCallstackIdConveter &
operator=(const IndexedCallstackIdConveter &) = delete;

std::vector<Frame> operator()(CallStackId CSId) { return CSIdConv(CSId); }

FrameIdConverter<decltype(IndexedMemProfData::Frames)> FrameIdConv;
CallStackIdConverter<decltype(IndexedMemProfData::CallStacks)> CSIdConv;
};

struct FrameStat {
// The number of occurrences of a given FrameId.
uint64_t Count = 0;
Expand Down
31 changes: 11 additions & 20 deletions llvm/unittests/ProfileData/InstrProfTest.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -457,17 +457,14 @@ TEST_F(InstrProfTest, test_memprof_v2_full_schema) {
ASSERT_THAT_ERROR(RecordOr.takeError(), Succeeded());
const memprof::MemProfRecord &Record = RecordOr.get();

memprof::FrameIdConverter<decltype(MemProfData.Frames)> FrameIdConv(
MemProfData.Frames);
memprof::CallStackIdConverter<decltype(MemProfData.CallStacks)> CSIdConv(
MemProfData.CallStacks, FrameIdConv);
memprof::IndexedCallstackIdConveter CSIdConv(MemProfData);

const ::llvm::memprof::MemProfRecord WantRecord =
IndexedMR.toMemProfRecord(CSIdConv);
ASSERT_EQ(FrameIdConv.LastUnmappedId, std::nullopt)
<< "could not map frame id: " << *FrameIdConv.LastUnmappedId;
ASSERT_EQ(CSIdConv.LastUnmappedId, std::nullopt)
<< "could not map call stack id: " << *CSIdConv.LastUnmappedId;
ASSERT_EQ(CSIdConv.FrameIdConv.LastUnmappedId, std::nullopt)
<< "could not map frame id: " << *CSIdConv.FrameIdConv.LastUnmappedId;
ASSERT_EQ(CSIdConv.CSIdConv.LastUnmappedId, std::nullopt)
<< "could not map call stack id: " << *CSIdConv.CSIdConv.LastUnmappedId;
EXPECT_THAT(WantRecord, EqualsRecord(Record));
}

Expand All @@ -494,17 +491,14 @@ TEST_F(InstrProfTest, test_memprof_v2_partial_schema) {
ASSERT_THAT_ERROR(RecordOr.takeError(), Succeeded());
const memprof::MemProfRecord &Record = RecordOr.get();

memprof::FrameIdConverter<decltype(MemProfData.Frames)> FrameIdConv(
MemProfData.Frames);
memprof::CallStackIdConverter<decltype(MemProfData.CallStacks)> CSIdConv(
MemProfData.CallStacks, FrameIdConv);
memprof::IndexedCallstackIdConveter CSIdConv(MemProfData);

const ::llvm::memprof::MemProfRecord WantRecord =
IndexedMR.toMemProfRecord(CSIdConv);
ASSERT_EQ(FrameIdConv.LastUnmappedId, std::nullopt)
<< "could not map frame id: " << *FrameIdConv.LastUnmappedId;
ASSERT_EQ(CSIdConv.LastUnmappedId, std::nullopt)
<< "could not map call stack id: " << *CSIdConv.LastUnmappedId;
ASSERT_EQ(CSIdConv.FrameIdConv.LastUnmappedId, std::nullopt)
<< "could not map frame id: " << *CSIdConv.FrameIdConv.LastUnmappedId;
ASSERT_EQ(CSIdConv.CSIdConv.LastUnmappedId, std::nullopt)
<< "could not map call stack id: " << *CSIdConv.CSIdConv.LastUnmappedId;
EXPECT_THAT(WantRecord, EqualsRecord(Record));
}

Expand Down Expand Up @@ -615,10 +609,7 @@ TEST_F(InstrProfTest, test_memprof_merge) {

std::optional<memprof::FrameId> LastUnmappedFrameId;

memprof::FrameIdConverter<decltype(MemProfData.Frames)> FrameIdConv(
MemProfData.Frames);
memprof::CallStackIdConverter<decltype(MemProfData.CallStacks)> CSIdConv(
MemProfData.CallStacks, FrameIdConv);
memprof::IndexedCallstackIdConveter CSIdConv(MemProfData);

const ::llvm::memprof::MemProfRecord WantRecord =
IndexedMR.toMemProfRecord(CSIdConv);
Expand Down
41 changes: 13 additions & 28 deletions llvm/unittests/ProfileData/MemProfTest.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -501,16 +501,13 @@ TEST(MemProf, IndexedMemProfRecordToMemProfRecord) {
IndexedRecord.CallSiteIds.push_back(CS3Id);
IndexedRecord.CallSiteIds.push_back(CS4Id);

FrameIdConverter<decltype(MemProfData.Frames)> FrameIdConv(
MemProfData.Frames);
CallStackIdConverter<decltype(MemProfData.CallStacks)> CSIdConv(
MemProfData.CallStacks, FrameIdConv);
IndexedCallstackIdConveter CSIdConv(MemProfData);

MemProfRecord Record = IndexedRecord.toMemProfRecord(CSIdConv);

// Make sure that all lookups are successful.
ASSERT_EQ(FrameIdConv.LastUnmappedId, std::nullopt);
ASSERT_EQ(CSIdConv.LastUnmappedId, std::nullopt);
ASSERT_EQ(CSIdConv.FrameIdConv.LastUnmappedId, std::nullopt);
ASSERT_EQ(CSIdConv.CSIdConv.LastUnmappedId, std::nullopt);

// Verify the contents of Record.
ASSERT_THAT(Record.AllocSites, SizeIs(2));
Expand Down Expand Up @@ -540,17 +537,14 @@ TEST(MemProf, MissingCallStackId) {

// Create empty maps.
IndexedMemProfData MemProfData;
FrameIdConverter<decltype(MemProfData.Frames)> FrameIdConv(
MemProfData.Frames);
CallStackIdConverter<decltype(MemProfData.CallStacks)> CSIdConv(
MemProfData.CallStacks, FrameIdConv);
IndexedCallstackIdConveter CSIdConv(MemProfData);

// We are only interested in errors, not the return value.
(void)IndexedMR.toMemProfRecord(CSIdConv);

ASSERT_TRUE(CSIdConv.LastUnmappedId.has_value());
EXPECT_EQ(*CSIdConv.LastUnmappedId, 0xdeadbeefU);
EXPECT_EQ(FrameIdConv.LastUnmappedId, std::nullopt);
ASSERT_TRUE(CSIdConv.CSIdConv.LastUnmappedId.has_value());
EXPECT_EQ(*CSIdConv.CSIdConv.LastUnmappedId, 0xdeadbeefU);
EXPECT_EQ(CSIdConv.FrameIdConv.LastUnmappedId, std::nullopt);
}

TEST(MemProf, MissingFrameId) {
Expand All @@ -561,17 +555,14 @@ TEST(MemProf, MissingFrameId) {
IndexedMemProfRecord IndexedMR;
IndexedMR.AllocSites.emplace_back(CSId, makePartialMIB(), getHotColdSchema());

FrameIdConverter<decltype(MemProfData.Frames)> FrameIdConv(
MemProfData.Frames);
CallStackIdConverter<decltype(MemProfData.CallStacks)> CSIdConv(
MemProfData.CallStacks, FrameIdConv);
IndexedCallstackIdConveter CSIdConv(MemProfData);

// We are only interested in errors, not the return value.
(void)IndexedMR.toMemProfRecord(CSIdConv);

EXPECT_EQ(CSIdConv.LastUnmappedId, std::nullopt);
ASSERT_TRUE(FrameIdConv.LastUnmappedId.has_value());
EXPECT_EQ(*FrameIdConv.LastUnmappedId, 3U);
EXPECT_EQ(CSIdConv.CSIdConv.LastUnmappedId, std::nullopt);
ASSERT_TRUE(CSIdConv.FrameIdConv.LastUnmappedId.has_value());
EXPECT_EQ(*CSIdConv.FrameIdConv.LastUnmappedId, 3U);
}

// Verify CallStackRadixTreeBuilder can handle empty inputs.
Expand Down Expand Up @@ -714,10 +705,7 @@ TEST(MemProf, YAMLParser) {
const auto &[GUID, IndexedRecord] = MemProfData.Records.front();
EXPECT_EQ(GUID, 0xdeadbeef12345678ULL);

FrameIdConverter<decltype(MemProfData.Frames)> FrameIdConv(
MemProfData.Frames);
CallStackIdConverter<decltype(MemProfData.CallStacks)> CSIdConv(
MemProfData.CallStacks, FrameIdConv);
IndexedCallstackIdConveter CSIdConv(MemProfData);
MemProfRecord Record = IndexedRecord.toMemProfRecord(CSIdConv);

ASSERT_THAT(Record.AllocSites, SizeIs(2));
Expand Down Expand Up @@ -760,10 +748,7 @@ TEST(MemProf, YAMLParserGUID) {
const auto &[GUID, IndexedRecord] = MemProfData.Records.front();
EXPECT_EQ(GUID, IndexedMemProfRecord::getGUID("_Z3fooi"));

FrameIdConverter<decltype(MemProfData.Frames)> FrameIdConv(
MemProfData.Frames);
CallStackIdConverter<decltype(MemProfData.CallStacks)> CSIdConv(
MemProfData.CallStacks, FrameIdConv);
IndexedCallstackIdConveter CSIdConv(MemProfData);
MemProfRecord Record = IndexedRecord.toMemProfRecord(CSIdConv);

ASSERT_THAT(Record.AllocSites, SizeIs(1));
Expand Down
Loading