| //===- 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 |