CompilandDumper.cpp revision 283625
1//===- CompilandDumper.cpp - llvm-pdbdump compiland symbol dumper *- 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 "CompilandDumper.h" 11#include "LinePrinter.h" 12#include "llvm-pdbdump.h" 13 14#include "llvm/DebugInfo/PDB/IPDBEnumChildren.h" 15#include "llvm/DebugInfo/PDB/IPDBSession.h" 16#include "llvm/DebugInfo/PDB/PDBExtras.h" 17#include "llvm/DebugInfo/PDB/PDBSymbol.h" 18#include "llvm/DebugInfo/PDB/PDBSymbolCompiland.h" 19#include "llvm/DebugInfo/PDB/PDBSymbolData.h" 20#include "llvm/DebugInfo/PDB/PDBSymbolFunc.h" 21#include "llvm/DebugInfo/PDB/PDBSymbolFuncDebugEnd.h" 22#include "llvm/DebugInfo/PDB/PDBSymbolFuncDebugStart.h" 23#include "llvm/DebugInfo/PDB/PDBSymbolLabel.h" 24#include "llvm/DebugInfo/PDB/PDBSymbolThunk.h" 25#include "llvm/DebugInfo/PDB/PDBSymbolTypeFunctionSig.h" 26#include "llvm/DebugInfo/PDB/PDBSymbolUnknown.h" 27#include "llvm/Support/Format.h" 28#include "llvm/Support/Path.h" 29#include "llvm/Support/raw_ostream.h" 30 31#include "FunctionDumper.h" 32 33#include <utility> 34#include <vector> 35 36using namespace llvm; 37 38CompilandDumper::CompilandDumper(LinePrinter &P) 39 : PDBSymDumper(true), Printer(P) {} 40 41void CompilandDumper::dump(const PDBSymbolCompilandDetails &Symbol) {} 42 43void CompilandDumper::dump(const PDBSymbolCompilandEnv &Symbol) {} 44 45void CompilandDumper::start(const PDBSymbolCompiland &Symbol, bool Children) { 46 std::string FullName = Symbol.getName(); 47 if (Printer.IsCompilandExcluded(FullName)) 48 return; 49 50 Printer.NewLine(); 51 WithColor(Printer, PDB_ColorItem::Path).get() << FullName; 52 if (!Children) 53 return; 54 55 auto ChildrenEnum = Symbol.findAllChildren(); 56 Printer.Indent(); 57 while (auto Child = ChildrenEnum->getNext()) 58 Child->dump(*this); 59 Printer.Unindent(); 60} 61 62void CompilandDumper::dump(const PDBSymbolData &Symbol) { 63 if (Printer.IsSymbolExcluded(Symbol.getName())) 64 return; 65 66 Printer.NewLine(); 67 68 switch (auto LocType = Symbol.getLocationType()) { 69 case PDB_LocType::Static: 70 Printer << "data: "; 71 WithColor(Printer, PDB_ColorItem::Address).get() 72 << "[" << format_hex(Symbol.getVirtualAddress(), 10) << "]"; 73 break; 74 case PDB_LocType::Constant: 75 Printer << "constant: "; 76 WithColor(Printer, PDB_ColorItem::LiteralValue).get() 77 << "[" << Symbol.getValue() << "]"; 78 break; 79 default: 80 Printer << "data(unexpected type=" << LocType << ")"; 81 } 82 83 Printer << " "; 84 WithColor(Printer, PDB_ColorItem::Identifier).get() << Symbol.getName(); 85} 86 87void CompilandDumper::dump(const PDBSymbolFunc &Symbol) { 88 if (Symbol.getLength() == 0) 89 return; 90 if (Printer.IsSymbolExcluded(Symbol.getName())) 91 return; 92 93 Printer.NewLine(); 94 FunctionDumper Dumper(Printer); 95 Dumper.start(Symbol, FunctionDumper::PointerType::None); 96} 97 98void CompilandDumper::dump(const PDBSymbolLabel &Symbol) { 99 if (Printer.IsSymbolExcluded(Symbol.getName())) 100 return; 101 102 Printer.NewLine(); 103 Printer << "label "; 104 WithColor(Printer, PDB_ColorItem::Address).get() 105 << "[" << format_hex(Symbol.getVirtualAddress(), 10) << "] "; 106 WithColor(Printer, PDB_ColorItem::Identifier).get() << Symbol.getName(); 107} 108 109void CompilandDumper::dump(const PDBSymbolThunk &Symbol) { 110 if (Printer.IsSymbolExcluded(Symbol.getName())) 111 return; 112 113 Printer.NewLine(); 114 Printer << "thunk "; 115 PDB_ThunkOrdinal Ordinal = Symbol.getThunkOrdinal(); 116 uint64_t VA = Symbol.getVirtualAddress(); 117 if (Ordinal == PDB_ThunkOrdinal::TrampIncremental) { 118 uint64_t Target = Symbol.getTargetVirtualAddress(); 119 WithColor(Printer, PDB_ColorItem::Address).get() << format_hex(VA, 10); 120 Printer << " -> "; 121 WithColor(Printer, PDB_ColorItem::Address).get() << format_hex(Target, 10); 122 } else { 123 WithColor(Printer, PDB_ColorItem::Address).get() 124 << "[" << format_hex(VA, 10) << " - " 125 << format_hex(VA + Symbol.getLength(), 10) << "]"; 126 } 127 Printer << " ("; 128 WithColor(Printer, PDB_ColorItem::Register).get() << Ordinal; 129 Printer << ") "; 130 std::string Name = Symbol.getName(); 131 if (!Name.empty()) 132 WithColor(Printer, PDB_ColorItem::Identifier).get() << Name; 133} 134 135void CompilandDumper::dump(const PDBSymbolTypeTypedef &Symbol) {} 136 137void CompilandDumper::dump(const PDBSymbolUnknown &Symbol) { 138 Printer.NewLine(); 139 Printer << "unknown (" << Symbol.getSymTag() << ")"; 140} 141