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