136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines//=-- InstrProfWriter.h - Instrumented profiling writer -----------*- C++ -*-=//
236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines//
336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines//                     The LLVM Compiler Infrastructure
436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines//
536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// This file is distributed under the University of Illinois Open Source
636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// License. See LICENSE.TXT for details.
736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines//
836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines//===----------------------------------------------------------------------===//
936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines//
1036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// This file contains support for writing profiling data for instrumentation
1136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// based PGO and coverage.
1236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines//
1336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines//===----------------------------------------------------------------------===//
1436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
1537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines#ifndef LLVM_PROFILEDATA_INSTRPROFWRITER_H
1637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines#define LLVM_PROFILEDATA_INSTRPROFWRITER_H
1736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
1836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/ADT/ArrayRef.h"
1937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines#include "llvm/ADT/DenseMap.h"
2036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/ADT/StringMap.h"
2136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/ProfileData/InstrProf.h"
2236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/Support/DataTypes.h"
23ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines#include "llvm/Support/MemoryBuffer.h"
2436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/Support/raw_ostream.h"
2536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include <vector>
2636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
2736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesnamespace llvm {
2836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
2936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines/// Writer for instrumentation based profile data.
3036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesclass InstrProfWriter {
3136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinespublic:
3237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  typedef SmallDenseMap<uint64_t, std::vector<uint64_t>, 1> CounterData;
3336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesprivate:
3436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  StringMap<CounterData> FunctionData;
3537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  uint64_t MaxFunctionCount;
3636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinespublic:
3737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  InstrProfWriter() : MaxFunctionCount(0) {}
3837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
3936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  /// Add function counts for the given function. If there are already counts
4036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  /// for this function and the hash and number of counts match, each counter is
4136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  /// summed.
42c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  std::error_code addFunctionCounts(StringRef FunctionName,
43c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines                                    uint64_t FunctionHash,
44c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines                                    ArrayRef<uint64_t> Counters);
45ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  /// Write the profile to \c OS
46dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  void write(raw_fd_ostream &OS);
47ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  /// Write the profile, returning the raw data. For testing.
48ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  std::unique_ptr<MemoryBuffer> writeBuffer();
49ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
50ebe69fe11e48d322045d5949c83283927a0d790bStephen Hinesprivate:
51ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  std::pair<uint64_t, uint64_t> writeImpl(raw_ostream &OS);
5236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines};
5336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
5436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines} // end namespace llvm
5536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
5637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines#endif
57