1ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines//===- CompilandDumper.cpp - llvm-pdbdump compiland symbol dumper *- C++ *-===//
2ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines//
3ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines//                     The LLVM Compiler Infrastructure
4ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines//
5ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines// This file is distributed under the University of Illinois Open Source
6ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines// License. See LICENSE.TXT for details.
7ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines//
8ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines//===----------------------------------------------------------------------===//
9ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
10ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines#include "CompilandDumper.h"
114c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar#include "LinePrinter.h"
12ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines#include "llvm-pdbdump.h"
13ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
14ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines#include "llvm/DebugInfo/PDB/IPDBEnumChildren.h"
15de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/DebugInfo/PDB/IPDBLineNumber.h"
16ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines#include "llvm/DebugInfo/PDB/IPDBSession.h"
17de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/DebugInfo/PDB/IPDBSourceFile.h"
18ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines#include "llvm/DebugInfo/PDB/PDBExtras.h"
19ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines#include "llvm/DebugInfo/PDB/PDBSymbol.h"
20ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines#include "llvm/DebugInfo/PDB/PDBSymbolCompiland.h"
21ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines#include "llvm/DebugInfo/PDB/PDBSymbolData.h"
22ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines#include "llvm/DebugInfo/PDB/PDBSymbolFunc.h"
23ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines#include "llvm/DebugInfo/PDB/PDBSymbolFuncDebugEnd.h"
24ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines#include "llvm/DebugInfo/PDB/PDBSymbolFuncDebugStart.h"
25ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines#include "llvm/DebugInfo/PDB/PDBSymbolLabel.h"
26ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines#include "llvm/DebugInfo/PDB/PDBSymbolThunk.h"
27ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines#include "llvm/DebugInfo/PDB/PDBSymbolTypeFunctionSig.h"
28ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines#include "llvm/DebugInfo/PDB/PDBSymbolUnknown.h"
29ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines#include "llvm/Support/Format.h"
30ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines#include "llvm/Support/Path.h"
31ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines#include "llvm/Support/raw_ostream.h"
32ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
33ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines#include "FunctionDumper.h"
34ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
35ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines#include <utility>
36ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
37ebe69fe11e48d322045d5949c83283927a0d790bStephen Hinesusing namespace llvm;
38de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarusing namespace llvm::pdb;
39ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
404c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga NainarCompilandDumper::CompilandDumper(LinePrinter &P)
414c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    : PDBSymDumper(true), Printer(P) {}
42ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
434c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainarvoid CompilandDumper::dump(const PDBSymbolCompilandDetails &Symbol) {}
44ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
454c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainarvoid CompilandDumper::dump(const PDBSymbolCompilandEnv &Symbol) {}
46ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
47de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarvoid CompilandDumper::start(const PDBSymbolCompiland &Symbol,
48de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                            CompilandDumpFlags opts) {
49ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  std::string FullName = Symbol.getName();
504c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  if (Printer.IsCompilandExcluded(FullName))
514c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    return;
524c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar
534c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  Printer.NewLine();
544c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  WithColor(Printer, PDB_ColorItem::Path).get() << FullName;
55ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
56de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  if (opts & Flags::Lines) {
57de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    const IPDBSession &Session = Symbol.getSession();
58de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    auto Files = Session.getSourceFilesForCompiland(Symbol);
59de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    Printer.Indent();
60de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    while (auto File = Files->getNext()) {
61de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      Printer.NewLine();
62de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      WithColor(Printer, PDB_ColorItem::Path).get() << File->getFileName();
63de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
64de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      auto Lines = Session.findLineNumbers(Symbol, *File);
65de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      Printer.Indent();
66de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      while (auto Line = Lines->getNext()) {
67de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        Printer.NewLine();
68de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        uint32_t LineStart = Line->getLineNumber();
69de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        uint32_t LineEnd = Line->getLineNumberEnd();
70de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
71de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        Printer << "Line ";
72de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        PDB_ColorItem StatementColor = Line->isStatement()
73de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                           ? PDB_ColorItem::Keyword
74de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                           : PDB_ColorItem::LiteralValue;
75de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        WithColor(Printer, StatementColor).get() << LineStart;
76de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        if (LineStart != LineEnd)
77de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar          WithColor(Printer, StatementColor).get() << " - " << LineEnd;
78de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
79de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        Printer << ", Address: ";
80de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        if (Line->getLength() > 0) {
81de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar          uint64_t AddrStart = Line->getVirtualAddress();
82de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar          uint64_t AddrEnd = AddrStart + Line->getLength() - 1;
83de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar          WithColor(Printer, PDB_ColorItem::Address).get()
84de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar              << "[" << format_hex(AddrStart, 10) << " - "
85de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar              << format_hex(AddrEnd, 10) << "]";
86de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar          Printer << " (" << Line->getLength() << " bytes)";
87de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        } else {
88de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar          uint64_t AddrStart = Line->getVirtualAddress();
89de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar          WithColor(Printer, PDB_ColorItem::Address).get()
90de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar              << "[" << format_hex(AddrStart, 10) << "] ";
91de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar          Printer << "(0 bytes)";
92de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        }
93de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      }
94de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      Printer.Unindent();
95de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    }
96de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    Printer.Unindent();
97de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
98de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
99de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  if (opts & Flags::Children) {
100de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    auto ChildrenEnum = Symbol.findAllChildren();
101de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    Printer.Indent();
102de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    while (auto Child = ChildrenEnum->getNext())
103de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      Child->dump(*this);
104de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    Printer.Unindent();
105de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
106ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines}
107ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
1084c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainarvoid CompilandDumper::dump(const PDBSymbolData &Symbol) {
1094c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  if (Printer.IsSymbolExcluded(Symbol.getName()))
1104c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    return;
1114c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar
1124c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  Printer.NewLine();
1134c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar
114ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  switch (auto LocType = Symbol.getLocationType()) {
115ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case PDB_LocType::Static:
1164c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    Printer << "data: ";
1174c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    WithColor(Printer, PDB_ColorItem::Address).get()
1186948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar        << "[" << format_hex(Symbol.getVirtualAddress(), 10) << "]";
119ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    break;
120ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case PDB_LocType::Constant:
1214c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    Printer << "constant: ";
1224c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    WithColor(Printer, PDB_ColorItem::LiteralValue).get()
1234c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar        << "[" << Symbol.getValue() << "]";
124ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    break;
125ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  default:
1264c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    Printer << "data(unexpected type=" << LocType << ")";
127ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  }
128ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
1294c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  Printer << " ";
1304c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  WithColor(Printer, PDB_ColorItem::Identifier).get() << Symbol.getName();
131ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines}
132ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
1334c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainarvoid CompilandDumper::dump(const PDBSymbolFunc &Symbol) {
134ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  if (Symbol.getLength() == 0)
135ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    return;
1364c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  if (Printer.IsSymbolExcluded(Symbol.getName()))
1374c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    return;
138ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
1394c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  Printer.NewLine();
1404c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  FunctionDumper Dumper(Printer);
1414c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  Dumper.start(Symbol, FunctionDumper::PointerType::None);
142ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines}
143ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
1444c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainarvoid CompilandDumper::dump(const PDBSymbolLabel &Symbol) {
1454c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  if (Printer.IsSymbolExcluded(Symbol.getName()))
1464c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    return;
1474c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar
1484c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  Printer.NewLine();
1494c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  Printer << "label ";
1504c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  WithColor(Printer, PDB_ColorItem::Address).get()
1516948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      << "[" << format_hex(Symbol.getVirtualAddress(), 10) << "] ";
1524c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  WithColor(Printer, PDB_ColorItem::Identifier).get() << Symbol.getName();
153ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines}
154ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
1554c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainarvoid CompilandDumper::dump(const PDBSymbolThunk &Symbol) {
1564c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  if (Printer.IsSymbolExcluded(Symbol.getName()))
1574c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    return;
1584c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar
1594c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  Printer.NewLine();
1604c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  Printer << "thunk ";
161de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  codeview::ThunkOrdinal Ordinal = Symbol.getThunkOrdinal();
1626948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  uint64_t VA = Symbol.getVirtualAddress();
163de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  if (Ordinal == codeview::ThunkOrdinal::TrampIncremental) {
1646948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    uint64_t Target = Symbol.getTargetVirtualAddress();
1656948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    WithColor(Printer, PDB_ColorItem::Address).get() << format_hex(VA, 10);
1664c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    Printer << " -> ";
1674c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    WithColor(Printer, PDB_ColorItem::Address).get() << format_hex(Target, 10);
168ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  } else {
1694c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    WithColor(Printer, PDB_ColorItem::Address).get()
1706948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar        << "[" << format_hex(VA, 10) << " - "
1716948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar        << format_hex(VA + Symbol.getLength(), 10) << "]";
172ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  }
1734c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  Printer << " (";
1744c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  WithColor(Printer, PDB_ColorItem::Register).get() << Ordinal;
1754c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  Printer << ") ";
176ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  std::string Name = Symbol.getName();
177ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  if (!Name.empty())
1784c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    WithColor(Printer, PDB_ColorItem::Identifier).get() << Name;
179ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines}
180ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
1814c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainarvoid CompilandDumper::dump(const PDBSymbolTypeTypedef &Symbol) {}
182ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
1834c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainarvoid CompilandDumper::dump(const PDBSymbolUnknown &Symbol) {
1844c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  Printer.NewLine();
1854c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  Printer << "unknown (" << Symbol.getSymTag() << ")";
186ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines}
187