LLVM  9.0.0svn
InstrProfWriter.h
Go to the documentation of this file.
1 //===- InstrProfWriter.h - Instrumented profiling writer --------*- C++ -*-===//
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 support for writing profiling data for instrumentation
10 // based PGO and coverage.
11 //
12 //===----------------------------------------------------------------------===//
13 
14 #ifndef LLVM_PROFILEDATA_INSTRPROFWRITER_H
15 #define LLVM_PROFILEDATA_INSTRPROFWRITER_H
16 
17 #include "llvm/ADT/DenseMap.h"
18 #include "llvm/ADT/StringMap.h"
20 #include "llvm/Support/Endian.h"
21 #include "llvm/Support/Error.h"
23 #include <cstdint>
24 #include <memory>
25 
26 namespace llvm {
27 
28 /// Writer for instrumentation based profile data.
29 class InstrProfRecordWriterTrait;
30 class ProfOStream;
31 class raw_fd_ostream;
32 
34 public:
37 
38 private:
39  bool Sparse;
40  StringMap<ProfilingData> FunctionData;
41  ProfKind ProfileKind = PF_Unknown;
42  // Use raw pointer here for the incomplete type object.
44 
45 public:
46  InstrProfWriter(bool Sparse = false);
48 
49  /// Add function counts for the given function. If there are already counts
50  /// for this function and the hash and number of counts match, each counter is
51  /// summed. Optionally scale counts by \p Weight.
52  void addRecord(NamedInstrProfRecord &&I, uint64_t Weight,
53  function_ref<void(Error)> Warn);
55  addRecord(std::move(I), 1, Warn);
56  }
57 
58  /// Merge existing function counts from the given writer.
60  function_ref<void(Error)> Warn);
61 
62  /// Write the profile to \c OS
63  void write(raw_fd_ostream &OS);
64 
65  /// Write the profile in text format to \c OS
67 
68  /// Write \c Record in text format to \c OS
69  static void writeRecordInText(StringRef Name, uint64_t Hash,
70  const InstrProfRecord &Counters,
71  InstrProfSymtab &Symtab, raw_fd_ostream &OS);
72 
73  /// Write the profile, returning the raw data. For testing.
74  std::unique_ptr<MemoryBuffer> writeBuffer();
75 
76  /// Set the ProfileKind. Report error if mixing FE and IR level profiles.
77  Error setIsIRLevelProfile(bool IsIRLevel) {
78  if (ProfileKind == PF_Unknown) {
79  ProfileKind = IsIRLevel ? PF_IRLevel: PF_FE;
80  return Error::success();
81  }
82  return (IsIRLevel == (ProfileKind == PF_IRLevel))
83  ? Error::success()
84  : make_error<InstrProfError>(
86  }
87 
88  // Internal interface for testing purpose only.
90  void setOutputSparse(bool Sparse);
91 
92 private:
93  void addRecord(StringRef Name, uint64_t Hash, InstrProfRecord &&I,
94  uint64_t Weight, function_ref<void(Error)> Warn);
95  bool shouldEncodeData(const ProfilingData &PD);
96  void writeImpl(ProfOStream &OS);
97 };
98 
99 } // end namespace llvm
100 
101 #endif // LLVM_PROFILEDATA_INSTRPROFWRITER_H
void setValueProfDataEndianness(support::endianness Endianness)
A symbol table used for function PGO name look-up with keys (such as pointers, md5hash values) to the...
Definition: InstrProf.h:410
This class represents lattice values for constants.
Definition: AllocatorList.h:23
amdgpu Simplify well known AMD library false FunctionCallee Value const Twine & Name
InstrProfWriter(bool Sparse=false)
An efficient, type-erasing, non-owning reference to a callable.
Definition: STLExtras.h:116
constexpr support::endianness Endianness
The endianness of all multi-byte encoded values in MessagePack.
Definition: MsgPack.h:24
void addRecord(NamedInstrProfRecord &&I, uint64_t Weight, function_ref< void(Error)> Warn)
Add function counts for the given function.
void mergeRecordsFromWriter(InstrProfWriter &&IPW, function_ref< void(Error)> Warn)
Merge existing function counts from the given writer.
void setOutputSparse(bool Sparse)
static ErrorSuccess success()
Create a success value.
Definition: Error.h:326
StringMap - This is an unconventional map that is specialized for handling keys that are "strings"...
Definition: StringMap.h:219
Error setIsIRLevelProfile(bool IsIRLevel)
Set the ProfileKind. Report error if mixing FE and IR level profiles.
static void writeRecordInText(StringRef Name, uint64_t Hash, const InstrProfRecord &Counters, InstrProfSymtab &Symtab, raw_fd_ostream &OS)
Write Record in text format to OS.
A raw_ostream that writes to a file descriptor.
Definition: raw_ostream.h:365
Profiling information for a single function.
Definition: InstrProf.h:621
void addRecord(NamedInstrProfRecord &&I, function_ref< void(Error)> Warn)
#define I(x, y, z)
Definition: MD5.cpp:58
void write(raw_fd_ostream &OS)
Write the profile to OS.
Error writeText(raw_fd_ostream &OS)
Write the profile in text format to OS.
Lightweight error class with error context and mandatory checking.
Definition: Error.h:157
StringRef - Represent a constant reference to a string, i.e.
Definition: StringRef.h:48
std::unique_ptr< MemoryBuffer > writeBuffer()
Write the profile, returning the raw data. For testing.