//===-- Reader/DataReader.h - Perf data reader ------------------*- C++ -*-===// // // The LLVM Compiler Infrastructure // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// // // This family of functions reads profile data written by the perf2flo // utility and stores it in memory for llvm-flo consumption. // //===----------------------------------------------------------------------===// #ifndef LLVM_TOOLS_LLVM_FLO_DATA_READER_H #define LLVM_TOOLS_LLVM_FLO_DATA_READER_H #include "llvm/ADT/STLExtras.h" #include "llvm/ADT/StringMap.h" #include "llvm/Support/Allocator.h" #include "llvm/Support/Errc.h" #include "llvm/Support/ErrorOr.h" #include "llvm/Support/MemoryBuffer.h" #include "llvm/Support/raw_ostream.h" namespace llvm { namespace flo { struct Location { bool IsSymbol; StringRef Name; uint64_t Offset; Location(bool IsSymbol, StringRef Name, uint64_t Offset) : IsSymbol(IsSymbol), Name(Name), Offset(Offset) {} }; struct BranchInfo { Location From; Location To; int64_t Mispreds; int64_t Branches; BranchInfo(Location From, Location To, int64_t Mispreds, int64_t Branches) : From(std::move(From)), To(std::move(To)), Mispreds(Mispreds), Branches(Branches) {} }; //===----------------------------------------------------------------------===// // /// DataReader Class /// class DataReader { public: DataReader(std::unique_ptr MemBuf, raw_ostream &Diag) : FileBuf(std::move(MemBuf)), Diag(Diag), ParsingBuf(FileBuf->getBuffer()), Line(0), Col(0) {} static ErrorOr> readPerfData(StringRef Path, raw_ostream &Diag); /// Parses the input flo data file into internal data structures. We expect /// the file format to follow the syntax below. /// /// /// /// /// /// In field we record 0 if our closest address is a DSO load /// address or 1 if our closest address is an ELF symbol. /// /// Example: /// /// 1 main 3fb 0 /lib/ld-2.21.so 12 4 221 /// /// The example records branches from symbol main, offset 3fb, to DSO ld-2.21, /// offset 12, with 4 mispredictions and 221 branches std::error_code parse(); /// Dumps the entire data structures parsed. Used for debugging. void dump(); private: void reportError(StringRef ErrorMsg); bool expectAndConsumeFS(); ErrorOr parseString(char EndChar); ErrorOr parseNumberField(char EndChar); ErrorOr parseLocation(); ErrorOr parseBranchInfo(); bool hasData(); // Owns reader data structures BumpPtrAllocator Alloc; // An in-memory copy of the input data file - owns strings used in reader std::unique_ptr FileBuf; raw_ostream &Diag; StringRef ParsingBuf; unsigned Line; unsigned Col; std::vector ParsedData; static const char FieldSeparator = ' '; }; } } #endif