blob: 718d3394e211d19df3451b3ec4d557e06e68d7e4 [file] [log] [blame]
Zachary Turner2d11c202015-02-27 09:15:59 +00001//===- 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
Zachary Turnerbd336e42017-06-09 20:46:17 +000012#include "llvm-pdbutil.h"
Zachary Turner7797c722015-03-02 04:39:56 +000013
Sanjoy Dasff3b8b42015-12-01 07:49:23 +000014#include "llvm/ADT/STLExtras.h"
Zachary Turner4dc4f012017-04-13 21:11:00 +000015#include "llvm/DebugInfo/PDB/UDTLayout.h"
Zachary Turner63055452017-06-15 22:24:24 +000016#include "llvm/Support/Format.h"
Zachary Turnerf5abda22015-03-01 06:49:49 +000017#include "llvm/Support/Regex.h"
18
Zachary Turner2d11c202015-02-27 09:15:59 +000019#include <algorithm>
20
Zachary Turnerec28fc32016-05-04 20:32:13 +000021using namespace llvm;
22using namespace llvm::pdb;
23
Zachary Turner4dddcc62015-09-29 19:49:06 +000024namespace {
Zachary Turner4dddcc62015-09-29 19:49:06 +000025bool IsItemExcluded(llvm::StringRef Item,
26 std::list<llvm::Regex> &IncludeFilters,
27 std::list<llvm::Regex> &ExcludeFilters) {
28 if (Item.empty())
29 return false;
30
31 auto match_pred = [Item](llvm::Regex &R) { return R.match(Item); };
32
33 // Include takes priority over exclude. If the user specified include
34 // filters, and none of them include this item, them item is gone.
Sanjoy Dasff3b8b42015-12-01 07:49:23 +000035 if (!IncludeFilters.empty() && !any_of(IncludeFilters, match_pred))
Zachary Turner4dddcc62015-09-29 19:49:06 +000036 return true;
37
Sanjoy Dasff3b8b42015-12-01 07:49:23 +000038 if (any_of(ExcludeFilters, match_pred))
Zachary Turner4dddcc62015-09-29 19:49:06 +000039 return true;
40
41 return false;
42}
43}
44
Zachary Turner2d11c202015-02-27 09:15:59 +000045using namespace llvm;
46
Adrian McCarthy1aa207d2017-03-23 15:28:15 +000047LinePrinter::LinePrinter(int Indent, bool UseColor, llvm::raw_ostream &Stream)
48 : OS(Stream), IndentSpaces(Indent), CurrentIndent(0), UseColor(UseColor) {
Zachary Turnera30bd1a2016-06-30 17:42:48 +000049 SetFilters(ExcludeTypeFilters, opts::pretty::ExcludeTypes.begin(),
50 opts::pretty::ExcludeTypes.end());
51 SetFilters(ExcludeSymbolFilters, opts::pretty::ExcludeSymbols.begin(),
52 opts::pretty::ExcludeSymbols.end());
53 SetFilters(ExcludeCompilandFilters, opts::pretty::ExcludeCompilands.begin(),
54 opts::pretty::ExcludeCompilands.end());
Zachary Turner4dddcc62015-09-29 19:49:06 +000055
Zachary Turnera30bd1a2016-06-30 17:42:48 +000056 SetFilters(IncludeTypeFilters, opts::pretty::IncludeTypes.begin(),
57 opts::pretty::IncludeTypes.end());
58 SetFilters(IncludeSymbolFilters, opts::pretty::IncludeSymbols.begin(),
59 opts::pretty::IncludeSymbols.end());
60 SetFilters(IncludeCompilandFilters, opts::pretty::IncludeCompilands.begin(),
61 opts::pretty::IncludeCompilands.end());
Zachary Turner7797c722015-03-02 04:39:56 +000062}
Zachary Turner2d11c202015-02-27 09:15:59 +000063
Zachary Turner63055452017-06-15 22:24:24 +000064void LinePrinter::Indent(uint32_t Amount) {
65 if (Amount == 0)
66 Amount = IndentSpaces;
67 CurrentIndent += Amount;
68}
Zachary Turner2d11c202015-02-27 09:15:59 +000069
Zachary Turner63055452017-06-15 22:24:24 +000070void LinePrinter::Unindent(uint32_t Amount) {
71 if (Amount == 0)
72 Amount = IndentSpaces;
73 CurrentIndent = std::max<int>(0, CurrentIndent - Amount);
Zachary Turner2d11c202015-02-27 09:15:59 +000074}
75
76void LinePrinter::NewLine() {
77 OS << "\n";
78 OS.indent(CurrentIndent);
79}
80
Zachary Turner63055452017-06-15 22:24:24 +000081void LinePrinter::print(const Twine &T) { OS << T; }
82
83void LinePrinter::printLine(const Twine &T) {
84 NewLine();
85 OS << T;
86}
87
Zachary Turner4dc4f012017-04-13 21:11:00 +000088bool LinePrinter::IsClassExcluded(const ClassLayout &Class) {
Zachary Turner16901642017-04-24 17:47:24 +000089 if (IsTypeExcluded(Class.getName(), Class.getSize()))
Zachary Turner4dc4f012017-04-13 21:11:00 +000090 return true;
91 if (Class.deepPaddingSize() < opts::pretty::PaddingThreshold)
92 return true;
93 return false;
94}
95
Zachary Turner63055452017-06-15 22:24:24 +000096void LinePrinter::formatBinary(StringRef Label, ArrayRef<uint8_t> Data,
97 uint32_t StartOffset) {
98 NewLine();
99 OS << Label << " (";
100 if (!Data.empty()) {
101 OS << "\n";
102 OS << format_bytes_with_ascii(Data, StartOffset, 32, 4,
103 CurrentIndent + IndentSpaces, true);
104 NewLine();
105 }
106 OS << ")";
107}
108
Zachary Turner4dc4f012017-04-13 21:11:00 +0000109bool LinePrinter::IsTypeExcluded(llvm::StringRef TypeName, uint32_t Size) {
110 if (IsItemExcluded(TypeName, IncludeTypeFilters, ExcludeTypeFilters))
111 return true;
112 if (Size < opts::pretty::SizeThreshold)
113 return true;
114 return false;
Zachary Turnerf5abda22015-03-01 06:49:49 +0000115}
116
117bool LinePrinter::IsSymbolExcluded(llvm::StringRef SymbolName) {
Zachary Turner4dddcc62015-09-29 19:49:06 +0000118 return IsItemExcluded(SymbolName, IncludeSymbolFilters, ExcludeSymbolFilters);
Zachary Turnerf5abda22015-03-01 06:49:49 +0000119}
120
121bool LinePrinter::IsCompilandExcluded(llvm::StringRef CompilandName) {
Zachary Turner4dddcc62015-09-29 19:49:06 +0000122 return IsItemExcluded(CompilandName, IncludeCompilandFilters,
123 ExcludeCompilandFilters);
Zachary Turnerf5abda22015-03-01 06:49:49 +0000124}
125
Adrian McCarthy5fcfc2c2017-03-29 17:11:27 +0000126WithColor::WithColor(LinePrinter &P, PDB_ColorItem C)
127 : OS(P.OS), UseColor(P.hasColor()) {
128 if (UseColor)
Adrian McCarthy1aa207d2017-03-23 15:28:15 +0000129 applyColor(C);
Zachary Turner2d11c202015-02-27 09:15:59 +0000130}
131
Adrian McCarthy5fcfc2c2017-03-29 17:11:27 +0000132WithColor::~WithColor() {
133 if (UseColor)
134 OS.resetColor();
135}
Zachary Turner2d11c202015-02-27 09:15:59 +0000136
Rui Ueyamafa05aac2015-11-03 01:04:44 +0000137void WithColor::applyColor(PDB_ColorItem C) {
Zachary Turner2d11c202015-02-27 09:15:59 +0000138 switch (C) {
Rui Ueyamafa05aac2015-11-03 01:04:44 +0000139 case PDB_ColorItem::None:
140 OS.resetColor();
141 return;
Zachary Turner0c990bbe2017-04-10 19:33:29 +0000142 case PDB_ColorItem::Comment:
143 OS.changeColor(raw_ostream::GREEN, false);
144 return;
Zachary Turner2d11c202015-02-27 09:15:59 +0000145 case PDB_ColorItem::Address:
Rui Ueyamafa05aac2015-11-03 01:04:44 +0000146 OS.changeColor(raw_ostream::YELLOW, /*bold=*/true);
Zachary Turner2d11c202015-02-27 09:15:59 +0000147 return;
148 case PDB_ColorItem::Keyword:
Rui Ueyamafa05aac2015-11-03 01:04:44 +0000149 OS.changeColor(raw_ostream::MAGENTA, true);
Zachary Turner2d11c202015-02-27 09:15:59 +0000150 return;
Zachary Turner7797c722015-03-02 04:39:56 +0000151 case PDB_ColorItem::Register:
Zachary Turner2d11c202015-02-27 09:15:59 +0000152 case PDB_ColorItem::Offset:
Rui Ueyamafa05aac2015-11-03 01:04:44 +0000153 OS.changeColor(raw_ostream::YELLOW, false);
Zachary Turner2d11c202015-02-27 09:15:59 +0000154 return;
155 case PDB_ColorItem::Type:
Rui Ueyamafa05aac2015-11-03 01:04:44 +0000156 OS.changeColor(raw_ostream::CYAN, true);
Zachary Turner2d11c202015-02-27 09:15:59 +0000157 return;
158 case PDB_ColorItem::Identifier:
Rui Ueyamafa05aac2015-11-03 01:04:44 +0000159 OS.changeColor(raw_ostream::CYAN, false);
Zachary Turner2d11c202015-02-27 09:15:59 +0000160 return;
161 case PDB_ColorItem::Path:
Rui Ueyamafa05aac2015-11-03 01:04:44 +0000162 OS.changeColor(raw_ostream::CYAN, false);
Zachary Turner2d11c202015-02-27 09:15:59 +0000163 return;
Zachary Turner0c990bbe2017-04-10 19:33:29 +0000164 case PDB_ColorItem::Padding:
Zachary Turner2d11c202015-02-27 09:15:59 +0000165 case PDB_ColorItem::SectionHeader:
Rui Ueyamafa05aac2015-11-03 01:04:44 +0000166 OS.changeColor(raw_ostream::RED, true);
Zachary Turner2d11c202015-02-27 09:15:59 +0000167 return;
168 case PDB_ColorItem::LiteralValue:
Rui Ueyamafa05aac2015-11-03 01:04:44 +0000169 OS.changeColor(raw_ostream::GREEN, true);
Zachary Turner2d11c202015-02-27 09:15:59 +0000170 return;
171 }
172}