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 24 namespace llvm { 25 26 namespace sampleprof { 27 28 enum SampleProfileFormat { SPF_None = 0, SPF_Text, SPF_Binary, SPF_GCC }; 29 30 /// \brief Sample-based profile writer. Base class. 31 class SampleProfileWriter { 32 public: SampleProfileWriter(StringRef Filename,std::error_code & EC,sys::fs::OpenFlags Flags)33 SampleProfileWriter(StringRef Filename, std::error_code &EC, 34 sys::fs::OpenFlags Flags) 35 : OS(Filename, EC, Flags) {} ~SampleProfileWriter()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. write(const Function & F,const FunctionSamples & S)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. write(const Module & M,StringMap<FunctionSamples> & P)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. write(StringMap<FunctionSamples> & ProfileMap)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 78 protected: 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). 84 class SampleProfileWriterText : public SampleProfileWriter { 85 public: SampleProfileWriterText(StringRef F,std::error_code & EC)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; write(const Module & M,StringMap<FunctionSamples> & P)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). 96 class SampleProfileWriterBinary : public SampleProfileWriter { 97 public: 98 SampleProfileWriterBinary(StringRef F, std::error_code &EC); 99 100 bool write(StringRef F, const FunctionSamples &S) override; write(const Module & M,StringMap<FunctionSamples> & P)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