xref: /llvm-project/llvm/lib/DebugInfo/PDB/Native/LinePrinter.cpp (revision 0060c54e0da6d1429875da2d30895faa7562b706)
175112133SCarlos Alberto Enciso //===- LinePrinter.cpp ------------------------------------------*- C++ -*-===//
275112133SCarlos Alberto Enciso //
375112133SCarlos Alberto Enciso // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
475112133SCarlos Alberto Enciso // See https://llvm.org/LICENSE.txt for license information.
575112133SCarlos Alberto Enciso // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
675112133SCarlos Alberto Enciso //
775112133SCarlos Alberto Enciso //===----------------------------------------------------------------------===//
875112133SCarlos Alberto Enciso 
975112133SCarlos Alberto Enciso #include "llvm/DebugInfo/PDB/Native/LinePrinter.h"
1075112133SCarlos Alberto Enciso 
1175112133SCarlos Alberto Enciso #include "llvm/ADT/STLExtras.h"
1275112133SCarlos Alberto Enciso #include "llvm/DebugInfo/MSF/MSFCommon.h"
1375112133SCarlos Alberto Enciso #include "llvm/DebugInfo/MSF/MappedBlockStream.h"
1475112133SCarlos Alberto Enciso #include "llvm/DebugInfo/PDB/IPDBLineNumber.h"
1575112133SCarlos Alberto Enciso #include "llvm/DebugInfo/PDB/Native/InputFile.h"
1675112133SCarlos Alberto Enciso #include "llvm/DebugInfo/PDB/Native/NativeSession.h"
1775112133SCarlos Alberto Enciso #include "llvm/DebugInfo/PDB/Native/PDBFile.h"
1875112133SCarlos Alberto Enciso #include "llvm/DebugInfo/PDB/UDTLayout.h"
1975112133SCarlos Alberto Enciso #include "llvm/Object/COFF.h"
2075112133SCarlos Alberto Enciso #include "llvm/Support/BinaryStreamReader.h"
2175112133SCarlos Alberto Enciso #include "llvm/Support/Format.h"
2275112133SCarlos Alberto Enciso #include "llvm/Support/FormatAdapters.h"
2375112133SCarlos Alberto Enciso #include "llvm/Support/FormatVariadic.h"
2475112133SCarlos Alberto Enciso #include "llvm/Support/Regex.h"
2575112133SCarlos Alberto Enciso 
2675112133SCarlos Alberto Enciso #include <algorithm>
2775112133SCarlos Alberto Enciso 
2875112133SCarlos Alberto Enciso using namespace llvm;
2975112133SCarlos Alberto Enciso using namespace llvm::msf;
3075112133SCarlos Alberto Enciso using namespace llvm::pdb;
3175112133SCarlos Alberto Enciso 
3275112133SCarlos Alberto Enciso namespace {
3375112133SCarlos Alberto Enciso bool IsItemExcluded(llvm::StringRef Item,
3475112133SCarlos Alberto Enciso                     std::list<llvm::Regex> &IncludeFilters,
3575112133SCarlos Alberto Enciso                     std::list<llvm::Regex> &ExcludeFilters) {
3675112133SCarlos Alberto Enciso   if (Item.empty())
3775112133SCarlos Alberto Enciso     return false;
3875112133SCarlos Alberto Enciso 
3975112133SCarlos Alberto Enciso   auto match_pred = [Item](llvm::Regex &R) { return R.match(Item); };
4075112133SCarlos Alberto Enciso 
4175112133SCarlos Alberto Enciso   // Include takes priority over exclude.  If the user specified include
4275112133SCarlos Alberto Enciso   // filters, and none of them include this item, them item is gone.
4375112133SCarlos Alberto Enciso   if (!IncludeFilters.empty() && !any_of(IncludeFilters, match_pred))
4475112133SCarlos Alberto Enciso     return true;
4575112133SCarlos Alberto Enciso 
4675112133SCarlos Alberto Enciso   if (any_of(ExcludeFilters, match_pred))
4775112133SCarlos Alberto Enciso     return true;
4875112133SCarlos Alberto Enciso 
4975112133SCarlos Alberto Enciso   return false;
5075112133SCarlos Alberto Enciso }
5175112133SCarlos Alberto Enciso } // namespace
5275112133SCarlos Alberto Enciso 
5375112133SCarlos Alberto Enciso using namespace llvm;
5475112133SCarlos Alberto Enciso 
5575112133SCarlos Alberto Enciso LinePrinter::LinePrinter(int Indent, bool UseColor, llvm::raw_ostream &Stream,
5610c11f5cSCarlos Alberto Enciso                          const FilterOptions &Filters)
5710c11f5cSCarlos Alberto Enciso     : OS(Stream), IndentSpaces(Indent), CurrentIndent(0), UseColor(UseColor),
5810c11f5cSCarlos Alberto Enciso       Filters(Filters) {
5975112133SCarlos Alberto Enciso   SetFilters(ExcludeTypeFilters, Filters.ExcludeTypes.begin(),
6075112133SCarlos Alberto Enciso              Filters.ExcludeTypes.end());
6175112133SCarlos Alberto Enciso   SetFilters(ExcludeSymbolFilters, Filters.ExcludeSymbols.begin(),
6275112133SCarlos Alberto Enciso              Filters.ExcludeSymbols.end());
6375112133SCarlos Alberto Enciso   SetFilters(ExcludeCompilandFilters, Filters.ExcludeCompilands.begin(),
6475112133SCarlos Alberto Enciso              Filters.ExcludeCompilands.end());
6575112133SCarlos Alberto Enciso 
6675112133SCarlos Alberto Enciso   SetFilters(IncludeTypeFilters, Filters.IncludeTypes.begin(),
6775112133SCarlos Alberto Enciso              Filters.IncludeTypes.end());
6875112133SCarlos Alberto Enciso   SetFilters(IncludeSymbolFilters, Filters.IncludeSymbols.begin(),
6975112133SCarlos Alberto Enciso              Filters.IncludeSymbols.end());
7075112133SCarlos Alberto Enciso   SetFilters(IncludeCompilandFilters, Filters.IncludeCompilands.begin(),
7175112133SCarlos Alberto Enciso              Filters.IncludeCompilands.end());
7275112133SCarlos Alberto Enciso }
7375112133SCarlos Alberto Enciso 
7475112133SCarlos Alberto Enciso void LinePrinter::Indent(uint32_t Amount) {
7575112133SCarlos Alberto Enciso   if (Amount == 0)
7675112133SCarlos Alberto Enciso     Amount = IndentSpaces;
7775112133SCarlos Alberto Enciso   CurrentIndent += Amount;
7875112133SCarlos Alberto Enciso }
7975112133SCarlos Alberto Enciso 
8075112133SCarlos Alberto Enciso void LinePrinter::Unindent(uint32_t Amount) {
8175112133SCarlos Alberto Enciso   if (Amount == 0)
8275112133SCarlos Alberto Enciso     Amount = IndentSpaces;
8375112133SCarlos Alberto Enciso   CurrentIndent = std::max<int>(0, CurrentIndent - Amount);
8475112133SCarlos Alberto Enciso }
8575112133SCarlos Alberto Enciso 
8675112133SCarlos Alberto Enciso void LinePrinter::NewLine() {
8775112133SCarlos Alberto Enciso   OS << "\n";
8875112133SCarlos Alberto Enciso   OS.indent(CurrentIndent);
8975112133SCarlos Alberto Enciso }
9075112133SCarlos Alberto Enciso 
9175112133SCarlos Alberto Enciso void LinePrinter::print(const Twine &T) { OS << T; }
9275112133SCarlos Alberto Enciso 
9375112133SCarlos Alberto Enciso void LinePrinter::printLine(const Twine &T) {
9475112133SCarlos Alberto Enciso   NewLine();
9575112133SCarlos Alberto Enciso   OS << T;
9675112133SCarlos Alberto Enciso }
9775112133SCarlos Alberto Enciso 
9875112133SCarlos Alberto Enciso bool LinePrinter::IsClassExcluded(const ClassLayout &Class) {
9975112133SCarlos Alberto Enciso   if (IsTypeExcluded(Class.getName(), Class.getSize()))
10075112133SCarlos Alberto Enciso     return true;
10175112133SCarlos Alberto Enciso   if (Class.deepPaddingSize() < Filters.PaddingThreshold)
10275112133SCarlos Alberto Enciso     return true;
10375112133SCarlos Alberto Enciso   return false;
10475112133SCarlos Alberto Enciso }
10575112133SCarlos Alberto Enciso 
10675112133SCarlos Alberto Enciso void LinePrinter::formatBinary(StringRef Label, ArrayRef<uint8_t> Data,
10775112133SCarlos Alberto Enciso                                uint64_t StartOffset) {
10875112133SCarlos Alberto Enciso   NewLine();
10975112133SCarlos Alberto Enciso   OS << Label << " (";
11075112133SCarlos Alberto Enciso   if (!Data.empty()) {
11175112133SCarlos Alberto Enciso     OS << "\n";
11275112133SCarlos Alberto Enciso     OS << format_bytes_with_ascii(Data, StartOffset, 32, 4,
11375112133SCarlos Alberto Enciso                                   CurrentIndent + IndentSpaces, true);
11475112133SCarlos Alberto Enciso     NewLine();
11575112133SCarlos Alberto Enciso   }
11675112133SCarlos Alberto Enciso   OS << ")";
11775112133SCarlos Alberto Enciso }
11875112133SCarlos Alberto Enciso 
11975112133SCarlos Alberto Enciso void LinePrinter::formatBinary(StringRef Label, ArrayRef<uint8_t> Data,
12075112133SCarlos Alberto Enciso                                uint64_t Base, uint64_t StartOffset) {
12175112133SCarlos Alberto Enciso   NewLine();
12275112133SCarlos Alberto Enciso   OS << Label << " (";
12375112133SCarlos Alberto Enciso   if (!Data.empty()) {
12475112133SCarlos Alberto Enciso     OS << "\n";
12575112133SCarlos Alberto Enciso     Base += StartOffset;
12675112133SCarlos Alberto Enciso     OS << format_bytes_with_ascii(Data, Base, 32, 4,
12775112133SCarlos Alberto Enciso                                   CurrentIndent + IndentSpaces, true);
12875112133SCarlos Alberto Enciso     NewLine();
12975112133SCarlos Alberto Enciso   }
13075112133SCarlos Alberto Enciso   OS << ")";
13175112133SCarlos Alberto Enciso }
13275112133SCarlos Alberto Enciso 
13375112133SCarlos Alberto Enciso namespace {
13475112133SCarlos Alberto Enciso struct Run {
13575112133SCarlos Alberto Enciso   Run() = default;
13675112133SCarlos Alberto Enciso   explicit Run(uint32_t Block) : Block(Block) {}
13775112133SCarlos Alberto Enciso   uint32_t Block = 0;
13875112133SCarlos Alberto Enciso   uint64_t ByteLen = 0;
13975112133SCarlos Alberto Enciso };
14075112133SCarlos Alberto Enciso } // namespace
14175112133SCarlos Alberto Enciso 
14275112133SCarlos Alberto Enciso static std::vector<Run> computeBlockRuns(uint32_t BlockSize,
14375112133SCarlos Alberto Enciso                                          const msf::MSFStreamLayout &Layout) {
14475112133SCarlos Alberto Enciso   std::vector<Run> Runs;
14575112133SCarlos Alberto Enciso   if (Layout.Length == 0)
14675112133SCarlos Alberto Enciso     return Runs;
14775112133SCarlos Alberto Enciso 
14875112133SCarlos Alberto Enciso   ArrayRef<support::ulittle32_t> Blocks = Layout.Blocks;
14975112133SCarlos Alberto Enciso   assert(!Blocks.empty());
15075112133SCarlos Alberto Enciso   uint64_t StreamBytesRemaining = Layout.Length;
15175112133SCarlos Alberto Enciso   uint32_t CurrentBlock = Blocks[0];
15275112133SCarlos Alberto Enciso   Runs.emplace_back(CurrentBlock);
15375112133SCarlos Alberto Enciso   while (!Blocks.empty()) {
15475112133SCarlos Alberto Enciso     Run *CurrentRun = &Runs.back();
15575112133SCarlos Alberto Enciso     uint32_t NextBlock = Blocks.front();
15675112133SCarlos Alberto Enciso     if (NextBlock < CurrentBlock || (NextBlock - CurrentBlock > 1)) {
15775112133SCarlos Alberto Enciso       Runs.emplace_back(NextBlock);
15875112133SCarlos Alberto Enciso       CurrentRun = &Runs.back();
15975112133SCarlos Alberto Enciso     }
16075112133SCarlos Alberto Enciso     uint64_t Used =
16175112133SCarlos Alberto Enciso         std::min(static_cast<uint64_t>(BlockSize), StreamBytesRemaining);
16275112133SCarlos Alberto Enciso     CurrentRun->ByteLen += Used;
16375112133SCarlos Alberto Enciso     StreamBytesRemaining -= Used;
16475112133SCarlos Alberto Enciso     CurrentBlock = NextBlock;
16575112133SCarlos Alberto Enciso     Blocks = Blocks.drop_front();
16675112133SCarlos Alberto Enciso   }
16775112133SCarlos Alberto Enciso   return Runs;
16875112133SCarlos Alberto Enciso }
16975112133SCarlos Alberto Enciso 
17075112133SCarlos Alberto Enciso static std::pair<Run, uint64_t> findRun(uint64_t Offset, ArrayRef<Run> Runs) {
17175112133SCarlos Alberto Enciso   for (const auto &R : Runs) {
17275112133SCarlos Alberto Enciso     if (Offset < R.ByteLen)
17375112133SCarlos Alberto Enciso       return std::make_pair(R, Offset);
17475112133SCarlos Alberto Enciso     Offset -= R.ByteLen;
17575112133SCarlos Alberto Enciso   }
17675112133SCarlos Alberto Enciso   llvm_unreachable("Invalid offset!");
17775112133SCarlos Alberto Enciso }
17875112133SCarlos Alberto Enciso 
17975112133SCarlos Alberto Enciso void LinePrinter::formatMsfStreamData(StringRef Label, PDBFile &File,
18075112133SCarlos Alberto Enciso                                       uint32_t StreamIdx,
18175112133SCarlos Alberto Enciso                                       StringRef StreamPurpose, uint64_t Offset,
18275112133SCarlos Alberto Enciso                                       uint64_t Size) {
18375112133SCarlos Alberto Enciso   if (StreamIdx >= File.getNumStreams()) {
18475112133SCarlos Alberto Enciso     formatLine("Stream {0}: Not present", StreamIdx);
18575112133SCarlos Alberto Enciso     return;
18675112133SCarlos Alberto Enciso   }
18775112133SCarlos Alberto Enciso   if (Size + Offset > File.getStreamByteSize(StreamIdx)) {
18875112133SCarlos Alberto Enciso     formatLine(
18975112133SCarlos Alberto Enciso         "Stream {0}: Invalid offset and size, range out of stream bounds",
19075112133SCarlos Alberto Enciso         StreamIdx);
19175112133SCarlos Alberto Enciso     return;
19275112133SCarlos Alberto Enciso   }
19375112133SCarlos Alberto Enciso 
19475112133SCarlos Alberto Enciso   auto S = File.createIndexedStream(StreamIdx);
19575112133SCarlos Alberto Enciso   if (!S) {
19675112133SCarlos Alberto Enciso     NewLine();
19775112133SCarlos Alberto Enciso     formatLine("Stream {0}: Not present", StreamIdx);
19875112133SCarlos Alberto Enciso     return;
19975112133SCarlos Alberto Enciso   }
20075112133SCarlos Alberto Enciso 
20175112133SCarlos Alberto Enciso   uint64_t End =
20275112133SCarlos Alberto Enciso       (Size == 0) ? S->getLength() : std::min(Offset + Size, S->getLength());
20375112133SCarlos Alberto Enciso   Size = End - Offset;
20475112133SCarlos Alberto Enciso 
20575112133SCarlos Alberto Enciso   formatLine("Stream {0}: {1} (dumping {2:N} / {3:N} bytes)", StreamIdx,
20675112133SCarlos Alberto Enciso              StreamPurpose, Size, S->getLength());
20775112133SCarlos Alberto Enciso   AutoIndent Indent(*this);
20875112133SCarlos Alberto Enciso   BinaryStreamRef Slice(*S);
20975112133SCarlos Alberto Enciso   BinarySubstreamRef Substream;
21075112133SCarlos Alberto Enciso   Substream.Offset = Offset;
21175112133SCarlos Alberto Enciso   Substream.StreamData = Slice.drop_front(Offset).keep_front(Size);
21275112133SCarlos Alberto Enciso 
21375112133SCarlos Alberto Enciso   auto Layout = File.getStreamLayout(StreamIdx);
21475112133SCarlos Alberto Enciso   formatMsfStreamData(Label, File, Layout, Substream);
21575112133SCarlos Alberto Enciso }
21675112133SCarlos Alberto Enciso 
21775112133SCarlos Alberto Enciso void LinePrinter::formatMsfStreamData(StringRef Label, PDBFile &File,
21875112133SCarlos Alberto Enciso                                       const msf::MSFStreamLayout &Stream,
21975112133SCarlos Alberto Enciso                                       BinarySubstreamRef Substream) {
22075112133SCarlos Alberto Enciso   BinaryStreamReader Reader(Substream.StreamData);
22175112133SCarlos Alberto Enciso 
22275112133SCarlos Alberto Enciso   auto Runs = computeBlockRuns(File.getBlockSize(), Stream);
22375112133SCarlos Alberto Enciso 
22475112133SCarlos Alberto Enciso   NewLine();
22575112133SCarlos Alberto Enciso   OS << Label << " (";
22675112133SCarlos Alberto Enciso   while (Reader.bytesRemaining() > 0) {
22775112133SCarlos Alberto Enciso     OS << "\n";
22875112133SCarlos Alberto Enciso 
22975112133SCarlos Alberto Enciso     Run FoundRun;
23075112133SCarlos Alberto Enciso     uint64_t RunOffset;
23175112133SCarlos Alberto Enciso     std::tie(FoundRun, RunOffset) = findRun(Substream.Offset, Runs);
23275112133SCarlos Alberto Enciso     assert(FoundRun.ByteLen >= RunOffset);
23375112133SCarlos Alberto Enciso     uint64_t Len = FoundRun.ByteLen - RunOffset;
23475112133SCarlos Alberto Enciso     Len = std::min(Len, Reader.bytesRemaining());
23575112133SCarlos Alberto Enciso     uint64_t Base = FoundRun.Block * File.getBlockSize() + RunOffset;
23675112133SCarlos Alberto Enciso     ArrayRef<uint8_t> Data;
23775112133SCarlos Alberto Enciso     consumeError(Reader.readBytes(Data, Len));
23875112133SCarlos Alberto Enciso     OS << format_bytes_with_ascii(Data, Base, 32, 4,
23975112133SCarlos Alberto Enciso                                   CurrentIndent + IndentSpaces, true);
24075112133SCarlos Alberto Enciso     if (Reader.bytesRemaining() > 0) {
24175112133SCarlos Alberto Enciso       NewLine();
24275112133SCarlos Alberto Enciso       OS << formatv("  {0}",
24375112133SCarlos Alberto Enciso                     fmt_align("<discontinuity>", AlignStyle::Center, 114, '-'));
24475112133SCarlos Alberto Enciso     }
24575112133SCarlos Alberto Enciso     Substream.Offset += Len;
24675112133SCarlos Alberto Enciso   }
24775112133SCarlos Alberto Enciso   NewLine();
24875112133SCarlos Alberto Enciso   OS << ")";
24975112133SCarlos Alberto Enciso }
25075112133SCarlos Alberto Enciso 
25175112133SCarlos Alberto Enciso void LinePrinter::formatMsfStreamBlocks(
25275112133SCarlos Alberto Enciso     PDBFile &File, const msf::MSFStreamLayout &StreamLayout) {
253*38818b60Sserge-sans-paille   auto Blocks = ArrayRef(StreamLayout.Blocks);
25475112133SCarlos Alberto Enciso   uint64_t L = StreamLayout.Length;
25575112133SCarlos Alberto Enciso 
25675112133SCarlos Alberto Enciso   while (L > 0) {
25775112133SCarlos Alberto Enciso     NewLine();
25875112133SCarlos Alberto Enciso     assert(!Blocks.empty());
25975112133SCarlos Alberto Enciso     OS << formatv("Block {0} (\n", uint32_t(Blocks.front()));
26075112133SCarlos Alberto Enciso     uint64_t UsedBytes =
26175112133SCarlos Alberto Enciso         std::min(L, static_cast<uint64_t>(File.getBlockSize()));
26275112133SCarlos Alberto Enciso     ArrayRef<uint8_t> BlockData =
26375112133SCarlos Alberto Enciso         cantFail(File.getBlockData(Blocks.front(), File.getBlockSize()));
26475112133SCarlos Alberto Enciso     uint64_t BaseOffset = Blocks.front();
26575112133SCarlos Alberto Enciso     BaseOffset *= File.getBlockSize();
26675112133SCarlos Alberto Enciso     OS << format_bytes_with_ascii(BlockData, BaseOffset, 32, 4,
26775112133SCarlos Alberto Enciso                                   CurrentIndent + IndentSpaces, true);
26875112133SCarlos Alberto Enciso     NewLine();
26975112133SCarlos Alberto Enciso     OS << ")";
27075112133SCarlos Alberto Enciso     NewLine();
27175112133SCarlos Alberto Enciso     L -= UsedBytes;
27275112133SCarlos Alberto Enciso     Blocks = Blocks.drop_front();
27375112133SCarlos Alberto Enciso   }
27475112133SCarlos Alberto Enciso }
27575112133SCarlos Alberto Enciso 
27675112133SCarlos Alberto Enciso bool LinePrinter::IsTypeExcluded(llvm::StringRef TypeName, uint64_t Size) {
27775112133SCarlos Alberto Enciso   if (IsItemExcluded(TypeName, IncludeTypeFilters, ExcludeTypeFilters))
27875112133SCarlos Alberto Enciso     return true;
27975112133SCarlos Alberto Enciso   if (Size < Filters.SizeThreshold)
28075112133SCarlos Alberto Enciso     return true;
28175112133SCarlos Alberto Enciso   return false;
28275112133SCarlos Alberto Enciso }
28375112133SCarlos Alberto Enciso 
28475112133SCarlos Alberto Enciso bool LinePrinter::IsSymbolExcluded(llvm::StringRef SymbolName) {
28575112133SCarlos Alberto Enciso   return IsItemExcluded(SymbolName, IncludeSymbolFilters, ExcludeSymbolFilters);
28675112133SCarlos Alberto Enciso }
28775112133SCarlos Alberto Enciso 
28875112133SCarlos Alberto Enciso bool LinePrinter::IsCompilandExcluded(llvm::StringRef CompilandName) {
28975112133SCarlos Alberto Enciso   return IsItemExcluded(CompilandName, IncludeCompilandFilters,
29075112133SCarlos Alberto Enciso                         ExcludeCompilandFilters);
29175112133SCarlos Alberto Enciso }
29275112133SCarlos Alberto Enciso 
29375112133SCarlos Alberto Enciso WithColor::WithColor(LinePrinter &P, PDB_ColorItem C)
29475112133SCarlos Alberto Enciso     : OS(P.OS), UseColor(P.hasColor()) {
29575112133SCarlos Alberto Enciso   if (UseColor)
29675112133SCarlos Alberto Enciso     applyColor(C);
29775112133SCarlos Alberto Enciso }
29875112133SCarlos Alberto Enciso 
29975112133SCarlos Alberto Enciso WithColor::~WithColor() {
30075112133SCarlos Alberto Enciso   if (UseColor)
30175112133SCarlos Alberto Enciso     OS.resetColor();
30275112133SCarlos Alberto Enciso }
30375112133SCarlos Alberto Enciso 
30475112133SCarlos Alberto Enciso void WithColor::applyColor(PDB_ColorItem C) {
30575112133SCarlos Alberto Enciso   switch (C) {
30675112133SCarlos Alberto Enciso   case PDB_ColorItem::None:
30775112133SCarlos Alberto Enciso     OS.resetColor();
30875112133SCarlos Alberto Enciso     return;
30975112133SCarlos Alberto Enciso   case PDB_ColorItem::Comment:
31075112133SCarlos Alberto Enciso     OS.changeColor(raw_ostream::GREEN, false);
31175112133SCarlos Alberto Enciso     return;
31275112133SCarlos Alberto Enciso   case PDB_ColorItem::Address:
31375112133SCarlos Alberto Enciso     OS.changeColor(raw_ostream::YELLOW, /*bold=*/true);
31475112133SCarlos Alberto Enciso     return;
31575112133SCarlos Alberto Enciso   case PDB_ColorItem::Keyword:
31675112133SCarlos Alberto Enciso     OS.changeColor(raw_ostream::MAGENTA, true);
31775112133SCarlos Alberto Enciso     return;
31875112133SCarlos Alberto Enciso   case PDB_ColorItem::Register:
31975112133SCarlos Alberto Enciso   case PDB_ColorItem::Offset:
32075112133SCarlos Alberto Enciso     OS.changeColor(raw_ostream::YELLOW, false);
32175112133SCarlos Alberto Enciso     return;
32275112133SCarlos Alberto Enciso   case PDB_ColorItem::Type:
32375112133SCarlos Alberto Enciso     OS.changeColor(raw_ostream::CYAN, true);
32475112133SCarlos Alberto Enciso     return;
32575112133SCarlos Alberto Enciso   case PDB_ColorItem::Identifier:
32675112133SCarlos Alberto Enciso     OS.changeColor(raw_ostream::CYAN, false);
32775112133SCarlos Alberto Enciso     return;
32875112133SCarlos Alberto Enciso   case PDB_ColorItem::Path:
32975112133SCarlos Alberto Enciso     OS.changeColor(raw_ostream::CYAN, false);
33075112133SCarlos Alberto Enciso     return;
33175112133SCarlos Alberto Enciso   case PDB_ColorItem::Padding:
33275112133SCarlos Alberto Enciso   case PDB_ColorItem::SectionHeader:
33375112133SCarlos Alberto Enciso     OS.changeColor(raw_ostream::RED, true);
33475112133SCarlos Alberto Enciso     return;
33575112133SCarlos Alberto Enciso   case PDB_ColorItem::LiteralValue:
33675112133SCarlos Alberto Enciso     OS.changeColor(raw_ostream::GREEN, true);
33775112133SCarlos Alberto Enciso     return;
33875112133SCarlos Alberto Enciso   }
33975112133SCarlos Alberto Enciso }
340