ce0bb524249884753587f41750fd7cf87fe26f4b
[oota-llvm.git] / include / llvm / ProfileData / InstrProfWriter.h
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/ArrayRef.h"
19 #include "llvm/ADT/DenseMap.h"
20 #include "llvm/ADT/StringMap.h"
21 #include "llvm/ProfileData/InstrProf.h"
22 #include "llvm/Support/DataTypes.h"
23 #include "llvm/Support/MemoryBuffer.h"
24 #include "llvm/Support/raw_ostream.h"
25 #include <vector>
26
27 namespace llvm {
28
29 /// Writer for instrumentation based profile data.
30 class InstrProfWriter {
31 public:
32   typedef SmallDenseMap<uint64_t, std::vector<uint64_t>, 1> CounterData;
33 private:
34   StringMap<CounterData> FunctionData;
35   uint64_t MaxFunctionCount;
36 public:
37   InstrProfWriter() : MaxFunctionCount(0) {}
38
39   /// Add function counts for the given function. If there are already counts
40   /// for this function and the hash and number of counts match, each counter is
41   /// summed.
42   std::error_code addFunctionCounts(StringRef FunctionName,
43                                     uint64_t FunctionHash,
44                                     ArrayRef<uint64_t> Counters);
45   /// Write the profile to \c OS
46   void write(raw_fd_ostream &OS);
47   /// Write the profile, returning the raw data. For testing.
48   std::unique_ptr<MemoryBuffer> writeBuffer();
49
50 private:
51   std::pair<uint64_t, uint64_t> writeImpl(raw_ostream &OS);
52 };
53
54 } // end namespace llvm
55
56 #endif