blob: 74dc839ff049c5d6c89d10c66e66ce6c4e55b7ec [file] [log] [blame]
Andrew Scull5e1ddfa2018-08-14 10:06:54 +01001//===- SampleProfWriter.h - Write LLVM sample profile data ------*- C++ -*-===//
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 writing sample profiles.
11//
12//===----------------------------------------------------------------------===//
13#ifndef LLVM_PROFILEDATA_SAMPLEPROFWRITER_H
14#define LLVM_PROFILEDATA_SAMPLEPROFWRITER_H
15
16#include "llvm/ADT/MapVector.h"
17#include "llvm/ADT/StringMap.h"
18#include "llvm/ADT/StringRef.h"
19#include "llvm/IR/ProfileSummary.h"
20#include "llvm/ProfileData/SampleProf.h"
21#include "llvm/Support/ErrorOr.h"
22#include "llvm/Support/raw_ostream.h"
23#include <algorithm>
24#include <cstdint>
25#include <memory>
Andrew Scullcdfcccc2018-10-05 20:58:37 +010026#include <set>
Andrew Scull5e1ddfa2018-08-14 10:06:54 +010027#include <system_error>
28
29namespace llvm {
30namespace sampleprof {
31
Andrew Scullcdfcccc2018-10-05 20:58:37 +010032/// Sample-based profile writer. Base class.
Andrew Scull5e1ddfa2018-08-14 10:06:54 +010033class SampleProfileWriter {
34public:
35 virtual ~SampleProfileWriter() = default;
36
37 /// Write sample profiles in \p S.
38 ///
39 /// \returns status code of the file update operation.
40 virtual std::error_code write(const FunctionSamples &S) = 0;
41
42 /// Write all the sample profiles in the given map of samples.
43 ///
44 /// \returns status code of the file update operation.
45 std::error_code write(const StringMap<FunctionSamples> &ProfileMap);
46
47 raw_ostream &getOutputStream() { return *OutputStream; }
48
49 /// Profile writer factory.
50 ///
51 /// Create a new file writer based on the value of \p Format.
52 static ErrorOr<std::unique_ptr<SampleProfileWriter>>
53 create(StringRef Filename, SampleProfileFormat Format);
54
55 /// Create a new stream writer based on the value of \p Format.
56 /// For testing.
57 static ErrorOr<std::unique_ptr<SampleProfileWriter>>
58 create(std::unique_ptr<raw_ostream> &OS, SampleProfileFormat Format);
59
60protected:
61 SampleProfileWriter(std::unique_ptr<raw_ostream> &OS)
62 : OutputStream(std::move(OS)) {}
63
Andrew Scullcdfcccc2018-10-05 20:58:37 +010064 /// Write a file header for the profile file.
Andrew Scull5e1ddfa2018-08-14 10:06:54 +010065 virtual std::error_code
66 writeHeader(const StringMap<FunctionSamples> &ProfileMap) = 0;
67
Andrew Scullcdfcccc2018-10-05 20:58:37 +010068 /// Output stream where to emit the profile to.
Andrew Scull5e1ddfa2018-08-14 10:06:54 +010069 std::unique_ptr<raw_ostream> OutputStream;
70
Andrew Scullcdfcccc2018-10-05 20:58:37 +010071 /// Profile summary.
Andrew Scull5e1ddfa2018-08-14 10:06:54 +010072 std::unique_ptr<ProfileSummary> Summary;
73
Andrew Scullcdfcccc2018-10-05 20:58:37 +010074 /// Compute summary for this profile.
Andrew Scull5e1ddfa2018-08-14 10:06:54 +010075 void computeSummary(const StringMap<FunctionSamples> &ProfileMap);
76};
77
Andrew Scullcdfcccc2018-10-05 20:58:37 +010078/// Sample-based profile writer (text format).
Andrew Scull5e1ddfa2018-08-14 10:06:54 +010079class SampleProfileWriterText : public SampleProfileWriter {
80public:
81 std::error_code write(const FunctionSamples &S) override;
82
83protected:
84 SampleProfileWriterText(std::unique_ptr<raw_ostream> &OS)
85 : SampleProfileWriter(OS), Indent(0) {}
86
87 std::error_code
88 writeHeader(const StringMap<FunctionSamples> &ProfileMap) override {
89 return sampleprof_error::success;
90 }
91
92private:
93 /// Indent level to use when writing.
94 ///
95 /// This is used when printing inlined callees.
96 unsigned Indent;
97
98 friend ErrorOr<std::unique_ptr<SampleProfileWriter>>
99 SampleProfileWriter::create(std::unique_ptr<raw_ostream> &OS,
100 SampleProfileFormat Format);
101};
102
Andrew Scullcdfcccc2018-10-05 20:58:37 +0100103/// Sample-based profile writer (binary format).
Andrew Scull5e1ddfa2018-08-14 10:06:54 +0100104class SampleProfileWriterBinary : public SampleProfileWriter {
105public:
106 std::error_code write(const FunctionSamples &S) override;
Andrew Scull5e1ddfa2018-08-14 10:06:54 +0100107 SampleProfileWriterBinary(std::unique_ptr<raw_ostream> &OS)
108 : SampleProfileWriter(OS) {}
109
Andrew Scullcdfcccc2018-10-05 20:58:37 +0100110protected:
111 virtual std::error_code writeNameTable() = 0;
112 virtual std::error_code writeMagicIdent() = 0;
113 std::error_code writeHeader(const StringMap<FunctionSamples> &ProfileMap) override;
Andrew Scull5e1ddfa2018-08-14 10:06:54 +0100114 std::error_code writeSummary();
115 std::error_code writeNameIdx(StringRef FName);
116 std::error_code writeBody(const FunctionSamples &S);
Andrew Scullcdfcccc2018-10-05 20:58:37 +0100117 inline void stablizeNameTable(std::set<StringRef> &V);
118
119 MapVector<StringRef, uint32_t> NameTable;
Andrew Scull5e1ddfa2018-08-14 10:06:54 +0100120
121private:
122 void addName(StringRef FName);
123 void addNames(const FunctionSamples &S);
124
Andrew Scull5e1ddfa2018-08-14 10:06:54 +0100125 friend ErrorOr<std::unique_ptr<SampleProfileWriter>>
126 SampleProfileWriter::create(std::unique_ptr<raw_ostream> &OS,
127 SampleProfileFormat Format);
128};
129
Andrew Scullcdfcccc2018-10-05 20:58:37 +0100130class SampleProfileWriterRawBinary : public SampleProfileWriterBinary {
131 using SampleProfileWriterBinary::SampleProfileWriterBinary;
132
133protected:
134 virtual std::error_code writeNameTable() override;
135 virtual std::error_code writeMagicIdent() override;
136};
137
138class SampleProfileWriterCompactBinary : public SampleProfileWriterBinary {
139 using SampleProfileWriterBinary::SampleProfileWriterBinary;
140
141protected:
142 virtual std::error_code writeNameTable() override;
143 virtual std::error_code writeMagicIdent() override;
144};
145
Andrew Scull5e1ddfa2018-08-14 10:06:54 +0100146} // end namespace sampleprof
147} // end namespace llvm
148
149#endif // LLVM_PROFILEDATA_SAMPLEPROFWRITER_H