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