1//===- SampleProfWriter.h - Write 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 writing sample profiles.
11//
12//===----------------------------------------------------------------------===//
13#ifndef LLVM_PROFILEDATA_SAMPLEPROFWRITER_H
14#define LLVM_PROFILEDATA_SAMPLEPROFWRITER_H
15
16#include "llvm/ADT/StringRef.h"
17#include "llvm/IR/Function.h"
18#include "llvm/IR/Module.h"
19#include "llvm/ProfileData/SampleProf.h"
20#include "llvm/Support/ErrorOr.h"
21#include "llvm/Support/FileSystem.h"
22#include "llvm/Support/raw_ostream.h"
23
24namespace llvm {
25
26namespace sampleprof {
27
28enum SampleProfileFormat { SPF_None = 0, SPF_Text, SPF_Binary, SPF_GCC };
29
30/// \brief Sample-based profile writer. Base class.
31class SampleProfileWriter {
32public:
33  SampleProfileWriter(StringRef Filename, std::error_code &EC,
34                      sys::fs::OpenFlags Flags)
35      : OS(Filename, EC, Flags) {}
36  virtual ~SampleProfileWriter() {}
37
38  /// \brief Write sample profiles in \p S for function \p FName.
39  ///
40  /// \returns true if the file was updated successfully. False, otherwise.
41  virtual bool write(StringRef FName, const FunctionSamples &S) = 0;
42
43  /// \brief Write sample profiles in \p S for function \p F.
44  bool write(const Function &F, const FunctionSamples &S) {
45    return write(F.getName(), S);
46  }
47
48  /// \brief Write all the sample profiles for all the functions in \p M.
49  ///
50  /// \returns true if the file was updated successfully. False, otherwise.
51  bool write(const Module &M, StringMap<FunctionSamples> &P) {
52    for (const auto &F : M) {
53      StringRef Name = F.getName();
54      if (!write(Name, P[Name]))
55        return false;
56    }
57    return true;
58  }
59
60  /// \brief Write all the sample profiles in the given map of samples.
61  ///
62  /// \returns true if the file was updated successfully. False, otherwise.
63  bool write(StringMap<FunctionSamples> &ProfileMap) {
64    for (auto &I : ProfileMap) {
65      StringRef FName = I.first();
66      FunctionSamples &Profile = I.second;
67      if (!write(FName, Profile))
68        return false;
69    }
70    return true;
71  }
72
73  /// \brief Profile writer factory. Create a new writer based on the value of
74  /// \p Format.
75  static ErrorOr<std::unique_ptr<SampleProfileWriter>>
76  create(StringRef Filename, SampleProfileFormat Format);
77
78protected:
79  /// \brief Output stream where to emit the profile to.
80  raw_fd_ostream OS;
81};
82
83/// \brief Sample-based profile writer (text format).
84class SampleProfileWriterText : public SampleProfileWriter {
85public:
86  SampleProfileWriterText(StringRef F, std::error_code &EC)
87      : SampleProfileWriter(F, EC, sys::fs::F_Text) {}
88
89  bool write(StringRef FName, const FunctionSamples &S) override;
90  bool write(const Module &M, StringMap<FunctionSamples> &P) {
91    return SampleProfileWriter::write(M, P);
92  }
93};
94
95/// \brief Sample-based profile writer (binary format).
96class SampleProfileWriterBinary : public SampleProfileWriter {
97public:
98  SampleProfileWriterBinary(StringRef F, std::error_code &EC);
99
100  bool write(StringRef F, const FunctionSamples &S) override;
101  bool write(const Module &M, StringMap<FunctionSamples> &P) {
102    return SampleProfileWriter::write(M, P);
103  }
104};
105
106} // End namespace sampleprof
107
108} // End namespace llvm
109
110#endif // LLVM_PROFILEDATA_SAMPLEPROFWRITER_H
111