Home | History | Annotate | Download | only in llvm-pdbdump
      1 //===- LinePrinter.cpp ------------------------------------------*- C++ -*-===//
      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 #include "LinePrinter.h"
     11 
     12 #include "llvm-pdbdump.h"
     13 
     14 #include "llvm/ADT/STLExtras.h"
     15 #include "llvm/Support/Regex.h"
     16 
     17 #include <algorithm>
     18 
     19 using namespace llvm;
     20 using namespace llvm::pdb;
     21 
     22 namespace {
     23 bool IsItemExcluded(llvm::StringRef Item,
     24                     std::list<llvm::Regex> &IncludeFilters,
     25                     std::list<llvm::Regex> &ExcludeFilters) {
     26   if (Item.empty())
     27     return false;
     28 
     29   auto match_pred = [Item](llvm::Regex &R) { return R.match(Item); };
     30 
     31   // Include takes priority over exclude.  If the user specified include
     32   // filters, and none of them include this item, them item is gone.
     33   if (!IncludeFilters.empty() && !any_of(IncludeFilters, match_pred))
     34     return true;
     35 
     36   if (any_of(ExcludeFilters, match_pred))
     37     return true;
     38 
     39   return false;
     40 }
     41 }
     42 
     43 using namespace llvm;
     44 
     45 LinePrinter::LinePrinter(int Indent, llvm::raw_ostream &Stream)
     46     : OS(Stream), IndentSpaces(Indent), CurrentIndent(0) {
     47   SetFilters(ExcludeTypeFilters, opts::pretty::ExcludeTypes.begin(),
     48              opts::pretty::ExcludeTypes.end());
     49   SetFilters(ExcludeSymbolFilters, opts::pretty::ExcludeSymbols.begin(),
     50              opts::pretty::ExcludeSymbols.end());
     51   SetFilters(ExcludeCompilandFilters, opts::pretty::ExcludeCompilands.begin(),
     52              opts::pretty::ExcludeCompilands.end());
     53 
     54   SetFilters(IncludeTypeFilters, opts::pretty::IncludeTypes.begin(),
     55              opts::pretty::IncludeTypes.end());
     56   SetFilters(IncludeSymbolFilters, opts::pretty::IncludeSymbols.begin(),
     57              opts::pretty::IncludeSymbols.end());
     58   SetFilters(IncludeCompilandFilters, opts::pretty::IncludeCompilands.begin(),
     59              opts::pretty::IncludeCompilands.end());
     60 }
     61 
     62 void LinePrinter::Indent() { CurrentIndent += IndentSpaces; }
     63 
     64 void LinePrinter::Unindent() {
     65   CurrentIndent = std::max(0, CurrentIndent - IndentSpaces);
     66 }
     67 
     68 void LinePrinter::NewLine() {
     69   OS << "\n";
     70   OS.indent(CurrentIndent);
     71 }
     72 
     73 bool LinePrinter::IsTypeExcluded(llvm::StringRef TypeName) {
     74   return IsItemExcluded(TypeName, IncludeTypeFilters, ExcludeTypeFilters);
     75 }
     76 
     77 bool LinePrinter::IsSymbolExcluded(llvm::StringRef SymbolName) {
     78   return IsItemExcluded(SymbolName, IncludeSymbolFilters, ExcludeSymbolFilters);
     79 }
     80 
     81 bool LinePrinter::IsCompilandExcluded(llvm::StringRef CompilandName) {
     82   return IsItemExcluded(CompilandName, IncludeCompilandFilters,
     83                         ExcludeCompilandFilters);
     84 }
     85 
     86 WithColor::WithColor(LinePrinter &P, PDB_ColorItem C) : OS(P.OS) {
     87   applyColor(C);
     88 }
     89 
     90 WithColor::~WithColor() { OS.resetColor(); }
     91 
     92 void WithColor::applyColor(PDB_ColorItem C) {
     93   switch (C) {
     94   case PDB_ColorItem::None:
     95     OS.resetColor();
     96     return;
     97   case PDB_ColorItem::Address:
     98     OS.changeColor(raw_ostream::YELLOW, /*bold=*/true);
     99     return;
    100   case PDB_ColorItem::Keyword:
    101     OS.changeColor(raw_ostream::MAGENTA, true);
    102     return;
    103   case PDB_ColorItem::Register:
    104   case PDB_ColorItem::Offset:
    105     OS.changeColor(raw_ostream::YELLOW, false);
    106     return;
    107   case PDB_ColorItem::Type:
    108     OS.changeColor(raw_ostream::CYAN, true);
    109     return;
    110   case PDB_ColorItem::Identifier:
    111     OS.changeColor(raw_ostream::CYAN, false);
    112     return;
    113   case PDB_ColorItem::Path:
    114     OS.changeColor(raw_ostream::CYAN, false);
    115     return;
    116   case PDB_ColorItem::SectionHeader:
    117     OS.changeColor(raw_ostream::RED, true);
    118     return;
    119   case PDB_ColorItem::LiteralValue:
    120     OS.changeColor(raw_ostream::GREEN, true);
    121     return;
    122   }
    123 }
    124