diff options
| author | Dimitry Andric <dim@FreeBSD.org> | 2017-05-16 19:46:52 +0000 | 
|---|---|---|
| committer | Dimitry Andric <dim@FreeBSD.org> | 2017-05-16 19:46:52 +0000 | 
| commit | 6b3f41ed88e8e440e11a4fbf20b6600529f80049 (patch) | |
| tree | 928b056f24a634d628c80238dbbf10d41b1a71d5 /lib/ProfileData/SampleProfWriter.cpp | |
| parent | c46e6a5940c50058e00c0c5f9123fd82e338d29a (diff) | |
Notes
Diffstat (limited to 'lib/ProfileData/SampleProfWriter.cpp')
| -rw-r--r-- | lib/ProfileData/SampleProfWriter.cpp | 42 | 
1 files changed, 38 insertions, 4 deletions
diff --git a/lib/ProfileData/SampleProfWriter.cpp b/lib/ProfileData/SampleProfWriter.cpp index b91b6fb7c7add..b05efa7417b94 100644 --- a/lib/ProfileData/SampleProfWriter.cpp +++ b/lib/ProfileData/SampleProfWriter.cpp @@ -29,6 +29,7 @@  #include <algorithm>  #include <cstdint>  #include <memory> +#include <set>  #include <system_error>  #include <utility>  #include <vector> @@ -36,6 +37,32 @@  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.  ///  /// Note: it may be tempting to implement this in terms of @@ -97,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) { @@ -136,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;  | 
