]> git.proxmox.com Git - rustc.git/blame - src/llvm/include/llvm/ProfileData/SampleProfReader.h
Imported Upstream version 1.0.0+dfsg1
[rustc.git] / src / llvm / include / llvm / ProfileData / SampleProfReader.h
CommitLineData
1a4d82fc
JJ
1//===- SampleProfReader.h - Read LLVM sample profile data -----------------===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file contains definitions needed for reading sample profiles.
11//
12//===----------------------------------------------------------------------===//
13#ifndef LLVM_PROFILEDATA_SAMPLEPROFREADER_H
14#define LLVM_PROFILEDATA_SAMPLEPROFREADER_H
15
16#include "llvm/ADT/DenseMap.h"
1a4d82fc
JJ
17#include "llvm/ADT/StringMap.h"
18#include "llvm/ADT/StringRef.h"
19#include "llvm/ADT/Twine.h"
85aaf69f
SL
20#include "llvm/IR/DiagnosticInfo.h"
21#include "llvm/IR/Function.h"
22#include "llvm/IR/LLVMContext.h"
23#include "llvm/ProfileData/SampleProf.h"
24#include "llvm/Support/Debug.h"
1a4d82fc 25#include "llvm/Support/ErrorHandling.h"
85aaf69f
SL
26#include "llvm/Support/ErrorOr.h"
27#include "llvm/Support/MemoryBuffer.h"
1a4d82fc
JJ
28#include "llvm/Support/raw_ostream.h"
29
1a4d82fc 30namespace llvm {
1a4d82fc
JJ
31
32namespace sampleprof {
33
1a4d82fc
JJ
34/// \brief Sample-based profile reader.
35///
36/// Each profile contains sample counts for all the functions
37/// executed. Inside each function, statements are annotated with the
38/// collected samples on all the instructions associated with that
39/// statement.
40///
41/// For this to produce meaningful data, the program needs to be
42/// compiled with some debug information (at minimum, line numbers:
43/// -gline-tables-only). Otherwise, it will be impossible to match IR
44/// instructions to the line numbers collected by the profiler.
45///
46/// From the profile file, we are interested in collecting the
47/// following information:
48///
49/// * A list of functions included in the profile (mangled names).
50///
51/// * For each function F:
52/// 1. The total number of samples collected in F.
53///
54/// 2. The samples collected at each line in F. To provide some
55/// protection against source code shuffling, line numbers should
56/// be relative to the start of the function.
57///
85aaf69f
SL
58/// The reader supports two file formats: text and binary. The text format
59/// is useful for debugging and testing, while the binary format is more
1a4d82fc
JJ
60/// compact. They can both be used interchangeably.
61class SampleProfileReader {
62public:
85aaf69f
SL
63 SampleProfileReader(std::unique_ptr<MemoryBuffer> B, LLVMContext &C)
64 : Profiles(0), Ctx(C), Buffer(std::move(B)) {}
65
66 virtual ~SampleProfileReader() {}
1a4d82fc 67
85aaf69f
SL
68 /// \brief Read and validate the file header.
69 virtual std::error_code readHeader() = 0;
1a4d82fc 70
85aaf69f
SL
71 /// \brief Read sample profiles from the associated file.
72 virtual std::error_code read() = 0;
1a4d82fc
JJ
73
74 /// \brief Print the profile for \p FName on stream \p OS.
85aaf69f 75 void dumpFunctionProfile(StringRef FName, raw_ostream &OS = dbgs());
1a4d82fc 76
85aaf69f
SL
77 /// \brief Print all the profiles on stream \p OS.
78 void dump(raw_ostream &OS = dbgs());
1a4d82fc
JJ
79
80 /// \brief Return the samples collected for function \p F.
81 FunctionSamples *getSamplesFor(const Function &F) {
82 return &Profiles[F.getName()];
83 }
84
85aaf69f
SL
85 /// \brief Return all the profiles.
86 StringMap<FunctionSamples> &getProfiles() { return Profiles; }
87
1a4d82fc
JJ
88 /// \brief Report a parse error message.
89 void reportParseError(int64_t LineNumber, Twine Msg) const {
85aaf69f
SL
90 Ctx.diagnose(DiagnosticInfoSampleProfile(Buffer->getBufferIdentifier(),
91 LineNumber, Msg));
1a4d82fc
JJ
92 }
93
85aaf69f
SL
94 /// \brief Create a sample profile reader appropriate to the file format.
95 static ErrorOr<std::unique_ptr<SampleProfileReader>>
96 create(StringRef Filename, LLVMContext &C);
1a4d82fc 97
85aaf69f 98protected:
1a4d82fc
JJ
99 /// \brief Map every function to its associated profile.
100 ///
101 /// The profile of every function executed at runtime is collected
102 /// in the structure FunctionSamples. This maps function objects
103 /// to their corresponding profiles.
104 StringMap<FunctionSamples> Profiles;
105
85aaf69f
SL
106 /// \brief LLVM context used to emit diagnostics.
107 LLVMContext &Ctx;
1a4d82fc 108
85aaf69f
SL
109 /// \brief Memory buffer holding the profile file.
110 std::unique_ptr<MemoryBuffer> Buffer;
111};
112
113class SampleProfileReaderText : public SampleProfileReader {
114public:
115 SampleProfileReaderText(std::unique_ptr<MemoryBuffer> B, LLVMContext &C)
116 : SampleProfileReader(std::move(B), C) {}
117
118 /// \brief Read and validate the file header.
119 std::error_code readHeader() override { return sampleprof_error::success; }
120
121 /// \brief Read sample profiles from the associated file.
122 std::error_code read() override;
123};
124
125class SampleProfileReaderBinary : public SampleProfileReader {
126public:
127 SampleProfileReaderBinary(std::unique_ptr<MemoryBuffer> B, LLVMContext &C)
128 : SampleProfileReader(std::move(B), C), Data(nullptr), End(nullptr) {}
129
130 /// \brief Read and validate the file header.
131 std::error_code readHeader() override;
132
133 /// \brief Read sample profiles from the associated file.
134 std::error_code read() override;
135
136 /// \brief Return true if \p Buffer is in the format supported by this class.
137 static bool hasFormat(const MemoryBuffer &Buffer);
138
139protected:
140 /// \brief Read a numeric value of type T from the profile.
141 ///
142 /// If an error occurs during decoding, a diagnostic message is emitted and
143 /// EC is set.
144 ///
145 /// \returns the read value.
146 template <typename T> ErrorOr<T> readNumber();
147
148 /// \brief Read a string from the profile.
149 ///
150 /// If an error occurs during decoding, a diagnostic message is emitted and
151 /// EC is set.
152 ///
153 /// \returns the read value.
154 ErrorOr<StringRef> readString();
155
156 /// \brief Return true if we've reached the end of file.
157 bool at_eof() const { return Data >= End; }
158
159 /// \brief Points to the current location in the buffer.
160 const uint8_t *Data;
161
162 /// \brief Points to the end of the buffer.
163 const uint8_t *End;
1a4d82fc
JJ
164};
165
166} // End namespace sampleprof
167
85aaf69f
SL
168} // End namespace llvm
169
1a4d82fc 170#endif // LLVM_PROFILEDATA_SAMPLEPROFREADER_H