1de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar//===-- ProfileCommon.h - Common profiling APIs. ----------------*- C++ -*-===// 2de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar// 3de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar// The LLVM Compiler Infrastructure 4de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar// 5de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar// This file is distributed under the University of Illinois Open Source 6de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar// License. See LICENSE.TXT for details. 7de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar// 8de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar//===----------------------------------------------------------------------===// 9de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar// 10de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar// This file contains data structures and functions common to both instrumented 11de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar// and sample profiling. 12de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar// 13de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar//===----------------------------------------------------------------------===// 14de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 15de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#ifndef LLVM_PROFILEDATA_PROFILE_COMMON_H 16de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#define LLVM_PROFILEDATA_PROFILE_COMMON_H 17de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 18de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include <cstdint> 19de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include <functional> 20de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include <map> 21de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include <utility> 22de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include <vector> 23de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 24de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/IR/ProfileSummary.h" 25de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/Support/Error.h" 26de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/ADT/ArrayRef.h" 27de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 28de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarnamespace llvm { 29de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarclass Function; 30de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarnamespace IndexedInstrProf { 31de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarstruct Summary; 32de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar} 33de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarnamespace sampleprof { 34de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarclass FunctionSamples; 35de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar} 36de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarstruct InstrProfRecord; 37de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarclass LLVMContext; 38de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarclass Metadata; 39de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarclass MDTuple; 40de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarclass MDNode; 41de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 42de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarinline const char *getHotSectionPrefix() { return ".hot"; } 43de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarinline const char *getUnlikelySectionPrefix() { return ".unlikely"; } 44de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 45de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarclass ProfileSummaryBuilder { 46de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 47de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarprivate: 48de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar // We keep track of the number of times a count (block count or samples) 49de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar // appears in the profile. The map is kept sorted in the descending order of 50de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar // counts. 51de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar std::map<uint64_t, uint32_t, std::greater<uint64_t>> CountFrequencies; 52de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar std::vector<uint32_t> DetailedSummaryCutoffs; 53de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 54de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarprotected: 55de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar SummaryEntryVector DetailedSummary; 56de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar ProfileSummaryBuilder(std::vector<uint32_t> Cutoffs) 57de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar : DetailedSummaryCutoffs(std::move(Cutoffs)), TotalCount(0), MaxCount(0), 58de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar MaxFunctionCount(0), NumCounts(0), NumFunctions(0) {} 59de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar inline void addCount(uint64_t Count); 60de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar ~ProfileSummaryBuilder() = default; 61de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar void computeDetailedSummary(); 62de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar uint64_t TotalCount, MaxCount, MaxFunctionCount; 63de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar uint32_t NumCounts, NumFunctions; 64de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 65de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarpublic: 66de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar /// \brief A vector of useful cutoff values for detailed summary. 67de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar static const ArrayRef<uint32_t> DefaultCutoffs; 68de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}; 69de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 70de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarclass InstrProfSummaryBuilder final : public ProfileSummaryBuilder { 71de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar uint64_t MaxInternalBlockCount; 72de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar inline void addEntryCount(uint64_t Count); 73de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar inline void addInternalCount(uint64_t Count); 74de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 75de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarpublic: 76de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar InstrProfSummaryBuilder(std::vector<uint32_t> Cutoffs) 77de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar : ProfileSummaryBuilder(std::move(Cutoffs)), MaxInternalBlockCount(0) {} 78de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar void addRecord(const InstrProfRecord &); 79de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar std::unique_ptr<ProfileSummary> getSummary(); 80de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}; 81de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 82de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarclass SampleProfileSummaryBuilder final : public ProfileSummaryBuilder { 83de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 84de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarpublic: 85de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar void addRecord(const sampleprof::FunctionSamples &FS); 86de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar SampleProfileSummaryBuilder(std::vector<uint32_t> Cutoffs) 87de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar : ProfileSummaryBuilder(std::move(Cutoffs)) {} 88de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar std::unique_ptr<ProfileSummary> getSummary(); 89de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}; 90de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 91de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar// This is called when a count is seen in the profile. 92de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarvoid ProfileSummaryBuilder::addCount(uint64_t Count) { 93de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar TotalCount += Count; 94de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar if (Count > MaxCount) 95de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar MaxCount = Count; 96de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar NumCounts++; 97de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar CountFrequencies[Count]++; 98de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar} 99de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 100de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 101de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar} // end namespace llvm 102de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#endif 103