1 //===- PDBSymbolExe.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 "llvm/DebugInfo/PDB/PDBSymbolExe.h" 11 12 #include "llvm/DebugInfo/PDB/IPDBEnumChildren.h" 13 #include "llvm/DebugInfo/PDB/PDBExtras.h" 14 #include "llvm/DebugInfo/PDB/PDBSymbol.h" 15 #include "llvm/Support/ConvertUTF.h" 16 #include "llvm/Support/FileSystem.h" 17 #include "llvm/Support/raw_ostream.h" 18 #include <utility> 19 20 #include <utility> 21 22 using namespace llvm; 23 24 PDBSymbolExe::PDBSymbolExe(const IPDBSession &PDBSession, 25 std::unique_ptr<IPDBRawSymbol> Symbol) 26 : PDBSymbol(PDBSession, std::move(Symbol)) {} 27 28 void PDBSymbolExe::dump(raw_ostream &OS, int Indent, 29 PDB_DumpLevel Level) const { 30 std::string FileName(getSymbolsFileName()); 31 32 OS << stream_indent(Indent) << "Summary for " << FileName << "\n"; 33 34 uint64_t FileSize = 0; 35 if (!llvm::sys::fs::file_size(FileName, FileSize)) 36 OS << stream_indent(Indent + 2) << "Size: " << FileSize << " bytes\n"; 37 else 38 OS << stream_indent(Indent + 2) << "Size: (Unable to obtain file size)\n"; 39 PDB_UniqueId Guid = getGuid(); 40 OS << stream_indent(Indent + 2) << "Guid: " << Guid << "\n"; 41 OS << stream_indent(Indent + 2) << "Age: " << getAge() << "\n"; 42 OS << stream_indent(Indent + 2) << "Attributes: "; 43 if (hasCTypes()) 44 OS << "HasCTypes "; 45 if (hasPrivateSymbols()) 46 OS << "HasPrivateSymbols "; 47 OS << "\n"; 48 49 auto ChildrenEnum = findAllChildren(); 50 OS << stream_indent(Indent + 2) << ChildrenEnum->getChildCount() 51 << " children\n"; 52 #if 0 53 dumpChildren(OS, PDB_SymType::None, Indent+4); 54 #else 55 dumpChildren(OS, "Compilands", PDB_SymType::Compiland, Indent + 4); 56 dumpChildren(OS, "Functions", PDB_SymType::Function, Indent + 4); 57 dumpChildren(OS, "Blocks", PDB_SymType::Block, Indent + 4); 58 dumpChildren(OS, "Data", PDB_SymType::Data, Indent + 4); 59 dumpChildren(OS, "Labels", PDB_SymType::Label, Indent + 4); 60 dumpChildren(OS, "Public Symbols", PDB_SymType::PublicSymbol, Indent + 4); 61 dumpChildren(OS, "UDTs", PDB_SymType::UDT, Indent + 4); 62 dumpChildren(OS, "Enums", PDB_SymType::Enum, Indent + 4); 63 dumpChildren(OS, "Function Signatures", PDB_SymType::FunctionSig, Indent + 4); 64 dumpChildren(OS, "Typedefs", PDB_SymType::Typedef, Indent + 4); 65 dumpChildren(OS, "VTables", PDB_SymType::VTable, Indent + 4); 66 dumpChildren(OS, "Thunks", PDB_SymType::Thunk, Indent + 4); 67 #endif 68 } 69 70 void PDBSymbolExe::dumpChildren(raw_ostream &OS, StringRef Label, 71 PDB_SymType ChildType, int Indent) const { 72 auto ChildrenEnum = findAllChildren(ChildType); 73 OS << stream_indent(Indent) << Label << ": (" << ChildrenEnum->getChildCount() 74 << " items)\n"; 75 while (auto Child = ChildrenEnum->getNext()) { 76 Child->dump(OS, Indent + 2, PDB_DumpLevel::Normal); 77 OS << "\n"; 78 } 79 } 80