LLVM  10.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:
36  // PF_IRLevelWithCS is the profile from context sensitive IR instrumentation.
38 
39 private:
40  bool Sparse;
41  StringMap<ProfilingData> FunctionData;
42  ProfKind ProfileKind = PF_Unknown;
43  // Use raw pointer here for the incomplete type object.
45 
46 public:
47  InstrProfWriter(bool Sparse = false);
49 
50  /// Add function counts for the given function. If there are already counts
51  /// for this function and the hash and number of counts match, each counter is
52  /// summed. Optionally scale counts by \p Weight.
53  void addRecord(NamedInstrProfRecord &&I, uint64_t Weight,
54  function_ref<void(Error)> Warn);
56  addRecord(std::move(I), 1, Warn);
57  }
58 
59  /// Merge existing function counts from the given writer.
61  function_ref<void(Error)> Warn);
62 
63  /// Write the profile to \c OS
64  void write(raw_fd_ostream &OS);
65 
66  /// Write the profile in text format to \c OS
68 
69  /// Write \c Record in text format to \c OS
70  static void writeRecordInText(StringRef Name, uint64_t Hash,
71  const InstrProfRecord &Counters,
72  InstrProfSymtab &Symtab, raw_fd_ostream &OS);
73 
74  /// Write the profile, returning the raw data. For testing.
75  std::unique_ptr<MemoryBuffer> writeBuffer();
76 
77  /// Set the ProfileKind. Report error if mixing FE and IR level profiles.
78  /// \c WithCS indicates if this is for contenxt sensitive instrumentation.
79  Error setIsIRLevelProfile(bool IsIRLevel, bool WithCS) {
80  if (ProfileKind == PF_Unknown) {
81  if (IsIRLevel)
82  ProfileKind = WithCS ? PF_IRLevelWithCS : PF_IRLevel;
83  else
84  ProfileKind = PF_FE;
85  return Error::success();
86  }
87 
88  if (((ProfileKind != PF_FE) && !IsIRLevel) ||
89  ((ProfileKind == PF_FE) && IsIRLevel))
90  return make_error<InstrProfError>(instrprof_error::unsupported_version);
91 
92  // When merging a context-sensitive profile (WithCS == true) with an IRLevel
93  // profile, set the kind to PF_IRLevelWithCS.
94  if (ProfileKind == PF_IRLevel && WithCS)
95  ProfileKind = PF_IRLevelWithCS;
96 
97  return Error::success();
98  }
99 
100  // Internal interface for testing purpose only.
102  void setOutputSparse(bool Sparse);
103  // Compute the overlap b/w this object and Other. Program level result is
104  // stored in Overlap and function level result is stored in FuncLevelOverlap.
106  OverlapStats &FuncLevelOverlap,
107  const OverlapFuncFilters &FuncFilter);
108 
109 private:
110  void addRecord(StringRef Name, uint64_t Hash, InstrProfRecord &&I,
111  uint64_t Weight, function_ref<void(Error)> Warn);
112  bool shouldEncodeData(const ProfilingData &PD);
113  void writeImpl(ProfOStream &OS);
114 };
115 
116 } // end namespace llvm
117 
118 #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:104
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.
ELFYAML::ELF_STO Other
Definition: ELFYAML.cpp:877
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
Error setIsIRLevelProfile(bool IsIRLevel, bool WithCS)
Set the ProfileKind.
StringMap - This is an unconventional map that is specialized for handling keys that are "strings"...
Definition: StringMap.h:219
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:384
Profiling information for a single function.
Definition: InstrProf.h:689
void addRecord(NamedInstrProfRecord &&I, function_ref< void(Error)> Warn)
#define I(x, y, z)
Definition: MD5.cpp:58
void overlapRecord(NamedInstrProfRecord &&Other, OverlapStats &Overlap, OverlapStats &FuncLevelOverlap, const OverlapFuncFilters &FuncFilter)
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.