aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/ProfileData/SampleProfWriter.cpp
diff options
context:
space:
mode:
authorDimitry Andric <dim@FreeBSD.org>2021-12-25 22:30:44 +0000
committerDimitry Andric <dim@FreeBSD.org>2021-12-25 22:30:44 +0000
commit77fc4c146f0870ffb09c1afb823ccbe742c5e6ff (patch)
tree5c0eb39553003b9c75a901af6bc4ddabd6f2f28c /llvm/lib/ProfileData/SampleProfWriter.cpp
parentf65dcba83ce5035ab88a85fe17628b447eb56e1b (diff)
Diffstat (limited to 'llvm/lib/ProfileData/SampleProfWriter.cpp')
-rw-r--r--llvm/lib/ProfileData/SampleProfWriter.cpp75
1 files changed, 53 insertions, 22 deletions
diff --git a/llvm/lib/ProfileData/SampleProfWriter.cpp b/llvm/lib/ProfileData/SampleProfWriter.cpp
index 78006aab1541..6f02bd203a9f 100644
--- a/llvm/lib/ProfileData/SampleProfWriter.cpp
+++ b/llvm/lib/ProfileData/SampleProfWriter.cpp
@@ -172,7 +172,7 @@ std::error_code SampleProfileWriterExtBinaryBase::writeFuncOffsetTable() {
return (std::error_code)sampleprof_error::success;
};
- if (FunctionSamples::ProfileIsCS) {
+ if (FunctionSamples::ProfileIsCSFlat) {
// Sort the contexts before writing them out. This is to help fast load all
// context profiles for a function as well as their callee contexts which
// can help profile-guided importing for ThinLTO.
@@ -195,17 +195,45 @@ std::error_code SampleProfileWriterExtBinaryBase::writeFuncOffsetTable() {
}
std::error_code SampleProfileWriterExtBinaryBase::writeFuncMetadata(
+ const FunctionSamples &FunctionProfile) {
+ auto &OS = *OutputStream;
+ if (std::error_code EC = writeContextIdx(FunctionProfile.getContext()))
+ return EC;
+
+ if (FunctionSamples::ProfileIsProbeBased)
+ encodeULEB128(FunctionProfile.getFunctionHash(), OS);
+ if (FunctionSamples::ProfileIsCSFlat || FunctionSamples::ProfileIsCSNested) {
+ encodeULEB128(FunctionProfile.getContext().getAllAttributes(), OS);
+ }
+
+ if (!FunctionSamples::ProfileIsCSFlat) {
+ // Recursively emit attributes for all callee samples.
+ uint64_t NumCallsites = 0;
+ for (const auto &J : FunctionProfile.getCallsiteSamples())
+ NumCallsites += J.second.size();
+ encodeULEB128(NumCallsites, OS);
+ for (const auto &J : FunctionProfile.getCallsiteSamples()) {
+ for (const auto &FS : J.second) {
+ LineLocation Loc = J.first;
+ encodeULEB128(Loc.LineOffset, OS);
+ encodeULEB128(Loc.Discriminator, OS);
+ if (std::error_code EC = writeFuncMetadata(FS.second))
+ return EC;
+ }
+ }
+ }
+
+ return sampleprof_error::success;
+}
+
+std::error_code SampleProfileWriterExtBinaryBase::writeFuncMetadata(
const SampleProfileMap &Profiles) {
- if (!FunctionSamples::ProfileIsProbeBased && !FunctionSamples::ProfileIsCS)
+ if (!FunctionSamples::ProfileIsProbeBased &&
+ !FunctionSamples::ProfileIsCSFlat && !FunctionSamples::ProfileIsCSNested)
return sampleprof_error::success;
- auto &OS = *OutputStream;
for (const auto &Entry : Profiles) {
- if (std::error_code EC = writeContextIdx(Entry.second.getContext()))
+ if (std::error_code EC = writeFuncMetadata(Entry.second))
return EC;
- if (FunctionSamples::ProfileIsProbeBased)
- encodeULEB128(Entry.second.getFunctionHash(), OS);
- if (FunctionSamples::ProfileIsCS)
- encodeULEB128(Entry.second.getContext().getAllAttributes(), OS);
}
return sampleprof_error::success;
}
@@ -295,10 +323,13 @@ std::error_code SampleProfileWriterExtBinaryBase::writeOneSection(
setToCompressSection(SecProfileSymbolList);
if (Type == SecFuncMetadata && FunctionSamples::ProfileIsProbeBased)
addSectionFlag(SecFuncMetadata, SecFuncMetadataFlags::SecFlagIsProbeBased);
- if (Type == SecProfSummary && FunctionSamples::ProfileIsCS)
- addSectionFlag(SecProfSummary, SecProfSummaryFlags::SecFlagFullContext);
- if (Type == SecFuncMetadata && FunctionSamples::ProfileIsCS)
+ if (Type == SecFuncMetadata && FunctionSamples::ProfileIsCSNested)
+ addSectionFlag(SecFuncMetadata, SecFuncMetadataFlags::SecFlagIsCSNested);
+ if (Type == SecFuncMetadata &&
+ (FunctionSamples::ProfileIsCSFlat || FunctionSamples::ProfileIsCSNested))
addSectionFlag(SecFuncMetadata, SecFuncMetadataFlags::SecFlagHasAttribute);
+ if (Type == SecProfSummary && FunctionSamples::ProfileIsCSFlat)
+ addSectionFlag(SecProfSummary, SecProfSummaryFlags::SecFlagFullContext);
if (Type == SecProfSummary && FunctionSamples::ProfileIsFS)
addSectionFlag(SecProfSummary, SecProfSummaryFlags::SecFlagFSDiscriminator);
@@ -440,7 +471,7 @@ SampleProfileWriterCompactBinary::write(const SampleProfileMap &ProfileMap) {
/// it needs to be parsed by the SampleProfileReaderText class.
std::error_code SampleProfileWriterText::writeSample(const FunctionSamples &S) {
auto &OS = *OutputStream;
- if (FunctionSamples::ProfileIsCS)
+ if (FunctionSamples::ProfileIsCSFlat)
OS << "[" << S.getContext().toString() << "]:" << S.getTotalSamples();
else
OS << S.getName() << ":" << S.getTotalSamples();
@@ -483,15 +514,14 @@ std::error_code SampleProfileWriterText::writeSample(const FunctionSamples &S) {
}
Indent -= 1;
- if (Indent == 0) {
- if (FunctionSamples::ProfileIsProbeBased) {
- OS.indent(Indent + 1);
- OS << "!CFGChecksum: " << S.getFunctionHash() << "\n";
- }
- if (FunctionSamples::ProfileIsCS) {
- OS.indent(Indent + 1);
- OS << "!Attributes: " << S.getContext().getAllAttributes() << "\n";
- }
+ if (FunctionSamples::ProfileIsProbeBased) {
+ OS.indent(Indent + 1);
+ OS << "!CFGChecksum: " << S.getFunctionHash() << "\n";
+ }
+
+ if (S.getContext().getAllAttributes()) {
+ OS.indent(Indent + 1);
+ OS << "!Attributes: " << S.getContext().getAllAttributes() << "\n";
}
return sampleprof_error::success;
@@ -841,7 +871,8 @@ SampleProfileWriter::create(std::unique_ptr<raw_ostream> &OS,
std::unique_ptr<SampleProfileWriter> Writer;
// Currently only Text and Extended Binary format are supported for CSSPGO.
- if ((FunctionSamples::ProfileIsCS || FunctionSamples::ProfileIsProbeBased) &&
+ if ((FunctionSamples::ProfileIsCSFlat ||
+ FunctionSamples::ProfileIsProbeBased) &&
(Format == SPF_Binary || Format == SPF_Compact_Binary))
return sampleprof_error::unsupported_writing_format;