diff options
author | Douglas Yung <douglas.yung@sony.com> | 2023-01-09 23:53:14 -0800 |
---|---|---|
committer | Douglas Yung <douglas.yung@sony.com> | 2023-01-09 23:53:14 -0800 |
commit | ac07911b455ed0b29c201b1d59d3f33105777af9 (patch) | |
tree | 8142feab811e19f456bb9438a90b9538f58dafe5 /llvm/lib/ProfileData/SampleProfWriter.cpp | |
parent | 146f78bf03fdcf80acf385a7e452a6d349e84e6c (diff) | |
download | llvm-ac07911b455ed0b29c201b1d59d3f33105777af9.zip llvm-ac07911b455ed0b29c201b1d59d3f33105777af9.tar.gz llvm-ac07911b455ed0b29c201b1d59d3f33105777af9.tar.bz2 |
Revert "[llvm-profdata] Add option to cap profile output size"
This reverts commit 5b72d0e4f5eeb8f90c744cac8e0728cffeca61a9.
The test added is failing on Mac/Windows. See review for buildbot failure links.
Diffstat (limited to 'llvm/lib/ProfileData/SampleProfWriter.cpp')
-rw-r--r-- | llvm/lib/ProfileData/SampleProfWriter.cpp | 134 |
1 files changed, 23 insertions, 111 deletions
diff --git a/llvm/lib/ProfileData/SampleProfWriter.cpp b/llvm/lib/ProfileData/SampleProfWriter.cpp index e52c7ba..093790a 100644 --- a/llvm/lib/ProfileData/SampleProfWriter.cpp +++ b/llvm/lib/ProfileData/SampleProfWriter.cpp @@ -30,7 +30,6 @@ #include "llvm/Support/MD5.h" #include "llvm/Support/raw_ostream.h" #include <algorithm> -#include <cmath> #include <cstdint> #include <memory> #include <set> @@ -38,96 +37,9 @@ #include <utility> #include <vector> -#define DEBUG_TYPE "llvm-profdata" - using namespace llvm; using namespace sampleprof; -namespace llvm { -namespace support { -namespace endian { -namespace { - -// Adapter class to llvm::support::endian::Writer for pwrite(). -struct SeekableWriter { - raw_pwrite_stream &OS; - endianness Endian; - SeekableWriter(raw_pwrite_stream &OS, endianness Endian) - : OS(OS), Endian(Endian) {} - - template <typename ValueType> - void pwrite(ValueType Val, size_t Offset) { - std::string StringBuf; - raw_string_ostream SStream(StringBuf); - Writer(SStream, Endian).write(Val); - OS.pwrite(StringBuf.data(), StringBuf.size(), Offset); - } -}; - -} // namespace -} // namespace endian -} // namespace support -} // namespace llvm - -DefaultFunctionPruningStrategy::DefaultFunctionPruningStrategy( - SampleProfileMap &ProfileMap, size_t OutputSizeLimit) - : FunctionPruningStrategy(ProfileMap, OutputSizeLimit) { - sortFuncProfiles(ProfileMap, SortedFunctions); -} - -void DefaultFunctionPruningStrategy::Erase(size_t CurrentOutputSize) { - double D = (double)OutputSizeLimit / CurrentOutputSize; - size_t NewSize = (size_t)round(ProfileMap.size() * D * D); - size_t NumToRemove = ProfileMap.size() - NewSize; - if (NumToRemove < 1) - NumToRemove = 1; - - assert(NumToRemove <= SortedFunctions.size()); - llvm::for_each( - llvm::make_range(SortedFunctions.begin() + SortedFunctions.size() - - NumToRemove, - SortedFunctions.end()), - [&](const NameFunctionSamples &E) { ProfileMap.erase(E.first); }); - SortedFunctions.resize(SortedFunctions.size() - NumToRemove); -} - -std::error_code SampleProfileWriter::writeWithSizeLimitInternal( - SampleProfileMap &ProfileMap, size_t OutputSizeLimit, - FunctionPruningStrategy *Strategy) { - if (OutputSizeLimit == 0) - return write(ProfileMap); - - size_t OriginalFunctionCount = ProfileMap.size(); - - SmallVector<char> StringBuffer; - std::unique_ptr<raw_ostream> BufferStream( - new raw_svector_ostream(StringBuffer)); - OutputStream.swap(BufferStream); - - if (std::error_code EC = write(ProfileMap)) - return EC; - size_t IterationCount = 0; - while (StringBuffer.size() > OutputSizeLimit) { - Strategy->Erase(StringBuffer.size()); - - if (ProfileMap.size() == 0) - return sampleprof_error::too_large; - - StringBuffer.clear(); - OutputStream.reset(new raw_svector_ostream(StringBuffer)); - if (std::error_code EC = write(ProfileMap)) - return EC; - IterationCount++; - } - - OutputStream.swap(BufferStream); - OutputStream->write(StringBuffer.data(), StringBuffer.size()); - LLVM_DEBUG(dbgs() << "Profile originally has " << OriginalFunctionCount - << " functions, reduced to " << ProfileMap.size() << " in " - << IterationCount << " iterations\n"); - return sampleprof_error::success; -} - std::error_code SampleProfileWriter::writeFuncProfiles(const SampleProfileMap &ProfileMap) { std::vector<NameFunctionSamples> V; @@ -204,12 +116,6 @@ std::error_code SampleProfileWriterExtBinaryBase::addNewSection( std::error_code SampleProfileWriterExtBinaryBase::write(const SampleProfileMap &ProfileMap) { - // When calling write on a different profile map, existing states should be - // cleared. - NameTable.clear(); - CSNameTable.clear(); - SecHdrTable.clear(); - if (std::error_code EC = writeHeader(ProfileMap)) return EC; @@ -699,10 +605,14 @@ std::error_code SampleProfileWriterCompactBinary::writeFuncOffsetTable() { auto &OS = *OutputStream; // Fill the slot remembered by TableOffset with the offset of FuncOffsetTable. + auto &OFS = static_cast<raw_fd_ostream &>(OS); uint64_t FuncOffsetTableStart = OS.tell(); - support::endian::SeekableWriter Writer(static_cast<raw_pwrite_stream &>(OS), - support::little); - Writer.pwrite(FuncOffsetTableStart, TableOffset); + if (OFS.seek(TableOffset) == (uint64_t)-1) + return sampleprof_error::ostream_seek_unsupported; + support::endian::Writer Writer(*OutputStream, support::little); + Writer.write(FuncOffsetTableStart); + if (OFS.seek(FuncOffsetTableStart) == (uint64_t)-1) + return sampleprof_error::ostream_seek_unsupported; // Write out the table size. encodeULEB128(FuncOffsetTable.size(), OS); @@ -740,10 +650,6 @@ SampleProfileWriterBinary::writeMagicIdent(SampleProfileFormat Format) { std::error_code SampleProfileWriterBinary::writeHeader(const SampleProfileMap &ProfileMap) { - // When calling write on a different profile map, existing names should be - // cleared. - NameTable.clear(); - writeMagicIdent(Format); computeSummary(ProfileMap); @@ -784,6 +690,14 @@ void SampleProfileWriterExtBinaryBase::allocSecHdrTable() { } std::error_code SampleProfileWriterExtBinaryBase::writeSecHdrTable() { + auto &OFS = static_cast<raw_fd_ostream &>(*OutputStream); + uint64_t Saved = OutputStream->tell(); + + // Set OutputStream to the location saved in SecHdrTableOffset. + if (OFS.seek(SecHdrTableOffset) == (uint64_t)-1) + return sampleprof_error::ostream_seek_unsupported; + support::endian::Writer Writer(*OutputStream, support::little); + assert(SecHdrTable.size() == SectionHdrLayout.size() && "SecHdrTable entries doesn't match SectionHdrLayout"); SmallVector<uint32_t, 16> IndexMap(SecHdrTable.size(), -1); @@ -800,23 +714,21 @@ std::error_code SampleProfileWriterExtBinaryBase::writeSecHdrTable() { // needs to be computed after SecLBRProfile (the order in SecHdrTable), // but it needs to be read before SecLBRProfile (the order in // SectionHdrLayout). So we use IndexMap above to switch the order. - support::endian::SeekableWriter Writer( - static_cast<raw_pwrite_stream &>(*OutputStream), support::little); for (uint32_t LayoutIdx = 0; LayoutIdx < SectionHdrLayout.size(); LayoutIdx++) { assert(IndexMap[LayoutIdx] < SecHdrTable.size() && "Incorrect LayoutIdx in SecHdrTable"); auto Entry = SecHdrTable[IndexMap[LayoutIdx]]; - Writer.pwrite(static_cast<uint64_t>(Entry.Type), - SecHdrTableOffset + 4 * LayoutIdx * sizeof(uint64_t)); - Writer.pwrite(static_cast<uint64_t>(Entry.Flags), - SecHdrTableOffset + (4 * LayoutIdx + 1) * sizeof(uint64_t)); - Writer.pwrite(static_cast<uint64_t>(Entry.Offset), - SecHdrTableOffset + (4 * LayoutIdx + 2) * sizeof(uint64_t)); - Writer.pwrite(static_cast<uint64_t>(Entry.Size), - SecHdrTableOffset + (4 * LayoutIdx + 3) * sizeof(uint64_t)); + Writer.write(static_cast<uint64_t>(Entry.Type)); + Writer.write(static_cast<uint64_t>(Entry.Flags)); + Writer.write(static_cast<uint64_t>(Entry.Offset)); + Writer.write(static_cast<uint64_t>(Entry.Size)); } + // Reset OutputStream. + if (OFS.seek(Saved) == (uint64_t)-1) + return sampleprof_error::ostream_seek_unsupported; + return sampleprof_error::success; } |