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
1536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#ifndef LLVM_PROFILEDATA_INSTRPROF_WRITER_H_
1636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#define LLVM_PROFILEDATA_INSTRPROF_WRITER_H_
1736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
1836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/ADT/ArrayRef.h"
1936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/ADT/StringMap.h"
2036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/ProfileData/InstrProf.h"
2136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/Support/DataTypes.h"
2236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/Support/raw_ostream.h"
2336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
2436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include <vector>
2536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
2636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesnamespace llvm {
2736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
2836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines/// Writer for instrumentation based profile data.
2936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesclass InstrProfWriter {
3036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinespublic:
3136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  struct CounterData {
3236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    uint64_t Hash;
3336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    std::vector<uint64_t> Counts;
3436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  };
3536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesprivate:
3636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  StringMap<CounterData> FunctionData;
3736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinespublic:
3836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  /// Add function counts for the given function. If there are already counts
3936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  /// for this function and the hash and number of counts match, each counter is
4036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  /// summed.
41cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  std::error_code addFunctionCounts(StringRef FunctionName,
42cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines                                    uint64_t FunctionHash,
43cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines                                    ArrayRef<uint64_t> Counters);
4436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  /// Ensure that all data is written to disk.
45dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  void write(raw_fd_ostream &OS);
4636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines};
4736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
4836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines} // end namespace llvm
4936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
5036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#endif // LLVM_PROFILE_INSTRPROF_WRITER_H_
51