diff options
Diffstat (limited to 'contrib/llvm-project/llvm/lib/ProfileData/SampleProfWriter.cpp')
| -rw-r--r-- | contrib/llvm-project/llvm/lib/ProfileData/SampleProfWriter.cpp | 54 |
1 files changed, 20 insertions, 34 deletions
diff --git a/contrib/llvm-project/llvm/lib/ProfileData/SampleProfWriter.cpp b/contrib/llvm-project/llvm/lib/ProfileData/SampleProfWriter.cpp index 1630fefb4fcf..9173a0f94f69 100644 --- a/contrib/llvm-project/llvm/lib/ProfileData/SampleProfWriter.cpp +++ b/contrib/llvm-project/llvm/lib/ProfileData/SampleProfWriter.cpp @@ -22,14 +22,12 @@ #include "llvm/ProfileData/ProfileCommon.h" #include "llvm/ProfileData/SampleProf.h" #include "llvm/Support/Compression.h" -#include "llvm/Support/Endian.h" #include "llvm/Support/EndianStream.h" #include "llvm/Support/ErrorOr.h" #include "llvm/Support/FileSystem.h" #include "llvm/Support/LEB128.h" #include "llvm/Support/MD5.h" #include "llvm/Support/raw_ostream.h" -#include <algorithm> #include <cmath> #include <cstdint> #include <memory> @@ -582,12 +580,8 @@ std::error_code SampleProfileWriterText::writeSample(const FunctionSamples &S) { LineLocation Loc = I->first; const SampleRecord &Sample = I->second; OS.indent(Indent + 1); - if (Loc.Discriminator == 0) - OS << Loc.LineOffset << ": "; - else - OS << Loc.LineOffset << "." << Loc.Discriminator << ": "; - - OS << Sample.getSamples(); + Loc.print(OS); + OS << ": " << Sample.getSamples(); for (const auto &J : Sample.getSortedCallTargets()) OS << " " << J.first << ":" << J.second; @@ -598,18 +592,18 @@ std::error_code SampleProfileWriterText::writeSample(const FunctionSamples &S) { SampleSorter<LineLocation, FunctionSamplesMap> SortedCallsiteSamples( S.getCallsiteSamples()); Indent += 1; - for (const auto &I : SortedCallsiteSamples.get()) - for (const auto &FS : I->second) { - LineLocation Loc = I->first; - const FunctionSamples &CalleeSamples = FS.second; + for (const auto *Element : SortedCallsiteSamples.get()) { + // Element is a pointer to a pair of LineLocation and FunctionSamplesMap. + const auto &[Loc, FunctionSamplesMap] = *Element; + for (const FunctionSamples &CalleeSamples : + make_second_range(FunctionSamplesMap)) { OS.indent(Indent); - if (Loc.Discriminator == 0) - OS << Loc.LineOffset << ": "; - else - OS << Loc.LineOffset << "." << Loc.Discriminator << ": "; + Loc.print(OS); + OS << ": "; if (std::error_code EC = writeSample(CalleeSamples)) return EC; } + } Indent -= 1; if (FunctionSamples::ProfileIsProbeBased) { @@ -624,6 +618,9 @@ std::error_code SampleProfileWriterText::writeSample(const FunctionSamples &S) { LineCount++; } + if (Indent == 0 && MarkFlatProfiles && S.getCallsiteSamples().size() == 0) + OS << " !Flat\n"; + return sampleprof_error::success; } @@ -832,17 +829,8 @@ std::error_code SampleProfileWriterBinary::writeBody(const FunctionSamples &S) { for (const auto &I : S.getBodySamples()) { LineLocation Loc = I.first; const SampleRecord &Sample = I.second; - encodeULEB128(Loc.LineOffset, OS); - encodeULEB128(Loc.Discriminator, OS); - encodeULEB128(Sample.getSamples(), OS); - encodeULEB128(Sample.getCallTargets().size(), OS); - for (const auto &J : Sample.getSortedCallTargets()) { - FunctionId Callee = J.first; - uint64_t CalleeSamples = J.second; - if (std::error_code EC = writeNameIdx(Callee)) - return EC; - encodeULEB128(CalleeSamples, OS); - } + Loc.serialize(OS); + Sample.serialize(OS, getNameTable()); } // Recursively emit all the callsite samples. @@ -850,13 +838,11 @@ std::error_code SampleProfileWriterBinary::writeBody(const FunctionSamples &S) { for (const auto &J : S.getCallsiteSamples()) NumCallsites += J.second.size(); encodeULEB128(NumCallsites, OS); - for (const auto &J : S.getCallsiteSamples()) - for (const auto &FS : J.second) { - LineLocation Loc = J.first; - const FunctionSamples &CalleeSamples = FS.second; - encodeULEB128(Loc.LineOffset, OS); - encodeULEB128(Loc.Discriminator, OS); - if (std::error_code EC = writeBody(CalleeSamples)) + for (const auto &[Loc, CalleeFunctionSampleMap] : S.getCallsiteSamples()) + for (const auto &FunctionSample : + llvm::make_second_range(CalleeFunctionSampleMap)) { + Loc.serialize(OS); + if (std::error_code EC = writeBody(FunctionSample)) return EC; } |
