Subversion Repositories QNX 8.QNX8 LLVM/Clang compiler suite

Rev

Blame | Last modification | View Log | Download | RSS feed

  1. //===- ProfileCommon.h - Common profiling APIs. -----------------*- C++ -*-===//
  2. //
  3. // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
  4. // See https://llvm.org/LICENSE.txt for license information.
  5. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  6. //
  7. //===----------------------------------------------------------------------===//
  8. //
  9. // This file contains data structures and functions common to both instrumented
  10. // and sample profiling.
  11. //
  12. //===----------------------------------------------------------------------===//
  13.  
  14. #ifndef LLVM_PROFILEDATA_PROFILECOMMON_H
  15. #define LLVM_PROFILEDATA_PROFILECOMMON_H
  16.  
  17. #include "llvm/ADT/ArrayRef.h"
  18. #include "llvm/IR/ProfileSummary.h"
  19. #include "llvm/ProfileData/InstrProf.h"
  20. #include "llvm/ProfileData/SampleProf.h"
  21. #include "llvm/Support/Error.h"
  22. #include <algorithm>
  23. #include <cstdint>
  24. #include <functional>
  25. #include <map>
  26. #include <memory>
  27. #include <vector>
  28.  
  29. namespace llvm {
  30.  
  31. namespace sampleprof {
  32.  
  33. class FunctionSamples;
  34.  
  35. } // end namespace sampleprof
  36.  
  37. inline const char *getHotSectionPrefix() { return "hot"; }
  38. inline const char *getUnlikelySectionPrefix() { return "unlikely"; }
  39.  
  40. class ProfileSummaryBuilder {
  41. private:
  42.   /// We keep track of the number of times a count (block count or samples)
  43.   /// appears in the profile. The map is kept sorted in the descending order of
  44.   /// counts.
  45.   std::map<uint64_t, uint32_t, std::greater<uint64_t>> CountFrequencies;
  46.   std::vector<uint32_t> DetailedSummaryCutoffs;
  47.  
  48. protected:
  49.   SummaryEntryVector DetailedSummary;
  50.   uint64_t TotalCount = 0;
  51.   uint64_t MaxCount = 0;
  52.   uint64_t MaxFunctionCount = 0;
  53.   uint32_t NumCounts = 0;
  54.   uint32_t NumFunctions = 0;
  55.  
  56.   ProfileSummaryBuilder(std::vector<uint32_t> Cutoffs)
  57.       : DetailedSummaryCutoffs(std::move(Cutoffs)) {}
  58.   ~ProfileSummaryBuilder() = default;
  59.  
  60.   inline void addCount(uint64_t Count);
  61.   void computeDetailedSummary();
  62.  
  63. public:
  64.   /// A vector of useful cutoff values for detailed summary.
  65.   static const ArrayRef<uint32_t> DefaultCutoffs;
  66.  
  67.   /// Find the summary entry for a desired percentile of counts.
  68.   static const ProfileSummaryEntry &
  69.   getEntryForPercentile(const SummaryEntryVector &DS, uint64_t Percentile);
  70.   static uint64_t getHotCountThreshold(const SummaryEntryVector &DS);
  71.   static uint64_t getColdCountThreshold(const SummaryEntryVector &DS);
  72. };
  73.  
  74. class InstrProfSummaryBuilder final : public ProfileSummaryBuilder {
  75.   uint64_t MaxInternalBlockCount = 0;
  76.  
  77.   inline void addEntryCount(uint64_t Count);
  78.   inline void addInternalCount(uint64_t Count);
  79.  
  80. public:
  81.   InstrProfSummaryBuilder(std::vector<uint32_t> Cutoffs)
  82.       : ProfileSummaryBuilder(std::move(Cutoffs)) {}
  83.  
  84.   void addRecord(const InstrProfRecord &);
  85.   std::unique_ptr<ProfileSummary> getSummary();
  86. };
  87.  
  88. class SampleProfileSummaryBuilder final : public ProfileSummaryBuilder {
  89. public:
  90.   SampleProfileSummaryBuilder(std::vector<uint32_t> Cutoffs)
  91.       : ProfileSummaryBuilder(std::move(Cutoffs)) {}
  92.  
  93.   void addRecord(const sampleprof::FunctionSamples &FS,
  94.                  bool isCallsiteSample = false);
  95.   std::unique_ptr<ProfileSummary>
  96.   computeSummaryForProfiles(const sampleprof::SampleProfileMap &Profiles);
  97.   std::unique_ptr<ProfileSummary> getSummary();
  98. };
  99.  
  100. /// This is called when a count is seen in the profile.
  101. void ProfileSummaryBuilder::addCount(uint64_t Count) {
  102.   TotalCount += Count;
  103.   if (Count > MaxCount)
  104.     MaxCount = Count;
  105.   NumCounts++;
  106.   CountFrequencies[Count]++;
  107. }
  108.  
  109. } // end namespace llvm
  110.  
  111. #endif // LLVM_PROFILEDATA_PROFILECOMMON_H
  112.