diff options
Diffstat (limited to 'contrib/llvm/lib/ProfileData/InstrProfWriter.cpp')
-rw-r--r-- | contrib/llvm/lib/ProfileData/InstrProfWriter.cpp | 30 |
1 files changed, 25 insertions, 5 deletions
diff --git a/contrib/llvm/lib/ProfileData/InstrProfWriter.cpp b/contrib/llvm/lib/ProfileData/InstrProfWriter.cpp index e25299e..029d756 100644 --- a/contrib/llvm/lib/ProfileData/InstrProfWriter.cpp +++ b/contrib/llvm/lib/ProfileData/InstrProfWriter.cpp @@ -13,10 +13,18 @@ //===----------------------------------------------------------------------===// #include "llvm/ProfileData/InstrProfWriter.h" -#include "llvm/ADT/StringExtras.h" +#include "llvm/ADT/StringRef.h" +#include "llvm/IR/ProfileSummary.h" +#include "llvm/ProfileData/ProfileCommon.h" #include "llvm/Support/EndianStream.h" +#include "llvm/Support/MemoryBuffer.h" #include "llvm/Support/OnDiskHashTable.h" +#include "llvm/Support/raw_ostream.h" +#include <algorithm> +#include <string> #include <tuple> +#include <utility> +#include <vector> using namespace llvm; @@ -29,6 +37,7 @@ struct PatchItem { }; namespace llvm { + // A wrapper class to abstract writer stream with support of bytes // back patching. class ProfOStream { @@ -40,6 +49,7 @@ public: uint64_t tell() { return OS.tell(); } void write(uint64_t V) { LE.write<uint64_t>(V); } + // \c patch can only be called when all data is written and flushed. // For raw_string_ostream, the patch is done on the target string // directly and it won't be reflected in the stream's internal buffer. @@ -65,6 +75,7 @@ public: } } } + // If \c OS is an instance of \c raw_fd_ostream, this field will be // true. Otherwise, \c OS will be an raw_string_ostream. bool IsFDOStream; @@ -139,7 +150,8 @@ public: } } }; -} + +} // end namespace llvm InstrProfWriter::InstrProfWriter(bool Sparse) : Sparse(Sparse), FunctionData(), ProfileKind(PF_Unknown), @@ -152,6 +164,7 @@ void InstrProfWriter::setValueProfDataEndianness( support::endianness Endianness) { InfoObj->ValueProfDataEndianness = Endianness; } + void InstrProfWriter::setOutputSparse(bool Sparse) { this->Sparse = Sparse; } @@ -182,13 +195,20 @@ Error InstrProfWriter::addRecord(InstrProfRecord &&I, uint64_t Weight) { return Dest.takeError(); } +Error InstrProfWriter::mergeRecordsFromWriter(InstrProfWriter &&IPW) { + for (auto &I : IPW.FunctionData) + for (auto &Func : I.getValue()) + if (Error E = addRecord(std::move(Func.second), 1)) + return E; + return Error::success(); +} + bool InstrProfWriter::shouldEncodeData(const ProfilingData &PD) { if (!Sparse) return true; for (const auto &Func : PD) { const InstrProfRecord &IPR = Func.second; - if (std::any_of(IPR.Counts.begin(), IPR.Counts.end(), - [](uint64_t Count) { return Count > 0; })) + if (any_of(IPR.Counts, [](uint64_t Count) { return Count > 0; })) return true; } return false; @@ -261,7 +281,7 @@ void InstrProfWriter::writeImpl(ProfOStream &OS) { // structure to be serialized out (to disk or buffer). std::unique_ptr<ProfileSummary> PS = ISB.getSummary(); setSummary(TheSummary.get(), *PS); - InfoObj->SummaryBuilder = 0; + InfoObj->SummaryBuilder = nullptr; // Now do the final patch: PatchItem PatchItems[] = { |