LLVM  9.0.0svn
SampleProf.cpp
Go to the documentation of this file.
1 //=-- SampleProf.cpp - Sample profiling format support --------------------===//
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 common definitions used in the reading and writing of
10 // sample profile data.
11 //
12 //===----------------------------------------------------------------------===//
13 
15 #include "llvm/Config/llvm-config.h"
17 #include "llvm/Support/Compiler.h"
18 #include "llvm/Support/Debug.h"
22 #include <string>
23 #include <system_error>
24 
25 using namespace llvm;
26 using namespace sampleprof;
27 
28 namespace llvm {
29 namespace sampleprof {
33 } // namespace sampleprof
34 } // namespace llvm
35 
36 namespace {
37 
38 // FIXME: This class is only here to support the transition to llvm::Error. It
39 // will be removed once this transition is complete. Clients should prefer to
40 // deal with the Error value directly, rather than converting to error_code.
41 class SampleProfErrorCategoryType : public std::error_category {
42  const char *name() const noexcept override { return "llvm.sampleprof"; }
43 
44  std::string message(int IE) const override {
45  sampleprof_error E = static_cast<sampleprof_error>(IE);
46  switch (E) {
48  return "Success";
50  return "Invalid sample profile data (bad magic)";
52  return "Unsupported sample profile format version";
54  return "Too much profile data";
56  return "Truncated profile data";
58  return "Malformed sample profile data";
60  return "Unrecognized sample profile encoding format";
62  return "Profile encoding format unsupported for writing operations";
64  return "Truncated function name table";
66  return "Unimplemented feature";
68  return "Counter overflow";
70  return "Ostream does not support seek";
71  }
72  llvm_unreachable("A value of sampleprof_error has no message.");
73  }
74 };
75 
76 } // end anonymous namespace
77 
79 
81  return *ErrorCategory;
82 }
83 
85  OS << LineOffset;
86  if (Discriminator > 0)
87  OS << "." << Discriminator;
88 }
89 
91  const LineLocation &Loc) {
92  Loc.print(OS);
93  return OS;
94 }
95 
96 #if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
98 #endif
99 
100 /// Print the sample record to the stream \p OS indented by \p Indent.
101 void SampleRecord::print(raw_ostream &OS, unsigned Indent) const {
102  OS << NumSamples;
103  if (hasCalls()) {
104  OS << ", calls:";
105  for (const auto &I : getCallTargets())
106  OS << " " << I.first() << ":" << I.second;
107  }
108  OS << "\n";
109 }
110 
111 #if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
113 #endif
114 
116  const SampleRecord &Sample) {
117  Sample.print(OS, 0);
118  return OS;
119 }
120 
121 /// Print the samples collected for a function on stream \p OS.
122 void FunctionSamples::print(raw_ostream &OS, unsigned Indent) const {
123  OS << TotalSamples << ", " << TotalHeadSamples << ", " << BodySamples.size()
124  << " sampled lines\n";
125 
126  OS.indent(Indent);
127  if (!BodySamples.empty()) {
128  OS << "Samples collected in the function's body {\n";
129  SampleSorter<LineLocation, SampleRecord> SortedBodySamples(BodySamples);
130  for (const auto &SI : SortedBodySamples.get()) {
131  OS.indent(Indent + 2);
132  OS << SI->first << ": " << SI->second;
133  }
134  OS.indent(Indent);
135  OS << "}\n";
136  } else {
137  OS << "No samples collected in the function's body\n";
138  }
139 
140  OS.indent(Indent);
141  if (!CallsiteSamples.empty()) {
142  OS << "Samples collected in inlined callsites {\n";
144  CallsiteSamples);
145  for (const auto &CS : SortedCallsiteSamples.get()) {
146  for (const auto &FS : CS->second) {
147  OS.indent(Indent + 2);
148  OS << CS->first << ": inlined callee: " << FS.second.getName() << ": ";
149  FS.second.print(OS, Indent + 4);
150  }
151  }
152  OS << "}\n";
153  } else {
154  OS << "No inlined callsites in this function\n";
155  }
156 }
157 
159  const FunctionSamples &FS) {
160  FS.print(OS);
161  return OS;
162 }
163 
165  return (DIL->getLine() - DIL->getScope()->getSubprogram()->getLine()) &
166  0xffff;
167 }
168 
169 const FunctionSamples *
171  assert(DIL);
173 
174  const DILocation *PrevDIL = DIL;
175  for (DIL = DIL->getInlinedAt(); DIL; DIL = DIL->getInlinedAt()) {
176  S.push_back(std::make_pair(
178  PrevDIL->getScope()->getSubprogram()->getLinkageName()));
179  PrevDIL = DIL;
180  }
181  if (S.size() == 0)
182  return this;
183  const FunctionSamples *FS = this;
184  for (int i = S.size() - 1; i >= 0 && FS != nullptr; i--) {
185  FS = FS->findFunctionSamplesAt(S[i].first, S[i].second);
186  }
187  return FS;
188 }
189 
190 #if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
192 #endif
raw_ostream & operator<<(raw_ostream &OS, const LineLocation &Loc)
Definition: SampleProf.cpp:90
This class represents lattice values for constants.
Definition: AllocatorList.h:23
#define LLVM_DUMP_METHOD
Mark debug helper function definitions like dump() that should not be stripped from debug builds...
Definition: Compiler.h:473
A Module instance is used to store all the information related to an LLVM module. ...
Definition: Module.h:65
raw_ostream & indent(unsigned NumSpaces)
indent - Insert &#39;NumSpaces&#39; spaces.
unsigned second
static SampleProfileFormat Format
Definition: SampleProf.h:474
Representation of the samples collected for a function.
Definition: SampleProf.h:216
void print(raw_ostream &OS=dbgs(), unsigned Indent=0) const
Print the samples collected for a function on stream OS.
Definition: SampleProf.cpp:122
static DenseMap< uint64_t, StringRef > GUIDToFuncNameMap
GUIDToFuncNameMap saves the mapping from GUID to the symbol name, for all the function symbols define...
Definition: SampleProf.h:477
void print(raw_ostream &OS, unsigned Indent) const
Print the sample record to the stream OS indented by Indent.
Definition: SampleProf.cpp:101
Representation of a single sample record.
Definition: SampleProf.h:144
static Error getOffset(const SymbolRef &Sym, SectionRef Sec, uint64_t &Result)
const SamplesWithLocList & get() const
Definition: SampleProf.h:580
Debug location.
Sort a LocationT->SampleT map by LocationT.
Definition: SampleProf.h:567
const FunctionSamples * findFunctionSamples(const DILocation *DIL) const
Get the FunctionSamples of the inline instance where DIL originates from.
Definition: SampleProf.cpp:170
sampleprof_error
Definition: SampleProf.h:40
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
static ManagedStatic< _object_error_category > error_category
Definition: Error.cpp:74
static void print(raw_ostream &Out, object::Archive::Kind Kind, T Val)
size_t size() const
Definition: SmallVector.h:52
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
unsigned first
const FunctionSamples * findFunctionSamplesAt(const LineLocation &Loc, StringRef CalleeName) const
Returns a pointer to FunctionSamples at the given callsite location Loc with callee CalleeName...
Definition: SampleProf.h:294
This is a &#39;vector&#39; (really, a variable-sized array), optimized for the case when the array is small...
Definition: SmallVector.h:837
static unsigned getOffset(const DILocation *DIL)
Returns the line offset to the start line of the subprogram.
Definition: SampleProf.cpp:164
raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
Definition: Debug.cpp:132
const std::error_category & sampleprof_category()
Definition: SampleProf.cpp:80
void print(raw_ostream &OS) const
Definition: SampleProf.cpp:84
static ManagedStatic< SampleProfErrorCategoryType > ErrorCategory
Definition: SampleProf.cpp:78
unsigned getBaseDiscriminator() const
Returns the base discriminator stored in the discriminator.
Represents the relative location of an instruction.
Definition: SampleProf.h:117
#define I(x, y, z)
Definition: MD5.cpp:58
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
aarch64 promote const
static const char * name
This class implements an extremely fast bulk output stream that can only output to a stream...
Definition: raw_ostream.h:45
ManagedStatic - This transparently changes the behavior of global statics to be lazily constructed on...
Definition: ManagedStatic.h:83