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 TagStats Stats; 50 auto ChildrenEnum = getChildStats(Stats); 51 OS << stream_indent(Indent + 2) << "Children: " << Stats << "\n"; 52 while (auto Child = ChildrenEnum->getNext()) { 53 // Skip uninteresting types. These are useful to print as part of type 54 // hierarchies, but as general children of the global scope, they are 55 // not very interesting. 56 switch (Child->getSymTag()) { 57 case PDB_SymType::ArrayType: 58 case PDB_SymType::BaseClass: 59 case PDB_SymType::BuiltinType: 60 case PDB_SymType::CompilandEnv: 61 case PDB_SymType::CustomType: 62 case PDB_SymType::Dimension: 63 case PDB_SymType::Friend: 64 case PDB_SymType::ManagedType: 65 case PDB_SymType::VTableShape: 66 case PDB_SymType::PointerType: 67 case PDB_SymType::FunctionSig: 68 case PDB_SymType::FunctionArg: 69 continue; 70 default: 71 break; 72 } 73 Child->dump(OS, Indent + 4, PDB_DumpLevel::Normal); 74 OS << "\n"; 75 } 76 } 77