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