| //===- LinePrinter.h ------------------------------------------ *- C++ --*-===// | 
 | // | 
 | //                     The LLVM Compiler Infrastructure | 
 | // | 
 | // This file is distributed under the University of Illinois Open Source | 
 | // License. See LICENSE.TXT for details. | 
 | // | 
 | //===----------------------------------------------------------------------===// | 
 |  | 
 | #ifndef LLVM_TOOLS_LLVMPDBDUMP_LINEPRINTER_H | 
 | #define LLVM_TOOLS_LLVMPDBDUMP_LINEPRINTER_H | 
 |  | 
 | #include "llvm/ADT/ArrayRef.h" | 
 | #include "llvm/ADT/StringRef.h" | 
 | #include "llvm/ADT/Twine.h" | 
 | #include "llvm/Support/BinaryStreamRef.h" | 
 | #include "llvm/Support/FormatVariadic.h" | 
 | #include "llvm/Support/Regex.h" | 
 | #include "llvm/Support/raw_ostream.h" | 
 |  | 
 | #include <list> | 
 |  | 
 | namespace llvm { | 
 | class BinaryStreamReader; | 
 | namespace msf { | 
 | class MSFStreamLayout; | 
 | } // namespace msf | 
 | namespace pdb { | 
 |  | 
 | class ClassLayout; | 
 | class PDBFile; | 
 |  | 
 | class LinePrinter { | 
 |   friend class WithColor; | 
 |  | 
 | public: | 
 |   LinePrinter(int Indent, bool UseColor, raw_ostream &Stream); | 
 |  | 
 |   void Indent(uint32_t Amount = 0); | 
 |   void Unindent(uint32_t Amount = 0); | 
 |   void NewLine(); | 
 |  | 
 |   void printLine(const Twine &T); | 
 |   void print(const Twine &T); | 
 |   template <typename... Ts> void formatLine(const char *Fmt, Ts &&... Items) { | 
 |     printLine(formatv(Fmt, std::forward<Ts>(Items)...)); | 
 |   } | 
 |   template <typename... Ts> void format(const char *Fmt, Ts &&... Items) { | 
 |     print(formatv(Fmt, std::forward<Ts>(Items)...)); | 
 |   } | 
 |  | 
 |   void formatBinary(StringRef Label, ArrayRef<uint8_t> Data, | 
 |                     uint32_t StartOffset); | 
 |   void formatBinary(StringRef Label, ArrayRef<uint8_t> Data, uint64_t BaseAddr, | 
 |                     uint32_t StartOffset); | 
 |  | 
 |   void formatMsfStreamData(StringRef Label, PDBFile &File, uint32_t StreamIdx, | 
 |                            StringRef StreamPurpose, uint32_t Offset, | 
 |                            uint32_t Size); | 
 |   void formatMsfStreamData(StringRef Label, PDBFile &File, | 
 |                            const msf::MSFStreamLayout &Stream, | 
 |                            BinarySubstreamRef Substream); | 
 |   void formatMsfStreamBlocks(PDBFile &File, const msf::MSFStreamLayout &Stream); | 
 |  | 
 |   bool hasColor() const { return UseColor; } | 
 |   raw_ostream &getStream() { return OS; } | 
 |   int getIndentLevel() const { return CurrentIndent; } | 
 |  | 
 |   bool IsClassExcluded(const ClassLayout &Class); | 
 |   bool IsTypeExcluded(llvm::StringRef TypeName, uint32_t Size); | 
 |   bool IsSymbolExcluded(llvm::StringRef SymbolName); | 
 |   bool IsCompilandExcluded(llvm::StringRef CompilandName); | 
 |  | 
 | private: | 
 |   template <typename Iter> | 
 |   void SetFilters(std::list<Regex> &List, Iter Begin, Iter End) { | 
 |     List.clear(); | 
 |     for (; Begin != End; ++Begin) | 
 |       List.emplace_back(StringRef(*Begin)); | 
 |   } | 
 |  | 
 |   raw_ostream &OS; | 
 |   int IndentSpaces; | 
 |   int CurrentIndent; | 
 |   bool UseColor; | 
 |  | 
 |   std::list<Regex> ExcludeCompilandFilters; | 
 |   std::list<Regex> ExcludeTypeFilters; | 
 |   std::list<Regex> ExcludeSymbolFilters; | 
 |  | 
 |   std::list<Regex> IncludeCompilandFilters; | 
 |   std::list<Regex> IncludeTypeFilters; | 
 |   std::list<Regex> IncludeSymbolFilters; | 
 | }; | 
 |  | 
 | struct PrintScope { | 
 |   explicit PrintScope(LinePrinter &P, uint32_t IndentLevel) | 
 |       : P(P), IndentLevel(IndentLevel) {} | 
 |   explicit PrintScope(const PrintScope &Other, uint32_t LabelWidth) | 
 |       : P(Other.P), IndentLevel(Other.IndentLevel), LabelWidth(LabelWidth) {} | 
 |  | 
 |   LinePrinter &P; | 
 |   uint32_t IndentLevel; | 
 |   uint32_t LabelWidth = 0; | 
 | }; | 
 |  | 
 | inline Optional<PrintScope> withLabelWidth(const Optional<PrintScope> &Scope, | 
 |                                            uint32_t W) { | 
 |   if (!Scope) | 
 |     return None; | 
 |   return PrintScope{*Scope, W}; | 
 | } | 
 |  | 
 | struct AutoIndent { | 
 |   explicit AutoIndent(LinePrinter &L, uint32_t Amount = 0) | 
 |       : L(&L), Amount(Amount) { | 
 |     L.Indent(Amount); | 
 |   } | 
 |   explicit AutoIndent(const Optional<PrintScope> &Scope) { | 
 |     if (Scope.hasValue()) { | 
 |       L = &Scope->P; | 
 |       Amount = Scope->IndentLevel; | 
 |     } | 
 |   } | 
 |   ~AutoIndent() { | 
 |     if (L) | 
 |       L->Unindent(Amount); | 
 |   } | 
 |  | 
 |   LinePrinter *L = nullptr; | 
 |   uint32_t Amount = 0; | 
 | }; | 
 |  | 
 | template <class T> | 
 | inline raw_ostream &operator<<(LinePrinter &Printer, const T &Item) { | 
 |   Printer.getStream() << Item; | 
 |   return Printer.getStream(); | 
 | } | 
 |  | 
 | enum class PDB_ColorItem { | 
 |   None, | 
 |   Address, | 
 |   Type, | 
 |   Comment, | 
 |   Padding, | 
 |   Keyword, | 
 |   Offset, | 
 |   Identifier, | 
 |   Path, | 
 |   SectionHeader, | 
 |   LiteralValue, | 
 |   Register, | 
 | }; | 
 |  | 
 | class WithColor { | 
 | public: | 
 |   WithColor(LinePrinter &P, PDB_ColorItem C); | 
 |   ~WithColor(); | 
 |  | 
 |   raw_ostream &get() { return OS; } | 
 |  | 
 | private: | 
 |   void applyColor(PDB_ColorItem C); | 
 |   raw_ostream &OS; | 
 |   bool UseColor; | 
 | }; | 
 | } | 
 | } | 
 |  | 
 | #endif |