diff options
Diffstat (limited to 'contrib/llvm/lib/ProfileData/SampleProfWriter.cpp')
| -rw-r--r-- | contrib/llvm/lib/ProfileData/SampleProfWriter.cpp | 112 | 
1 files changed, 78 insertions, 34 deletions
| diff --git a/contrib/llvm/lib/ProfileData/SampleProfWriter.cpp b/contrib/llvm/lib/ProfileData/SampleProfWriter.cpp index 4fa71288f8d9..b05efa7417b9 100644 --- a/contrib/llvm/lib/ProfileData/SampleProfWriter.cpp +++ b/contrib/llvm/lib/ProfileData/SampleProfWriter.cpp @@ -18,16 +18,50 @@  //  //===----------------------------------------------------------------------===// +#include "llvm/ADT/StringRef.h" +#include "llvm/ProfileData/ProfileCommon.h" +#include "llvm/ProfileData/SampleProf.h"  #include "llvm/ProfileData/SampleProfWriter.h" -#include "llvm/Support/Debug.h"  #include "llvm/Support/ErrorOr.h" +#include "llvm/Support/FileSystem.h"  #include "llvm/Support/LEB128.h" -#include "llvm/Support/LineIterator.h" -#include "llvm/Support/MemoryBuffer.h" -#include "llvm/Support/Regex.h" +#include "llvm/Support/raw_ostream.h" +#include <algorithm> +#include <cstdint> +#include <memory> +#include <set> +#include <system_error> +#include <utility> +#include <vector> -using namespace llvm::sampleprof;  using namespace llvm; +using namespace sampleprof; + +std::error_code +SampleProfileWriter::write(const StringMap<FunctionSamples> &ProfileMap) { +  if (std::error_code EC = writeHeader(ProfileMap)) +    return EC; + +  // Sort the ProfileMap by total samples. +  typedef std::pair<StringRef, const FunctionSamples *> NameFunctionSamples; +  std::vector<NameFunctionSamples> V; +  for (const auto &I : ProfileMap) +    V.push_back(std::make_pair(I.getKey(), &I.second)); + +  std::stable_sort( +      V.begin(), V.end(), +      [](const NameFunctionSamples &A, const NameFunctionSamples &B) { +        if (A.second->getTotalSamples() == B.second->getTotalSamples()) +          return A.first > B.first; +        return A.second->getTotalSamples() > B.second->getTotalSamples(); +      }); + +  for (const auto &I : V) { +    if (std::error_code EC = write(*I.second)) +      return EC; +  } +  return sampleprof_error::success; +}  /// \brief Write samples to a text file.  /// @@ -61,20 +95,21 @@ std::error_code SampleProfileWriterText::write(const FunctionSamples &S) {      OS << "\n";    } -  SampleSorter<LineLocation, FunctionSamples> SortedCallsiteSamples( +  SampleSorter<LineLocation, FunctionSamplesMap> SortedCallsiteSamples(        S.getCallsiteSamples());    Indent += 1; -  for (const auto &I : SortedCallsiteSamples.get()) { -    LineLocation Loc = I->first; -    const FunctionSamples &CalleeSamples = I->second; -    OS.indent(Indent); -    if (Loc.Discriminator == 0) -      OS << Loc.LineOffset << ": "; -    else -      OS << Loc.LineOffset << "." << Loc.Discriminator << ": "; -    if (std::error_code EC = write(CalleeSamples)) -      return EC; -  } +  for (const auto &I : SortedCallsiteSamples.get()) +    for (const auto &FS : I->second) { +      LineLocation Loc = I->first; +      const FunctionSamples &CalleeSamples = FS.second; +      OS.indent(Indent); +      if (Loc.Discriminator == 0) +        OS << Loc.LineOffset << ": "; +      else +        OS << Loc.LineOffset << "." << Loc.Discriminator << ": "; +      if (std::error_code EC = write(CalleeSamples)) +        return EC; +    }    Indent -= 1;    return sampleprof_error::success; @@ -89,8 +124,7 @@ std::error_code SampleProfileWriterBinary::writeNameIdx(StringRef FName) {  }  void SampleProfileWriterBinary::addName(StringRef FName) { -  auto NextIdx = NameTable.size(); -  NameTable.insert(std::make_pair(FName, NextIdx)); +  NameTable.insert(std::make_pair(FName, 0));  }  void SampleProfileWriterBinary::addNames(const FunctionSamples &S) { @@ -102,11 +136,12 @@ void SampleProfileWriterBinary::addNames(const FunctionSamples &S) {    }    // Recursively add all the names for inlined callsites. -  for (const auto &J : S.getCallsiteSamples()) { -    const FunctionSamples &CalleeSamples = J.second; -    addName(CalleeSamples.getName()); -    addNames(CalleeSamples); -  } +  for (const auto &J : S.getCallsiteSamples()) +    for (const auto &FS : J.second) { +      const FunctionSamples &CalleeSamples = FS.second; +      addName(CalleeSamples.getName()); +      addNames(CalleeSamples); +    }  }  std::error_code SampleProfileWriterBinary::writeHeader( @@ -127,10 +162,18 @@ std::error_code SampleProfileWriterBinary::writeHeader(      addNames(I.second);    } +  // Sort the names to make NameTable is deterministic. +  std::set<StringRef> V; +  for (const auto &I : NameTable) +    V.insert(I.first); +  int i = 0; +  for (const StringRef &N : V) +    NameTable[N] = i++; +    // Write out the name table.    encodeULEB128(NameTable.size(), OS); -  for (auto N : NameTable) { -    OS << N.first; +  for (auto N : V) { +    OS << N;      encodeULEB128(0, OS);    }    return sampleprof_error::success; @@ -180,14 +223,15 @@ std::error_code SampleProfileWriterBinary::writeBody(const FunctionSamples &S) {    // Recursively emit all the callsite samples.    encodeULEB128(S.getCallsiteSamples().size(), OS); -  for (const auto &J : S.getCallsiteSamples()) { -    LineLocation Loc = J.first; -    const FunctionSamples &CalleeSamples = J.second; -    encodeULEB128(Loc.LineOffset, OS); -    encodeULEB128(Loc.Discriminator, OS); -    if (std::error_code EC = writeBody(CalleeSamples)) -      return EC; -  } +  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)) +        return EC; +    }    return sampleprof_error::success;  } | 
