1//===- SampleProfWriter.h - Write LLVM sample profile data ----------------===// 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 definitions needed for writing sample profiles. 11// 12//===----------------------------------------------------------------------===// 13#ifndef LLVM_PROFILEDATA_SAMPLEPROFWRITER_H 14#define LLVM_PROFILEDATA_SAMPLEPROFWRITER_H 15 16#include "llvm/ADT/StringRef.h" 17#include "llvm/IR/Function.h" 18#include "llvm/IR/Module.h" 19#include "llvm/ProfileData/SampleProf.h" 20#include "llvm/Support/ErrorOr.h" 21#include "llvm/Support/FileSystem.h" 22#include "llvm/Support/raw_ostream.h" 23 24namespace llvm { 25 26namespace sampleprof { 27 28enum SampleProfileFormat { SPF_None = 0, SPF_Text, SPF_Binary, SPF_GCC }; 29 30/// \brief Sample-based profile writer. Base class. 31class SampleProfileWriter { 32public: 33 SampleProfileWriter(StringRef Filename, std::error_code &EC, 34 sys::fs::OpenFlags Flags) 35 : OS(Filename, EC, Flags) {} 36 virtual ~SampleProfileWriter() {} 37 38 /// \brief Write sample profiles in \p S for function \p FName. 39 /// 40 /// \returns true if the file was updated successfully. False, otherwise. 41 virtual bool write(StringRef FName, const FunctionSamples &S) = 0; 42 43 /// \brief Write sample profiles in \p S for function \p F. 44 bool write(const Function &F, const FunctionSamples &S) { 45 return write(F.getName(), S); 46 } 47 48 /// \brief Write all the sample profiles for all the functions in \p M. 49 /// 50 /// \returns true if the file was updated successfully. False, otherwise. 51 bool write(const Module &M, StringMap<FunctionSamples> &P) { 52 for (const auto &F : M) { 53 StringRef Name = F.getName(); 54 if (!write(Name, P[Name])) 55 return false; 56 } 57 return true; 58 } 59 60 /// \brief Write all the sample profiles in the given map of samples. 61 /// 62 /// \returns true if the file was updated successfully. False, otherwise. 63 bool write(StringMap<FunctionSamples> &ProfileMap) { 64 for (auto &I : ProfileMap) { 65 StringRef FName = I.first(); 66 FunctionSamples &Profile = I.second; 67 if (!write(FName, Profile)) 68 return false; 69 } 70 return true; 71 } 72 73 /// \brief Profile writer factory. Create a new writer based on the value of 74 /// \p Format. 75 static ErrorOr<std::unique_ptr<SampleProfileWriter>> 76 create(StringRef Filename, SampleProfileFormat Format); 77 78protected: 79 /// \brief Output stream where to emit the profile to. 80 raw_fd_ostream OS; 81}; 82 83/// \brief Sample-based profile writer (text format). 84class SampleProfileWriterText : public SampleProfileWriter { 85public: 86 SampleProfileWriterText(StringRef F, std::error_code &EC) 87 : SampleProfileWriter(F, EC, sys::fs::F_Text) {} 88 89 bool write(StringRef FName, const FunctionSamples &S) override; 90 bool write(const Module &M, StringMap<FunctionSamples> &P) { 91 return SampleProfileWriter::write(M, P); 92 } 93}; 94 95/// \brief Sample-based profile writer (binary format). 96class SampleProfileWriterBinary : public SampleProfileWriter { 97public: 98 SampleProfileWriterBinary(StringRef F, std::error_code &EC); 99 100 bool write(StringRef F, const FunctionSamples &S) override; 101 bool write(const Module &M, StringMap<FunctionSamples> &P) { 102 return SampleProfileWriter::write(M, P); 103 } 104}; 105 106} // End namespace sampleprof 107 108} // End namespace llvm 109 110#endif // LLVM_PROFILEDATA_SAMPLEPROFWRITER_H 111