1c572e92cSDiego Novillo //=-- SampleProf.cpp - Sample profiling format support --------------------===// 2c572e92cSDiego Novillo // 3c572e92cSDiego Novillo // The LLVM Compiler Infrastructure 4c572e92cSDiego Novillo // 5c572e92cSDiego Novillo // This file is distributed under the University of Illinois Open Source 6c572e92cSDiego Novillo // License. See LICENSE.TXT for details. 7c572e92cSDiego Novillo // 8c572e92cSDiego Novillo //===----------------------------------------------------------------------===// 9c572e92cSDiego Novillo // 10c572e92cSDiego Novillo // This file contains common definitions used in the reading and writing of 11c572e92cSDiego Novillo // sample profile data. 12c572e92cSDiego Novillo // 13c572e92cSDiego Novillo //===----------------------------------------------------------------------===// 14c572e92cSDiego Novillo 15c572e92cSDiego Novillo #include "llvm/ProfileData/SampleProf.h" 16c572e92cSDiego Novillo #include "llvm/Support/ErrorHandling.h" 17c572e92cSDiego Novillo #include "llvm/Support/ManagedStatic.h" 18c572e92cSDiego Novillo 194b6bdb53SDiego Novillo using namespace llvm::sampleprof; 20c572e92cSDiego Novillo using namespace llvm; 21c572e92cSDiego Novillo 22c572e92cSDiego Novillo namespace { 23c572e92cSDiego Novillo class SampleProfErrorCategoryType : public std::error_category { 24c572e92cSDiego Novillo const char *name() const LLVM_NOEXCEPT override { return "llvm.sampleprof"; } 25c572e92cSDiego Novillo std::string message(int IE) const override { 26c572e92cSDiego Novillo sampleprof_error E = static_cast<sampleprof_error>(IE); 27c572e92cSDiego Novillo switch (E) { 28c572e92cSDiego Novillo case sampleprof_error::success: 29c572e92cSDiego Novillo return "Success"; 30c572e92cSDiego Novillo case sampleprof_error::bad_magic: 314f823667SNathan Slingerland return "Invalid sample profile data (bad magic)"; 32c572e92cSDiego Novillo case sampleprof_error::unsupported_version: 334f823667SNathan Slingerland return "Unsupported sample profile format version"; 34c572e92cSDiego Novillo case sampleprof_error::too_large: 35c572e92cSDiego Novillo return "Too much profile data"; 36c572e92cSDiego Novillo case sampleprof_error::truncated: 37c572e92cSDiego Novillo return "Truncated profile data"; 38c572e92cSDiego Novillo case sampleprof_error::malformed: 394f823667SNathan Slingerland return "Malformed sample profile data"; 40d5336ae2SDiego Novillo case sampleprof_error::unrecognized_format: 414f823667SNathan Slingerland return "Unrecognized sample profile encoding format"; 42760c5a8fSDiego Novillo case sampleprof_error::unsupported_writing_format: 43760c5a8fSDiego Novillo return "Profile encoding format unsupported for writing operations"; 44760c5a8fSDiego Novillo case sampleprof_error::truncated_name_table: 45760c5a8fSDiego Novillo return "Truncated function name table"; 463376a787SDiego Novillo case sampleprof_error::not_implemented: 473376a787SDiego Novillo return "Unimplemented feature"; 48c572e92cSDiego Novillo } 49c572e92cSDiego Novillo llvm_unreachable("A value of sampleprof_error has no message."); 50c572e92cSDiego Novillo } 51c572e92cSDiego Novillo }; 52f00654e3SAlexander Kornienko } 53c572e92cSDiego Novillo 54c572e92cSDiego Novillo static ManagedStatic<SampleProfErrorCategoryType> ErrorCategory; 55c572e92cSDiego Novillo 56c572e92cSDiego Novillo const std::error_category &llvm::sampleprof_category() { 57c572e92cSDiego Novillo return *ErrorCategory; 58c572e92cSDiego Novillo } 594b6bdb53SDiego Novillo 60ba920be4SDiego Novillo void LineLocation::print(raw_ostream &OS) const { 61ba920be4SDiego Novillo OS << LineOffset; 62ba920be4SDiego Novillo if (Discriminator > 0) 63ba920be4SDiego Novillo OS << "." << Discriminator; 64ba920be4SDiego Novillo } 65ba920be4SDiego Novillo 66ba920be4SDiego Novillo raw_ostream &llvm::sampleprof::operator<<(raw_ostream &OS, 67ba920be4SDiego Novillo const LineLocation &Loc) { 68ba920be4SDiego Novillo Loc.print(OS); 69ba920be4SDiego Novillo return OS; 70ba920be4SDiego Novillo } 71ba920be4SDiego Novillo 72ba920be4SDiego Novillo void LineLocation::dump() const { print(dbgs()); } 73ba920be4SDiego Novillo 74ba920be4SDiego Novillo void CallsiteLocation::print(raw_ostream &OS) const { 75ba920be4SDiego Novillo LineLocation::print(OS); 76ba920be4SDiego Novillo OS << ": inlined callee: " << CalleeName; 77ba920be4SDiego Novillo } 78ba920be4SDiego Novillo 79ba920be4SDiego Novillo void CallsiteLocation::dump() const { print(dbgs()); } 80ba920be4SDiego Novillo 81ba920be4SDiego Novillo inline raw_ostream &llvm::sampleprof::operator<<(raw_ostream &OS, 82ba920be4SDiego Novillo const CallsiteLocation &Loc) { 83ba920be4SDiego Novillo Loc.print(OS); 84ba920be4SDiego Novillo return OS; 85ba920be4SDiego Novillo } 86ba920be4SDiego Novillo 878e415a82SDiego Novillo /// \brief Print the sample record to the stream \p OS indented by \p Indent. 888e415a82SDiego Novillo void SampleRecord::print(raw_ostream &OS, unsigned Indent) const { 898e415a82SDiego Novillo OS << NumSamples; 908e415a82SDiego Novillo if (hasCalls()) { 914b6bdb53SDiego Novillo OS << ", calls:"; 928e415a82SDiego Novillo for (const auto &I : getCallTargets()) 934b6bdb53SDiego Novillo OS << " " << I.first() << ":" << I.second; 944b6bdb53SDiego Novillo } 954b6bdb53SDiego Novillo OS << "\n"; 964b6bdb53SDiego Novillo } 978e415a82SDiego Novillo 98ba920be4SDiego Novillo void SampleRecord::dump() const { print(dbgs(), 0); } 99ba920be4SDiego Novillo 100ba920be4SDiego Novillo raw_ostream &llvm::sampleprof::operator<<(raw_ostream &OS, 101ba920be4SDiego Novillo const SampleRecord &Sample) { 102ba920be4SDiego Novillo Sample.print(OS, 0); 103ba920be4SDiego Novillo return OS; 104ba920be4SDiego Novillo } 105ba920be4SDiego Novillo 1068e415a82SDiego Novillo /// \brief Print the samples collected for a function on stream \p OS. 1078e415a82SDiego Novillo void FunctionSamples::print(raw_ostream &OS, unsigned Indent) const { 1088e415a82SDiego Novillo OS << TotalSamples << ", " << TotalHeadSamples << ", " << BodySamples.size() 1098e415a82SDiego Novillo << " sampled lines\n"; 1108e415a82SDiego Novillo 111*ef548d29SDiego Novillo SampleSorter<LineLocation, SampleRecord> SortedBodySamples(BodySamples); 112*ef548d29SDiego Novillo for (const auto &SI : SortedBodySamples.get()) { 1134b6bdb53SDiego Novillo OS.indent(Indent); 114*ef548d29SDiego Novillo OS << SI->first << ": " << SI->second; 1158e415a82SDiego Novillo } 1168e415a82SDiego Novillo 117*ef548d29SDiego Novillo SampleSorter<CallsiteLocation, FunctionSamples> SortedCallsiteSamples( 118*ef548d29SDiego Novillo CallsiteSamples); 119*ef548d29SDiego Novillo for (const auto &CS : SortedCallsiteSamples.get()) { 1208e415a82SDiego Novillo OS.indent(Indent); 121*ef548d29SDiego Novillo OS << CS->first << ": "; 122*ef548d29SDiego Novillo CS->second.print(OS, Indent + 2); 1234b6bdb53SDiego Novillo } 1244b6bdb53SDiego Novillo } 125ba920be4SDiego Novillo 126ba920be4SDiego Novillo raw_ostream &llvm::sampleprof::operator<<(raw_ostream &OS, 127ba920be4SDiego Novillo const FunctionSamples &FS) { 128ba920be4SDiego Novillo FS.print(OS); 129ba920be4SDiego Novillo return OS; 130ba920be4SDiego Novillo } 131ba920be4SDiego Novillo 132ba920be4SDiego Novillo void FunctionSamples::dump(void) const { print(dbgs(), 0); } 133