InstrProfWriter.h revision de2d8694e25a814696358e95141f4b1aa4d8847e
1//=-- InstrProfWriter.h - Instrumented profiling writer -----------*- 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 support for writing profiling data for instrumentation
11// based PGO and coverage.
12//
13//===----------------------------------------------------------------------===//
14
15#ifndef LLVM_PROFILEDATA_INSTRPROFWRITER_H
16#define LLVM_PROFILEDATA_INSTRPROFWRITER_H
17
18#include "llvm/ADT/DenseMap.h"
19#include "llvm/ProfileData/InstrProf.h"
20#include "llvm/Support/DataTypes.h"
21#include "llvm/Support/MemoryBuffer.h"
22#include "llvm/Support/raw_ostream.h"
23
24namespace llvm {
25
26/// Writer for instrumentation based profile data.
27class ProfOStream;
28class InstrProfRecordWriterTrait;
29
30class InstrProfWriter {
31public:
32  typedef SmallDenseMap<uint64_t, InstrProfRecord, 1> ProfilingData;
33  enum ProfKind { PF_Unknown = 0, PF_FE, PF_IRLevel };
34
35private:
36  bool Sparse;
37  StringMap<ProfilingData> FunctionData;
38  ProfKind ProfileKind;
39  // Use raw pointer here for the incomplete type object.
40  InstrProfRecordWriterTrait *InfoObj;
41
42public:
43  InstrProfWriter(bool Sparse = false);
44  ~InstrProfWriter();
45
46  /// Add function counts for the given function. If there are already counts
47  /// for this function and the hash and number of counts match, each counter is
48  /// summed. Optionally scale counts by \p Weight.
49  Error addRecord(InstrProfRecord &&I, uint64_t Weight = 1);
50  /// Write the profile to \c OS
51  void write(raw_fd_ostream &OS);
52  /// Write the profile in text format to \c OS
53  void writeText(raw_fd_ostream &OS);
54  /// Write \c Record in text format to \c OS
55  static void writeRecordInText(const InstrProfRecord &Record,
56                                InstrProfSymtab &Symtab, raw_fd_ostream &OS);
57  /// Write the profile, returning the raw data. For testing.
58  std::unique_ptr<MemoryBuffer> writeBuffer();
59
60  /// Set the ProfileKind. Report error if mixing FE and IR level profiles.
61  Error setIsIRLevelProfile(bool IsIRLevel) {
62    if (ProfileKind == PF_Unknown) {
63      ProfileKind = IsIRLevel ? PF_IRLevel: PF_FE;
64      return Error::success();
65    }
66    return (IsIRLevel == (ProfileKind == PF_IRLevel))
67               ? Error::success()
68               : make_error<InstrProfError>(
69                     instrprof_error::unsupported_version);
70  }
71
72  // Internal interface for testing purpose only.
73  void setValueProfDataEndianness(support::endianness Endianness);
74  void setOutputSparse(bool Sparse);
75
76private:
77  bool shouldEncodeData(const ProfilingData &PD);
78  void writeImpl(ProfOStream &OS);
79};
80
81} // end namespace llvm
82
83#endif
84